From aa4fc4f21849e3963c4404198123c05f9ecef1de Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 13 Apr 2024 18:03:44 +1000 Subject: [PATCH] Simplify UI code a little bit --- src/Gui.c | 13 ------------- src/Gui.h | 1 - src/Menus.c | 34 +++++++++++++++++++++++++--------- src/Screens.c | 7 +++++-- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index f8b6def9a..f712cee74 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -500,19 +500,6 @@ int Screen_DoPointerDown(void* screen, int id, int x, int y) { return i; } -int Screen_Index(void* screen, void* widget) { - struct Screen* s = (struct Screen*)screen; - struct Widget** widgets = s->widgets; - int i; - - struct Widget* w = (struct Widget*)widget; - for (i = 0; i < s->numWidgets; i++) - { - if (widgets[i] == w) return i; - } - return -1; -} - int Screen_CalcDefaultMaxVertices(void* screen) { struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; diff --git a/src/Gui.h b/src/Gui.h index 4390d4e5d..dd704a4b5 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -117,7 +117,6 @@ void Screen_Render2Widgets(void* screen, double delta); void Screen_UpdateVb(void* screen); struct VertexTextured* Screen_LockVb(void* screen); int Screen_DoPointerDown(void* screen, int id, int x, int y); -int Screen_Index(void* screen, void* w); int Screen_CalcDefaultMaxVertices(void* screen); /* Default mesh building implementation for a screen */ diff --git a/src/Menus.c b/src/Menus.c index c2b50c6f7..00a73b2c4 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1963,8 +1963,10 @@ static void KeyBindsScreen_Update(struct KeyBindsScreen* s, int i) { static void KeyBindsScreen_OnBindingClick(void* screen, void* widget) { struct KeyBindsScreen* s = (struct KeyBindsScreen*)screen; + struct ButtonWidget* btn = (struct ButtonWidget*)widget; + int old = s->curI; - s->curI = Screen_Index(s, widget); + s->curI = btn->meta.val; s->closable = false; KeyBindsScreen_Update(s, s->curI); @@ -2053,6 +2055,7 @@ static void KeyBindsScreen_Init(void* screen) { for (i = 0; i < s->bindsCount; i++) { ButtonWidget_Init(&s->buttons[i], s->btnWidth, KeyBindsScreen_OnBindingClick); s->widgets[i] = (struct Widget*)&s->buttons[i]; + s->buttons[i].meta.val = i; } for (; i < KEYBINDS_MAX_BTNS; i++) { s->widgets[i] = NULL; } @@ -2494,7 +2497,7 @@ static void MenuOptionsScreen_OnDone(const cc_string* value, cc_bool valid) { s->dirty = true; } - MenuOptionsScreen_SelectExtHelp(s, Screen_Index(s, s->activeBtn)); + if (s->selectedI >= 0) MenuOptionsScreen_SelectExtHelp(s, s->selectedI); s->activeBtn = NULL; } @@ -3837,7 +3840,10 @@ static struct Widget* texpack_widgets[] = { (struct Widget*)&TexPackOverlay.btns[2], (struct Widget*)&TexPackOverlay.btns[3] }; -static cc_bool TexPackOverlay_IsAlways(void* screen, void* w) { return Screen_Index(screen, w) >= 6; } +static cc_bool TexPackOverlay_IsAlways(void* screen, void* w) { + struct ButtonWidget* btn = (struct ButtonWidget*)w; + return btn->meta.val != 0; +} static void TexPackOverlay_YesClick(void* screen, void* widget) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; @@ -3944,6 +3950,8 @@ static void TexPackOverlay_ContextRecreated(void* screen) { ButtonWidget_SetConst(&s->btns[3], "Always no", &titleFont); s->btns[2].MenuClick = TexPackOverlay_YesClick; s->btns[3].MenuClick = TexPackOverlay_NoClick; + s->btns[2].meta.val = 1; + s->btns[3].meta.val = 1; } s->numWidgets = s->deny ? 6 : 8; @@ -4005,7 +4013,6 @@ void TexPackOverlay_Show(const cc_string* url) { #define ONSCREEN_PAGE_BTNS 8 static struct TouchOnscreenScreen { Screen_Body - int offset; struct ButtonWidget back, left, right; struct ButtonWidget btns[ONSCREEN_PAGE_BTNS]; const struct SimpleButtonDesc* btnDescs; @@ -4023,17 +4030,20 @@ static struct Widget* touchOnscreen_widgets[3 + ONSCREEN_PAGE_BTNS] = { static void TouchOnscreen_UpdateColors(struct TouchOnscreenScreen* s) { PackedCol grey = PackedCol_Make(0x7F, 0x7F, 0x7F, 0xFF); - int i, j; + int i, bit; - for (i = 0, j = s->offset; i < ONSCREEN_PAGE_BTNS; i++, j++) + for (i = 0; i < ONSCREEN_PAGE_BTNS; i++) { - s->btns[i].color = (Gui._onscreenButtons & (1 << j)) ? PACKEDCOL_WHITE : grey; + bit = s->btns[i].meta.val; + s->btns[i].color = (Gui._onscreenButtons & bit) ? PACKEDCOL_WHITE : grey; } } static void TouchOnscreen_Any(void* screen, void* w) { struct TouchOnscreenScreen* s = (struct TouchOnscreenScreen*)screen; - int bit = 1 << (Screen_Index(s, w) - 3 + s->offset); + struct ButtonWidget* btn = (struct ButtonWidget*)w; + int bit = btn->meta.val; + if (Gui._onscreenButtons & bit) { Gui._onscreenButtons &= ~bit; } else { @@ -4060,12 +4070,18 @@ static const struct SimpleButtonDesc touchOnscreen_page2[ONSCREEN_PAGE_BTNS] = { }; static void TouchOnscreen_SetPage(struct TouchOnscreenScreen* s, cc_bool page1) { - s->offset = page1 ? 0 : ONSCREEN_PAGE_BTNS; + int i; + int offset = page1 ? 0 : ONSCREEN_PAGE_BTNS; s->btnDescs = page1 ? touchOnscreen_page1 : touchOnscreen_page2; Menu_InitButtons(s->btns, 200, s->btnDescs, ONSCREEN_PAGE_BTNS); Widget_SetDisabled(&s->left, page1); Widget_SetDisabled(&s->right, !page1); + + for (i = 0; i < ONSCREEN_PAGE_BTNS; i++) + { + s->btns[i].meta.val = 1 << (i + offset); + } } static void TouchOnscreen_Left(void* screen, void* b) { diff --git a/src/Screens.c b/src/Screens.c index 32b8ee7f6..779fa8740 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -2254,8 +2254,10 @@ static void TouchScreen_HalfClick(void* s, void* w) { } static void TouchScreen_BindClick(void* screen, void* widget) { - struct TouchScreen* s = (struct TouchScreen*)screen; - int i = Screen_Index(screen, widget) - ONSCREEN_MAX_BTNS; + struct TouchScreen* s = (struct TouchScreen*)screen; + struct ButtonWidget* btn = (struct ButtonWidget*)widget; + + int i = btn->meta.val; Input_Set(KeyBinds_Normal[s->descs[i].bind], true); } @@ -2316,6 +2318,7 @@ static void TouchScreen_InitButtons(struct TouchScreen* s) { s->widgets[i + ONSCREEN_MAX_BTNS] = (struct Widget*)&s->btns[i]; ButtonWidget_Init(&s->btns[i], 60, s->descs[i].OnClick); s->btns[i].color = TOUCHSCREEN_BTN_COLOR; + s->btns[i].meta.val = i; } }