From f03febce996383e549b39f9628db8cf977086823 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 23 Jan 2022 13:13:26 +1100 Subject: [PATCH] Launcher: Fix checkbox not adjusting its position when font isn't Arial Usually this resulted in checkbox being drawn over first 1-2 characters of text --- src/LBackend.c | 21 +++++++++++++++------ src/LBackend.h | 3 +++ src/LScreens.c | 32 ++++++++++++-------------------- src/LWidgets.c | 13 ++++++++++--- src/LWidgets.h | 5 ++++- 5 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/LBackend.c b/src/LBackend.c index 282b286ce..e7410aa78 100644 --- a/src/LBackend.c +++ b/src/LBackend.c @@ -248,20 +248,29 @@ void LBackend_DrawCheckbox(struct LCheckbox* w) { PackedCol boxTop = PackedCol_Make(255, 255, 255, 255); PackedCol boxBottom = PackedCol_Make(240, 240, 240, 255); PackedCol black = PackedCol_Make(0, 0, 0, 255); - int height = w->height / 2; + struct DrawTextArgs args; + int x, y, width, height; + + width = Display_ScaleX(CB_SIZE); + height = Display_ScaleY(CB_SIZE); Gradient_Vertical(&Launcher_Framebuffer, boxTop, boxBottom, - w->x, w->y, w->width, height); + w->x, w->y, width, height / 2); Gradient_Vertical(&Launcher_Framebuffer, boxBottom, boxTop, - w->x, w->y + height, w->width, height); + w->x, w->y + height / 2, width, height / 2); if (w->value) { const int size = 12; - int x = w->x + w->width / 2 - size / 2; - int y = w->y + w->height / 2 - size / 2; + x = w->x + width / 2 - size / 2; + y = w->y + height / 2 - size / 2; DrawIndexed(size, x, y, &Launcher_Framebuffer); } - DrawBoxBounds(black, w->x, w->y, w->width, w->height); + DrawBoxBounds(black, w->x, w->y, width, height); + + DrawTextArgs_Make(&args, &w->text, w->font, true); + x = w->x + Display_ScaleX(CB_SIZE + CB_OFFSET); + y = w->y + (height - Drawer2D_TextHeight(&args)) / 2; + Drawer2D_DrawText(&Launcher_Framebuffer, &args, x, y); } diff --git a/src/LBackend.h b/src/LBackend.h index 22861aabc..d3872d562 100644 --- a/src/LBackend.h +++ b/src/LBackend.h @@ -12,6 +12,9 @@ struct LLabel; struct LLine; struct LSlider; +#define CB_SIZE 24 +#define CB_OFFSET 8 + /* Whether tiles have been extracted from a terrain atlas */ cc_bool LBackend_HasTextures(void); /* Extracts tiles from the given terrain atlas bitmap */ diff --git a/src/LScreens.c b/src/LScreens.c index 207869d93..46f2ffaab 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -339,10 +339,10 @@ void ChooseModeScreen_SetActive(cc_bool firstTime) { static struct ColoursScreen { LScreen_Layout struct LButton btnBack; - struct LLabel lblNames[5], lblRGB[3], lblClassic; + struct LLabel lblNames[5], lblRGB[3]; struct LInput iptColours[5 * 3]; struct LCheckbox cbClassic; - struct LWidget* _widgets[26]; + struct LWidget* _widgets[25]; float colourAcc; } ColoursScreen_Instance; @@ -470,8 +470,7 @@ static void ColoursScreen_Init(struct LScreen* s_) { LLabel_Init(s_, &s->lblRGB[2], "Blue"); LButton_Init(s_, &s->btnBack, 80, 35, "Back"); - LLabel_Init(s_, &s->lblClassic, "Classic style"); - LCheckbox_Init(s_, &s->cbClassic); + LCheckbox_Init(s_, &s->cbClassic, "Classic style"); s->cbClassic.OnClick = ColoursScreen_ToggleBG; s->btnBack.OnClick = SwitchToThemes; } @@ -503,8 +502,7 @@ static void ColoursScreen_Layout(struct LScreen* s_) { LWidget_SetLocation(&s->lblRGB[1], ANCHOR_CENTRE, ANCHOR_CENTRE, 95, -130); LWidget_SetLocation(&s->lblRGB[2], ANCHOR_CENTRE, ANCHOR_CENTRE, 160, -130); - LWidget_SetLocation(&s->cbClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, -75, 130); - LWidget_SetLocation(&s->lblClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 130); + LWidget_SetLocation(&s->cbClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, -16, 130); LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170); } @@ -1095,13 +1093,12 @@ static void CheckResourcesScreen_ResetArea(int x, int y, int width, int height) static void CheckResourcesScreen_DrawBackground(struct LScreen* s, struct Bitmap* bmp) { int x, y, width, height; - Drawer2D_Clear(bmp, RESOURCES_BACK_COLOR, - 0, 0, WindowInfo.Width, WindowInfo.Height); + Drawer2D_Clear(bmp, RESOURCES_BACK_COLOR, 0, 0, bmp->width, bmp->height); width = Display_ScaleX(380); height = Display_ScaleY(140); - x = Gui_CalcPos(ANCHOR_CENTRE, 0, width, WindowInfo.Width); - y = Gui_CalcPos(ANCHOR_CENTRE, 0, height, WindowInfo.Height); + x = Gui_CalcPos(ANCHOR_CENTRE, 0, width, bmp->width); + y = Gui_CalcPos(ANCHOR_CENTRE, 0, height, bmp->height); Gradient_Noise(bmp, RESOURCES_FORE_COLOR, 4, x, y, width, height); } @@ -1428,10 +1425,9 @@ static struct SettingsScreen { LScreen_Layout struct LButton btnUpdates, btnMode, btnColours, btnBack; struct LLabel lblUpdates, lblMode, lblColours; - struct LLabel lblExtra; struct LCheckbox cbExtra; struct LLine sep; - struct LWidget* _widgets[10]; + struct LWidget* _widgets[9]; } SettingsScreen_Instance; #if defined CC_BUILD_MOBILE @@ -1466,12 +1462,10 @@ static void SettingsScreen_Init(struct LScreen* s_) { LLabel_Init(s_, &s->lblColours, "&eChange how the launcher looks"); #if defined CC_BUILD_MOBILE - LLabel_Init(s_, &s->lblExtra, "Force landscape"); - LCheckbox_Init(s_, &s->cbExtra); + LCheckbox_Init(s_, &s->cbExtra, "Force landscape"); s->cbExtra.OnClick = SettingsScreen_LockOrientation; #else - LLabel_Init(s_, &s->lblExtra, "Close this after game starts"); - LCheckbox_Init(s_, &s->cbExtra); + LCheckbox_Init(s_, &s->cbExtra, "Close this after game starts"); s->cbExtra.OnClick = SettingsScreen_AutoClose; #endif @@ -1508,11 +1502,9 @@ static void SettingsScreen_Layout(struct LScreen* s_) { LWidget_SetLocation(&s->sep, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 15); #if defined CC_BUILD_MOBILE - LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -178, 44); - LWidget_SetLocation(&s->lblExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -84, 44); + LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -100, 44); #else - LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -178, 44); - LWidget_SetLocation(&s->lblExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -42, 44); + LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -58, 44); #endif LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170); diff --git a/src/LWidgets.c b/src/LWidgets.c index 73201bf23..4debcace9 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -132,12 +132,19 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = { NULL, NULL, /* Hover */ NULL, NULL /* Select */ }; -void LCheckbox_Init(struct LScreen* s, struct LCheckbox* w) { +void LCheckbox_Init(struct LScreen* s, struct LCheckbox* w, const char* text) { + struct DrawTextArgs args; w->VTABLE = &lcheckbox_VTABLE; + w->font = &Launcher_TextFont; w->tabSelectable = true; - w->width = Display_ScaleX(24); - w->height = Display_ScaleY(24); + + String_InitArray(w->text, w->_textBuffer); + String_AppendConst(&w->text, text); s->widgets[s->numWidgets++] = (struct LWidget*)w; + + DrawTextArgs_Make(&args, &w->text, w->font, true); + w->width = Display_ScaleX(CB_SIZE + CB_OFFSET) + Drawer2D_TextWidth(&args); + w->height = Display_ScaleY(CB_SIZE); } diff --git a/src/LWidgets.h b/src/LWidgets.h index 38cf1e4b1..d67d0fb6d 100644 --- a/src/LWidgets.h +++ b/src/LWidgets.h @@ -63,9 +63,12 @@ CC_NOINLINE void LButton_SetConst(struct LButton* w, const char* text); struct LCheckbox { LWidget_Layout + struct FontDesc* font; cc_bool value; + cc_string text; + char _textBuffer[STRING_SIZE]; }; -CC_NOINLINE void LCheckbox_Init(struct LScreen* s, struct LCheckbox* w); +CC_NOINLINE void LCheckbox_Init(struct LScreen* s, struct LCheckbox* w, const char* text); struct LInput; struct LInput {