From 4be7d08f2051b4068da9432ee294ef1b437cbf5d Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 26 Apr 2024 13:05:17 +1000 Subject: [PATCH] Move more menus to new init method --- src/Menus.c | 137 +++++++++++++++++++++----------------------------- src/Screens.c | 11 ++-- src/Widgets.c | 7 +-- src/Widgets.h | 5 +- 4 files changed, 65 insertions(+), 95 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index cb528fcd5..af9141697 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -54,13 +54,6 @@ static void Menu_AddButtons(void* screen, struct ButtonWidget* btns, int width, } } -static void Menu_InitButtons(struct ButtonWidget* btns, int width, const struct SimpleButtonDesc* descs, int count) { - int i; - for (i = 0; i < count; i++) { - ButtonWidget_Init(&btns[i], width, descs[i].onClick); - } -} - static void Menu_LayoutButtons(struct ButtonWidget* btns, const struct SimpleButtonDesc* descs, int count) { int i; for (i = 0; i < count; i++) { @@ -2391,7 +2384,7 @@ static struct MenuOptionsScreen { const char* descriptions[MENUOPTS_MAX_OPTS + 1]; struct ButtonWidget* activeBtn; InitMenuOptions DoInit, DoRecreateExtra, OnHacksChanged; - int numButtons, numCore; + int numButtons; struct FontDesc titleFont, textFont; struct TextGroupWidget extHelp; struct Texture extHelpTextures[5]; /* max lines is 5 */ @@ -2400,11 +2393,7 @@ static struct MenuOptionsScreen { } MenuOptionsScreen_Instance; static struct MenuInputDesc menuOpts_descs[MENUOPTS_MAX_OPTS]; -static struct Widget* menuOpts_widgets[MENUOPTS_MAX_OPTS + 1] = { - NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL, - NULL, - (struct Widget*)&MenuOptionsScreen_Instance.done -}; +static struct Widget* menuOpts_widgets[MENUOPTS_MAX_OPTS + 1]; static void Menu_GetBool(cc_string* raw, cc_bool v) { String_AppendConst(raw, v ? "ON" : "OFF"); @@ -2507,14 +2496,14 @@ static int MenuOptionsScreen_PointerMove(void* screen, int id, int x, int y) { return true; } -static void MenuOptionsScreen_InitButtons(struct MenuOptionsScreen* s, const struct MenuOptionDesc* btns, int count, Widget_LeftClick backClick) { +static void MenuOptionsScreen_AddButtons(struct MenuOptionsScreen* s, const struct MenuOptionDesc* btns, int count, Widget_LeftClick backClick) { struct ButtonWidget* btn; int i; for (i = 0; i < count; i++) { btn = &s->buttons[i]; - ButtonWidget_Make(btn, 300, btns[i].OnClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, btns[i].dir * 160, btns[i].y); + ButtonWidget_Add(s, btn, 300, btns[i].OnClick); + Widget_SetLocation(btn, ANCHOR_CENTRE, ANCHOR_CENTRE, btns[i].dir * 160, btns[i].y); btn->optName = btns[i].name; btn->GetValue = btns[i].GetValue; @@ -2523,7 +2512,7 @@ static void MenuOptionsScreen_InitButtons(struct MenuOptionsScreen* s, const str s->widgets[i] = (struct Widget*)btn; } s->numButtons = count; - ButtonWidget_Init(&s->done, 400, backClick); + ButtonWidget_Add(s, &s->done, 400, backClick); } static void MenuOptionsScreen_Bool(void* screen, void* widget) { @@ -2595,7 +2584,8 @@ static void MenuOptionsScreen_Init(void* screen) { int i; s->widgets = menuOpts_widgets; - s->numWidgets = MENUOPTS_MAX_OPTS + 1; /* always have back button */ + s->numWidgets = 0; + s->maxWidgets = MENUOPTS_MAX_OPTS + 1; /* always have back button */ s->maxVertices = BUTTONWIDGET_MAX; /* The various menu options screens might have different number of widgets */ @@ -2769,14 +2759,12 @@ static void ClassicOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 0, 60, "Hacks enabled", MenuOptionsScreen_Bool, ClassicOptionsScreen_GetHacks, ClassicOptionsScreen_SetHacks } }; - s->numCore = 9 + 1; - s->maxVertices += 9 * BUTTONWIDGET_MAX + BUTTONWIDGET_MAX; + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX + BUTTONWIDGET_MAX; s->DoRecreateExtra = ClassicOptionsScreen_RecreateExtra; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchPause); - ButtonWidget_Make(&s->buttons[9], 400, Menu_SwitchBindsClassic, - ANCHOR_CENTRE, ANCHOR_MAX, 0, 95); - s->widgets[9] = (struct Widget*)&s->buttons[9]; + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchPause); + ButtonWidget_Add(s, &s->buttons[9], 400, Menu_SwitchBindsClassic); + Widget_SetLocation(&s->buttons[9], ANCHOR_CENTRE, ANCHOR_MAX, 0, 95); /* Disable certain options */ if (!Server.IsSinglePlayer) Menu_Remove(s, 3); @@ -2852,9 +2840,8 @@ static void EnvSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { EnvSettingsScreen_GetEdgeHeight, EnvSettingsScreen_SetEdgeHeight } }; - s->numCore = 10; - s->maxVertices += 10 * BUTTONWIDGET_MAX; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } void EnvSettingsScreen_Show(void) { @@ -2942,9 +2929,8 @@ static void GraphicsOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { ClassicOptionsScreen_GetAnaglyph, ClassicOptionsScreen_SetAnaglyph } }; - s->numCore = 9; - s->maxVertices += 9 * BUTTONWIDGET_MAX; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); s->descriptions[0] = "&eChange the smoothness of the smooth camera."; s->descriptions[1] = \ @@ -3027,9 +3013,8 @@ static void ChatOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { ChatOptionsScreen_GetAutoScaleChat, ChatOptionsScreen_SetAutoScaleChat } }; - s->numCore = 5; - s->maxVertices += 5 * BUTTONWIDGET_MAX; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } void ChatOptionsScreen_Show(void) { @@ -3092,9 +3077,8 @@ static void GuiOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { NULL, NULL } }; - s->numCore = 8; - s->maxVertices += 8 * BUTTONWIDGET_MAX; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } void GuiOptionsScreen_Show(void) { @@ -3214,11 +3198,10 @@ static void HacksSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Field of view", MenuOptionsScreen_Input, HacksSettingsScreen_GetFOV, HacksSettingsScreen_SetFOV }, }; - s->numCore = 10; - s->maxVertices += 10 * BUTTONWIDGET_MAX; + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; s->OnHacksChanged = HacksSettingsScreen_CheckHacksAllowed; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); HacksSettingsScreen_CheckHacksAllowed(s); s->descriptions[2] = "&eIf &fON&e, then the third person cameras will limit\nðeir zoom distance if they hit a solid block."; @@ -3292,9 +3275,8 @@ static void MiscSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Mouse sensitivity", MenuOptionsScreen_Input, MiscOptionsScreen_GetSensitivity, MiscOptionsScreen_SetSensitivity } }; - s->numCore = 7; - s->maxVertices += 7 * BUTTONWIDGET_MAX; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); /* Disable certain options */ if (!Server.IsSinglePlayer) Menu_Remove(s, 0); @@ -3430,10 +3412,9 @@ static void NostalgiaAppearanceScreen_InitWidgets(struct MenuOptionsScreen* s) { { 1, 50, "Classic options", MenuOptionsScreen_Bool, NostalgiaScreen_GetOpts, NostalgiaScreen_SetOpts }, }; - s->numCore = Array_Elems(buttons); - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchNostalgia); + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchNostalgia); } void NostalgiaAppearanceScreen_Show(void) { @@ -3492,14 +3473,12 @@ static void NostalgiaFunctionalityScreen_InitWidgets(struct MenuOptionsScreen* s { 1, 0, "Game version", NostalgiaScreen_Version, NostalgiaScreen_GetVersion, NostalgiaScreen_SetVersion } }; - s->numCore = Array_Elems(buttons) + 1; - s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX + TEXTWIDGET_MAX; + s->maxVertices += Array_Elems(buttons) * BUTTONWIDGET_MAX + TEXTWIDGET_MAX; s->DoRecreateExtra = NostalgiaScreen_RecreateExtra; - MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchNostalgia); - TextWidget_Init(&nostalgia_desc); + MenuOptionsScreen_AddButtons(s, buttons, Array_Elems(buttons), Menu_SwitchNostalgia); + TextWidget_Add(s, &nostalgia_desc); Widget_SetLocation(&nostalgia_desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); - s->widgets[4] = (struct Widget*)&nostalgia_desc; NostalgiaScreen_UpdateVersionDisabled(); s->descriptions[3] = \ @@ -4068,11 +4047,22 @@ static const struct SimpleButtonDesc touchOnscreen_page2[ONSCREEN_PAGE_BTNS] = { { -120, 100, "---", TouchOnscreen_Any }, { 120, 100, "---", TouchOnscreen_Any } }; -static void TouchOnscreen_SetPage(struct TouchOnscreenScreen* s, cc_bool page1) { +static void TouchOnscreen_Left(void* screen, void* b); +static void TouchOnscreen_Right(void* screen, void* b); + +static void TouchOnscreen_RemakeWidgets(struct TouchOnscreenScreen* s, cc_bool page1) { 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); + + s->widgets = touchOnscreen_widgets; + s->numWidgets = 0; + s->maxWidgets = Array_Elems(touchOnscreen_widgets); + + Menu_AddButtons(s, s->btns, 200, s->btnDescs, ONSCREEN_PAGE_BTNS); + ButtonWidget_Add(s, &s->back, 400, TouchOnscreen_More); + ButtonWidget_Add(s, &s->left, 40, TouchOnscreen_Left); + ButtonWidget_Add(s, &s->right, 40, TouchOnscreen_Right); Widget_SetDisabled(&s->left, page1); Widget_SetDisabled(&s->right, !page1); @@ -4085,14 +4075,14 @@ static void TouchOnscreen_SetPage(struct TouchOnscreenScreen* s, cc_bool page1) static void TouchOnscreen_Left(void* screen, void* b) { struct TouchOnscreenScreen* s = (struct TouchOnscreenScreen*)screen; - TouchOnscreen_SetPage(s, true); + TouchOnscreen_RemakeWidgets(s, true); Gui_Refresh((struct Screen*)s); TouchOnscreen_UpdateColors(s); } static void TouchOnscreen_Right(void* screen, void* b) { struct TouchOnscreenScreen* s = (struct TouchOnscreenScreen*)screen; - TouchOnscreen_SetPage(s, false); + TouchOnscreen_RemakeWidgets(s, false); Gui_Refresh((struct Screen*)s); TouchOnscreen_UpdateColors(s); } @@ -4123,13 +4113,7 @@ static void TouchOnscreenScreen_Layout(void* screen) { static void TouchOnscreenScreen_Init(void* screen) { struct TouchOnscreenScreen* s = (struct TouchOnscreenScreen*)screen; - s->widgets = touchOnscreen_widgets; - s->numWidgets = Array_Elems(touchOnscreen_widgets); - - ButtonWidget_Init(&s->back, 400, TouchOnscreen_More); - ButtonWidget_Init(&s->left, 40, TouchOnscreen_Left); - ButtonWidget_Init(&s->right, 40, TouchOnscreen_Right); - TouchOnscreen_SetPage(s, true); + TouchOnscreen_RemakeWidgets(s, true); TouchOnscreen_UpdateColors(screen); s->maxVertices = Screen_CalcDefaultMaxVertices(s); @@ -4163,11 +4147,7 @@ static struct TouchCtrlsScreen { struct FontDesc font; } TouchCtrlsScreen; -static struct Widget* touchCtrls_widgets[1 + TOUCHCTRLS_BTNS] = { - (struct Widget*)&TouchCtrlsScreen.back, (struct Widget*)&TouchCtrlsScreen.btns[0], - (struct Widget*)&TouchCtrlsScreen.btns[1], (struct Widget*)&TouchCtrlsScreen.btns[2], - (struct Widget*)&TouchCtrlsScreen.btns[3], (struct Widget*)&TouchCtrlsScreen.btns[4] -}; +static struct Widget* touchCtrls_widgets[TOUCHCTRLS_BTNS + 1]; static const char* GetTapDesc(int mode) { if (mode == INPUT_MODE_PLACE) return "Tap: Place"; @@ -4299,11 +4279,12 @@ static void TouchCtrlsScreen_Layout(void* screen) { static void TouchCtrlsScreen_Init(void* screen) { struct TouchCtrlsScreen* s = (struct TouchCtrlsScreen*)screen; s->widgets = touchCtrls_widgets; - s->numWidgets = Array_Elems(touchCtrls_widgets); + s->numWidgets = 0; + s->maxWidgets = Array_Elems(touchCtrls_widgets); - Menu_InitButtons(s->btns, 195, touchCtrls_btns, 4); - Menu_InitButtons(s->btns + 4, 400, touchCtrls_btns + 4, 1); - ButtonWidget_Init(&s->back, 400, TouchCtrls_More); + Menu_AddButtons(s, s->btns, 195, touchCtrls_btns, 4); + Menu_AddButtons(s, s->btns + 4, 400, touchCtrls_btns + 4, 1); + ButtonWidget_Add(s, &s->back, 400, TouchCtrls_More); s->maxVertices = Screen_CalcDefaultMaxVertices(s); } @@ -4335,12 +4316,7 @@ static struct TouchMoreScreen { struct ButtonWidget btns[TOUCHMORE_BTNS]; } TouchMoreScreen; -static struct Widget* touchMore_widgets[1 + TOUCHMORE_BTNS] = { - (struct Widget*)&TouchMoreScreen.back, (struct Widget*)&TouchMoreScreen.btns[0], - (struct Widget*)&TouchMoreScreen.btns[1], (struct Widget*)&TouchMoreScreen.btns[2], - (struct Widget*)&TouchMoreScreen.btns[3], (struct Widget*)&TouchMoreScreen.btns[4], - (struct Widget*)&TouchMoreScreen.btns[5] -}; +static struct Widget* touchMore_widgets[TOUCHMORE_BTNS + 1]; static void TouchMore_Take(void* s, void* w) { Gui_Remove((struct Screen*)&TouchMoreScreen); @@ -4393,11 +4369,12 @@ static void TouchMoreScreen_Layout(void* screen) { static void TouchMoreScreen_Init(void* screen) { struct TouchMoreScreen* s = (struct TouchMoreScreen*)screen; s->widgets = touchMore_widgets; - s->numWidgets = Array_Elems(touchMore_widgets); + s->numWidgets = 0; + s->maxWidgets = Array_Elems(touchMore_widgets); - Menu_InitButtons(s->btns, 195, touchMore_btns, 4); - Menu_InitButtons(s->btns + 4, 400, touchMore_btns + 4, 2); - ButtonWidget_Init(&s->back, 400, TouchMore_Game); + Menu_AddButtons(s, s->btns, 195, touchMore_btns, 4); + Menu_AddButtons(s, s->btns + 4, 400, touchMore_btns + 4, 2); + ButtonWidget_Add(s, &s->back, 400, TouchMore_Game); s->maxVertices = Screen_CalcDefaultMaxVertices(s); } diff --git a/src/Screens.c b/src/Screens.c index 3ca639c7f..dcf077933 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1581,9 +1581,7 @@ static struct InventoryScreen { cc_bool releasedInv, deferredSelect; } InventoryScreen; -static struct Widget* inventory_widgets[] = { - (struct Widget*)&InventoryScreen.title, (struct Widget*)&InventoryScreen.table -}; +static struct Widget* inventory_widgets[2]; static void InventoryScreen_GetTitleText(cc_string* desc, BlockID block) { @@ -1665,10 +1663,11 @@ static void InventoryScreen_MoveToSelected(struct InventoryScreen* s) { static void InventoryScreen_Init(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; s->widgets = inventory_widgets; - s->numWidgets = Array_Elems(inventory_widgets); + s->numWidgets = 0; + s->maxWidgets = Array_Elems(inventory_widgets); - TextWidget_Init(&s->title); - TableWidget_Create(&s->table, 22 * Options_GetFloat(OPT_INV_SCROLLBAR_SCALE, 0, 10, 1)); + TextWidget_Add(s, &s->title); + TableWidget_Add(s, &s->table, 22 * Options_GetFloat(OPT_INV_SCROLLBAR_SCALE, 0, 10, 1)); s->table.blocksPerRow = Inventory.BlocksPerRow; s->table.UpdateTitle = InventoryScreen_OnUpdateTitle; TableWidget_RecreateBlocks(&s->table); diff --git a/src/Widgets.c b/src/Widgets.c index 61fccc36c..14e2e956b 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -232,10 +232,6 @@ static const struct WidgetVTABLE ButtonWidget_VTABLE = { Widget_Pointer, Widget_PointerUp, Widget_PointerMove, ButtonWidget_BuildMesh, ButtonWidget_Render2, ButtonWidget_MaxVertices }; -void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick, cc_uint8 horAnchor, cc_uint8 verAnchor, int xOffset, int yOffset) { - ButtonWidget_Init(w, minWidth, onClick); - Widget_SetLocation(w, horAnchor, verAnchor, xOffset, yOffset); -} void ButtonWidget_Init(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick) { Widget_Reset(w); @@ -1015,7 +1011,7 @@ static const struct WidgetVTABLE TableWidget_VTABLE = { TableWidget_BuildMesh, TableWidget_Render2, TableWidget_MaxVertices, TableWidget_PadAxis }; -void TableWidget_Create(struct TableWidget* w, int sbWidth) { +void TableWidget_Add(void* screen, struct TableWidget* w, int sbWidth) { cc_bool classic; Widget_Reset(w); w->VTABLE = &TableWidget_VTABLE; @@ -1032,6 +1028,7 @@ void TableWidget_Create(struct TableWidget* w, int sbWidth) { w->everCreated = true; w->selectedIndex = -1; } + AddWidget(screen, w); classic = Gui.ClassicInventory; w->paddingL = Display_ScaleX(classic ? 20 : 15); diff --git a/src/Widgets.h b/src/Widgets.h index 93808d9dc..a3f340350 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -43,9 +43,6 @@ struct ButtonWidget { }; #define BUTTONWIDGET_MAX 12 -/* Initialises a button widget. */ -CC_NOINLINE void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick, - cc_uint8 horAnchor, cc_uint8 verAnchor, int xOffset, int yOffset); /* Initialises a button widget. */ CC_NOINLINE void ButtonWidget_Init(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick); /* Initialises then adds a button widget. */ @@ -116,7 +113,7 @@ struct TableWidget { int verticesCount; }; -CC_NOINLINE void TableWidget_Create(struct TableWidget* w, int sbWidth); +CC_NOINLINE void TableWidget_Add(void* screen, struct TableWidget* w, int sbWidth); /* Sets the selected block in the table to the given block. */ /* Also adjusts scrollbar and moves cursor to be over the given block. */ CC_NOINLINE void TableWidget_SetToBlock(struct TableWidget* w, BlockID block);