diff --git a/src/Gui.c b/src/Gui.c index 16346f88d..1cbf5a333 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -125,7 +125,7 @@ static void Gui_LoadOptions(void) { Gui_ShowFPS = Options_GetBool(OPT_SHOW_FPS, true); } -static void Gui_FontChanged(void* obj) { Gui_Refresh(); } +static void Gui_FontChanged(void* obj) { Gui_RefreshAll(); } static void Gui_FileChanged(void* obj, struct Stream* stream, const String* name) { if (String_CaselessEqualsConst(name, "gui.png")) { @@ -209,7 +209,7 @@ void Gui_SetActive(struct Screen* screen) { Camera_CheckFocus(); } -void Gui_Refresh(void) { +void Gui_RefreshAll(void) { Gui_ContextLost(NULL); Gui_ContextRecreated(NULL); } @@ -312,18 +312,6 @@ struct Screen* Gui_GetClosable(void) { return NULL; } -void Gui_ShowOverlay(struct Screen* screen) { - if (Gui_OverlaysCount == GUI_MAX_OVERLAYS) { - Logger_Abort("Gui_ShowOverlay - hit max count"); - } - - Gui_Overlays[Gui_OverlaysCount] = screen; - Gui_OverlaysCount++; - - Elem_Init(screen); - Camera_CheckFocus(); -} - int Gui_IndexOverlay(const void* screen) { int i; diff --git a/src/Gui.h b/src/Gui.h index c6d04b603..1f25a0810 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -159,9 +159,8 @@ struct Screen* Gui_GetBlocksWorld(void); /* Returns highest priority screen that is closable. */ struct Screen* Gui_GetClosable(void); -void Gui_Refresh(void); +void Gui_RefreshAll(void); void Gui_RefreshHud(void); -void Gui_ShowOverlay(struct Screen* screen); /* Returns index of the given screen in the overlays list, -1 if not */ int Gui_IndexOverlay(const void* screen); /* Removes given screen from the overlays list */ diff --git a/src/InputHandler.c b/src/InputHandler.c index fe7234356..301e901b7 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -173,7 +173,7 @@ static bool InputHandler_HandleNonClassicKey(Key key) { } } else if (key == KeyBinds[KEYBIND_IDOVERLAY]) { if (Gui_OverlaysCount) return true; - Gui_ShowOverlay(TexIdsOverlay_MakeInstance()); + TexIdsOverlay_Show(); } else if (key == KeyBinds[KEYBIND_BREAK_LIQUIDS]) { InputHandler_Toggle(key, &Game_BreakableLiquids, " &eBreakable liquids is &aenabled", diff --git a/src/Menus.c b/src/Menus.c index 5ac1c2615..3fa7e5441 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -44,25 +44,6 @@ struct MenuOptionDesc { }; struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; }; -struct UrlWarningOverlay { - MenuScreen_Layout - bool openingUrl; - String url; - struct ButtonWidget buttons[2]; - struct TextWidget labels[4]; - char _urlBuffer[STRING_SIZE * 4]; -}; - -struct TexPackOverlay { - MenuScreen_Layout - bool showingDeny, alwaysDeny; - uint32_t contentLength; - String identifier; - struct ButtonWidget buttons[4]; - struct TextWidget labels[4]; - char _identifierBuffer[STRING_SIZE + 4]; -}; - /*########################################################################################################################* *--------------------------------------------------------Menu base--------------------------------------------------------* @@ -98,6 +79,21 @@ static void Menu_Back(void* s, int i, struct ButtonWidget* btn, const char* labe Menu_Button(s, i, btn, width, &msg, font, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); } +CC_NOINLINE static void Menu_MakeBack(struct ButtonWidget* btn, Widget_LeftClick onClick) { + int width = Gui_ClassicMenu ? 400 : 200; + ButtonWidget_Make(btn, width, onClick); + Widget_SetLocation(btn, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); +} + +CC_NOINLINE static void Menu_MakeTitleFont(FontDesc* font) { + Drawer2D_MakeFont(font, 16, FONT_STYLE_BOLD); +} + +CC_NOINLINE static void Menu_MakeBodyFont(FontDesc* font) { + Drawer2D_MakeFont(font, 16, FONT_STYLE_NORMAL); +} + + static void Menu_ContextLost(void* screen) { struct Menu* s = (struct Menu*)screen; struct Widget** widgets = s->widgets; @@ -122,7 +118,7 @@ static void Menu_OnResize(void* screen) { } } -static void Menu_Render(void* screen, double delta) { +static void Menu_RenderWidgets(void* screen, double delta) { struct Menu* s = (struct Menu*)screen; struct Widget** widgets = s->widgets; int i; @@ -229,7 +225,7 @@ static float Menu_Float(const String* str) { float v; Convert_ParseFloat(st static PackedCol Menu_HexCol(const String* str) { PackedCol v; PackedCol_TryParseHex(str, &v); return v; } #define Menu_ReplaceActive(screen) Gui_FreeActive(); Gui_SetActive(screen); -static void Menu_SwitchOptions(void* a, void* b) { Menu_ReplaceActive(OptionsGroupScreen_MakeInstance()); } +static void Menu_SwitchOptions(void* a, void* b) { OptionsGroupScreen_Show(); } static void Menu_SwitchPause(void* a, void* b) { PauseScreen_Show(); } static void Menu_SwitchClassicOptions(void* a, void* b) { Menu_ReplaceActive(ClassicOptionsScreen_MakeInstance()); } @@ -349,11 +345,10 @@ static void ListScreen_ContextRecreated(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; ListScreen_RedrawEntries(s); - ButtonWidget_SetConst(&s->left, "<", &s->font); - ButtonWidget_SetConst(&s->right, ">", &s->font); + ButtonWidget_SetConst(&s->left, "<", &s->font); + ButtonWidget_SetConst(&s->right, ">", &s->font); TextWidget_SetConst(&s->title, s->titleText, &s->font); - - Menu_Back(s, 7, &s->buttons[7], "Done", &s->font, Menu_SwitchPause); + ButtonWidget_SetConst(&s->done, "Done", &s->font); ListScreen_UpdatePage(s); } @@ -420,20 +415,21 @@ static void ListScreen_Init(void* screen) { ButtonWidget_Make(&s->right, 40, ListScreen_MoveForwards); TextWidget_Make(&s->title); TextWidget_Make(&s->page); + Menu_MakeBack(&s->done, Menu_SwitchPause); Widget_SetLocation(&s->left, ANCHOR_CENTRE, ANCHOR_CENTRE, -220, 0); Widget_SetLocation(&s->right, ANCHOR_CENTRE, ANCHOR_CENTRE, 220, 0); Widget_SetLocation(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -155); Widget_SetLocation(&s->page, ANCHOR_CENTRE, ANCHOR_MAX, 0, 75); - Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_BOLD); + Menu_MakeTitleFont(&s->font); s->LoadEntries(s); } static void ListScreen_Render(void* screen, double delta) { Menu_RenderBounds(); Gfx_SetTexturing(true); - Menu_Render(screen, delta); + Menu_RenderWidgets(screen, delta); Gfx_SetTexturing(false); } @@ -499,7 +495,7 @@ static void MenuScreen_Init(void* screen) { static void MenuScreen_Render(void* screen, double delta) { Menu_RenderBounds(); Gfx_SetTexturing(true); - Menu_Render(screen, delta); + Menu_RenderWidgets(screen, delta); Gfx_SetTexturing(false); } @@ -703,7 +699,7 @@ static struct ScreenVTABLE OptionsGroupScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, OptionsGroupScreen_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, OptionsGroupScreen_ContextRecreated, }; -struct Screen* OptionsGroupScreen_MakeInstance(void) { +void OptionsGroupScreen_Show(void) { static struct Widget* widgets[9]; struct OptionsGroupScreen* s = &OptionsGroupScreen_Instance; @@ -714,7 +710,7 @@ struct Screen* OptionsGroupScreen_MakeInstance(void) { s->VTABLE = &OptionsGroupScreen_VTABLE; s->selectedI = -1; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -2876,6 +2872,7 @@ static bool WarningOverlay_IsAlways(void* screen, void* w) { return Menu_Index(s *#########################################################################################################################*/ #define TEXID_OVERLAY_MAX_PER_PAGE (ATLAS2D_TILES_PER_ROW * ATLAS2D_TILES_PER_ROW) #define TEXID_OVERLAY_VERTICES_COUNT (TEXID_OVERLAY_MAX_PER_PAGE * 4) + static struct TexIdsOverlay { MenuScreen_Layout GfxResourceID dynamicVb; @@ -2987,7 +2984,7 @@ static void TexIdsOverlay_Render(void* screen, double delta) { Menu_RenderBounds(); Gfx_SetTexturing(true); Gfx_SetVertexFormat(VERTEX_FORMAT_P3FT2FC4B); - Menu_Render(s, delta); + Menu_RenderWidgets(s, delta); origXOffset = s->xOffset; s->baseTexLoc = 0; @@ -3019,7 +3016,7 @@ static struct ScreenVTABLE TexIdsOverlay_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated, }; -struct Screen* TexIdsOverlay_MakeInstance(void) { +void TexIdsOverlay_Show(void) { static struct Widget* widgets[1]; struct TexIdsOverlay* s = &TexIdsOverlay_Instance; @@ -3029,14 +3026,22 @@ struct Screen* TexIdsOverlay_MakeInstance(void) { s->widgetsCount = Array_Elems(widgets); s->VTABLE = &TexIdsOverlay_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_TEXIDS); } /*########################################################################################################################* *----------------------------------------------------UrlWarningOverlay----------------------------------------------------* *#########################################################################################################################*/ -static struct UrlWarningOverlay UrlWarningOverlay_Instance; +static struct UrlWarningOverlay { + MenuScreen_Layout + bool openingUrl; + String url; + struct ButtonWidget buttons[2]; + struct TextWidget labels[4]; + char _urlBuffer[STRING_SIZE * 4]; +} UrlWarningOverlay_Instance; + static void UrlWarningOverlay_OpenUrl(void* screen, void* b) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; if (s->openingUrl) return; @@ -3080,7 +3085,7 @@ static struct ScreenVTABLE UrlWarningOverlay_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, UrlWarningOverlay_ContextRecreated, }; -struct Screen* UrlWarningOverlay_MakeInstance(const String* url) { +void UrlWarningOverlay_Show(const String* url) { static struct Widget* widgets[6]; struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance; @@ -3093,14 +3098,23 @@ struct Screen* UrlWarningOverlay_MakeInstance(const String* url) { String_Copy(&s->url, url); s->VTABLE = &UrlWarningOverlay_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_URLWARNING); } /*########################################################################################################################* *-----------------------------------------------------TexPackOverlay------------------------------------------------------* *#########################################################################################################################*/ -static struct TexPackOverlay TexPackOverlay_Instance; +static struct TexPackOverlay { + MenuScreen_Layout + bool showingDeny, alwaysDeny; + uint32_t contentLength; + String identifier; + struct ButtonWidget buttons[4]; + struct TextWidget labels[4]; + char _identifierBuffer[STRING_SIZE + 4]; +} TexPackOverlay_Instance; + static void TexPackOverlay_YesClick(void* screen, void* widget) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; String url = String_UNSAFE_SubstringAt(&s->identifier, 3); @@ -3217,15 +3231,10 @@ static struct ScreenVTABLE TexPackOverlay_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, TexPackOverlay_ContextRecreated, }; -struct Screen* TexPackOverlay_MakeInstance(const String* url) { +void TexPackOverlay_Show(const String* url) { static struct Widget* widgets[8]; struct TexPackOverlay* s = &TexPackOverlay_Instance; - /* If we are showing this texture pack overlay, completely free it first */ - /* It doesn't matter anymore, because the new texture pack URL will always */ - /* replace/override the old texture pack URL associated with that overlay */ - if (Gui_IndexOverlay(s) >= 0) { Elem_Free(s); } - s->showingDeny = false; s->grabsInput = true; s->closable = true; @@ -3238,5 +3247,5 @@ struct Screen* TexPackOverlay_MakeInstance(const String* url) { Http_AsyncGetHeaders(url, true, &s->identifier); s->VTABLE = &TexPackOverlay_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_TEXPACK); } diff --git a/src/Menus.h b/src/Menus.h index 9a94fa173..0ff13bbfc 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -8,7 +8,7 @@ struct Screen; void PauseScreen_Show(void); -struct Screen* OptionsGroupScreen_MakeInstance(void); +void OptionsGroupScreen_Show(void); struct Screen* ClassicOptionsScreen_MakeInstance(void); struct Screen* ClassicKeyBindingsScreen_MakeInstance(void); @@ -33,7 +33,7 @@ struct Screen* HacksSettingsScreen_MakeInstance(void); struct Screen* EnvSettingsScreen_MakeInstance(void); struct Screen* NostalgiaScreen_MakeInstance(void); -struct Screen* UrlWarningOverlay_MakeInstance(const String* url); -struct Screen* TexIdsOverlay_MakeInstance(void); -struct Screen* TexPackOverlay_MakeInstance(const String* url); +void UrlWarningOverlay_Show(const String* url); +void TexIdsOverlay_Show(void); +void TexPackOverlay_Show(const String* url); #endif diff --git a/src/Screens.c b/src/Screens.c index 701282ba3..c798d4079 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1156,7 +1156,7 @@ static bool HUDScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { if (!text.length) return false; if (Utils_IsUrlPrefix(&text)) { - Gui_ShowOverlay(UrlWarningOverlay_MakeInstance(&text)); + UrlWarningOverlay_Show(&text); } else if (Gui_ClickableChat) { InputWidget_AppendString(&s->input.base, &text); } diff --git a/src/Server.c b/src/Server.c index 60af98019..fae2f96f1 100644 --- a/src/Server.c +++ b/src/Server.c @@ -46,7 +46,7 @@ void Server_RetrieveTexturePack(const String* url) { if (!url->length || TextureCache_HasAccepted(url)) { World_ApplyTexturePack(url); } else { - Gui_ShowOverlay(TexPackOverlay_MakeInstance(url)); + TexPackOverlay_Show(url); } }