Simplify UI code a little bit

This commit is contained in:
UnknownShadow200 2024-04-13 18:03:44 +10:00
parent 1a82ef84ce
commit aa4fc4f218
4 changed files with 30 additions and 25 deletions

View File

@ -500,19 +500,6 @@ int Screen_DoPointerDown(void* screen, int id, int x, int y) {
return i; 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) { int Screen_CalcDefaultMaxVertices(void* screen) {
struct Screen* s = (struct Screen*)screen; struct Screen* s = (struct Screen*)screen;
struct Widget** widgets = s->widgets; struct Widget** widgets = s->widgets;

View File

@ -117,7 +117,6 @@ void Screen_Render2Widgets(void* screen, double delta);
void Screen_UpdateVb(void* screen); void Screen_UpdateVb(void* screen);
struct VertexTextured* Screen_LockVb(void* screen); struct VertexTextured* Screen_LockVb(void* screen);
int Screen_DoPointerDown(void* screen, int id, int x, int y); int Screen_DoPointerDown(void* screen, int id, int x, int y);
int Screen_Index(void* screen, void* w);
int Screen_CalcDefaultMaxVertices(void* screen); int Screen_CalcDefaultMaxVertices(void* screen);
/* Default mesh building implementation for a screen */ /* Default mesh building implementation for a screen */

View File

@ -1963,8 +1963,10 @@ static void KeyBindsScreen_Update(struct KeyBindsScreen* s, int i) {
static void KeyBindsScreen_OnBindingClick(void* screen, void* widget) { static void KeyBindsScreen_OnBindingClick(void* screen, void* widget) {
struct KeyBindsScreen* s = (struct KeyBindsScreen*)screen; struct KeyBindsScreen* s = (struct KeyBindsScreen*)screen;
struct ButtonWidget* btn = (struct ButtonWidget*)widget;
int old = s->curI; int old = s->curI;
s->curI = Screen_Index(s, widget); s->curI = btn->meta.val;
s->closable = false; s->closable = false;
KeyBindsScreen_Update(s, s->curI); KeyBindsScreen_Update(s, s->curI);
@ -2053,6 +2055,7 @@ static void KeyBindsScreen_Init(void* screen) {
for (i = 0; i < s->bindsCount; i++) { for (i = 0; i < s->bindsCount; i++) {
ButtonWidget_Init(&s->buttons[i], s->btnWidth, KeyBindsScreen_OnBindingClick); ButtonWidget_Init(&s->buttons[i], s->btnWidth, KeyBindsScreen_OnBindingClick);
s->widgets[i] = (struct Widget*)&s->buttons[i]; s->widgets[i] = (struct Widget*)&s->buttons[i];
s->buttons[i].meta.val = i;
} }
for (; i < KEYBINDS_MAX_BTNS; i++) { s->widgets[i] = NULL; } 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; s->dirty = true;
} }
MenuOptionsScreen_SelectExtHelp(s, Screen_Index(s, s->activeBtn)); if (s->selectedI >= 0) MenuOptionsScreen_SelectExtHelp(s, s->selectedI);
s->activeBtn = NULL; s->activeBtn = NULL;
} }
@ -3837,7 +3840,10 @@ static struct Widget* texpack_widgets[] = {
(struct Widget*)&TexPackOverlay.btns[2], (struct Widget*)&TexPackOverlay.btns[3] (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) { static void TexPackOverlay_YesClick(void* screen, void* widget) {
struct TexPackOverlay* s = (struct TexPackOverlay*)screen; struct TexPackOverlay* s = (struct TexPackOverlay*)screen;
@ -3944,6 +3950,8 @@ static void TexPackOverlay_ContextRecreated(void* screen) {
ButtonWidget_SetConst(&s->btns[3], "Always no", &titleFont); ButtonWidget_SetConst(&s->btns[3], "Always no", &titleFont);
s->btns[2].MenuClick = TexPackOverlay_YesClick; s->btns[2].MenuClick = TexPackOverlay_YesClick;
s->btns[3].MenuClick = TexPackOverlay_NoClick; s->btns[3].MenuClick = TexPackOverlay_NoClick;
s->btns[2].meta.val = 1;
s->btns[3].meta.val = 1;
} }
s->numWidgets = s->deny ? 6 : 8; s->numWidgets = s->deny ? 6 : 8;
@ -4005,7 +4013,6 @@ void TexPackOverlay_Show(const cc_string* url) {
#define ONSCREEN_PAGE_BTNS 8 #define ONSCREEN_PAGE_BTNS 8
static struct TouchOnscreenScreen { static struct TouchOnscreenScreen {
Screen_Body Screen_Body
int offset;
struct ButtonWidget back, left, right; struct ButtonWidget back, left, right;
struct ButtonWidget btns[ONSCREEN_PAGE_BTNS]; struct ButtonWidget btns[ONSCREEN_PAGE_BTNS];
const struct SimpleButtonDesc* btnDescs; const struct SimpleButtonDesc* btnDescs;
@ -4023,17 +4030,20 @@ static struct Widget* touchOnscreen_widgets[3 + ONSCREEN_PAGE_BTNS] = {
static void TouchOnscreen_UpdateColors(struct TouchOnscreenScreen* s) { static void TouchOnscreen_UpdateColors(struct TouchOnscreenScreen* s) {
PackedCol grey = PackedCol_Make(0x7F, 0x7F, 0x7F, 0xFF); 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) { static void TouchOnscreen_Any(void* screen, void* w) {
struct TouchOnscreenScreen* s = (struct TouchOnscreenScreen*)screen; 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) { if (Gui._onscreenButtons & bit) {
Gui._onscreenButtons &= ~bit; Gui._onscreenButtons &= ~bit;
} else { } else {
@ -4060,12 +4070,18 @@ static const struct SimpleButtonDesc touchOnscreen_page2[ONSCREEN_PAGE_BTNS] = {
}; };
static void TouchOnscreen_SetPage(struct TouchOnscreenScreen* s, cc_bool page1) { 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; s->btnDescs = page1 ? touchOnscreen_page1 : touchOnscreen_page2;
Menu_InitButtons(s->btns, 200, s->btnDescs, ONSCREEN_PAGE_BTNS); Menu_InitButtons(s->btns, 200, s->btnDescs, ONSCREEN_PAGE_BTNS);
Widget_SetDisabled(&s->left, page1); Widget_SetDisabled(&s->left, page1);
Widget_SetDisabled(&s->right, !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) { static void TouchOnscreen_Left(void* screen, void* b) {

View File

@ -2254,8 +2254,10 @@ static void TouchScreen_HalfClick(void* s, void* w) {
} }
static void TouchScreen_BindClick(void* screen, void* widget) { static void TouchScreen_BindClick(void* screen, void* widget) {
struct TouchScreen* s = (struct TouchScreen*)screen; struct TouchScreen* s = (struct TouchScreen*)screen;
int i = Screen_Index(screen, widget) - ONSCREEN_MAX_BTNS; struct ButtonWidget* btn = (struct ButtonWidget*)widget;
int i = btn->meta.val;
Input_Set(KeyBinds_Normal[s->descs[i].bind], true); 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]; s->widgets[i + ONSCREEN_MAX_BTNS] = (struct Widget*)&s->btns[i];
ButtonWidget_Init(&s->btns[i], 60, s->descs[i].OnClick); ButtonWidget_Init(&s->btns[i], 60, s->descs[i].OnClick);
s->btns[i].color = TOUCHSCREEN_BTN_COLOR; s->btns[i].color = TOUCHSCREEN_BTN_COLOR;
s->btns[i].meta.val = i;
} }
} }