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
This commit is contained in:
UnknownShadow200 2022-01-23 13:13:26 +11:00
parent 2b0b05358c
commit f03febce99
5 changed files with 44 additions and 30 deletions

View File

@ -248,20 +248,29 @@ void LBackend_DrawCheckbox(struct LCheckbox* w) {
PackedCol boxTop = PackedCol_Make(255, 255, 255, 255); PackedCol boxTop = PackedCol_Make(255, 255, 255, 255);
PackedCol boxBottom = PackedCol_Make(240, 240, 240, 255); PackedCol boxBottom = PackedCol_Make(240, 240, 240, 255);
PackedCol black = PackedCol_Make(0, 0, 0, 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, 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, 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) { if (w->value) {
const int size = 12; const int size = 12;
int x = w->x + w->width / 2 - size / 2; x = w->x + width / 2 - size / 2;
int y = w->y + w->height / 2 - size / 2; y = w->y + height / 2 - size / 2;
DrawIndexed(size, x, y, &Launcher_Framebuffer); 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);
} }

View File

@ -12,6 +12,9 @@ struct LLabel;
struct LLine; struct LLine;
struct LSlider; struct LSlider;
#define CB_SIZE 24
#define CB_OFFSET 8
/* Whether tiles have been extracted from a terrain atlas */ /* Whether tiles have been extracted from a terrain atlas */
cc_bool LBackend_HasTextures(void); cc_bool LBackend_HasTextures(void);
/* Extracts tiles from the given terrain atlas bitmap */ /* Extracts tiles from the given terrain atlas bitmap */

View File

@ -339,10 +339,10 @@ void ChooseModeScreen_SetActive(cc_bool firstTime) {
static struct ColoursScreen { static struct ColoursScreen {
LScreen_Layout LScreen_Layout
struct LButton btnBack; struct LButton btnBack;
struct LLabel lblNames[5], lblRGB[3], lblClassic; struct LLabel lblNames[5], lblRGB[3];
struct LInput iptColours[5 * 3]; struct LInput iptColours[5 * 3];
struct LCheckbox cbClassic; struct LCheckbox cbClassic;
struct LWidget* _widgets[26]; struct LWidget* _widgets[25];
float colourAcc; float colourAcc;
} ColoursScreen_Instance; } ColoursScreen_Instance;
@ -470,8 +470,7 @@ static void ColoursScreen_Init(struct LScreen* s_) {
LLabel_Init(s_, &s->lblRGB[2], "Blue"); LLabel_Init(s_, &s->lblRGB[2], "Blue");
LButton_Init(s_, &s->btnBack, 80, 35, "Back"); LButton_Init(s_, &s->btnBack, 80, 35, "Back");
LLabel_Init(s_, &s->lblClassic, "Classic style"); LCheckbox_Init(s_, &s->cbClassic, "Classic style");
LCheckbox_Init(s_, &s->cbClassic);
s->cbClassic.OnClick = ColoursScreen_ToggleBG; s->cbClassic.OnClick = ColoursScreen_ToggleBG;
s->btnBack.OnClick = SwitchToThemes; 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[1], ANCHOR_CENTRE, ANCHOR_CENTRE, 95, -130);
LWidget_SetLocation(&s->lblRGB[2], ANCHOR_CENTRE, ANCHOR_CENTRE, 160, -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->cbClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, -16, 130);
LWidget_SetLocation(&s->lblClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 130);
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170); 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) { static void CheckResourcesScreen_DrawBackground(struct LScreen* s, struct Bitmap* bmp) {
int x, y, width, height; int x, y, width, height;
Drawer2D_Clear(bmp, RESOURCES_BACK_COLOR, Drawer2D_Clear(bmp, RESOURCES_BACK_COLOR, 0, 0, bmp->width, bmp->height);
0, 0, WindowInfo.Width, WindowInfo.Height);
width = Display_ScaleX(380); width = Display_ScaleX(380);
height = Display_ScaleY(140); height = Display_ScaleY(140);
x = Gui_CalcPos(ANCHOR_CENTRE, 0, width, WindowInfo.Width); x = Gui_CalcPos(ANCHOR_CENTRE, 0, width, bmp->width);
y = Gui_CalcPos(ANCHOR_CENTRE, 0, height, WindowInfo.Height); y = Gui_CalcPos(ANCHOR_CENTRE, 0, height, bmp->height);
Gradient_Noise(bmp, RESOURCES_FORE_COLOR, 4, x, y, width, height); Gradient_Noise(bmp, RESOURCES_FORE_COLOR, 4, x, y, width, height);
} }
@ -1428,10 +1425,9 @@ static struct SettingsScreen {
LScreen_Layout LScreen_Layout
struct LButton btnUpdates, btnMode, btnColours, btnBack; struct LButton btnUpdates, btnMode, btnColours, btnBack;
struct LLabel lblUpdates, lblMode, lblColours; struct LLabel lblUpdates, lblMode, lblColours;
struct LLabel lblExtra;
struct LCheckbox cbExtra; struct LCheckbox cbExtra;
struct LLine sep; struct LLine sep;
struct LWidget* _widgets[10]; struct LWidget* _widgets[9];
} SettingsScreen_Instance; } SettingsScreen_Instance;
#if defined CC_BUILD_MOBILE #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"); LLabel_Init(s_, &s->lblColours, "&eChange how the launcher looks");
#if defined CC_BUILD_MOBILE #if defined CC_BUILD_MOBILE
LLabel_Init(s_, &s->lblExtra, "Force landscape"); LCheckbox_Init(s_, &s->cbExtra, "Force landscape");
LCheckbox_Init(s_, &s->cbExtra);
s->cbExtra.OnClick = SettingsScreen_LockOrientation; s->cbExtra.OnClick = SettingsScreen_LockOrientation;
#else #else
LLabel_Init(s_, &s->lblExtra, "Close this after game starts"); LCheckbox_Init(s_, &s->cbExtra, "Close this after game starts");
LCheckbox_Init(s_, &s->cbExtra);
s->cbExtra.OnClick = SettingsScreen_AutoClose; s->cbExtra.OnClick = SettingsScreen_AutoClose;
#endif #endif
@ -1508,11 +1502,9 @@ static void SettingsScreen_Layout(struct LScreen* s_) {
LWidget_SetLocation(&s->sep, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 15); LWidget_SetLocation(&s->sep, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 15);
#if defined CC_BUILD_MOBILE #if defined CC_BUILD_MOBILE
LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -178, 44); LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -100, 44);
LWidget_SetLocation(&s->lblExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -84, 44);
#else #else
LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -178, 44); LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -58, 44);
LWidget_SetLocation(&s->lblExtra, ANCHOR_CENTRE, ANCHOR_CENTRE, -42, 44);
#endif #endif
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170); LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170);

View File

@ -132,12 +132,19 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = {
NULL, NULL, /* Hover */ NULL, NULL, /* Hover */
NULL, NULL /* Select */ 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->VTABLE = &lcheckbox_VTABLE;
w->font = &Launcher_TextFont;
w->tabSelectable = true; 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; 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);
} }

View File

@ -63,9 +63,12 @@ CC_NOINLINE void LButton_SetConst(struct LButton* w, const char* text);
struct LCheckbox { struct LCheckbox {
LWidget_Layout LWidget_Layout
struct FontDesc* font;
cc_bool value; 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;
struct LInput { struct LInput {