From 9eefb24253180ee27c553f824fe3a97d8a630162 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 10 Aug 2019 17:08:42 +1000 Subject: [PATCH 01/46] Phase 1 of screens rewrite --- src/Camera.c | 5 +-- src/Entity.c | 2 +- src/Game.c | 5 +-- src/Gui.c | 88 ++++++++++++++++++++++++++++++++--------- src/Gui.h | 45 ++++++++++++++------- src/InputHandler.c | 7 ++-- src/Menus.c | 98 +++++++++++++++++++++++----------------------- src/Protocol.c | 12 +----- src/Screens.c | 61 +++++++++++++++-------------- src/Server.c | 3 -- src/Server.h | 4 +- 11 files changed, 190 insertions(+), 140 deletions(-) diff --git a/src/Camera.c b/src/Camera.c index b56a2d10f..2f19b2b73 100644 --- a/src/Camera.c +++ b/src/Camera.c @@ -97,8 +97,7 @@ static void PerspectiveCamera_UpdateMouseRotation(double delta) { } static void PerspectiveCamera_UpdateMouse(double delta) { - struct Screen* s = Gui_GetActiveScreen(); - if (!s->handlesAllInput && Window_Focused) Window_UpdateRawMouse(); + if (!Gui_GetInputGrab() && Window_Focused) Window_UpdateRawMouse(); PerspectiveCamera_UpdateMouseRotation(delta); cam_deltaX = 0; cam_deltaY = 0; @@ -273,7 +272,7 @@ void Camera_Register(struct Camera* cam) { static bool cam_focussed; void Camera_CheckFocus(void) { - bool focus = !Gui_GetActiveScreen()->handlesAllInput; + bool focus = Gui_GetInputGrab() == NULL; if (focus == cam_focussed) return; cam_focussed = focus; diff --git a/src/Entity.c b/src/Entity.c index 3fb424b14..8d6cfd8da 100644 --- a/src/Entity.c +++ b/src/Entity.c @@ -781,7 +781,7 @@ static void LocalPlayer_HandleInput(float* xMoving, float* zMoving) { struct LocalPlayer* p = &LocalPlayer_Instance; struct HacksComp* hacks = &p->Hacks; - if (Gui_GetActiveScreen()->handlesAllInput) { + if (Gui_GetInputGrab()) { p->Physics.Jumping = false; hacks->Speeding = false; hacks->FlyingUp = false; hacks->FlyingDown = false; } else { diff --git a/src/Game.c b/src/Game.c index 9d6df282a..904a0b502 100644 --- a/src/Game.c +++ b/src/Game.c @@ -177,7 +177,6 @@ void Game_UpdateProjection(void) { void Game_Disconnect(const String* title, const String* reason) { Event_RaiseVoid(&NetEvents.Disconnected); - Gui_FreeActive(); DisconnectScreen_Show(title, reason); Game_Reset(); } @@ -637,12 +636,12 @@ static void Game_RenderFrame(double delta) { Game_Vertices = 0; Camera.Active->UpdateMouse(delta); - if (!Window_Focused && !Gui_GetActiveScreen()->handlesAllInput) { + if (!Window_Focused && !Gui_GetInputGrab()) { Gui_FreeActive(); Gui_SetActive(PauseScreen_MakeInstance()); } - allowZoom = !Gui_Active && !Gui_HUD->handlesAllInput; + allowZoom = !Gui_Active && !Gui_HUD->grabsInput; if (allowZoom && KeyBind_IsPressed(KEYBIND_ZOOM_SCROLL)) { InputHandler_SetFOV(Game_ZoomFov); } diff --git a/src/Gui.c b/src/Gui.c index 172473621..1b26d4ae2 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -21,7 +21,9 @@ struct Screen* Gui_Status; struct Screen* Gui_HUD; struct Screen* Gui_Active; struct Screen* Gui_Overlays[GUI_MAX_OVERLAYS]; -int Gui_OverlaysCount; +struct Screen* Gui_Screens[GUI_MAX_SCREENS]; +int Gui_ScreensCount, Gui_OverlaysCount; +static uint8_t priorities[GUI_MAX_SCREENS]; void Gui_DefaultRecreate(void* elem) { struct GuiElem* e = (struct GuiElem*)elem; @@ -147,9 +149,7 @@ static void Gui_Free(void) { Event_UnregisterVoid(&ChatEvents.FontChanged, NULL, Gui_FontChanged); Event_UnregisterEntry(&TextureEvents.FileChanged, NULL, Gui_FileChanged); - if (Gui_Active) Elem_TryFree(Gui_Active); - Elem_TryFree(Gui_Status); - Elem_TryFree(Gui_HUD); + while (Gui_ScreensCount) Gui_Remove(Gui_Screens[0]); Gfx_DeleteTexture(&Gui_GuiTex); Gfx_DeleteTexture(&Gui_GuiClassicTex); @@ -197,6 +197,64 @@ void Gui_SetActive(struct Screen* screen) { } void Gui_RefreshHud(void) { Elem_Recreate(Gui_HUD); } +int Gui_Index(struct Screen* screen) { + int i; + for (i = 0; i < Gui_ScreensCount; i++) { + if (Gui_Screens[i] == screen) return i; + } + return -1; +} + +void Gui_Add(struct Screen* screen, int priority) { + int i, j; + if (Gui_ScreensCount >= GUI_MAX_SCREENS) Logger_Abort("Hit max screens"); + + for (i = 0; i < Gui_ScreensCount; i++) { + if (priority <= priorities[i]) continue; + + /* Shift lower priority screens right */ + for (j = i + 1; j <= Gui_ScreensCount; i++) { + Gui_Screens[j] = Gui_Screens[j - 1]; + priorities[j] = priorities[j - 1]; + } + break; + } + + Gui_Screens[i] = screen; + priorities[i] = priority; + Gui_ScreensCount++; + + Elem_Init(screen); + /* for selecting active button etc */ + Elem_HandlesMouseMove(screen, Mouse_X, Mouse_Y); +} + +void Gui_Remove(struct Screen* screen) { + int i = Gui_Index(screen); + if (i == -1) return; + + for (; i < Gui_ScreensCount - 1; i++) { + Gui_Screens[i] = Gui_Screens[i + 1]; + priorities[i] = priorities[i + 1]; + } + Gui_ScreensCount--; + + Elem_Free(screen); +} + +void Gui_Replace(struct Screen* screen, int priority) { + Gui_Remove(screen); + Gui_Add(screen, priority); +} + +struct Screen* Gui_GetInputGrab(void) { + int i; + for (i = 0; i < Gui_ScreensCount; i++) { + if (Gui_Screens[i]->grabsInput) return Gui_Screens[i]; + } + return NULL; +} + void Gui_ShowOverlay(struct Screen* screen) { if (Gui_OverlaysCount == GUI_MAX_OVERLAYS) { Logger_Abort("Gui_ShowOverlay - hit max count"); @@ -232,28 +290,20 @@ void Gui_RemoveOverlay(const void* screen) { } void Gui_RenderGui(double delta) { - bool showHUD, hudBefore; + int i; Gfx_Mode2D(Game.Width, Game.Height); - showHUD = !Gui_Active || !Gui_Active->hidesHUD; - hudBefore = !Gui_Active || !Gui_Active->renderHUDOver; - if (showHUD) { Elem_Render(Gui_Status, delta); } - - if (showHUD && hudBefore) { Elem_Render(Gui_HUD, delta); } - if (Gui_Active) { Elem_Render(Gui_Active, delta); } - if (showHUD && !hudBefore) { Elem_Render(Gui_HUD, delta); } - - if (Gui_OverlaysCount) { Elem_Render(Gui_Overlays[0], delta); } + /* Draw back to front so highest priority screen is on top */ + for (i = Gui_ScreensCount - 1; i >= 0; i--) { + Elem_Render(Gui_Screens[i], delta); + } Gfx_Mode3D(); } void Gui_OnResize(void) { int i; - if (Gui_Active) { Screen_OnResize(Gui_Active); } - Screen_OnResize(Gui_HUD); - - for (i = 0; i < Gui_OverlaysCount; i++) { - Screen_OnResize(Gui_Overlays[i]); + for (i = 0; i < Gui_ScreensCount; i++) { + Screen_OnResize(Gui_Screens[i]); } } diff --git a/src/Gui.h b/src/Gui.h index 099e70921..c65e7b895 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -59,11 +59,10 @@ struct ScreenVTABLE { Event_Void_Callback ContextRecreated; }; #define Screen_Layout struct ScreenVTABLE* VTABLE; \ - bool handlesAllInput; /* Whether this screen handles all input. Prevents user interacting with the world. */ \ - bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ - bool hidesHUD; /* Whether this screen hides the normal in-game HUD. */ \ - bool renderHUDOver; /* Whether the normal in-game HUD should be drawn over the top of this screen. */ \ - bool closable; /* Whether this screen is automatically closed when pressing Escape */ + bool grabsInput; /* Whether this screen grabs input. Causes the cursor to become visible. */ \ + bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ + bool inactive; /* Whether this screen is prevented from rendering and receiving input. */ \ + bool closable; /* Whether this screen is automatically closed when pressing Escape */ /* Represents a container of widgets and other 2D elements. May cover entire window. */ struct Screen { Screen_Layout }; @@ -97,23 +96,27 @@ bool Widget_Contains(void* widget, int x, int y); extern GfxResourceID Gui_GuiTex, Gui_GuiClassicTex, Gui_IconsTex; +/* Higher priority handles input first and draws on top */ enum GuiPriority { - GUI_PRIORITY_STATUS = 1, - GUI_PRIORITY_DISCONNECT = 3, - GUI_PRIORITY_URLWARNING = 5, - GUI_PRIORITY_TEXPACK = 7, - GUI_PRIORITY_TEXIDS = 9, - GUI_PRIORITY_MENU = 11, - GUI_PRIORITY_INVENTORY = 13, - GUI_PRIORITY_HUD = 15, - GUI_PRIORITY_LOADING = 17, + GUI_PRIORITY_DISCONNECT = 45, + GUI_PRIORITY_STATUS = 40, + GUI_PRIORITY_URLWARNING = 35, + GUI_PRIORITY_TEXPACK = 30, + GUI_PRIORITY_TEXIDS = 25, + GUI_PRIORITY_MENU = 20, + GUI_PRIORITY_INVENTORY = 15, + GUI_PRIORITY_HUD = 10, + GUI_PRIORITY_LOADING = 5, }; extern struct Screen* Gui_Status; extern struct Screen* Gui_HUD; extern struct Screen* Gui_Active; +#define GUI_MAX_SCREENS 10 #define GUI_MAX_OVERLAYS 4 extern struct Screen* Gui_Overlays[GUI_MAX_OVERLAYS]; +extern struct Screen* Gui_Screens[GUI_MAX_SCREENS]; +extern int Gui_ScreensCount; extern int Gui_OverlaysCount; /* Calculates position of an element on a particular axis */ @@ -139,7 +142,19 @@ CC_NOINLINE void Gui_CloseActive(void); /* Frees the given screen, and if == Gui_Active, calls Gui_SetActive(NULL) */ CC_NOINLINE void Gui_Close(void* screen); -void Gui_RefreshHud(void); +/* Returns index of the given screen in the screens list, -1 if not */ +int Gui_Index(struct Screen* screen); +/* Inserts a screen into the screen lists with the given priority. */ +/* NOTE: You MUST ensure a screen isn't added twice. Or use Gui_Replace. */ +void Gui_Add(struct Screen* screen, int priority); +/* Removes the screen from the screens list. */ +void Gui_Remove(struct Screen* screen); +/* Shorthand for Gui_Remove then Gui_Add. */ +void Gui_Replace(struct Screen* screen, int priority); +/* Returns the screen that has grabbed input, else NULL. */ +struct Screen* Gui_GetInputGrab(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); diff --git a/src/InputHandler.c b/src/InputHandler.c index 614233dbd..2536742ca 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -63,7 +63,7 @@ static void InputHandler_ButtonStateChanged(MouseButton button, bool pressed) { } void InputHandler_ScreenChanged(struct Screen* oldScreen, struct Screen* newScreen) { - if (oldScreen && oldScreen->handlesAllInput) { + if (oldScreen && oldScreen->grabsInput) { input_lastClick = DateTime_CurrentUTC_MS(); } @@ -331,16 +331,15 @@ void InputHandler_PickBlocks(bool cooldown, bool left, bool middle, bool right) if (cooldown && delta < 250) return; /* 4 times per second */ input_lastClick = now; + if (Gui_GetInputGrab()) return; - if (Server.SupportsPlayerClick && !Gui_GetActiveScreen()->handlesAllInput) { + if (Server.SupportsPlayerClick) { input_pickingId = -1; InputHandler_ButtonStateChanged(MOUSE_LEFT, left); InputHandler_ButtonStateChanged(MOUSE_RIGHT, right); InputHandler_ButtonStateChanged(MOUSE_MIDDLE, middle); } - if (Gui_GetActiveScreen()->handlesAllInput) return; - if (left) { /* always play delete animations, even if we aren't picking a block */ HeldBlockRenderer_ClickAnim(true); diff --git a/src/Menus.c b/src/Menus.c index 4d1f237c5..785c5dc56 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -543,10 +543,10 @@ static struct ScreenVTABLE ListScreen_VTABLE = { struct ListScreen* ListScreen_MakeInstance(void) { struct ListScreen* s = &ListScreen_Instance; StringsBuffer_Clear(&s->entries); - s->handlesAllInput = true; - s->closable = true; - s->widgetsCount = 0; - s->currentIndex = 0; + s->grabsInput = true; + s->closable = true; + s->widgetsCount = 0; + s->currentIndex = 0; s->UpdateEntry = ListScreen_UpdateEntry; s->VTABLE = &ListScreen_VTABLE; @@ -675,10 +675,10 @@ struct Screen* PauseScreen_MakeInstance(void) { static struct Widget* widgets[8]; struct PauseScreen* s = &PauseScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &PauseScreen_VTABLE; return (struct Screen*)s; @@ -774,10 +774,10 @@ struct Screen* OptionsGroupScreen_MakeInstance(void) { static struct Widget* widgets[9]; struct OptionsGroupScreen* s = &OptionsGroupScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &OptionsGroupScreen_VTABLE; s->selectedI = -1; @@ -986,10 +986,10 @@ struct Screen* EditHotkeyScreen_MakeInstance(struct HotkeyData original) { static struct Widget* widgets[7]; struct EditHotkeyScreen* s = &EditHotkeyScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &EditHotkeyScreen_VTABLE; s->selectedI = -1; @@ -1147,10 +1147,10 @@ struct Screen* GenLevelScreen_MakeInstance(void) { static struct Widget* widgets[12]; struct GenLevelScreen* s = &GenLevelScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &GenLevelScreen_VTABLE; return (struct Screen*)s; @@ -1198,10 +1198,10 @@ struct Screen* ClassicGenScreen_MakeInstance(void) { static struct Widget* widgets[4]; struct ClassicGenScreen* s = &ClassicGenScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &ClassicGenScreen_VTABLE; return (struct Screen*)s; @@ -1356,10 +1356,10 @@ struct Screen* SaveLevelScreen_MakeInstance(void) { static struct Widget* widgets[6]; struct SaveLevelScreen* s = &SaveLevelScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &SaveLevelScreen_VTABLE; return (struct Screen*)s; @@ -1719,10 +1719,10 @@ static struct KeyBindingsScreen* KeyBindingsScreen_Make(int bindsCount, uint8_t* static struct Widget* widgets[12 + 4]; struct KeyBindingsScreen* s = &KeyBindingsScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = bindsCount + 4; + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = bindsCount + 4; s->VTABLE = &KeyBindingsScreen_VTABLE; s->VTABLE->ContextRecreated = contextRecreated; @@ -2151,10 +2151,10 @@ static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { struct Screen* MenuOptionsScreen_MakeInstance(struct Widget** widgets, int count, struct ButtonWidget* buttons, Event_Void_Callback contextRecreated, struct MenuInputDesc* descs, const char** descriptions, int descsCount) { struct MenuOptionsScreen* s = &MenuOptionsScreen_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = count; + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = count; s->extHelp.lines = 0; s->VTABLE = &MenuOptionsScreen_VTABLE; @@ -3072,10 +3072,10 @@ struct Screen* TexIdsOverlay_MakeInstance(void) { static struct Widget* widgets[1]; struct TexIdsOverlay* s = &TexIdsOverlay_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); s->VTABLE = &TexIdsOverlay_VTABLE; return (struct Screen*)s; @@ -3133,10 +3133,10 @@ struct Screen* UrlWarningOverlay_MakeInstance(const String* url) { static struct Widget* widgets[6]; struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); String_InitArray(s->url, s->_urlBuffer); String_Copy(&s->url, url); @@ -3275,11 +3275,11 @@ struct Screen* TexPackOverlay_MakeInstance(const String* url) { /* replace/override the old texture pack URL associated with that overlay */ if (Gui_IndexOverlay(s) >= 0) { Elem_Free(s); } - s->showingDeny = false; - s->handlesAllInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->showingDeny = false; + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); String_InitArray(s->identifier, s->_identifierBuffer); String_Format1(&s->identifier, "CL_%s", url); diff --git a/src/Protocol.c b/src/Protocol.c index 50b0e7165..18e0c2047 100644 --- a/src/Protocol.c +++ b/src/Protocol.c @@ -27,7 +27,6 @@ /* Classic state */ static uint8_t classic_tabList[ENTITIES_MAX_COUNT >> 3]; -static struct Screen* classic_prevScreen; static bool classic_receivedFirstPos; /* Map state */ @@ -424,13 +423,6 @@ static void Classic_StartLoading(void) { Event_RaiseVoid(&WorldEvents.NewMap); Stream_ReadonlyMemory(&map_part, NULL, 0); - classic_prevScreen = Gui_Active; - if (classic_prevScreen == LoadingScreen_UNSAFE_RawPointer) { - /* otherwise replacing LoadingScreen with LoadingScreen will cause issues */ - Gui_FreeActive(); - classic_prevScreen = NULL; - } - LoadingScreen_Show(&Server.Name, &Server.MOTD); WoM_CheckMotd(); classic_receivedFirstPos = false; @@ -511,9 +503,7 @@ static void Classic_LevelFinalise(uint8_t* data) { int width, height, length; int loadingMs; - Gui_CloseActive(); - Gui_Active = classic_prevScreen; - classic_prevScreen = NULL; + Gui_Remove(LoadingScreen_UNSAFE_RawPointer); Camera_CheckFocus(); loadingMs = (int)(DateTime_CurrentUTC_MS() - map_receiveStart); diff --git a/src/Screens.c b/src/Screens.c index e7be6ef39..4932364ba 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -205,11 +205,11 @@ static struct ScreenVTABLE InventoryScreen_VTABLE = { }; void InventoryScreen_Show(void) { struct InventoryScreen* s = &InventoryScreen_Instance; - s->handlesAllInput = true; - s->closable = true; + s->grabsInput = true; + s->closable = true; s->VTABLE = &InventoryScreen_VTABLE; - Gui_SetActive((struct Screen*)s); + Gui_Replace((struct Screen*)s, GUI_PRIORITY_INVENTORY); } struct Screen* InventoryScreen_UNSAFE_RawPointer = (struct Screen*)&InventoryScreen_Instance; @@ -415,10 +415,9 @@ static struct ScreenVTABLE StatusScreen_VTABLE = { }; void StatusScreen_Show(void) { struct StatusScreen* s = &StatusScreen_Instance; - s->handlesAllInput = false; - s->VTABLE = &StatusScreen_VTABLE; - Gui_Status = (struct Screen*)s; + Gui_Status =(struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_STATUS); } @@ -485,7 +484,7 @@ static bool LoadingScreen_KeyUp(void* screen, Key key) { } static bool LoadingScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { - if (Gui_HUD->handlesAllInput) { Elem_HandlesMouseDown(Gui_HUD, x, y, btn); } + if (Gui_HUD->grabsInput) { Elem_HandlesMouseDown(Gui_HUD, x, y, btn); } return true; } @@ -591,9 +590,8 @@ CC_NOINLINE static void LoadingScreen_Reset(const String* title, const String* m String_InitArray(s->messageStr, s->_messageBuffer); String_AppendString(&s->messageStr, message); - s->handlesAllInput = true; - s->blocksWorld = true; - s->renderHUDOver = true; + s->grabsInput = true; + s->blocksWorld = true; } static struct ScreenVTABLE LoadingScreen_VTABLE = { @@ -605,7 +603,7 @@ static struct ScreenVTABLE LoadingScreen_VTABLE = { void LoadingScreen_Show(const String* title, const String* message) { LoadingScreen_Reset(title, message); LoadingScreen_Instance.VTABLE = &LoadingScreen_VTABLE; - Gui_SetActive((struct Screen*)&LoadingScreen_Instance); + Gui_Replace((struct Screen*)&LoadingScreen_Instance, GUI_PRIORITY_LOADING); } struct Screen* LoadingScreen_UNSAFE_RawPointer = (struct Screen*)&LoadingScreen_Instance; @@ -679,7 +677,7 @@ void GeneratingScreen_Show(void) { LoadingScreen_Reset(&title, &message); LoadingScreen_Instance.VTABLE = &GeneratingScreen_VTABLE; - Gui_SetActive((struct Screen*)&LoadingScreen_Instance); + Gui_Replace((struct Screen*)&LoadingScreen_Instance, GUI_PRIORITY_LOADING); } @@ -785,7 +783,7 @@ static void HUDScreen_SetInitialMessages(struct HUDScreen* s) { TextGroupWidget_RedrawAll(&s->bottomRight); TextGroupWidget_RedrawAll(&s->clientStatus); - if (s->handlesAllInput) HUDScreen_OpenInput(&chatInputStr); + if (s->grabsInput) HUDScreen_OpenInput(&chatInputStr); } static void HUDScreen_UpdateChatYOffset(struct HUDScreen* s, bool force) { @@ -829,7 +827,7 @@ static void HUDScreen_EnterChatInput(struct HUDScreen* s, bool close) { struct InputWidget* input; int defaultIndex; - s->handlesAllInput = false; + s->grabsInput = false; Camera_CheckFocus(); if (close) InputWidget_Clear(&s->input.base); @@ -970,7 +968,7 @@ static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) { } now = DateTime_CurrentUTC_MS(); - if (s->handlesAllInput) { + if (s->grabsInput) { Elem_Render(&s->chat, delta); } else { /* Only render recent chat */ @@ -985,7 +983,7 @@ static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) { } Elem_Render(&s->announcement, delta); - if (s->handlesAllInput) { + if (s->grabsInput) { Elem_Render(&s->input.base, delta); if (s->altText.active) { Elem_Render(&s->altText, delta); @@ -1001,7 +999,7 @@ static void HUDScreen_ContextLost(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; Elem_TryFree(&s->hotbar); - if (s->handlesAllInput) { + if (s->grabsInput) { String_Copy(&chatInputStr, &s->input.base.text); /* TODO: Why are we checking camera here */ Camera_CheckFocus(); @@ -1056,7 +1054,7 @@ static void HUDScreen_OnResize(void* screen) { static bool HUDScreen_KeyPress(void* screen, char keyChar) { struct HUDScreen* s = (struct HUDScreen*)screen; - if (!s->handlesAllInput) return false; + if (!s->grabsInput) return false; if (s->suppressNextPress) { s->suppressNextPress = false; @@ -1072,7 +1070,7 @@ static bool HUDScreen_KeyDown(void* screen, Key key, bool was) { static const String slash = String_FromConst("/"); struct HUDScreen* s = (struct HUDScreen*)screen; Key playerListKey = KeyBinds[KEYBIND_PLAYER_LIST]; - bool handlesList = playerListKey != KEY_TAB || !Gui_TabAutocomplete || !s->handlesAllInput; + bool handlesList = playerListKey != KEY_TAB || !Gui_TabAutocomplete || !s->grabsInput; if (key == playerListKey && handlesList) { if (!s->showingList && !Server.IsSinglePlayer) { @@ -1084,7 +1082,7 @@ static bool HUDScreen_KeyDown(void* screen, Key key, bool was) { s->suppressNextPress = false; /* Handle chat text input */ - if (s->handlesAllInput) { + if (s->grabsInput) { #ifdef CC_BUILD_WEB /* See reason for this in InputHandler_KeyUp */ if (key == KeyBinds[KEYBIND_SEND_CHAT] || key == KEY_KP_ENTER) { @@ -1123,7 +1121,7 @@ static bool HUDScreen_KeyUp(void* screen, Key key) { return true; } - if (!s->handlesAllInput) return Elem_HandlesKeyUp(&s->hotbar, key); + if (!s->grabsInput) return Elem_HandlesKeyUp(&s->hotbar, key); #ifdef CC_BUILD_WEB /* See reason for this in InputHandler_KeyUp */ if (key == KEY_ESCAPE) HUDScreen_EnterChatInput(s, true); @@ -1139,7 +1137,7 @@ static bool HUDScreen_KeyUp(void* screen, Key key) { static bool HUDScreen_MouseScroll(void* screen, float delta) { struct HUDScreen* s = (struct HUDScreen*)screen; int steps; - if (!s->handlesAllInput) return false; + if (!s->grabsInput) return false; steps = Utils_AccumulateWheelDelta(&s->chatAcc, delta); HUDScreen_ScrollChatBy(s, -steps); @@ -1151,7 +1149,7 @@ static bool HUDScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { struct HUDScreen* s = (struct HUDScreen*)screen; int height, chatY; - if (btn != MOUSE_LEFT || !s->handlesAllInput) return false; + if (btn != MOUSE_LEFT || !s->grabsInput) return false; /* player clicks on name in tab list */ /* TODO: Move to PlayerListWidget */ @@ -1214,7 +1212,7 @@ static void HUDScreen_Render(void* screen, double delta) { struct HUDScreen* s = (struct HUDScreen*)screen; bool showMinimal; - if (Game_HideGui && s->handlesAllInput) { + if (Game_HideGui && s->grabsInput) { Gfx_SetTexturing(true); Elem_Render(&s->input.base, delta); Gfx_SetTexturing(false); @@ -1227,7 +1225,7 @@ static void HUDScreen_Render(void* screen, double delta) { HUDScreen_DrawCrosshairs(); Gfx_SetTexturing(false); } - if (s->handlesAllInput && !Game_PureClassic) { + if (s->grabsInput && !Game_PureClassic) { HUDScreen_DrawChatBackground(s); } @@ -1271,12 +1269,13 @@ void HUDScreen_Show(void) { s->VTABLE = &HUDScreen_VTABLE; Gui_HUD = (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_HUD); } void HUDScreen_OpenInput(const String* text) { struct HUDScreen* s = &HUDScreen_Instance; s->suppressNextPress = true; - s->handlesAllInput = true; + s->grabsInput = true; Camera_CheckFocus(); String_Copy(&s->input.base.text, text); @@ -1452,9 +1451,8 @@ void DisconnectScreen_Show(const String* title, const String* message) { String why; char whyBuffer[STRING_SIZE]; struct DisconnectScreen* s = &DisconnectScreen_Instance; - s->handlesAllInput = true; - s->blocksWorld = true; - s->hidesHUD = true; + s->grabsInput = true; + s->blocksWorld = true; String_InitArray(s->titleStr, s->_titleBuffer); String_AppendString(&s->titleStr, title); @@ -1466,5 +1464,8 @@ void DisconnectScreen_Show(const String* title, const String* message) { s->canReconnect = !(String_CaselessStarts(&why, &kick) || String_CaselessStarts(&why, &ban)); s->VTABLE = &DisconnectScreen_VTABLE; - Gui_SetActive((struct Screen*)s); + + /* Get rid of all other menus instead of just hiding to reduce GPU usage */ + while (Gui_ScreensCount) Gui_Remove(Gui_Screens[0]); + Gui_Replace((struct Screen*)s, GUI_PRIORITY_DISCONNECT); } diff --git a/src/Server.c b/src/Server.c index e862b5491..570d4bbaf 100644 --- a/src/Server.c +++ b/src/Server.c @@ -147,8 +147,6 @@ static void SPConnection_BeginConnect(void) { World_SetDimensions(128, 64, 128); Gen_Vanilla = true; Gen_Seed = Random_Next(&rnd, Int32_MaxValue); - - Gui_FreeActive(); GeneratingScreen_Show(); } @@ -316,7 +314,6 @@ static void MPConnection_BeginConnect(void) { MPConnection_FailConnect(res); } else { String_Format2(&title, "Connecting to %s:%i..", &Server.IP, &Server.Port); - Gui_FreeActive(); LoadingScreen_Show(&title, &String_Empty); } } diff --git a/src/Server.h b/src/Server.h index 7862298c2..f68d5f13d 100644 --- a/src/Server.h +++ b/src/Server.h @@ -63,7 +63,7 @@ CC_VAR extern struct _ServerConnectionData { /* Sends a position update to the server. */ void (*SendPosition)(Vec3 pos, float rotY, float headX); /* Sends raw data to the server. */ - /* NOTE: Prefer SendBlock/Position/Chat instead, this does not work in singleplayer. */ + /* NOTE: Prefer SendBlock/Position/Chat instead, this does NOT work in singleplayer. */ void (*SendData)(const uint8_t* data, uint32_t len); /* The current name of the server. (Shows as first line when loading) */ @@ -71,7 +71,7 @@ CC_VAR extern struct _ServerConnectionData { /* The current MOTD of the server. (Shows as second line when loading) */ String MOTD; /* The software name the client identifies itself as being to the server. */ - /* By default this is the same as GAME_APP_NAME */ + /* By default this is GAME_APP_NAME. */ String AppName; /* Buffer to data to send to the server. */ From 1308acaa71f4a86f07ca337822916dcc1ffdff70 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 11 Aug 2019 07:50:29 +1000 Subject: [PATCH 02/46] now with a few less compile errors --- src/Game.c | 5 ++--- src/InputHandler.c | 22 +++++++++++++++------- src/Menus.c | 16 +++------------- src/Screens.c | 44 ++++++++++++++------------------------------ 4 files changed, 34 insertions(+), 53 deletions(-) diff --git a/src/Game.c b/src/Game.c index 904a0b502..284dc3df1 100644 --- a/src/Game.c +++ b/src/Game.c @@ -618,7 +618,7 @@ void Game_TakeScreenshot(void) { static void Game_RenderFrame(double delta) { struct ScheduledTask entTask; - bool allowZoom, visible; + bool visible; float t; /* TODO: Should other tasks get called back too? */ @@ -641,8 +641,7 @@ static void Game_RenderFrame(double delta) { Gui_SetActive(PauseScreen_MakeInstance()); } - allowZoom = !Gui_Active && !Gui_HUD->grabsInput; - if (allowZoom && KeyBind_IsPressed(KEYBIND_ZOOM_SCROLL)) { + if (KeyBind_IsPressed(KEYBIND_ZOOM_SCROLL) && !Gui_GetInputGrab()) { InputHandler_SetFOV(Game_ZoomFov); } diff --git a/src/InputHandler.c b/src/InputHandler.c index 2536742ca..1ebb48fd5 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -207,7 +207,6 @@ static bool InputHandler_HandleCoreKey(Key key) { InputHandler_CycleDistanceForwards(viewDists, count); } } else if (key == KeyBinds[KEYBIND_INVENTORY] && active == Gui_HUD) { - Gui_FreeActive(); InventoryScreen_Show(); } else if (key == KEY_F5 && Game_ClassicMode) { int weather = Env.Weather == WEATHER_SUNNY ? WEATHER_RAINY : WEATHER_SUNNY; @@ -414,9 +413,13 @@ static void InputHandler_MouseWheel(void* obj, float delta) { } static void InputHandler_MouseMove(void* obj, int xDelta, int yDelta) { - struct Screen* active = Gui_GetActiveScreen(); - /* In case MouseMove is called before game is fully initialised */ - if (active) Elem_HandlesMouseMove(active, Mouse_X, Mouse_Y); + struct Screen* s; + int i; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (!s->inactive && Elem_HandlesMouseMove(s, Mouse_X, Mouse_Y)) return; + } } static void InputHandler_MouseDown(void* obj, int button) { @@ -504,7 +507,7 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { if (!hkey->StaysOpen) { Chat_Send(&text, false); - } else if (!Gui_Active) { + } else if (!Gui_GetInputGrab()) { HUDScreen_OpenInput(&text); } } @@ -530,8 +533,13 @@ static void InputHandler_KeyUp(void* obj, int key) { } static void InputHandler_KeyPress(void* obj, int keyChar) { - struct Screen* active = Gui_GetActiveScreen(); - Elem_HandlesKeyPress(active, keyChar); + struct Screen* s; + int i; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (!s->inactive && Elem_HandlesKeyPress(s, keyChar)) return; + } } void InputHandler_Init(void) { diff --git a/src/Menus.c b/src/Menus.c index 785c5dc56..d08c92f0f 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -3046,21 +3046,11 @@ static void TexIdsOverlay_Render(void* screen, double delta) { static bool TexIdsOverlay_KeyDown(void* screen, Key key, bool was) { struct Screen* s = (struct Screen*)screen; if (key == KeyBinds[KEYBIND_IDOVERLAY]) { Elem_Free(s); return true; } - - /* allow user to chat when tex ids overlay is active */ - s = Gui_GetUnderlyingScreen(); - return Elem_HandlesKeyDown(s, key, was); + return false; } -static bool TexIdsOverlay_KeyPress(void* screen, char keyChar) { - struct Screen* s = Gui_GetUnderlyingScreen(); - return Elem_HandlesKeyPress(s, keyChar); -} - -static bool TexIdsOverlay_KeyUp(void* screen, Key key) { - struct Screen* s = Gui_GetUnderlyingScreen(); - return Elem_HandlesKeyUp(s, key); -} +static bool TexIdsOverlay_KeyPress(void* screen, char keyChar) { return false; } +static bool TexIdsOverlay_KeyUp(void* screen, Key key) { return false; } static struct ScreenVTABLE TexIdsOverlay_VTABLE = { TexIdsOverlay_Init, TexIdsOverlay_Render, Overlay_Free, Gui_DefaultRecreate, diff --git a/src/Screens.c b/src/Screens.c index 4932364ba..3a8292c91 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -469,28 +469,12 @@ static void LoadingScreen_ContextRecreated(void* screen) { LoadingScreen_SetMessage(s); } -static bool LoadingScreen_KeyDown(void* sceen, Key key, bool was) { - if (key == KEY_TAB) return true; - return Elem_HandlesKeyDown(Gui_HUD, key, was); -} - -static bool LoadingScreen_KeyPress(void* scren, char keyChar) { - return Elem_HandlesKeyPress(Gui_HUD, keyChar); -} - -static bool LoadingScreen_KeyUp(void* screen, Key key) { - if (key == KEY_TAB) return true; - return Elem_HandlesKeyUp(Gui_HUD, key); -} - -static bool LoadingScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { - if (Gui_HUD->grabsInput) { Elem_HandlesMouseDown(Gui_HUD, x, y, btn); } - return true; -} - -static bool LoadingScreen_MouseUp(void* screen, int x, int y, MouseButton btn) { return true; } -static bool LoadingScreen_MouseMove(void* screen, int x, int y) { return true; } -static bool LoadingScreen_MouseScroll(void* screen, float delta) { return true; } +static bool LoadingScreen_KeyDown(void* sceen, Key key, bool was) { return false; } +static bool LoadingScreen_KeyPress(void* scren, char keyChar) { return false; } +static bool LoadingScreen_KeyUp(void* screen, Key key) { return false; } +static bool LoadingScreen_Mouse(void* screen, int x, int y, MouseButton btn) { return false; } +static bool LoadingScreen_MouseMove(void* screen, int x, int y) { return false; } +static bool LoadingScreen_MouseScroll(void* screen, float delta) { return false; } static void LoadingScreen_UpdateBackgroundVB(VertexP3fT2fC4b* vertices, int count, int atlasIndex, bool* bound) { if (!(*bound)) { @@ -595,10 +579,10 @@ CC_NOINLINE static void LoadingScreen_Reset(const String* title, const String* m } static struct ScreenVTABLE LoadingScreen_VTABLE = { - LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, - LoadingScreen_KeyDown, LoadingScreen_KeyUp, LoadingScreen_KeyPress, - LoadingScreen_MouseDown, LoadingScreen_MouseUp, LoadingScreen_MouseMove, LoadingScreen_MouseScroll, - LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, + LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, + LoadingScreen_KeyDown, LoadingScreen_KeyUp, LoadingScreen_KeyPress, + LoadingScreen_Mouse, LoadingScreen_Mouse, LoadingScreen_MouseMove, LoadingScreen_MouseScroll, + LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; void LoadingScreen_Show(const String* title, const String* message) { LoadingScreen_Reset(title, message); @@ -666,10 +650,10 @@ static void GeneratingScreen_Render(void* screen, double delta) { } static struct ScreenVTABLE GeneratingScreen_VTABLE = { - GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, - LoadingScreen_KeyDown, LoadingScreen_KeyUp, LoadingScreen_KeyPress, - LoadingScreen_MouseDown, LoadingScreen_MouseUp, LoadingScreen_MouseMove, LoadingScreen_MouseScroll, - LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, + GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, + LoadingScreen_KeyDown, LoadingScreen_KeyUp, LoadingScreen_KeyPress, + LoadingScreen_Mouse, LoadingScreen_Mouse, LoadingScreen_MouseMove, LoadingScreen_MouseScroll, + LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; void GeneratingScreen_Show(void) { static const String title = String_FromConst("Generating level"); From 347fdd0ffc52a93cfcd823488c28fe6bbc587342 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 11 Aug 2019 21:37:11 +1000 Subject: [PATCH 03/46] No more compile errors but still completely broken --- src/Game.c | 5 +---- src/InputHandler.c | 5 ++--- src/Menus.c | 9 ++++----- src/Menus.h | 2 +- src/Screens.c | 11 +++++------ 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/Game.c b/src/Game.c index 284dc3df1..56561f7e8 100644 --- a/src/Game.c +++ b/src/Game.c @@ -636,10 +636,7 @@ static void Game_RenderFrame(double delta) { Game_Vertices = 0; Camera.Active->UpdateMouse(delta); - if (!Window_Focused && !Gui_GetInputGrab()) { - Gui_FreeActive(); - Gui_SetActive(PauseScreen_MakeInstance()); - } + if (!Window_Focused && !Gui_GetInputGrab()) PauseScreen_Show(); if (KeyBind_IsPressed(KEYBIND_ZOOM_SCROLL) && !Gui_GetInputGrab()) { InputHandler_SetFOV(Game_ZoomFov); diff --git a/src/InputHandler.c b/src/InputHandler.c index 1ebb48fd5..1e44cb5f9 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -481,7 +481,7 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { Game_ScreenshotRequested = true; return; } else if (Elem_HandlesKeyDown(active, key, was)) { return; - } else if ((key == KEY_ESCAPE || key == KEY_PAUSE) && !active->handlesAllInput) { + } else if ((key == KEY_ESCAPE || key == KEY_PAUSE) && !Gui_GetInputGrab()) { #ifdef CC_BUILD_WEB /* Can't do this in KeyUp, because pressing escape without having */ /* explicitly disabled mouse lock means a KeyUp event isn't sent. */ @@ -490,8 +490,7 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { /* closes the pause screen. Hence why the next KeyUp must be supressed. */ suppressEscape = true; #endif - Gui_FreeActive(); - Gui_SetActive(PauseScreen_MakeInstance()); return; + PauseScreen_Show(); return; } /* These should not be triggered multiple times when holding down */ diff --git a/src/Menus.c b/src/Menus.c index d08c92f0f..4724d2a92 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -324,7 +324,7 @@ static PackedCol Menu_HexCol(const String* str) { PackedCol v; PackedCol_TryPars #define Menu_ReplaceActive(screen) Gui_FreeActive(); Gui_SetActive(screen); static void Menu_SwitchOptions(void* a, void* b) { Menu_ReplaceActive(OptionsGroupScreen_MakeInstance()); } -static void Menu_SwitchPause(void* a, void* b) { Menu_ReplaceActive(PauseScreen_MakeInstance()); } +static void Menu_SwitchPause(void* a, void* b) { PauseScreen_Show(); } static void Menu_SwitchClassicOptions(void* a, void* b) { Menu_ReplaceActive(ClassicOptionsScreen_MakeInstance()); } static void Menu_SwitchKeysClassic(void* a, void* b) { Menu_ReplaceActive(ClassicKeyBindingsScreen_MakeInstance()); } @@ -671,7 +671,7 @@ static struct ScreenVTABLE PauseScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, PauseScreen_ContextRecreated, }; -struct Screen* PauseScreen_MakeInstance(void) { +void PauseScreen_Show(void) { static struct Widget* widgets[8]; struct PauseScreen* s = &PauseScreen_Instance; @@ -681,7 +681,7 @@ struct Screen* PauseScreen_MakeInstance(void) { s->widgetsCount = Array_Elems(widgets); s->VTABLE = &PauseScreen_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1267,8 +1267,7 @@ static void SaveLevelScreen_SaveMap(struct SaveLevelScreen* s, const String* pat if (res) { Logger_Warn2(res, "closing", path); return; } Chat_Add1("&eSaved map to: %s", path); - Gui_FreeActive(); - Gui_SetActive(PauseScreen_MakeInstance()); + PauseScreen_Show(); } static void SaveLevelScreen_Save(void* screen, void* widget, const char* ext) { diff --git a/src/Menus.h b/src/Menus.h index 9ef0b19ea..f69f37a40 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -7,7 +7,7 @@ */ struct Screen; -struct Screen* PauseScreen_MakeInstance(void); +void PauseScreen_Show(void); struct Screen* OptionsGroupScreen_MakeInstance(void); struct Screen* ClassicOptionsScreen_MakeInstance(void); diff --git a/src/Screens.c b/src/Screens.c index 3a8292c91..f3f67a705 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -564,7 +564,7 @@ static void LoadingScreen_Free(void* screen) { Event_UnregisterFloat(&WorldEvents.Loading, s, LoadingScreen_MapLoading); } -CC_NOINLINE static void LoadingScreen_Reset(const String* title, const String* message) { +CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const String* message) { struct LoadingScreen* s = &LoadingScreen_Instance; s->lastState = NULL; s->progress = 0.0f; @@ -576,6 +576,7 @@ CC_NOINLINE static void LoadingScreen_Reset(const String* title, const String* m s->grabsInput = true; s->blocksWorld = true; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_LOADING); } static struct ScreenVTABLE LoadingScreen_VTABLE = { @@ -585,9 +586,8 @@ static struct ScreenVTABLE LoadingScreen_VTABLE = { LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; void LoadingScreen_Show(const String* title, const String* message) { - LoadingScreen_Reset(title, message); LoadingScreen_Instance.VTABLE = &LoadingScreen_VTABLE; - Gui_Replace((struct Screen*)&LoadingScreen_Instance, GUI_PRIORITY_LOADING); + LoadingScreen_ShowCommon(title, message); } struct Screen* LoadingScreen_UNSAFE_RawPointer = (struct Screen*)&LoadingScreen_Instance; @@ -659,9 +659,8 @@ void GeneratingScreen_Show(void) { static const String title = String_FromConst("Generating level"); static const String message = String_FromConst("Generating.."); - LoadingScreen_Reset(&title, &message); LoadingScreen_Instance.VTABLE = &GeneratingScreen_VTABLE; - Gui_Replace((struct Screen*)&LoadingScreen_Instance, GUI_PRIORITY_LOADING); + LoadingScreen_ShowCommon(&title, &message); } @@ -1218,7 +1217,7 @@ static void HUDScreen_Render(void* screen, double delta) { HUDScreen_DrawChat(s, delta); if (s->showingList && Gui_GetActiveScreen() == (struct Screen*)s) { - s->playerList.active = s->handlesAllInput; + s->playerList.active = s->grabsInput; Elem_Render(&s->playerList, delta); /* NOTE: Should usually be caught by KeyUp, but just in case. */ if (!KeyBind_IsPressed(KEYBIND_PLAYER_LIST)) { From c06203bc7ddc788374c1f1343325cee02cce40ee Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 12 Aug 2019 11:47:19 +1000 Subject: [PATCH 04/46] Now clicking partially works --- src/Game.c | 6 +- src/Gui.c | 92 ++++++++++++++++++++++-------- src/Gui.h | 14 +++-- src/InputHandler.c | 46 ++++++++------- src/Menus.c | 16 ++---- src/Program.c | 4 +- src/Screens.c | 139 +++++++++++++++++---------------------------- 7 files changed, 166 insertions(+), 151 deletions(-) diff --git a/src/Game.c b/src/Game.c index 56561f7e8..a8146a9eb 100644 --- a/src/Game.c +++ b/src/Game.c @@ -177,8 +177,8 @@ void Game_UpdateProjection(void) { void Game_Disconnect(const String* title, const String* reason) { Event_RaiseVoid(&NetEvents.Disconnected); - DisconnectScreen_Show(title, reason); Game_Reset(); + DisconnectScreen_Show(title, reason); } void Game_Reset(void) { @@ -618,7 +618,6 @@ void Game_TakeScreenshot(void) { static void Game_RenderFrame(double delta) { struct ScheduledTask entTask; - bool visible; float t; /* TODO: Should other tasks get called back too? */ @@ -651,8 +650,7 @@ static void Game_RenderFrame(double delta) { Camera.CurrentPos = Camera.Active->GetPosition(t); Game_UpdateViewMatrix(); - visible = !Gui_Active || !Gui_Active->blocksWorld; - if (visible && World.Blocks) { + if (!Gui_GetBlocksWorld() && World.Blocks) { Game_Render3D(delta, t); } else { PickedPos_SetAsInvalid(&Game_SelectedPos); diff --git a/src/Gui.c b/src/Gui.c index 1b26d4ae2..558b2862f 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -93,9 +93,24 @@ bool Gui_Contains(int recX, int recY, int width, int height, int x, int y) { return x >= recX && y >= recY && x < (recX + width) && y < (recY + height); } -CC_NOINLINE static void Gui_RecreateScreen(struct Screen* screen) { - if (Gfx.LostContext || !screen) return; - Elem_Recreate(screen); +static void Gui_ContextLost(void* obj) { + struct Screen* s; + int i; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + s->VTABLE->ContextLost(s); + } +} + +static void Gui_ContextRecreated(void* obj) { + struct Screen* s; + int i; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + s->VTABLE->ContextRecreated(s); + } } static void Gui_LoadOptions(void) { @@ -110,11 +125,7 @@ static void Gui_LoadOptions(void) { Gui_ShowFPS = Options_GetBool(OPT_SHOW_FPS, true); } -static void Gui_FontChanged(void* obj) { - Gui_RecreateScreen(Gui_Active); - Gui_RecreateScreen(Gui_Status); - Gui_RecreateScreen(Gui_HUD); -} +static void Gui_FontChanged(void* obj) { Gui_Refresh(); } static void Gui_FileChanged(void* obj, struct Stream* stream, const String* name) { if (String_CaselessEqualsConst(name, "gui.png")) { @@ -129,12 +140,12 @@ static void Gui_FileChanged(void* obj, struct Stream* stream, const String* name static void Gui_Init(void) { Event_RegisterVoid(&ChatEvents.FontChanged, NULL, Gui_FontChanged); Event_RegisterEntry(&TextureEvents.FileChanged, NULL, Gui_FileChanged); + Event_RegisterVoid(&GfxEvents.ContextLost, NULL, Gui_ContextLost); + Event_RegisterVoid(&GfxEvents.ContextRecreated, NULL, Gui_ContextRecreated); Gui_LoadOptions(); StatusScreen_Show(); HUDScreen_Show(); - Elem_Init(Gui_Status); - Elem_Init(Gui_HUD); } static void Gui_Reset(void) { @@ -148,6 +159,8 @@ static void Gui_Reset(void) { static void Gui_Free(void) { Event_UnregisterVoid(&ChatEvents.FontChanged, NULL, Gui_FontChanged); Event_UnregisterEntry(&TextureEvents.FileChanged, NULL, Gui_FileChanged); + Event_UnregisterVoid(&GfxEvents.ContextLost, NULL, Gui_ContextLost); + Event_UnregisterVoid(&GfxEvents.ContextRecreated, NULL, Gui_ContextRecreated); while (Gui_ScreensCount) Gui_Remove(Gui_Screens[0]); @@ -195,17 +208,26 @@ void Gui_SetActive(struct Screen* screen) { } Camera_CheckFocus(); } -void Gui_RefreshHud(void) { Elem_Recreate(Gui_HUD); } -int Gui_Index(struct Screen* screen) { +void Gui_Refresh(void) { + Gui_ContextLost(NULL); + Gui_ContextRecreated(NULL); +} + +void Gui_RefreshHud(void) { + Gui_HUD->VTABLE->ContextLost(Gui_HUD); + Gui_HUD->VTABLE->ContextRecreated(Gui_HUD); +} + +int Gui_Index(struct Screen* s) { int i; for (i = 0; i < Gui_ScreensCount; i++) { - if (Gui_Screens[i] == screen) return i; + if (Gui_Screens[i] == s) return i; } return -1; } -void Gui_Add(struct Screen* screen, int priority) { +void Gui_Add(struct Screen* s, int priority) { int i, j; if (Gui_ScreensCount >= GUI_MAX_SCREENS) Logger_Abort("Hit max screens"); @@ -213,24 +235,25 @@ void Gui_Add(struct Screen* screen, int priority) { if (priority <= priorities[i]) continue; /* Shift lower priority screens right */ - for (j = i + 1; j <= Gui_ScreensCount; i++) { + for (j = Gui_ScreensCount; j > i; j--) { Gui_Screens[j] = Gui_Screens[j - 1]; priorities[j] = priorities[j - 1]; } break; } - Gui_Screens[i] = screen; + Gui_Screens[i] = s; priorities[i] = priority; Gui_ScreensCount++; - Elem_Init(screen); + s->VTABLE->Init(s); + s->VTABLE->ContextRecreated(s); /* for selecting active button etc */ - Elem_HandlesMouseMove(screen, Mouse_X, Mouse_Y); + s->VTABLE->HandlesMouseMove(s, Mouse_X, Mouse_Y); } -void Gui_Remove(struct Screen* screen) { - int i = Gui_Index(screen); +void Gui_Remove(struct Screen* s) { + int i = Gui_Index(s); if (i == -1) return; for (; i < Gui_ScreensCount - 1; i++) { @@ -239,12 +262,13 @@ void Gui_Remove(struct Screen* screen) { } Gui_ScreensCount--; - Elem_Free(screen); + s->VTABLE->ContextLost(s); + s->VTABLE->Free(s); } -void Gui_Replace(struct Screen* screen, int priority) { - Gui_Remove(screen); - Gui_Add(screen, priority); +void Gui_Replace(struct Screen* s, int priority) { + Gui_Remove(s); + Gui_Add(s, priority); } struct Screen* Gui_GetInputGrab(void) { @@ -255,6 +279,22 @@ struct Screen* Gui_GetInputGrab(void) { return NULL; } +struct Screen* Gui_GetBlocksWorld(void) { + int i; + for (i = 0; i < Gui_ScreensCount; i++) { + if (Gui_Screens[i]->blocksWorld) return Gui_Screens[i]; + } + return NULL; +} + +struct Screen* Gui_GetClosable(void) { + int i; + for (i = 0; i < Gui_ScreensCount; i++) { + if (Gui_Screens[i]->closable) return Gui_Screens[i]; + } + return NULL; +} + void Gui_ShowOverlay(struct Screen* screen) { if (Gui_OverlaysCount == GUI_MAX_OVERLAYS) { Logger_Abort("Gui_ShowOverlay - hit max count"); @@ -290,12 +330,14 @@ void Gui_RemoveOverlay(const void* screen) { } void Gui_RenderGui(double delta) { + struct Screen* s; int i; Gfx_Mode2D(Game.Width, Game.Height); /* Draw back to front so highest priority screen is on top */ for (i = Gui_ScreensCount - 1; i >= 0; i--) { - Elem_Render(Gui_Screens[i], delta); + s = Gui_Screens[i]; + if (!s->hidden) Elem_Render(s, delta); } Gfx_Mode3D(); } diff --git a/src/Gui.h b/src/Gui.h index c65e7b895..c1b592f24 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -61,7 +61,7 @@ struct ScreenVTABLE { #define Screen_Layout struct ScreenVTABLE* VTABLE; \ bool grabsInput; /* Whether this screen grabs input. Causes the cursor to become visible. */ \ bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ - bool inactive; /* Whether this screen is prevented from rendering and receiving input. */ \ + bool hidden; /* Whether this screen is prevented from rendering. */ \ bool closable; /* Whether this screen is automatically closed when pressing Escape */ /* Represents a container of widgets and other 2D elements. May cover entire window. */ @@ -151,10 +151,16 @@ void Gui_Add(struct Screen* screen, int priority); void Gui_Remove(struct Screen* screen); /* Shorthand for Gui_Remove then Gui_Add. */ void Gui_Replace(struct Screen* screen, int priority); -/* Returns the screen that has grabbed input, else NULL. */ -struct Screen* Gui_GetInputGrab(void); -void Gui_RefreshHud(void); +/* Returns highest priority screen that has grabbed input. */ +struct Screen* Gui_GetInputGrab(void); +/* Returns highest priority screen that blocks world rendering. */ +struct Screen* Gui_GetBlocksWorld(void); +/* Returns highest priority screen that is closable. */ +struct Screen* Gui_GetClosable(void); + +void Gui_Refresh(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); diff --git a/src/InputHandler.c b/src/InputHandler.c index 1e44cb5f9..6798a7e04 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -418,30 +418,38 @@ static void InputHandler_MouseMove(void* obj, int xDelta, int yDelta) { for (i = 0; i < Gui_ScreensCount; i++) { s = Gui_Screens[i]; - if (!s->inactive && Elem_HandlesMouseMove(s, Mouse_X, Mouse_Y)) return; + if (Elem_HandlesMouseMove(s, Mouse_X, Mouse_Y)) return; } } -static void InputHandler_MouseDown(void* obj, int button) { - struct Screen* active = Gui_GetActiveScreen(); - if (!Elem_HandlesMouseDown(active, Mouse_X, Mouse_Y, button)) { - bool left = button == MOUSE_LEFT; - bool middle = button == MOUSE_MIDDLE; - bool right = button == MOUSE_RIGHT; - InputHandler_PickBlocks(false, left, middle, right); - } else { - input_lastClick = DateTime_CurrentUTC_MS(); - } -} +static void InputHandler_MouseDown(void* obj, int btn) { + struct Screen* s; + int i; -static void InputHandler_MouseUp(void* obj, int button) { - struct Screen* active = Gui_GetActiveScreen(); - if (!Elem_HandlesMouseUp(active, Mouse_X, Mouse_Y, button)) { - if (Server.SupportsPlayerClick && button <= MOUSE_MIDDLE) { - input_pickingId = -1; - InputHandler_ButtonStateChanged(button, false); + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (Elem_HandlesMouseDown(s, Mouse_X, Mouse_Y, btn)) { + input_lastClick = DateTime_CurrentUTC_MS(); return; } } + + InputHandler_PickBlocks(false, btn == MOUSE_LEFT, + btn == MOUSE_MIDDLE, btn == MOUSE_RIGHT); +} + +static void InputHandler_MouseUp(void* obj, int btn) { + struct Screen* s; + int i; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (Elem_HandlesMouseUp(s, Mouse_X, Mouse_Y, btn)) return; + } + + if (Server.SupportsPlayerClick && btn <= MOUSE_MIDDLE) { + input_pickingId = -1; + InputHandler_ButtonStateChanged(btn, false); + } } static bool InputHandler_SimulateMouse(Key key, bool pressed) { @@ -537,7 +545,7 @@ static void InputHandler_KeyPress(void* obj, int keyChar) { for (i = 0; i < Gui_ScreensCount; i++) { s = Gui_Screens[i]; - if (!s->inactive && Elem_HandlesKeyPress(s, keyChar)) return; + if (s->VTABLE->HandlesKeyPress(s, keyChar)) return; } } diff --git a/src/Menus.c b/src/Menus.c index 4724d2a92..8b994140d 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -53,11 +53,6 @@ struct ListScreen { #define MenuScreen_Layout MenuBase_Layout FontDesc titleFont, textFont; struct MenuScreen { MenuScreen_Layout }; -struct PauseScreen { - MenuScreen_Layout - struct ButtonWidget buttons[8]; -}; - struct OptionsGroupScreen { MenuScreen_Layout struct ButtonWidget buttons[8]; @@ -313,8 +308,6 @@ static void Menu_Remove(void* screen, int i) { static void Menu_HandleFontChange(struct Screen* s) { Event_RaiseVoid(&ChatEvents.FontChanged); - Elem_Recreate(s); - Gui_RefreshHud(); Elem_HandlesMouseMove(s, Mouse_X, Mouse_Y); } @@ -591,10 +584,13 @@ static void MenuScreen_Free(void* screen) { /*########################################################################################################################* *-------------------------------------------------------PauseScreen-------------------------------------------------------* *#########################################################################################################################*/ -static struct PauseScreen PauseScreen_Instance; +static struct PauseScreen { + MenuScreen_Layout + struct ButtonWidget buttons[8]; +} PauseScreen_Instance; static void PauseScreen_Quit(void* a, void* b) { Window_Close(); } -static void PauseScreen_Game(void* a, void* b) { Gui_CloseActive(); } +static void PauseScreen_Game(void* a, void* b) { Gui_Remove((struct Screen*)&PauseScreen_Instance); } static void PauseScreen_CheckHacksAllowed(void* screen) { struct PauseScreen* s = (struct PauseScreen*)screen; @@ -3044,7 +3040,7 @@ static void TexIdsOverlay_Render(void* screen, double delta) { static bool TexIdsOverlay_KeyDown(void* screen, Key key, bool was) { struct Screen* s = (struct Screen*)screen; - if (key == KeyBinds[KEYBIND_IDOVERLAY]) { Elem_Free(s); return true; } + if (key == KeyBinds[KEYBIND_IDOVERLAY]) { Gui_Remove(s); return true; } return false; } diff --git a/src/Program.c b/src/Program.c index a4908acb8..0b68ee9e3 100644 --- a/src/Program.c +++ b/src/Program.c @@ -106,8 +106,8 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ /* String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); */ - /* String rawArgs = String_FromConst("UnknownShadow200"); */ - /* argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); */ + String rawArgs = String_FromConst("UnknownShadow200"); + argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); if (argsCount == 0) { #ifdef CC_BUILD_WEB diff --git a/src/Screens.c b/src/Screens.c index f3f67a705..a64bcedde 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -50,8 +50,18 @@ struct HUDScreen { }; -static bool Screen_Mouse(void* elem, int x, int y, MouseButton btn) { return false; } -static bool Screen_MouseMove(void* elem, int x, int y) { return false; } +static bool Screen_FKeyDown(void* elem, Key key, bool was) { return false; } +static bool Screen_FKeyUp(void* elem, Key key) { return false; } +static bool Screen_FKeyPress(void* elem, char keyChar) { return false; } +static bool Screen_FMouseScroll(void* elem, float delta) { return false; } +static bool Screen_FMouse(void* elem, int x, int y, int btn) { return false; } +static bool Screen_FMouseMove(void* elem, int x, int y) { return false; } + +static bool Screen_TKeyPress(void* elem, char keyChar) { return true; } +static bool Screen_TKeyUp(void* s, Key key) { return true; } +static bool Screen_TMouseScroll(void* screen, float delta) { return true; } +static bool Screen_TMouse(void* screen, int x, int y, int btn) { return true; } +static void Screen_NullFunc(void* screen) { } /*########################################################################################################################* @@ -71,11 +81,13 @@ static void InventoryScreen_OnBlockChanged(void* screen) { static void InventoryScreen_ContextLost(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; + Font_Free(&s->font); Elem_TryFree(&s->table); } static void InventoryScreen_ContextRecreated(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; + Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); Elem_Recreate(&s->table); } @@ -93,8 +105,7 @@ static void InventoryScreen_MoveToSelected(struct InventoryScreen* s) { static void InventoryScreen_Init(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; - Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); - + TableWidget_Create(&s->table); s->table.font = &s->font; s->table.elementsPerRow = Game_PureClassic ? 9 : 10; @@ -104,7 +115,6 @@ static void InventoryScreen_Init(void* screen) { /* status might be toggled after InventoryScreen_Init() is called. */ /* That causes the cursor to be moved back to the middle of the window. */ s->deferredSelect = true; - Screen_CommonInit(s); Event_RegisterVoid(&BlockEvents.PermissionsChanged, s, InventoryScreen_OnBlockChanged); Event_RegisterVoid(&BlockEvents.BlockDefChanged, s, InventoryScreen_OnBlockChanged); @@ -123,9 +133,6 @@ static void InventoryScreen_OnResize(void* screen) { static void InventoryScreen_Free(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; - Font_Free(&s->font); - Screen_CommonFree(s); - Event_UnregisterVoid(&BlockEvents.PermissionsChanged, s, InventoryScreen_OnBlockChanged); Event_UnregisterVoid(&BlockEvents.BlockDefChanged, s, InventoryScreen_OnBlockChanged); } @@ -135,10 +142,10 @@ static bool InventoryScreen_KeyDown(void* screen, Key key, bool was) { struct TableWidget* table = &s->table; if (key == KeyBinds[KEYBIND_INVENTORY] && s->releasedInv) { - Gui_Close(screen); + Gui_Remove(screen); } else if (key == KEY_ENTER && table->selectedIndex != -1) { Inventory_SetSelectedBlock(table->elements[table->selectedIndex]); - Gui_Close(screen); + Gui_Remove(screen); } else if (Elem_HandlesKeyDown(table, key, was)) { } else { struct HUDScreen* hud = (struct HUDScreen*)Gui_HUD; @@ -147,7 +154,6 @@ static bool InventoryScreen_KeyDown(void* screen, Key key, bool was) { return true; } -static bool InventoryScreen_KeyPress(void* elem, char keyChar) { return true; } static bool InventoryScreen_KeyUp(void* screen, Key key) { struct InventoryScreen* s = (struct InventoryScreen*)screen; struct HUDScreen* hud; @@ -171,7 +177,7 @@ static bool InventoryScreen_MouseDown(void* screen, int x, int y, MouseButton bt if ((!handled || table->pendingClose) && btn == MOUSE_LEFT) { hotbar = Key_IsControlPressed() || Key_IsShiftPressed(); - if (!hotbar) Gui_Close(screen); + if (!hotbar) Gui_Remove(screen); } return true; } @@ -199,7 +205,7 @@ static bool InventoryScreen_MouseScroll(void* screen, float delta) { static struct ScreenVTABLE InventoryScreen_VTABLE = { InventoryScreen_Init, InventoryScreen_Render, InventoryScreen_Free, Gui_DefaultRecreate, - InventoryScreen_KeyDown, InventoryScreen_KeyUp, InventoryScreen_KeyPress, + InventoryScreen_KeyDown, InventoryScreen_KeyUp, Screen_TKeyPress, InventoryScreen_MouseDown, InventoryScreen_MouseUp, InventoryScreen_MouseMove, InventoryScreen_MouseScroll, InventoryScreen_OnResize, InventoryScreen_ContextLost, InventoryScreen_ContextRecreated, }; @@ -325,9 +331,9 @@ static void StatusScreen_Update(struct StatusScreen* s, double delta) { Game.ChunkUpdates = 0; } -static void StatusScreen_OnResize(void* screen) { } static void StatusScreen_ContextLost(void* screen) { struct StatusScreen* s = (struct StatusScreen*)screen; + Font_Free(&s->font); TextAtlas_Free(&s->posAtlas); Elem_TryFree(&s->line1); Elem_TryFree(&s->line2); @@ -342,7 +348,8 @@ static void StatusScreen_ContextRecreated(void* screen) { struct TextWidget* line1 = &s->line1; struct TextWidget* line2 = &s->line2; int y; - + Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); + y = 2; TextWidget_Make(line1); Widget_SetLocation(line1, ANCHOR_MIN, ANCHOR_MIN, 2, y); @@ -371,17 +378,6 @@ static void StatusScreen_ContextRecreated(void* screen) { } } -static bool StatusScreen_KeyDown(void* elem, Key key, bool was) { return false; } -static bool StatusScreen_KeyUp(void* elem, Key key) { return false; } -static bool StatusScreen_KeyPress(void* elem, char keyChar) { return false; } -static bool StatusScreen_MouseScroll(void* elem, float delta) { return false; } - -static void StatusScreen_Init(void* screen) { - struct StatusScreen* s = (struct StatusScreen*)screen; - Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); - Screen_CommonInit(s); -} - static void StatusScreen_Render(void* screen, double delta) { struct StatusScreen* s = (struct StatusScreen*)screen; StatusScreen_Update(s, delta); @@ -401,17 +397,11 @@ static void StatusScreen_Render(void* screen, double delta) { Gfx_SetTexturing(false); } -static void StatusScreen_Free(void* screen) { - struct StatusScreen* s = (struct StatusScreen*)screen; - Font_Free(&s->font); - Screen_CommonFree(s); -} - static struct ScreenVTABLE StatusScreen_VTABLE = { - StatusScreen_Init, StatusScreen_Render, StatusScreen_Free, Gui_DefaultRecreate, - StatusScreen_KeyDown, StatusScreen_KeyUp, StatusScreen_KeyPress, - Screen_Mouse, Screen_Mouse, Screen_MouseMove, StatusScreen_MouseScroll, - StatusScreen_OnResize, StatusScreen_ContextLost, StatusScreen_ContextRecreated, + Screen_NullFunc, StatusScreen_Render, Screen_NullFunc, Gui_DefaultRecreate, + Screen_FKeyDown, Screen_FKeyUp, Screen_FKeyPress, + Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, + Screen_NullFunc, StatusScreen_ContextLost, StatusScreen_ContextRecreated, }; void StatusScreen_Show(void) { struct StatusScreen* s = &StatusScreen_Instance; @@ -458,24 +448,20 @@ static void LoadingScreen_OnResize(void* screen) { static void LoadingScreen_ContextLost(void* screen) { struct LoadingScreen* s = (struct LoadingScreen*)screen; + Font_Free(&s->font); if (!s->title.VTABLE) return; + Elem_Free(&s->title); Elem_Free(&s->message); } static void LoadingScreen_ContextRecreated(void* screen) { struct LoadingScreen* s = (struct LoadingScreen*)screen; + Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); LoadingScreen_SetTitle(s); LoadingScreen_SetMessage(s); } -static bool LoadingScreen_KeyDown(void* sceen, Key key, bool was) { return false; } -static bool LoadingScreen_KeyPress(void* scren, char keyChar) { return false; } -static bool LoadingScreen_KeyUp(void* screen, Key key) { return false; } -static bool LoadingScreen_Mouse(void* screen, int x, int y, MouseButton btn) { return false; } -static bool LoadingScreen_MouseMove(void* screen, int x, int y) { return false; } -static bool LoadingScreen_MouseScroll(void* screen, float delta) { return false; } - static void LoadingScreen_UpdateBackgroundVB(VertexP3fT2fC4b* vertices, int count, int atlasIndex, bool* bound) { if (!(*bound)) { *bound = true; @@ -521,14 +507,12 @@ static void LoadingScreen_DrawBackground(void) { static void LoadingScreen_Init(void* screen) { struct LoadingScreen* s = (struct LoadingScreen*)screen; - Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); TextWidget_Make(&s->title); Widget_SetLocation(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -31); TextWidget_Make(&s->message); Widget_SetLocation(&s->message, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 17); - Screen_CommonInit(s); Gfx_SetFog(false); Event_RegisterFloat(&WorldEvents.Loading, s, LoadingScreen_MapLoading); } @@ -559,8 +543,6 @@ static void LoadingScreen_Render(void* screen, double delta) { static void LoadingScreen_Free(void* screen) { struct LoadingScreen* s = (struct LoadingScreen*)screen; - Font_Free(&s->font); - Screen_CommonFree(s); Event_UnregisterFloat(&WorldEvents.Loading, s, LoadingScreen_MapLoading); } @@ -580,9 +562,9 @@ CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const Stri } static struct ScreenVTABLE LoadingScreen_VTABLE = { - LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, - LoadingScreen_KeyDown, LoadingScreen_KeyUp, LoadingScreen_KeyPress, - LoadingScreen_Mouse, LoadingScreen_Mouse, LoadingScreen_MouseMove, LoadingScreen_MouseScroll, + LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, + Screen_FKeyDown, Screen_FKeyUp, Screen_FKeyPress, + Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; void LoadingScreen_Show(const String* title, const String* message) { @@ -616,7 +598,7 @@ static void GeneratingScreen_EndGeneration(void) { struct LocationUpdate update; float x, z; - Gui_CloseActive(); + Gui_Remove(LoadingScreen_UNSAFE_RawPointer); Gen_Done = false; if (!Gen_Blocks) { Chat_AddRaw("&cFailed to generate the map."); return; } @@ -650,9 +632,9 @@ static void GeneratingScreen_Render(void* screen, double delta) { } static struct ScreenVTABLE GeneratingScreen_VTABLE = { - GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, - LoadingScreen_KeyDown, LoadingScreen_KeyUp, LoadingScreen_KeyPress, - LoadingScreen_Mouse, LoadingScreen_Mouse, LoadingScreen_MouseMove, LoadingScreen_MouseScroll, + GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, + Screen_FKeyDown, Screen_FKeyUp, Screen_FKeyPress, + Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; void GeneratingScreen_Show(void) { @@ -982,6 +964,9 @@ static void HUDScreen_ContextLost(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; Elem_TryFree(&s->hotbar); + Font_Free(&s->playerFont); + HUDScreen_FreeChatFonts(s); + if (s->grabsInput) { String_Copy(&chatInputStr, &s->input.base.text); /* TODO: Why are we checking camera here */ @@ -1003,12 +988,14 @@ static void HUDScreen_ContextLost(void* screen) { static void HUDScreen_ContextRecreated(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; + int size; bool extended; Elem_TryFree(&s->hotbar); Elem_Init(&s->hotbar); - HUDScreen_FreeChatFonts(s); + size = Drawer2D_BitmappedText ? 16 : 11; + Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); HUDScreen_InitChatFonts(s); HUDScreen_ConstructWidgets(s); @@ -1177,16 +1164,9 @@ static bool HUDScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { static void HUDScreen_Init(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; - int size; - - size = Drawer2D_BitmappedText ? 16 : 11; - Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); s->wasShowingList = false; - - HUDScreen_InitChatFonts(s); HotbarWidget_Create(&s->hotbar); - Screen_CommonInit(s); Event_RegisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived); Event_RegisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged); } @@ -1201,7 +1181,7 @@ static void HUDScreen_Render(void* screen, double delta) { Gfx_SetTexturing(false); } if (Game_HideGui) return; - showMinimal = Gui_GetActiveScreen()->blocksWorld; + showMinimal = Gui_GetBlocksWorld() != NULL; if (!s->showingList && !showMinimal) { Gfx_SetTexturing(true); @@ -1230,10 +1210,6 @@ static void HUDScreen_Render(void* screen, double delta) { static void HUDScreen_Free(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; - Font_Free(&s->playerFont); - HUDScreen_FreeChatFonts(s); - - Screen_CommonFree(s); Event_UnregisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived); Event_UnregisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged); } @@ -1241,7 +1217,7 @@ static void HUDScreen_Free(void* screen) { static struct ScreenVTABLE HUDScreen_VTABLE = { HUDScreen_Init, HUDScreen_Render, HUDScreen_Free, Gui_DefaultRecreate, HUDScreen_KeyDown, HUDScreen_KeyUp, HUDScreen_KeyPress, - HUDScreen_MouseDown, Screen_Mouse, Screen_MouseMove, HUDScreen_MouseScroll, + HUDScreen_MouseDown, Screen_FMouse, Screen_FMouseMove, HUDScreen_MouseScroll, HUDScreen_OnResize, HUDScreen_ContextLost, HUDScreen_ContextRecreated, }; void HUDScreen_Show(void) { @@ -1325,6 +1301,8 @@ static void DisconnectScreen_UpdateDelayLeft(struct DisconnectScreen* s, double static void DisconnectScreen_ContextLost(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; + Font_Free(&s->titleFont); + Font_Free(&s->messageFont); if (!s->title.VTABLE) return; Elem_Free(&s->title); @@ -1335,6 +1313,8 @@ static void DisconnectScreen_ContextLost(void* screen) { static void DisconnectScreen_ContextRecreated(void* screen) { String msg; char msgBuffer[STRING_SIZE]; struct DisconnectScreen* s = (struct DisconnectScreen*)screen; + Drawer2D_MakeFont(&s->titleFont, 16, FONT_STYLE_BOLD); + Drawer2D_MakeFont(&s->messageFont, 16, FONT_STYLE_NORMAL); TextWidget_Set(&s->title, &s->titleStr, &s->titleFont); TextWidget_Set(&s->message, &s->messageStr, &s->messageFont); @@ -1346,9 +1326,6 @@ static void DisconnectScreen_ContextRecreated(void* screen) { static void DisconnectScreen_Init(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; - Drawer2D_MakeFont(&s->titleFont, 16, FONT_STYLE_BOLD); - Drawer2D_MakeFont(&s->messageFont, 16, FONT_STYLE_NORMAL); - TextWidget_Make(&s->title); Widget_SetLocation(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); TextWidget_Make(&s->message); @@ -1358,7 +1335,6 @@ static void DisconnectScreen_Init(void* screen) { Widget_SetLocation(&s->reconnect, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 80); s->reconnect.disabled = !s->canReconnect; - Screen_CommonInit(s); /* NOTE: changing VSync can't be done within frame, causes crash on some GPUs */ Gfx_SetFpsLimit(Game_FpsLimit == FPS_LIMIT_VSYNC, 1000 / 5.0f); @@ -1382,13 +1358,7 @@ static void DisconnectScreen_Render(void* screen, double delta) { Gfx_SetTexturing(false); } -static void DisconnectScreen_Free(void* screen) { - struct DisconnectScreen* s = (struct DisconnectScreen*)screen; - Font_Free(&s->titleFont); - Font_Free(&s->messageFont); - Screen_CommonFree(s); - Game_SetFpsLimit(Game_FpsLimit); -} +static void DisconnectScreen_Free(void* screen) { Game_SetFpsLimit(Game_FpsLimit); } static void DisconnectScreen_OnResize(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; @@ -1399,8 +1369,6 @@ static void DisconnectScreen_OnResize(void* screen) { } static bool DisconnectScreen_KeyDown(void* s, Key key, bool was) { return key < KEY_F1 || key > KEY_F35; } -static bool DisconnectScreen_KeyPress(void* s, char keyChar) { return true; } -static bool DisconnectScreen_KeyUp(void* s, Key key) { return true; } static bool DisconnectScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; @@ -1419,13 +1387,10 @@ static bool DisconnectScreen_MouseMove(void* screen, int x, int y) { return true; } -static bool DisconnectScreen_MouseScroll(void* screen, float delta) { return true; } -static bool DisconnectScreen_MouseUp(void* screen, int x, int y, MouseButton btn) { return true; } - static struct ScreenVTABLE DisconnectScreen_VTABLE = { - DisconnectScreen_Init, DisconnectScreen_Render, DisconnectScreen_Free, Gui_DefaultRecreate, - DisconnectScreen_KeyDown, DisconnectScreen_KeyUp, DisconnectScreen_KeyPress, - DisconnectScreen_MouseDown, DisconnectScreen_MouseUp, DisconnectScreen_MouseMove, DisconnectScreen_MouseScroll, + DisconnectScreen_Init, DisconnectScreen_Render, DisconnectScreen_Free, Gui_DefaultRecreate, + DisconnectScreen_KeyDown, Screen_TKeyUp, Screen_TKeyPress, + DisconnectScreen_MouseDown, Screen_TMouse, DisconnectScreen_MouseMove, Screen_TMouseScroll, DisconnectScreen_OnResize, DisconnectScreen_ContextLost, DisconnectScreen_ContextRecreated }; void DisconnectScreen_Show(const String* title, const String* message) { From 340555833e4ab25e102d6ae08c61c08ce7abe994 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 12 Aug 2019 15:52:27 +1000 Subject: [PATCH 05/46] Cleanup list screens --- src/Menus.c | 199 ++++++++++++++++++++++++++-------------------------- src/Menus.h | 8 +-- 2 files changed, 104 insertions(+), 103 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 8b994140d..ab26fc31f 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -32,24 +32,6 @@ #define MenuBase_Layout Screen_Layout struct Widget** widgets; int widgetsCount; struct Menu { MenuBase_Layout }; -#define LIST_SCREEN_ITEMS 5 -#define LIST_SCREEN_BUTTONS (LIST_SCREEN_ITEMS + 3) - -struct ListScreen; -struct ListScreen { - MenuBase_Layout - struct ButtonWidget buttons[LIST_SCREEN_BUTTONS]; - FontDesc font; - float wheelAcc; - int currentIndex; - Widget_LeftClick EntryClick; - void (*UpdateEntry)(struct ListScreen* s, struct ButtonWidget* btn, const String* text); - String titleText; - struct TextWidget title, page; - struct Widget* listWidgets[LIST_SCREEN_BUTTONS + 2]; - StringsBuffer entries; -}; - #define MenuScreen_Layout MenuBase_Layout FontDesc titleFont, textFont; struct MenuScreen { MenuScreen_Layout }; @@ -336,19 +318,35 @@ static void Menu_SwitchNostalgia(void* a, void* b) { Menu_ReplaceActive(Nostalgi static void Menu_SwitchGenLevel(void* a, void* b) { Menu_ReplaceActive(GenLevelScreen_MakeInstance()); } static void Menu_SwitchClassicGenLevel(void* a, void* b) { Menu_ReplaceActive(ClassicGenScreen_MakeInstance()); } -static void Menu_SwitchLoadLevel(void* a, void* b) { Menu_ReplaceActive(LoadLevelScreen_MakeInstance()); } +static void Menu_SwitchLoadLevel(void* a, void* b) { LoadLevelScreen_Show(); } static void Menu_SwitchSaveLevel(void* a, void* b) { Menu_ReplaceActive(SaveLevelScreen_MakeInstance()); } -static void Menu_SwitchTexPacks(void* a, void* b) { Menu_ReplaceActive(TexturePackScreen_MakeInstance()); } -static void Menu_SwitchHotkeys(void* a, void* b) { Menu_ReplaceActive(HotkeyListScreen_MakeInstance()); } -static void Menu_SwitchFont(void* a, void* b) { Menu_ReplaceActive(FontListScreen_MakeInstance()); } +static void Menu_SwitchTexPacks(void* a, void* b) { TexturePackScreen_Show(); } +static void Menu_SwitchHotkeys(void* a, void* b) { HotkeyListScreen_Show(); } +static void Menu_SwitchFont(void* a, void* b) { FontListScreen_Show(); } /*########################################################################################################################* *--------------------------------------------------------ListScreen-------------------------------------------------------* *#########################################################################################################################*/ -static struct ListScreen ListScreen_Instance; +struct ListScreen; +#define LIST_SCREEN_ITEMS 5 +#define LIST_SCREEN_BUTTONS (LIST_SCREEN_ITEMS + 3) #define LIST_SCREEN_EMPTY "-----" +static struct ListScreen { + MenuBase_Layout + struct ButtonWidget buttons[LIST_SCREEN_BUTTONS]; + FontDesc font; + float wheelAcc; + int currentIndex; + Widget_LeftClick EntryClick; + void (*LoadEntries)(struct ListScreen* s); + void (*UpdateEntry)(struct ListScreen* s, struct ButtonWidget* btn, const String* text); + String titleText; + struct TextWidget title, page; + StringsBuffer entries; +} ListScreen_Instance; + static STRING_REF String ListScreen_UNSAFE_Get(struct ListScreen* s, int index) { static const String str = String_FromConst(LIST_SCREEN_EMPTY); @@ -485,13 +483,16 @@ static void ListScreen_Select(struct ListScreen* s, const String* str) { } static void ListScreen_Init(void* screen) { + static struct Widget* widgets[LIST_SCREEN_BUTTONS + 2]; struct ListScreen* s = (struct ListScreen*)screen; - s->widgets = s->listWidgets; - s->widgetsCount = Array_Elems(s->listWidgets); - Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_BOLD); - s->wheelAcc = 0.0f; - Screen_CommonInit(s); + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); + s->wheelAcc = 0.0f; + s->currentIndex = 0; + + Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_BOLD); + s->LoadEntries(s); } static void ListScreen_Render(void* screen, double delta) { @@ -504,7 +505,7 @@ static void ListScreen_Render(void* screen, double delta) { static void ListScreen_Free(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; Font_Free(&s->font); - Screen_CommonFree(s); + StringsBuffer_Clear(&s->entries); } static bool ListScreen_KeyDown(void* screen, Key key, bool was) { @@ -533,17 +534,12 @@ static struct ScreenVTABLE ListScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, ListScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, ListScreen_ContextRecreated, }; -struct ListScreen* ListScreen_MakeInstance(void) { +void ListScreen_Show(void) { struct ListScreen* s = &ListScreen_Instance; - StringsBuffer_Clear(&s->entries); s->grabsInput = true; s->closable = true; - s->widgetsCount = 0; - s->currentIndex = 0; - - s->UpdateEntry = ListScreen_UpdateEntry; - s->VTABLE = &ListScreen_VTABLE; - return s; + s->VTABLE = &ListScreen_VTABLE; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -873,8 +869,8 @@ static void EditHotkeyScreen_SaveChanges(void* screen, void* b) { Hotkeys_UserAddedHotkey(hk.Trigger, hk.Flags, hk.StaysOpen, &text); } - Gui_FreeActive(); - Gui_SetActive(HotkeyListScreen_MakeInstance()); + Gui_Remove((struct Screen*)screen); + HotkeyListScreen_Show(); } static void EditHotkeyScreen_RemoveHotkey(void* screen, void* b) { @@ -886,8 +882,8 @@ static void EditHotkeyScreen_RemoveHotkey(void* screen, void* b) { Hotkeys_UserRemovedHotkey(hk.Trigger, hk.Flags); } - Gui_FreeActive(); - Gui_SetActive(HotkeyListScreen_MakeInstance()); + Gui_Remove((struct Screen*)screen); + HotkeyListScreen_Show(); } static void EditHotkeyScreen_Render(void* screen, double delta) { @@ -1393,19 +1389,24 @@ static void TexturePackScreen_FilterFiles(const String* path, void* obj) { StringsBuffer_Add((StringsBuffer*)obj, &file); } -struct Screen* TexturePackScreen_MakeInstance(void) { - static const String title = String_FromConst("Select a texture pack zip"); - static const String path = String_FromConst("texpacks"); - struct ListScreen* s = ListScreen_MakeInstance(); - - s->titleText = title; - s->EntryClick = TexturePackScreen_EntryClick; - +static void TexturePackScreen_LoadEntries(struct ListScreen* s) { + static const String path = String_FromConst("texpacks"); Directory_Enum(&path, &s->entries, TexturePackScreen_FilterFiles); + if (s->entries.count) { ListScreen_QuickSort(0, s->entries.count - 1); } - return (struct Screen*)s; +} + +void TexturePackScreen_Show(void) { + static const String title = String_FromConst("Select a texture pack zip"); + struct ListScreen* s = &ListScreen_Instance; + + s->titleText = title; + s->LoadEntries = TexturePackScreen_LoadEntries; + s->EntryClick = TexturePackScreen_EntryClick; + s->UpdateEntry = ListScreen_UpdateEntry; + ListScreen_Show(); } @@ -1444,32 +1445,23 @@ static void FontListScreen_UpdateEntry(struct ListScreen* s, struct ButtonWidget Font_Free(&font); } -static void FontListScreen_Init(void* screen) { - struct ListScreen* s = (struct ListScreen*)screen; - ListScreen_Init(s); - ListScreen_Select(s, &Drawer2D_FontName); -} - -static struct ScreenVTABLE FontListScreen_VTABLE = { - FontListScreen_Init, ListScreen_Render, ListScreen_Free, Gui_DefaultRecreate, - ListScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, ListScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, ListScreen_ContextRecreated, -}; -struct Screen* FontListScreen_MakeInstance(void) { - static const String title = String_FromConst("Select a font"); - struct ListScreen* s = ListScreen_MakeInstance(); - - s->titleText = title; - s->EntryClick = FontListScreen_EntryClick; - s->UpdateEntry = FontListScreen_UpdateEntry; - s->VTABLE = &FontListScreen_VTABLE; - +static void FontListScreen_LoadEntries(struct ListScreen* s) { Font_GetNames(&s->entries); if (s->entries.count) { ListScreen_QuickSort(0, s->entries.count - 1); } - return (struct Screen*)s; + ListScreen_Select(s, &Drawer2D_FontName); +} + +void FontListScreen_Show(void) { + static const String title = String_FromConst("Select a font"); + struct ListScreen* s = &ListScreen_Instance; + + s->titleText = title; + s->LoadEntries = FontListScreen_LoadEntries; + s->EntryClick = FontListScreen_EntryClick; + s->UpdateEntry = FontListScreen_UpdateEntry; + ListScreen_Show(); } @@ -1516,18 +1508,12 @@ static void HotkeyListScreen_MakeFlags(int flags, String* str) { if (flags & HOTKEY_MOD_ALT) String_AppendConst(str, " Alt"); } -struct Screen* HotkeyListScreen_MakeInstance(void) { - static const String title = String_FromConst("Modify hotkeys"); - static const String empty = String_FromConst(LIST_SCREEN_EMPTY); +static void HotkeyListScreen_LoadEntries(struct ListScreen* s) { + static const String empty = String_FromConst(LIST_SCREEN_EMPTY); String text; char textBuffer[STRING_SIZE]; - - struct ListScreen* s = ListScreen_MakeInstance(); struct HotkeyData hKey; int i; - String_InitArray(text, textBuffer); - s->titleText = title; - s->EntryClick = HotkeyListScreen_EntryClick; for (i = 0; i < HotkeysText.count; i++) { hKey = HotkeysList[i]; @@ -1540,26 +1526,27 @@ struct Screen* HotkeyListScreen_MakeInstance(void) { } StringsBuffer_Add(&s->entries, &text); } - + for (i = 0; i < LIST_SCREEN_ITEMS; i++) { StringsBuffer_Add(&s->entries, &empty); } - return (struct Screen*)s; +} + +void HotkeyListScreen_Show(void) { + static const String title = String_FromConst("Modify hotkeys"); + struct ListScreen* s = &ListScreen_Instance; + + s->titleText = title; + s->LoadEntries = HotkeyListScreen_LoadEntries; + s->EntryClick = HotkeyListScreen_EntryClick; + s->UpdateEntry = ListScreen_UpdateEntry; + ListScreen_Show(); } /*########################################################################################################################* *----------------------------------------------------LoadLevelScreen------------------------------------------------------* *#########################################################################################################################*/ -static void LoadLevelScreen_FilterFiles(const String* path, void* obj) { - IMapImporter importer = Map_FindImporter(path); - String file = *path; - if (!importer) return; - - Utils_UNSAFE_GetFilename(&file); - StringsBuffer_Add((StringsBuffer*)obj, &file); -} - static void LoadLevelScreen_EntryClick(void* screen, void* widget) { String path; char pathBuffer[FILENAME_SIZE]; struct ListScreen* s = (struct ListScreen*)screen; @@ -1573,19 +1560,33 @@ static void LoadLevelScreen_EntryClick(void* screen, void* widget) { Map_LoadFrom(&path); } -struct Screen* LoadLevelScreen_MakeInstance(void) { - static const String title = String_FromConst("Select a level"); - static const String path = String_FromConst("maps"); - struct ListScreen* s = ListScreen_MakeInstance(); +static void LoadLevelScreen_FilterFiles(const String* path, void* obj) { + IMapImporter importer = Map_FindImporter(path); + String file = *path; + if (!importer) return; - s->titleText = title; - s->EntryClick = LoadLevelScreen_EntryClick; - + Utils_UNSAFE_GetFilename(&file); + StringsBuffer_Add((StringsBuffer*)obj, &file); +} + +static void LoadLevelScreen_LoadEntries(struct ListScreen* s) { + static const String path = String_FromConst("maps"); Directory_Enum(&path, &s->entries, LoadLevelScreen_FilterFiles); + if (s->entries.count) { ListScreen_QuickSort(0, s->entries.count - 1); } - return (struct Screen*)s; +} + +void LoadLevelScreen_Show(void) { + static const String title = String_FromConst("Select a level"); + struct ListScreen* s = &ListScreen_Instance; + + s->titleText = title; + s->LoadEntries = LoadLevelScreen_LoadEntries; + s->EntryClick = LoadLevelScreen_EntryClick; + s->UpdateEntry = ListScreen_UpdateEntry; + ListScreen_Show(); } diff --git a/src/Menus.h b/src/Menus.h index f69f37a40..beef3fbbe 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -20,11 +20,11 @@ struct Screen* MouseKeyBindingsScreen_MakeInstance(void); struct Screen* GenLevelScreen_MakeInstance(void); struct Screen* ClassicGenScreen_MakeInstance(void); -struct Screen* LoadLevelScreen_MakeInstance(void); +void LoadLevelScreen_Show(void); struct Screen* SaveLevelScreen_MakeInstance(void); -struct Screen* TexturePackScreen_MakeInstance(void); -struct Screen* FontListScreen_MakeInstance(void); -struct Screen* HotkeyListScreen_MakeInstance(void); +void TexturePackScreen_Show(void); +void FontListScreen_Show(void); +void HotkeyListScreen_Show(void); struct Screen* MiscOptionsScreen_MakeInstance(void); struct Screen* GuiOptionsScreen_MakeInstance(void); From 22dea901ee00d4d38abce7747d676cff09c874b6 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 12 Aug 2019 18:02:56 +1000 Subject: [PATCH 06/46] Get rid of unused wasDown argument for KeyDown handler in screens/widgets --- src/Gui.h | 8 ++++---- src/InputHandler.c | 8 ++++---- src/Menus.c | 36 ++++++++++++++++++------------------ src/Screens.c | 27 +++++++++++++-------------- src/Widgets.c | 41 +++++++++++++++++------------------------ 5 files changed, 56 insertions(+), 64 deletions(-) diff --git a/src/Gui.h b/src/Gui.h index c1b592f24..c6d04b603 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -39,7 +39,7 @@ extern bool Gui_ShowFPS; void (*Render)(void* elem, double delta); \ void (*Free)(void* elem); \ void (*Recreate)(void* elem); \ - bool (*HandlesKeyDown)(void* elem, Key key, bool wasDown); \ + bool (*HandlesKeyDown)(void* elem, Key key); \ bool (*HandlesKeyUp)(void* elem, Key key); \ bool (*HandlesKeyPress)(void* elem, char keyChar); \ bool (*HandlesMouseDown)(void* elem, int x, int y, MouseButton btn); \ @@ -187,9 +187,9 @@ void TextAtlas_AddInt(struct TextAtlas* atlas, int value, VertexP3fT2fC4b** vert #define Elem_Render(elem, delta) (elem)->VTABLE->Render(elem, delta) #define Elem_Free(elem) (elem)->VTABLE->Free(elem) #define Elem_Recreate(elem) (elem)->VTABLE->Recreate(elem) -#define Elem_HandlesKeyPress(elem, key) (elem)->VTABLE->HandlesKeyPress(elem, key) -#define Elem_HandlesKeyDown(elem, key, was) (elem)->VTABLE->HandlesKeyDown(elem, key, was) -#define Elem_HandlesKeyUp(elem, key) (elem)->VTABLE->HandlesKeyUp(elem, key) +#define Elem_HandlesKeyPress(elem, key) (elem)->VTABLE->HandlesKeyPress(elem, key) +#define Elem_HandlesKeyDown(elem, key) (elem)->VTABLE->HandlesKeyDown(elem, key) +#define Elem_HandlesKeyUp(elem, key) (elem)->VTABLE->HandlesKeyUp(elem, key) #define Elem_HandlesMouseDown(elem, x, y, btn) (elem)->VTABLE->HandlesMouseDown(elem, x, y, btn) #define Elem_HandlesMouseUp(elem, x, y, btn) (elem)->VTABLE->HandlesMouseUp(elem, x, y, btn) #define Elem_HandlesMouseMove(elem, x, y) (elem)->VTABLE->HandlesMouseMove(elem, x, y) diff --git a/src/InputHandler.c b/src/InputHandler.c index 6798a7e04..a3379748a 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -418,7 +418,7 @@ static void InputHandler_MouseMove(void* obj, int xDelta, int yDelta) { for (i = 0; i < Gui_ScreensCount; i++) { s = Gui_Screens[i]; - if (Elem_HandlesMouseMove(s, Mouse_X, Mouse_Y)) return; + if (s->VTABLE->HandlesMouseMove(s, Mouse_X, Mouse_Y)) return; } } @@ -428,7 +428,7 @@ static void InputHandler_MouseDown(void* obj, int btn) { for (i = 0; i < Gui_ScreensCount; i++) { s = Gui_Screens[i]; - if (Elem_HandlesMouseDown(s, Mouse_X, Mouse_Y, btn)) { + if (s->VTABLE->HandlesMouseDown(s, Mouse_X, Mouse_Y, btn)) { input_lastClick = DateTime_CurrentUTC_MS(); return; } } @@ -443,7 +443,7 @@ static void InputHandler_MouseUp(void* obj, int btn) { for (i = 0; i < Gui_ScreensCount; i++) { s = Gui_Screens[i]; - if (Elem_HandlesMouseUp(s, Mouse_X, Mouse_Y, btn)) return; + if (s->VTABLE->HandlesMouseUp(s, Mouse_X, Mouse_Y, btn)) return; } if (Server.SupportsPlayerClick && btn <= MOUSE_MIDDLE) { @@ -487,7 +487,7 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { Window_Close(); return; } else if (key == KeyBinds[KEYBIND_SCREENSHOT] && !was) { Game_ScreenshotRequested = true; return; - } else if (Elem_HandlesKeyDown(active, key, was)) { + } else if (Elem_HandlesKeyDown(active, key)) { return; } else if ((key == KEY_ESCAPE || key == KEY_PAUSE) && !Gui_GetInputGrab()) { #ifdef CC_BUILD_WEB diff --git a/src/Menus.c b/src/Menus.c index ab26fc31f..829724bfb 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -508,7 +508,7 @@ static void ListScreen_Free(void* screen) { StringsBuffer_Clear(&s->entries); } -static bool ListScreen_KeyDown(void* screen, Key key, bool was) { +static bool ListScreen_KeyDown(void* screen, Key key) { struct ListScreen* s = (struct ListScreen*)screen; if (key == KEY_LEFT || key == KEY_PAGEUP) { ListScreen_PageClick(s, false); @@ -546,7 +546,7 @@ void ListScreen_Show(void) { /*########################################################################################################################* *--------------------------------------------------------MenuScreen-------------------------------------------------------* *#########################################################################################################################*/ -static bool MenuScreen_KeyDown(void* screen, Key key, bool was) { return key < KEY_F1 || key > KEY_F35; } +static bool MenuScreen_KeyDown(void* screen, Key key) { return key < KEY_F1 || key > KEY_F35; } static bool MenuScreen_MouseScroll(void* screen, float delta) { return true; } static void MenuScreen_Init(void* screen) { @@ -911,7 +911,7 @@ static bool EditHotkeyScreen_KeyPress(void* screen, char keyChar) { return Elem_HandlesKeyPress(&s->input.base, keyChar); } -static bool EditHotkeyScreen_KeyDown(void* screen, Key key, bool was) { +static bool EditHotkeyScreen_KeyDown(void* screen, Key key) { struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; if (s->selectedI >= 0) { if (s->selectedI == 0) { @@ -930,7 +930,7 @@ static bool EditHotkeyScreen_KeyDown(void* screen, Key key, bool was) { s->selectedI = -1; return true; } - return Elem_HandlesKeyDown(&s->input.base, key, was) || MenuScreen_KeyDown(s, key, was); + return Elem_HandlesKeyDown(&s->input.base, key) || MenuScreen_KeyDown(s, key); } static bool EditHotkeyScreen_KeyUp(void* screen, Key key) { @@ -1088,10 +1088,10 @@ static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int x, int y, Widget_Reposition(label); } -static bool GenLevelScreen_KeyDown(void* screen, Key key, bool was) { +static bool GenLevelScreen_KeyDown(void* screen, Key key) { struct GenLevelScreen* s = (struct GenLevelScreen*)screen; - if (s->selected && Elem_HandlesKeyDown(&s->selected->base, key, was)) return true; - return MenuScreen_KeyDown(s, key, was); + if (s->selected && Elem_HandlesKeyDown(&s->selected->base, key)) return true; + return MenuScreen_KeyDown(s, key); } static bool GenLevelScreen_KeyUp(void* screen, Key key) { @@ -1303,11 +1303,11 @@ static bool SaveLevelScreen_KeyPress(void* screen, char keyChar) { return Elem_HandlesKeyPress(&s->input.base, keyChar); } -static bool SaveLevelScreen_KeyDown(void* screen, Key key, bool was) { +static bool SaveLevelScreen_KeyDown(void* screen, Key key) { struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; SaveLevelScreen_RemoveOverwrites(s); - if (Elem_HandlesKeyDown(&s->input.base, key, was)) return true; - return MenuScreen_KeyDown(s, key, was); + if (Elem_HandlesKeyDown(&s->input.base, key)) return true; + return MenuScreen_KeyDown(s, key); } static bool SaveLevelScreen_KeyUp(void* screen, Key key) { @@ -1666,13 +1666,13 @@ static int KeyBindingsScreen_MakeWidgets(struct KeyBindingsScreen* s, int y, int return i; } -static bool KeyBindingsScreen_KeyDown(void* screen, Key key, bool was) { +static bool KeyBindingsScreen_KeyDown(void* screen, Key key) { String text; char textBuffer[STRING_SIZE]; struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; struct ButtonWidget* cur; KeyBind bind; - if (s->curI == -1) return MenuScreen_KeyDown(s, key, was); + if (s->curI == -1) return MenuScreen_KeyDown(s, key); bind = s->binds[s->curI]; if (key == KEY_ESCAPE) key = KeyBind_Defaults[bind]; @@ -1698,7 +1698,7 @@ static bool KeyBindingsScreen_MouseDown(void* screen, int x, int y, MouseButton /* Reset a key binding by right clicking */ if ((s->curI == -1 || s->curI == i) && i < s->bindsCount) { s->curI = i; - Elem_HandlesKeyDown(s, KeyBind_Defaults[s->binds[i]], false); + Elem_HandlesKeyDown(s, KeyBind_Defaults[s->binds[i]]); } return true; } @@ -2002,16 +2002,16 @@ static bool MenuOptionsScreen_KeyPress(void* screen, char keyChar) { return Elem_HandlesKeyPress(&s->input.base, keyChar); } -static bool MenuOptionsScreen_KeyDown(void* screen, Key key, bool was) { +static bool MenuOptionsScreen_KeyDown(void* screen, Key key) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; if (s->activeI >= 0) { - if (Elem_HandlesKeyDown(&s->input.base, key, was)) return true; + if (Elem_HandlesKeyDown(&s->input.base, key)) return true; if (key == KEY_ENTER || key == KEY_KP_ENTER) { MenuOptionsScreen_EnterInput(s); return true; } } - return MenuScreen_KeyDown(s, key, was); + return MenuScreen_KeyDown(s, key); } static bool MenuOptionsScreen_KeyUp(void* screen, Key key) { @@ -2874,7 +2874,7 @@ static void Overlay_Free(void* screen) { Gui_RemoveOverlay(screen); } -static bool Overlay_KeyDown(void* screen, Key key, bool was) { return true; } +static bool Overlay_KeyDown(void* screen, Key key) { return true; } static void Overlay_MakeLabels(void* menu, struct TextWidget* labels, const String* lines) { struct MenuScreen* s = (struct MenuScreen*)menu; @@ -3039,7 +3039,7 @@ static void TexIdsOverlay_Render(void* screen, double delta) { Gfx_SetTexturing(false); } -static bool TexIdsOverlay_KeyDown(void* screen, Key key, bool was) { +static bool TexIdsOverlay_KeyDown(void* screen, Key key) { struct Screen* s = (struct Screen*)screen; if (key == KeyBinds[KEYBIND_IDOVERLAY]) { Gui_Remove(s); return true; } return false; diff --git a/src/Screens.c b/src/Screens.c index a64bcedde..9ed3198b9 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -50,15 +50,14 @@ struct HUDScreen { }; -static bool Screen_FKeyDown(void* elem, Key key, bool was) { return false; } -static bool Screen_FKeyUp(void* elem, Key key) { return false; } +static bool Screen_FKey(void* elem, Key key) { return false; } static bool Screen_FKeyPress(void* elem, char keyChar) { return false; } static bool Screen_FMouseScroll(void* elem, float delta) { return false; } static bool Screen_FMouse(void* elem, int x, int y, int btn) { return false; } static bool Screen_FMouseMove(void* elem, int x, int y) { return false; } static bool Screen_TKeyPress(void* elem, char keyChar) { return true; } -static bool Screen_TKeyUp(void* s, Key key) { return true; } +static bool Screen_TKey(void* s, Key key) { return true; } static bool Screen_TMouseScroll(void* screen, float delta) { return true; } static bool Screen_TMouse(void* screen, int x, int y, int btn) { return true; } static void Screen_NullFunc(void* screen) { } @@ -137,7 +136,7 @@ static void InventoryScreen_Free(void* screen) { Event_UnregisterVoid(&BlockEvents.BlockDefChanged, s, InventoryScreen_OnBlockChanged); } -static bool InventoryScreen_KeyDown(void* screen, Key key, bool was) { +static bool InventoryScreen_KeyDown(void* screen, Key key) { struct InventoryScreen* s = (struct InventoryScreen*)screen; struct TableWidget* table = &s->table; @@ -146,10 +145,10 @@ static bool InventoryScreen_KeyDown(void* screen, Key key, bool was) { } else if (key == KEY_ENTER && table->selectedIndex != -1) { Inventory_SetSelectedBlock(table->elements[table->selectedIndex]); Gui_Remove(screen); - } else if (Elem_HandlesKeyDown(table, key, was)) { + } else if (Elem_HandlesKeyDown(table, key)) { } else { struct HUDScreen* hud = (struct HUDScreen*)Gui_HUD; - return Elem_HandlesKeyDown(&hud->hotbar, key, was); + return Elem_HandlesKeyDown(&hud->hotbar, key); } return true; } @@ -399,7 +398,7 @@ static void StatusScreen_Render(void* screen, double delta) { static struct ScreenVTABLE StatusScreen_VTABLE = { Screen_NullFunc, StatusScreen_Render, Screen_NullFunc, Gui_DefaultRecreate, - Screen_FKeyDown, Screen_FKeyUp, Screen_FKeyPress, + Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, Screen_NullFunc, StatusScreen_ContextLost, StatusScreen_ContextRecreated, }; @@ -563,7 +562,7 @@ CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const Stri static struct ScreenVTABLE LoadingScreen_VTABLE = { LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, - Screen_FKeyDown, Screen_FKeyUp, Screen_FKeyPress, + Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; @@ -633,7 +632,7 @@ static void GeneratingScreen_Render(void* screen, double delta) { static struct ScreenVTABLE GeneratingScreen_VTABLE = { GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, - Screen_FKeyDown, Screen_FKeyUp, Screen_FKeyPress, + Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, }; @@ -1036,7 +1035,7 @@ static bool HUDScreen_KeyPress(void* screen, char keyChar) { return true; } -static bool HUDScreen_KeyDown(void* screen, Key key, bool was) { +static bool HUDScreen_KeyDown(void* screen, Key key) { static const String slash = String_FromConst("/"); struct HUDScreen* s = (struct HUDScreen*)screen; Key playerListKey = KeyBinds[KEYBIND_PLAYER_LIST]; @@ -1066,7 +1065,7 @@ static bool HUDScreen_KeyDown(void* screen, Key key, bool was) { } else if (key == KEY_PAGEDOWN) { HUDScreen_ScrollChatBy(s, +Gui_Chatlines); } else { - Elem_HandlesKeyDown(&s->input.base, key, was); + Elem_HandlesKeyDown(&s->input.base, key); HUDScreen_UpdateAltTextY(s); } return key < KEY_F1 || key > KEY_F35; @@ -1077,7 +1076,7 @@ static bool HUDScreen_KeyDown(void* screen, Key key, bool was) { } else if (key == KEY_SLASH) { HUDScreen_OpenInput(&slash); } else { - return Elem_HandlesKeyDown(&s->hotbar, key, was); + return Elem_HandlesKeyDown(&s->hotbar, key); } return true; } @@ -1368,7 +1367,7 @@ static void DisconnectScreen_OnResize(void* screen) { Widget_Reposition(&s->reconnect); } -static bool DisconnectScreen_KeyDown(void* s, Key key, bool was) { return key < KEY_F1 || key > KEY_F35; } +static bool DisconnectScreen_KeyDown(void* s, Key key) { return key < KEY_F1 || key > KEY_F35; } static bool DisconnectScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; @@ -1389,7 +1388,7 @@ static bool DisconnectScreen_MouseMove(void* screen, int x, int y) { static struct ScreenVTABLE DisconnectScreen_VTABLE = { DisconnectScreen_Init, DisconnectScreen_Render, DisconnectScreen_Free, Gui_DefaultRecreate, - DisconnectScreen_KeyDown, Screen_TKeyUp, Screen_TKeyPress, + DisconnectScreen_KeyDown, Screen_TKey, Screen_TKeyPress, DisconnectScreen_MouseDown, Screen_TMouse, DisconnectScreen_MouseMove, Screen_TMouseScroll, DisconnectScreen_OnResize, DisconnectScreen_ContextLost, DisconnectScreen_ContextRecreated }; diff --git a/src/Widgets.c b/src/Widgets.c index dc51ff6af..45a62e6b2 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -23,8 +23,7 @@ static void Widget_NullFunc(void* widget) { } static Size2D Size2D_Empty; static bool Widget_Mouse(void* elem, int x, int y, MouseButton btn) { return false; } -static bool Widget_KeyDown(void* elem, Key key, bool was) { return false; } -static bool Widget_KeyUp(void* elem, Key key) { return false; } +static bool Widget_Key(void* elem, Key key) { return false; } static bool Widget_KeyPress(void* elem, char keyChar) { return false; } static bool Widget_MouseMove(void* elem, int x, int y) { return false; } static bool Widget_MouseScroll(void* elem, float delta) { return false; } @@ -44,16 +43,14 @@ static void TextWidget_Free(void* widget) { static void TextWidget_Reposition(void* widget) { struct TextWidget* w = (struct TextWidget*)widget; - int oldX = w->x, oldY = w->y; - Widget_CalcPosition(w); - w->texture.X += w->x - oldX; - w->texture.Y += w->y - oldY; + w->texture.X = w->x; + w->texture.Y = w->y; } static struct WidgetVTABLE TextWidget_VTABLE = { Widget_NullFunc, TextWidget_Render, TextWidget_Free, Gui_DefaultRecreate, - Widget_KeyDown, Widget_KeyUp, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, TextWidget_Reposition, }; @@ -108,11 +105,10 @@ static void ButtonWidget_Free(void* widget) { static void ButtonWidget_Reposition(void* widget) { struct ButtonWidget* w = (struct ButtonWidget*)widget; - int oldX = w->x, oldY = w->y; Widget_CalcPosition(w); - w->texture.X += w->x - oldX; - w->texture.Y += w->y - oldY; + w->texture.X = w->x + (w->width / 2 - w->texture.Width / 2); + w->texture.Y = w->y + (w->height / 2 - w->texture.Height / 2); } static void ButtonWidget_Render(void* widget, double delta) { @@ -156,7 +152,7 @@ static void ButtonWidget_Render(void* widget, double delta) { static struct WidgetVTABLE ButtonWidget_VTABLE = { Widget_NullFunc, ButtonWidget_Render, ButtonWidget_Free, Gui_DefaultRecreate, - Widget_KeyDown, Widget_KeyUp, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, ButtonWidget_Reposition, }; @@ -182,10 +178,7 @@ void ButtonWidget_Set(struct ButtonWidget* w, const String* text, const FontDesc w->width = max(w->texture.Width, w->minWidth); w->height = max(w->texture.Height, BUTTON_MIN_WIDTH); - Widget_Reposition(w); - w->texture.X = w->x + (w->width / 2 - w->texture.Width / 2); - w->texture.Y = w->y + (w->height / 2 - w->texture.Height / 2); } void ButtonWidget_Create(struct ButtonWidget* w, int minWidth, const String* text, const FontDesc* font, Widget_LeftClick onClick) { @@ -304,7 +297,7 @@ static bool ScrollbarWidget_MouseMove(void* widget, int x, int y) { static struct WidgetVTABLE ScrollbarWidget_VTABLE = { Widget_NullFunc, ScrollbarWidget_Render, Widget_NullFunc, Gui_DefaultRecreate, - Widget_KeyDown, Widget_KeyUp, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_KeyPress, ScrollbarWidget_MouseDown, ScrollbarWidget_MouseUp, ScrollbarWidget_MouseMove, ScrollbarWidget_MouseScroll, Widget_CalcPosition, }; @@ -417,7 +410,7 @@ static void HotbarWidget_Render(void* widget, double delta) { HotbarWidget_RenderHotbarBlocks(w); } -static bool HotbarWidget_KeyDown(void* widget, Key key, bool was) { +static bool HotbarWidget_KeyDown(void* widget, Key key) { struct HotbarWidget* w = (struct HotbarWidget*)widget; int index; if (key < '1' || key > '9') return false; @@ -809,7 +802,7 @@ static bool TableWidget_MouseMove(void* widget, int x, int y) { return true; } -static bool TableWidget_KeyDown(void* widget, Key key, bool was) { +static bool TableWidget_KeyDown(void* widget, Key key) { struct TableWidget* w = (struct TableWidget*)widget; if (w->selectedIndex == -1) return false; @@ -829,7 +822,7 @@ static bool TableWidget_KeyDown(void* widget, Key key, bool was) { static struct WidgetVTABLE TableWidget_VTABLE = { TableWidget_Init, TableWidget_Render, TableWidget_Free, TableWidget_Recreate, - TableWidget_KeyDown, Widget_KeyUp, Widget_KeyPress, + TableWidget_KeyDown, Widget_Key, Widget_KeyPress, TableWidget_MouseDown, TableWidget_MouseUp, TableWidget_MouseMove, TableWidget_MouseScroll, TableWidget_Reposition, }; @@ -1200,7 +1193,7 @@ static void InputWidget_Reposition(void* widget) { w->inputTex.X += w->x - oldX; w->inputTex.Y += w->y - oldY; } -static bool InputWidget_KeyDown(void* widget, Key key, bool was) { +static bool InputWidget_KeyDown(void* widget, Key key) { struct InputWidget* w = (struct InputWidget*)widget; if (key == KEY_LEFT) { InputWidget_LeftKey(w); @@ -1741,12 +1734,12 @@ static void ChatInputWidget_TabKey(struct InputWidget* w) { } } -static bool ChatInputWidget_KeyDown(void* widget, Key key, bool was) { +static bool ChatInputWidget_KeyDown(void* widget, Key key) { struct InputWidget* w = (struct InputWidget*)widget; if (key == KEY_TAB) { ChatInputWidget_TabKey(w); return true; } if (key == KEY_UP) { ChatInputWidget_UpKey(w); return true; } if (key == KEY_DOWN) { ChatInputWidget_DownKey(w); return true; } - return InputWidget_KeyDown(w, key, was); + return InputWidget_KeyDown(w, key); } static int ChatInputWidget_GetMaxLines(void) { @@ -2153,7 +2146,7 @@ static void PlayerListWidget_Free(void* widget) { static struct WidgetVTABLE PlayerListWidget_VTABLE = { PlayerListWidget_Init, PlayerListWidget_Render, PlayerListWidget_Free, Gui_DefaultRecreate, - Widget_KeyDown, Widget_KeyUp, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, PlayerListWidget_Reposition, }; @@ -2585,7 +2578,7 @@ static void TextGroupWidget_Free(void* widget) { static struct WidgetVTABLE TextGroupWidget_VTABLE = { TextGroupWidget_Init, TextGroupWidget_Render, TextGroupWidget_Free, Gui_DefaultRecreate, - Widget_KeyDown, Widget_KeyUp, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, TextGroupWidget_Reposition, }; @@ -2838,7 +2831,7 @@ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active) { static struct WidgetVTABLE SpecialInputWidget_VTABLE = { SpecialInputWidget_Init, SpecialInputWidget_Render, SpecialInputWidget_Free, Gui_DefaultRecreate, - Widget_KeyDown, Widget_KeyUp, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_KeyPress, SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, Widget_CalcPosition, }; From 5934c3618b7a3e68c71e75c59ad02f3880c7670b Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 14 Aug 2019 07:52:03 +1000 Subject: [PATCH 07/46] Fix cursor being visible at wrong time And gen/save menus show up properly now --- src/Gui.c | 25 +++++++++++++++++++++---- src/Menus.c | 18 +++++++++--------- src/Menus.h | 6 +++--- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 558b2862f..16346f88d 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -227,7 +227,7 @@ int Gui_Index(struct Screen* s) { return -1; } -void Gui_Add(struct Screen* s, int priority) { +static void Gui_AddCore(struct Screen* s, int priority) { int i, j; if (Gui_ScreensCount >= GUI_MAX_SCREENS) Logger_Abort("Hit max screens"); @@ -252,7 +252,7 @@ void Gui_Add(struct Screen* s, int priority) { s->VTABLE->HandlesMouseMove(s, Mouse_X, Mouse_Y); } -void Gui_Remove(struct Screen* s) { +static void Gui_RemoveCore(struct Screen* s) { int i = Gui_Index(s); if (i == -1) return; @@ -266,9 +266,26 @@ void Gui_Remove(struct Screen* s) { s->VTABLE->Free(s); } +void Gui_Add(struct Screen* s, int priority) { + Gui_AddCore(s, priority); + Camera_CheckFocus(); +} + +void Gui_Remove(struct Screen* s) { + Gui_RemoveCore(s); + Camera_CheckFocus(); +} + void Gui_Replace(struct Screen* s, int priority) { - Gui_Remove(s); - Gui_Add(s, priority); + int i; + Gui_RemoveCore(s); + /* Backwards loop since removing changes count and gui_screens */ + for (i = Gui_ScreensCount - 1; i >= 0; i--) { + if (priorities[i] == priority) Gui_RemoveCore(Gui_Screens[i]); + } + + Gui_AddCore(s, priority); + Camera_CheckFocus(); } struct Screen* Gui_GetInputGrab(void) { diff --git a/src/Menus.c b/src/Menus.c index 829724bfb..4c1283dca 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -316,10 +316,10 @@ static void Menu_SwitchHacks(void* a, void* b) { Menu_ReplaceActive(HacksSet static void Menu_SwitchEnv(void* a, void* b) { Menu_ReplaceActive(EnvSettingsScreen_MakeInstance()); } static void Menu_SwitchNostalgia(void* a, void* b) { Menu_ReplaceActive(NostalgiaScreen_MakeInstance()); } -static void Menu_SwitchGenLevel(void* a, void* b) { Menu_ReplaceActive(GenLevelScreen_MakeInstance()); } -static void Menu_SwitchClassicGenLevel(void* a, void* b) { Menu_ReplaceActive(ClassicGenScreen_MakeInstance()); } +static void Menu_SwitchGenLevel(void* a, void* b) { GenLevelScreen_Show(); } +static void Menu_SwitchClassicGenLevel(void* a, void* b) { ClassicGenScreen_Show(); } static void Menu_SwitchLoadLevel(void* a, void* b) { LoadLevelScreen_Show(); } -static void Menu_SwitchSaveLevel(void* a, void* b) { Menu_ReplaceActive(SaveLevelScreen_MakeInstance()); } +static void Menu_SwitchSaveLevel(void* a, void* b) { SaveLevelScreen_Show(); } static void Menu_SwitchTexPacks(void* a, void* b) { TexturePackScreen_Show(); } static void Menu_SwitchHotkeys(void* a, void* b) { HotkeyListScreen_Show(); } static void Menu_SwitchFont(void* a, void* b) { FontListScreen_Show(); } @@ -1135,7 +1135,7 @@ static struct ScreenVTABLE GenLevelScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, GenLevelScreen_ContextRecreated, }; -struct Screen* GenLevelScreen_MakeInstance(void) { +void GenLevelScreen_Show(void) { static struct Widget* widgets[12]; struct GenLevelScreen* s = &GenLevelScreen_Instance; @@ -1145,7 +1145,7 @@ struct Screen* GenLevelScreen_MakeInstance(void) { s->widgetsCount = Array_Elems(widgets); s->VTABLE = &GenLevelScreen_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1186,7 +1186,7 @@ static struct ScreenVTABLE ClassicGenScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, ClassicGenScreen_ContextRecreated, }; -struct Screen* ClassicGenScreen_MakeInstance(void) { +void ClassicGenScreen_Show(void) { static struct Widget* widgets[4]; struct ClassicGenScreen* s = &ClassicGenScreen_Instance; @@ -1196,7 +1196,7 @@ struct Screen* ClassicGenScreen_MakeInstance(void) { s->widgetsCount = Array_Elems(widgets); s->VTABLE = &ClassicGenScreen_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1343,7 +1343,7 @@ static struct ScreenVTABLE SaveLevelScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, SaveLevelScreen_ContextRecreated, }; -struct Screen* SaveLevelScreen_MakeInstance(void) { +void SaveLevelScreen_Show(void) { static struct Widget* widgets[6]; struct SaveLevelScreen* s = &SaveLevelScreen_Instance; @@ -1353,7 +1353,7 @@ struct Screen* SaveLevelScreen_MakeInstance(void) { s->widgetsCount = Array_Elems(widgets); s->VTABLE = &SaveLevelScreen_VTABLE; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } diff --git a/src/Menus.h b/src/Menus.h index beef3fbbe..9a94fa173 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -18,10 +18,10 @@ struct Screen* HacksKeyBindingsScreen_MakeInstance(void); struct Screen* OtherKeyBindingsScreen_MakeInstance(void); struct Screen* MouseKeyBindingsScreen_MakeInstance(void); -struct Screen* GenLevelScreen_MakeInstance(void); -struct Screen* ClassicGenScreen_MakeInstance(void); +void GenLevelScreen_Show(void); +void ClassicGenScreen_Show(void); void LoadLevelScreen_Show(void); -struct Screen* SaveLevelScreen_MakeInstance(void); +void SaveLevelScreen_Show(void); void TexturePackScreen_Show(void); void FontListScreen_Show(void); void HotkeyListScreen_Show(void); From bf6c81189decc111e112717cd63f68ada96a4862 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 14 Aug 2019 23:12:06 +1000 Subject: [PATCH 08/46] Reuse buttons/widgets arrays and save 5kb of memory --- src/Menus.c | 59 +++++++++++++++++++--------------------------------- src/Server.c | 1 - 2 files changed, 21 insertions(+), 39 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 4c1283dca..db1805f94 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1020,7 +1020,7 @@ CC_NOINLINE static int GenLevelScreen_GetSeedInt(struct GenLevelScreen* s, int i static void GenLevelScreen_Begin(int width, int height, int length) { World_Reset(); World_SetDimensions(width, height, length); - Gui_FreeActive(); + Gui_FreeActive(); // TODO: fix for classicgen GeneratingScreen_Show(); } @@ -2144,8 +2144,10 @@ static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, NULL, }; -struct Screen* MenuOptionsScreen_MakeInstance(struct Widget** widgets, int count, struct ButtonWidget* buttons, Event_Void_Callback contextRecreated, - struct MenuInputDesc* descs, const char** descriptions, int descsCount) { +struct Screen* MenuOptionsScreen_MakeInstance(int count, Event_Void_Callback contextRecreated, struct MenuInputDesc* descs, const char** descriptions, int descsCount) { + static struct ButtonWidget buttons[11]; /* max buttons used is 11 */ + static struct Widget* widgets[11 + 3]; /* max buttons + 3 widgets for input */ + struct MenuOptionsScreen* s = &MenuOptionsScreen_Instance; s->grabsInput = true; s->closable = true; @@ -2259,14 +2261,11 @@ static void ClassicOptionsScreen_ContextRecreated(void* screen) { } struct Screen* ClassicOptionsScreen_MakeInstance(void) { - static struct ButtonWidget buttons[11]; - static struct MenuInputDesc descs[Array_Elems(buttons)]; - static struct Widget* widgets[Array_Elems(buttons)]; - + static struct MenuInputDesc descs[11]; MenuInput_Enum(descs[2], ViewDist_Names, VIEW_COUNT); MenuInput_Enum(descs[7], FpsLimit_Names, FPS_LIMIT_COUNT); - return MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + return MenuOptionsScreen_MakeInstance(11, ClassicOptionsScreen_ContextRecreated, descs, NULL, 0); } @@ -2347,10 +2346,7 @@ static String String_InitAndClear(STRING_REF char* buffer, int capacity) { } struct Screen* EnvSettingsScreen_MakeInstance(void) { - static struct ButtonWidget buttons[11]; - static struct MenuInputDesc descs[Array_Elems(buttons)]; - static struct Widget* widgets[Array_Elems(buttons) + 3]; - + static struct MenuInputDesc descs[1]; MenuInput_Hex(descs[0], Env_DefaultCloudsCol); MenuInput_Hex(descs[1], Env_DefaultSkyCol); MenuInput_Hex(descs[2], Env_DefaultFogCol); @@ -2363,7 +2359,7 @@ struct Screen* EnvSettingsScreen_MakeInstance(void) { MenuInput_Float(descs[8], -100, 100, 1); MenuInput_Int(descs[9], -2048, 2048, World.Height / 2); - return MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + return MenuOptionsScreen_MakeInstance(4, EnvSettingsScreen_ContextRecreated, descs, NULL, 0); } @@ -2424,11 +2420,9 @@ static void GraphicsOptionsScreen_ContextRecreated(void* screen) { } struct Screen* GraphicsOptionsScreen_MakeInstance(void) { - static struct ButtonWidget buttons[7]; - static struct MenuInputDesc descs[Array_Elems(buttons)]; - static struct Widget* widgets[Array_Elems(buttons) + 3]; - - static const char* extDescs[Array_Elems(buttons)]; + static struct MenuInputDesc descs[7]; + static const char* extDescs[Array_Elems(descs)]; + extDescs[0] = \ "&eVSync: &fNumber of frames rendered is at most the monitor's refresh rate.\n" \ "&e30/60/120/144 FPS: &fRenders 30/60/120/144 frames at most each second.\n" \ @@ -2452,7 +2446,7 @@ struct Screen* GraphicsOptionsScreen_MakeInstance(void) { MenuInput_Enum(descs[3], NameMode_Names, NAME_MODE_COUNT); MenuInput_Enum(descs[4], ShadowMode_Names, SHADOW_MODE_COUNT); - return MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + return MenuOptionsScreen_MakeInstance(10, GraphicsOptionsScreen_ContextRecreated, descs, extDescs, Array_Elems(extDescs)); } @@ -2536,16 +2530,13 @@ static void GuiOptionsScreen_ContextRecreated(void* screen) { } struct Screen* GuiOptionsScreen_MakeInstance(void) { - static struct ButtonWidget buttons[11]; - static struct MenuInputDesc descs[Array_Elems(buttons)]; - static struct Widget* widgets[Array_Elems(buttons) + 3]; - + static struct MenuInputDesc descs[11]; MenuInput_Float(descs[2], 0.25f, 4.00f, 1); MenuInput_Float(descs[3], 0.25f, 4.00f, 1); MenuInput_Float(descs[6], 0.25f, 4.00f, 1); MenuInput_Int(descs[7], 0, 30, 10); - return MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + return MenuOptionsScreen_MakeInstance(14, GuiOptionsScreen_ContextRecreated, descs, NULL, 0); } @@ -2680,11 +2671,9 @@ static void HacksSettingsScreen_ContextRecreated(void* screen) { } struct Screen* HacksSettingsScreen_MakeInstance(void) { - static struct ButtonWidget buttons[11]; - static struct MenuInputDesc descs[Array_Elems(buttons)]; - static struct Widget* widgets[Array_Elems(buttons) + 3]; + static struct MenuInputDesc descs[11]; + static const char* extDescs[Array_Elems(descs)]; - static const char* extDescs[Array_Elems(buttons)]; extDescs[2] = "&eIf &fON&e, then the third person cameras will limit\nðeir zoom distance if they hit a solid block."; extDescs[3] = "&eSets how many blocks high you can jump up.\n&eNote: You jump much higher when holding down the Speed key binding."; extDescs[7] = \ @@ -2697,7 +2686,7 @@ struct Screen* HacksSettingsScreen_MakeInstance(void) { MenuInput_Float(descs[3], 0.1f, 2048, 1.233f); MenuInput_Int(descs[9], 1, 179, 70); - struct Screen* s = MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + struct Screen* s = MenuOptionsScreen_MakeInstance(14, HacksSettingsScreen_ContextRecreated, descs, extDescs, Array_Elems(extDescs)); s->VTABLE->ContextLost = HacksSettingsScreen_ContextLost; return s; @@ -2775,10 +2764,7 @@ static void MiscOptionsScreen_ContextRecreated(void* screen) { } struct Screen* MiscOptionsScreen_MakeInstance(void) { - static struct ButtonWidget buttons[9]; - static struct MenuInputDesc descs[Array_Elems(buttons)]; - static struct Widget* widgets[Array_Elems(buttons) + 3]; - + static struct MenuInputDesc descs[9]; MenuInput_Float(descs[0], 1, 1024, 5); MenuInput_Int(descs[1], 0, 100, 0); MenuInput_Int(descs[2], 0, 100, 0); @@ -2788,7 +2774,7 @@ struct Screen* MiscOptionsScreen_MakeInstance(void) { MenuInput_Int(descs[7], 1, 200, 30); #endif - return MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + return MenuOptionsScreen_MakeInstance(12, MiscOptionsScreen_ContextRecreated, descs, NULL, 0); } @@ -2858,10 +2844,7 @@ static void NostalgiaScreen_ContextRecreated(void* screen) { } struct Screen* NostalgiaScreen_MakeInstance(void) { - static struct ButtonWidget buttons[9]; - static struct Widget* widgets[Array_Elems(buttons) + 1]; - - return MenuOptionsScreen_MakeInstance(widgets, Array_Elems(widgets), buttons, + return MenuOptionsScreen_MakeInstance(10, NostalgiaScreen_ContextRecreated, NULL, NULL, 0); } diff --git a/src/Server.c b/src/Server.c index 570d4bbaf..60af98019 100644 --- a/src/Server.c +++ b/src/Server.c @@ -139,7 +139,6 @@ static void SPConnection_BeginConnect(void) { path = Game_Username; if (SP_HasDir(path) && File_Exists(&path)) { Map_LoadFrom(&path); - Gui_CloseActive(); return; } From 242ffea6e2fbd57fbed8981f926c2bb403673fc0 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 15 Aug 2019 08:48:35 +1000 Subject: [PATCH 09/46] simplify listscreen --- src/InputHandler.c | 20 ++-- src/Menus.c | 274 +++++++++++++++++++++------------------------ src/Screens.c | 2 + src/Widgets.c | 12 +- src/Widgets.h | 4 + 5 files changed, 155 insertions(+), 157 deletions(-) diff --git a/src/InputHandler.c b/src/InputHandler.c index a3379748a..fe7234356 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -185,8 +185,6 @@ static bool InputHandler_HandleNonClassicKey(Key key) { } static bool InputHandler_HandleCoreKey(Key key) { - struct Screen* active = Gui_GetActiveScreen(); - if (key == KeyBinds[KEYBIND_HIDE_FPS]) { Gui_ShowFPS = !Gui_ShowFPS; } else if (key == KeyBinds[KEYBIND_FULLSCREEN]) { @@ -206,8 +204,6 @@ static bool InputHandler_HandleCoreKey(Key key) { } else { InputHandler_CycleDistanceForwards(viewDists, count); } - } else if (key == KeyBinds[KEYBIND_INVENTORY] && active == Gui_HUD) { - InventoryScreen_Show(); } else if (key == KEY_F5 && Game_ClassicMode) { int weather = Env.Weather == WEATHER_SUNNY ? WEATHER_RAINY : WEATHER_SUNNY; Env_SetWeather(weather); @@ -521,22 +517,26 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { } static void InputHandler_KeyUp(void* obj, int key) { - struct Screen* active; - if (InputHandler_SimulateMouse(key, false)) return; + struct Screen* s; + int i; + if (InputHandler_SimulateMouse(key, false)) return; if (key == KeyBinds[KEYBIND_ZOOM_SCROLL]) Game_SetFov(Game_DefaultFov); - active = Gui_GetActiveScreen(); #ifdef CC_BUILD_WEB /* When closing menus (which reacquires mouse focus) in key down, */ /* this still leaves the cursor visible. But if this is instead */ /* done in key up, the cursor disappears as expected. */ - if (key == KEY_ESCAPE && active->closable) { + if (key == KEY_ESCAPE && (s = Gui_GetClosable())) { if (suppressEscape) { suppressEscape = false; return; } - Gui_Close(active); return; + Gui_Remove(s); return; } #endif - Elem_HandlesKeyUp(active, key); + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (s->VTABLE->HandlesKeyUp(s, key)) return; + } } static void InputHandler_KeyPress(void* obj, int keyChar) { diff --git a/src/Menus.c b/src/Menus.c index db1805f94..5ac1c2615 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -35,66 +35,6 @@ struct Menu { MenuBase_Layout }; #define MenuScreen_Layout MenuBase_Layout FontDesc titleFont, textFont; struct MenuScreen { MenuScreen_Layout }; -struct OptionsGroupScreen { - MenuScreen_Layout - struct ButtonWidget buttons[8]; - struct TextWidget desc; - int selectedI; -}; - -struct EditHotkeyScreen { - MenuScreen_Layout - struct ButtonWidget buttons[6]; - struct HotkeyData curHotkey, origHotkey; - int selectedI; - bool supressNextPress; - struct MenuInputWidget input; -}; - -struct GenLevelScreen { - MenuScreen_Layout - struct ButtonWidget buttons[3]; - struct MenuInputWidget* selected; - struct MenuInputWidget inputs[4]; - struct TextWidget labels[5]; -}; - -struct ClassicGenScreen { - MenuScreen_Layout - struct ButtonWidget buttons[4]; -}; - -struct KeyBindingsScreen { - MenuScreen_Layout - struct ButtonWidget* buttons; - int curI, bindsCount; - const char** descs; - uint8_t* binds; - Widget_LeftClick leftPage, rightPage; - struct TextWidget title; - struct ButtonWidget back, left, right; -}; - -struct SaveLevelScreen { - MenuScreen_Layout - struct ButtonWidget buttons[3]; - struct MenuInputWidget input; - struct TextWidget mcEdit, desc; -}; - -#define MENUOPTIONS_MAX_DESC 5 -struct MenuOptionsScreen { - MenuScreen_Layout - struct ButtonWidget* buttons; - struct MenuInputDesc* descs; - const char** descriptions; - int activeI, selectedI, descriptionsCount; - struct ButtonWidget ok, Default; - struct MenuInputWidget input; - struct TextGroupWidget extHelp; - struct Texture extHelpTextures[MENUOPTIONS_MAX_DESC]; -}; - /* Describes a menu option button */ struct MenuOptionDesc { short dir, y; @@ -104,31 +44,22 @@ struct MenuOptionDesc { }; struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; }; -struct TexIdsOverlay { - MenuScreen_Layout - struct ButtonWidget* buttons; - GfxResourceID dynamicVb; - int xOffset, yOffset, tileSize, baseTexLoc; - struct TextAtlas idAtlas; - struct TextWidget title; -}; - struct UrlWarningOverlay { MenuScreen_Layout + bool openingUrl; + String url; struct ButtonWidget buttons[2]; struct TextWidget labels[4]; - String url; - bool openingUrl; char _urlBuffer[STRING_SIZE * 4]; }; struct TexPackOverlay { MenuScreen_Layout - struct ButtonWidget buttons[4]; - struct TextWidget labels[4]; bool showingDeny, alwaysDeny; uint32_t contentLength; String identifier; + struct ButtonWidget buttons[4]; + struct TextWidget labels[4]; char _identifierBuffer[STRING_SIZE + 4]; }; @@ -330,22 +261,22 @@ static void Menu_SwitchFont(void* a, void* b) { FontListScreen_Show() *#########################################################################################################################*/ struct ListScreen; #define LIST_SCREEN_ITEMS 5 -#define LIST_SCREEN_BUTTONS (LIST_SCREEN_ITEMS + 3) #define LIST_SCREEN_EMPTY "-----" static struct ListScreen { MenuBase_Layout - struct ButtonWidget buttons[LIST_SCREEN_BUTTONS]; + struct ButtonWidget buttons[LIST_SCREEN_ITEMS]; + struct ButtonWidget left, right, done; FontDesc font; float wheelAcc; int currentIndex; Widget_LeftClick EntryClick; void (*LoadEntries)(struct ListScreen* s); void (*UpdateEntry)(struct ListScreen* s, struct ButtonWidget* btn, const String* text); - String titleText; + const char* titleText; struct TextWidget title, page; StringsBuffer entries; -} ListScreen_Instance; +} ListScreen; static STRING_REF String ListScreen_UNSAFE_Get(struct ListScreen* s, int index) { static const String str = String_FromConst(LIST_SCREEN_EMPTY); @@ -356,28 +287,15 @@ static STRING_REF String ListScreen_UNSAFE_Get(struct ListScreen* s, int index) return str; } -static void ListScreen_MakeText(struct ListScreen* s, int i) { - String text = ListScreen_UNSAFE_Get(s, s->currentIndex + i); - Menu_Button(s, i, &s->buttons[i], 300, &String_Empty, &s->font, - s->EntryClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, (i - 2) * 50); - /* needed for font list menu */ - s->UpdateEntry(s, &s->buttons[i], &text); -} - -static void ListScreen_Make(struct ListScreen* s, int i, int x, const String* text, Widget_LeftClick onClick) { - Menu_Button(s, i, &s->buttons[i], 40, text, &s->font, onClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, x, 0); -} - static void ListScreen_UpdatePage(struct ListScreen* s) { + String page; char pageBuffer[STRING_SIZE]; int beg, end; int num, pages; - String page; char pageBuffer[STRING_SIZE]; beg = LIST_SCREEN_ITEMS; end = s->entries.count - LIST_SCREEN_ITEMS; - s->buttons[5].disabled = s->currentIndex < beg; - s->buttons[6].disabled = s->currentIndex >= end; + s->left.disabled = s->currentIndex < beg; + s->right.disabled = s->currentIndex >= end; if (Game_ClassicMode) return; num = (s->currentIndex / LIST_SCREEN_ITEMS) + 1; @@ -393,19 +311,22 @@ static void ListScreen_UpdateEntry(struct ListScreen* s, struct ButtonWidget* bu ButtonWidget_Set(button, text, &s->font); } -static void ListScreen_SetCurrentIndex(struct ListScreen* s, int index) { +static void ListScreen_RedrawEntries(struct ListScreen* s) { String str; int i; - if (index >= s->entries.count) { index = s->entries.count - 1; } - if (index < 0) index = 0; - for (i = 0; i < LIST_SCREEN_ITEMS; i++) { - str = ListScreen_UNSAFE_Get(s, index + i); + str = ListScreen_UNSAFE_Get(s, s->currentIndex + i); s->UpdateEntry(s, &s->buttons[i], &str); } +} + +static void ListScreen_SetCurrentIndex(struct ListScreen* s, int index) { + if (index >= s->entries.count) { index = s->entries.count - 1; } + if (index < 0) index = 0; s->currentIndex = index; + ListScreen_RedrawEntries(s); ListScreen_UpdatePage(s); } @@ -425,27 +346,19 @@ static void ListScreen_MoveForwards(void* screen, void* b) { } static void ListScreen_ContextRecreated(void* screen) { - static const String lArrow = String_FromConst("<"); - static const String rArrow = String_FromConst(">"); - struct ListScreen* s = (struct ListScreen*)screen; - int i; - for (i = 0; i < LIST_SCREEN_ITEMS; i++) { ListScreen_MakeText(s, i); } - - ListScreen_Make(s, 5, -220, &lArrow, ListScreen_MoveBackwards); - ListScreen_Make(s, 6, 220, &rArrow, ListScreen_MoveForwards); + ListScreen_RedrawEntries(s); - Menu_Back(s, 7, &s->buttons[7], "Done", &s->font, Menu_SwitchPause); - Menu_Label(s, 8, &s->title, &s->titleText, &s->font, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -155); - Menu_Label(s, 9, &s->page, &String_Empty, &s->font, - ANCHOR_CENTRE, ANCHOR_MAX, 0, 75); + 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); ListScreen_UpdatePage(s); } static void ListScreen_QuickSort(int left, int right) { - StringsBuffer* buffer = &ListScreen_Instance.entries; + StringsBuffer* buffer = &ListScreen.entries; uint32_t* keys = buffer->flagsBuffer; uint32_t key; while (left < right) { @@ -477,20 +390,42 @@ static void ListScreen_Select(struct ListScreen* s, const String* str) { entry = StringsBuffer_UNSAFE_Get(&s->entries, i); if (!String_CaselessEquals(&entry, str)) continue; - ListScreen_SetCurrentIndex(s, i); + s->currentIndex = i; return; } } static void ListScreen_Init(void* screen) { - static struct Widget* widgets[LIST_SCREEN_BUTTONS + 2]; + static struct Widget* widgets[LIST_SCREEN_ITEMS + 3 + 2] = { + (struct Widget*)&ListScreen.buttons[0], (struct Widget*)&ListScreen.buttons[1], + (struct Widget*)&ListScreen.buttons[2], (struct Widget*)&ListScreen.buttons[3], + (struct Widget*)&ListScreen.buttons[4], (struct Widget*)&ListScreen.left, + (struct Widget*)&ListScreen.right, (struct Widget*)&ListScreen.done, + (struct Widget*)&ListScreen.title, (struct Widget*)&ListScreen.page, + }; struct ListScreen* s = (struct ListScreen*)screen; + int i; s->widgets = widgets; s->widgetsCount = Array_Elems(widgets); s->wheelAcc = 0.0f; s->currentIndex = 0; + for (i = 0; i < LIST_SCREEN_ITEMS; i++) { + ButtonWidget_Make(&s->buttons[i], 300, s->EntryClick); + Widget_SetLocation(&s->buttons[i], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, (i - 2) * 50); + } + + ButtonWidget_Make(&s->left, 40, ListScreen_MoveBackwards); + ButtonWidget_Make(&s->right, 40, ListScreen_MoveForwards); + TextWidget_Make(&s->title); + TextWidget_Make(&s->page); + + 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); s->LoadEntries(s); } @@ -535,7 +470,7 @@ static struct ScreenVTABLE ListScreen_VTABLE = { Menu_OnResize, Menu_ContextLost, ListScreen_ContextRecreated, }; void ListScreen_Show(void) { - struct ListScreen* s = &ListScreen_Instance; + struct ListScreen* s = &ListScreen; s->grabsInput = true; s->closable = true; s->VTABLE = &ListScreen_VTABLE; @@ -680,7 +615,13 @@ void PauseScreen_Show(void) { /*########################################################################################################################* *--------------------------------------------------OptionsGroupScreen-----------------------------------------------------* *#########################################################################################################################*/ -static struct OptionsGroupScreen OptionsGroupScreen_Instance; +static struct OptionsGroupScreen { + MenuScreen_Layout + int selectedI; + struct TextWidget desc; + struct ButtonWidget buttons[8]; +} OptionsGroupScreen_Instance; + static const char* optsGroup_descs[7] = { "&eMusic/Sound, view bobbing, and more", "&eChat options, gui scale, font settings, and more", @@ -780,7 +721,15 @@ struct Screen* OptionsGroupScreen_MakeInstance(void) { /*########################################################################################################################* *----------------------------------------------------EditHotkeyScreen-----------------------------------------------------* *#########################################################################################################################*/ -static struct EditHotkeyScreen EditHotkeyScreen_Instance; +static struct EditHotkeyScreen { + MenuScreen_Layout + struct HotkeyData curHotkey, origHotkey; + int selectedI; + bool supressNextPress; + struct MenuInputWidget input; + struct ButtonWidget buttons[6]; +} EditHotkeyScreen_Instance; + static void EditHotkeyScreen_Make(struct EditHotkeyScreen* s, int i, int x, int y, const String* text, Widget_LeftClick onClick) { Menu_Button(s, i, &s->buttons[i], 300, text, &s->titleFont, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); @@ -994,7 +943,14 @@ struct Screen* EditHotkeyScreen_MakeInstance(struct HotkeyData original) { /*########################################################################################################################* *-----------------------------------------------------GenLevelScreen------------------------------------------------------* *#########################################################################################################################*/ -static struct GenLevelScreen GenLevelScreen_Instance; +static struct GenLevelScreen { + MenuScreen_Layout + struct ButtonWidget buttons[3]; + struct MenuInputWidget* selected; + struct MenuInputWidget inputs[4]; + struct TextWidget labels[5]; +} GenLevelScreen_Instance; + CC_NOINLINE static int GenLevelScreen_GetInt(struct GenLevelScreen* s, int index) { struct MenuInputWidget* input = &s->inputs[index]; struct MenuInputDesc* desc; @@ -1152,7 +1108,11 @@ void GenLevelScreen_Show(void) { /*########################################################################################################################* *----------------------------------------------------ClassicGenScreen-----------------------------------------------------* *#########################################################################################################################*/ -static struct ClassicGenScreen ClassicGenScreen_Instance; +static struct ClassicGenScreen { + MenuScreen_Layout + struct ButtonWidget buttons[4]; +} ClassicGenScreen_Instance; + static void ClassicGenScreen_Gen(int size) { RNGState rnd; Random_SeedFromCurrentTime(&rnd); Gen_Vanilla = true; @@ -1203,7 +1163,13 @@ void ClassicGenScreen_Show(void) { /*########################################################################################################################* *----------------------------------------------------SaveLevelScreen------------------------------------------------------* *#########################################################################################################################*/ -static struct SaveLevelScreen SaveLevelScreen_Instance; +static struct SaveLevelScreen { + MenuScreen_Layout + struct ButtonWidget buttons[3]; + struct MenuInputWidget input; + struct TextWidget mcEdit, desc; +} SaveLevelScreen_Instance; + static void SaveLevelScreen_RemoveOverwrites(struct SaveLevelScreen* s) { static const String save = String_FromConst("Save"); static const String schem = String_FromConst("Save schematic"); @@ -1399,10 +1365,8 @@ static void TexturePackScreen_LoadEntries(struct ListScreen* s) { } void TexturePackScreen_Show(void) { - static const String title = String_FromConst("Select a texture pack zip"); - struct ListScreen* s = &ListScreen_Instance; - - s->titleText = title; + struct ListScreen* s = &ListScreen; + s->titleText = "Select a texture pack zip"; s->LoadEntries = TexturePackScreen_LoadEntries; s->EntryClick = TexturePackScreen_EntryClick; s->UpdateEntry = ListScreen_UpdateEntry; @@ -1454,10 +1418,8 @@ static void FontListScreen_LoadEntries(struct ListScreen* s) { } void FontListScreen_Show(void) { - static const String title = String_FromConst("Select a font"); - struct ListScreen* s = &ListScreen_Instance; - - s->titleText = title; + struct ListScreen* s = &ListScreen; + s->titleText = "Select a font"; s->LoadEntries = FontListScreen_LoadEntries; s->EntryClick = FontListScreen_EntryClick; s->UpdateEntry = FontListScreen_UpdateEntry; @@ -1533,10 +1495,8 @@ static void HotkeyListScreen_LoadEntries(struct ListScreen* s) { } void HotkeyListScreen_Show(void) { - static const String title = String_FromConst("Modify hotkeys"); - struct ListScreen* s = &ListScreen_Instance; - - s->titleText = title; + struct ListScreen* s = &ListScreen; + s->titleText = "Modify hotkeys"; s->LoadEntries = HotkeyListScreen_LoadEntries; s->EntryClick = HotkeyListScreen_EntryClick; s->UpdateEntry = ListScreen_UpdateEntry; @@ -1579,10 +1539,8 @@ static void LoadLevelScreen_LoadEntries(struct ListScreen* s) { } void LoadLevelScreen_Show(void) { - static const String title = String_FromConst("Select a level"); - struct ListScreen* s = &ListScreen_Instance; - - s->titleText = title; + struct ListScreen* s = &ListScreen; + s->titleText = "Select a level"; s->LoadEntries = LoadLevelScreen_LoadEntries; s->EntryClick = LoadLevelScreen_EntryClick; s->UpdateEntry = ListScreen_UpdateEntry; @@ -1593,7 +1551,17 @@ void LoadLevelScreen_Show(void) { /*########################################################################################################################* *---------------------------------------------------KeyBindingsScreen-----------------------------------------------------* *#########################################################################################################################*/ -static struct KeyBindingsScreen KeyBindingsScreen_Instance; +static struct KeyBindingsScreen { + MenuScreen_Layout + int curI, bindsCount; + const char** descs; + uint8_t* binds; + Widget_LeftClick leftPage, rightPage; + struct TextWidget title; + struct ButtonWidget back, left, right; + struct ButtonWidget buttons[12]; +} KeyBindingsScreen_Instance; + static void KeyBindingsScreen_GetText(struct KeyBindingsScreen* s, int i, String* text) { Key key = KeyBinds[s->binds[i]]; String_Format2(text, "%c: %c", s->descs[i], Key_Names[key]); @@ -1710,9 +1678,7 @@ static struct ScreenVTABLE KeyBindingsScreen_VTABLE = { Menu_OnResize, Menu_ContextLost, NULL, }; static struct KeyBindingsScreen* KeyBindingsScreen_Make(int bindsCount, uint8_t* binds, const char** descs, Event_Void_Callback contextRecreated) { - /* NOTE: 12 is the most buttons on one screen (OtherKeyBindingsScreen_MakeInstance) */ - static struct ButtonWidget buttons[12]; - static struct Widget* widgets[12 + 4]; + static struct Widget* widgets[12 + 4]; /* 12 buttons + buttons + 2 widgets used by MouseKeyBindings */ struct KeyBindingsScreen* s = &KeyBindingsScreen_Instance; s->grabsInput = true; @@ -1726,7 +1692,6 @@ static struct KeyBindingsScreen* KeyBindingsScreen_Make(int bindsCount, uint8_t* s->bindsCount = bindsCount; s->binds = binds; s->descs = descs; - s->buttons = buttons; s->curI = -1; s->leftPage = NULL; @@ -1858,11 +1823,23 @@ struct Screen* MouseKeyBindingsScreen_MakeInstance(void) { /*########################################################################################################################* *--------------------------------------------------MenuOptionsScreen------------------------------------------------------* *#########################################################################################################################*/ -static struct MenuOptionsScreen MenuOptionsScreen_Instance; +#define MENUOPTIONS_MAX_DESC 5 + +static struct MenuOptionsScreen { + MenuScreen_Layout + struct MenuInputDesc* descs; + const char** descriptions; + int activeI, selectedI, descriptionsCount; + struct ButtonWidget ok, Default; + struct MenuInputWidget input; + struct TextGroupWidget extHelp; + struct Texture extHelpTextures[MENUOPTIONS_MAX_DESC]; + struct ButtonWidget buttons[11]; /* max buttons used is 11 */ +} MenuOptionsScreen_Instance; + static void Menu_GetBool(String* raw, bool v) { String_AppendConst(raw, v ? "ON" : "OFF"); } - static bool Menu_SetBool(const String* raw, const char* key) { bool isOn = String_CaselessEqualsConst(raw, "ON"); Options_SetBool(key, isOn); @@ -2145,7 +2122,6 @@ static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, NULL, }; struct Screen* MenuOptionsScreen_MakeInstance(int count, Event_Void_Callback contextRecreated, struct MenuInputDesc* descs, const char** descriptions, int descsCount) { - static struct ButtonWidget buttons[11]; /* max buttons used is 11 */ static struct Widget* widgets[11 + 3]; /* max buttons + 3 widgets for input */ struct MenuOptionsScreen* s = &MenuOptionsScreen_Instance; @@ -2159,7 +2135,6 @@ struct Screen* MenuOptionsScreen_MakeInstance(int count, Event_Void_Callback con s->VTABLE->ContextLost = MenuOptionsScreen_ContextLost; s->VTABLE->ContextRecreated = contextRecreated; - s->buttons = buttons; s->descs = descs; s->descriptions = descriptions; s->descriptionsCount = descsCount; @@ -2901,7 +2876,14 @@ 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 TexIdsOverlay_Instance; +static struct TexIdsOverlay { + MenuScreen_Layout + GfxResourceID dynamicVb; + int xOffset, yOffset, tileSize, baseTexLoc; + struct TextAtlas idAtlas; + struct TextWidget title; +} TexIdsOverlay_Instance; + static void TexIdsOverlay_ContextLost(void* screen) { struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen; Menu_ContextLost(s); diff --git a/src/Screens.c b/src/Screens.c index 9ed3198b9..701282ba3 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1075,6 +1075,8 @@ static bool HUDScreen_KeyDown(void* screen, Key key) { HUDScreen_OpenInput(&String_Empty); } else if (key == KEY_SLASH) { HUDScreen_OpenInput(&slash); + } else if (key == KeyBinds[KEYBIND_INVENTORY]) { + InventoryScreen_Show(); } else { return Elem_HandlesKeyDown(&s->hotbar, key); } diff --git a/src/Widgets.c b/src/Widgets.c index 45a62e6b2..a35845937 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -33,7 +33,7 @@ static bool Widget_MouseScroll(void* elem, float delta) { return false; } *#########################################################################################################################*/ static void TextWidget_Render(void* widget, double delta) { struct TextWidget* w = (struct TextWidget*)widget; - if (w->texture.ID) { Texture_RenderShaded(&w->texture, w->col); } + if (w->texture.ID) Texture_RenderShaded(&w->texture, w->col); } static void TextWidget_Free(void* widget) { @@ -82,6 +82,11 @@ void TextWidget_Set(struct TextWidget* w, const String* text, const FontDesc* fo w->texture.X = w->x; w->texture.Y = w->y; } +void TextWidget_SetConst(struct TextWidget* w, const char* text, const FontDesc* font) { + String str = String_FromReadonly(text); + TextWidget_Set(w, &str, font); +} + void TextWidget_Create(struct TextWidget* w, const String* text, const FontDesc* font) { TextWidget_Make(w); TextWidget_Set(w, text, font); @@ -181,6 +186,11 @@ void ButtonWidget_Set(struct ButtonWidget* w, const String* text, const FontDesc Widget_Reposition(w); } +void ButtonWidget_SetConst(struct ButtonWidget* w, const char* text, const FontDesc* font) { + String str = String_FromReadonly(text); + ButtonWidget_Set(w, &str, font); +} + void ButtonWidget_Create(struct ButtonWidget* w, int minWidth, const String* text, const FontDesc* font, Widget_LeftClick onClick) { ButtonWidget_Make(w, minWidth, onClick); ButtonWidget_Set(w, text, font); diff --git a/src/Widgets.h b/src/Widgets.h index f8cc76d99..0fa8c7584 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -20,6 +20,8 @@ struct TextWidget { CC_NOINLINE void TextWidget_Make(struct TextWidget* w); /* Draws the given text into a texture, then updates the position and size of this widget. */ CC_NOINLINE void TextWidget_Set(struct TextWidget* w, const String* text, const FontDesc* font); +/* Shorthand for TextWidget_Set using String_FromReadonly */ +CC_NOINLINE void TextWidget_SetConst(struct TextWidget* w, const char* text, const FontDesc* font); /* Shorthand for TextWidget_Make then TextWidget_Set */ CC_NOINLINE void TextWidget_Create(struct TextWidget* w, const String* text, const FontDesc* font); @@ -40,6 +42,8 @@ struct ButtonWidget { CC_NOINLINE void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick); /* Draws the given text into a texture, then updates the position and size of this widget. */ CC_NOINLINE void ButtonWidget_Set(struct ButtonWidget* w, const String* text, const FontDesc* font); +/* Shorthand for ButtonWidget_Set using String_FromReadonly */ +CC_NOINLINE void ButtonWidget_SetConst(struct ButtonWidget* w, const char* text, const FontDesc* font); /* Resets state of the given button widget, then calls ButtonWidget_Set */ CC_NOINLINE void ButtonWidget_Create(struct ButtonWidget* w, int minWidth, const String* text, const FontDesc* font, Widget_LeftClick onClick); From bb4d963a70eaaecd6fc27093ff0d997d40a7eeec Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 15 Aug 2019 12:40:55 +1000 Subject: [PATCH 10/46] start rewriting overlays --- src/Gui.c | 16 +------- src/Gui.h | 3 +- src/InputHandler.c | 2 +- src/Menus.c | 97 +++++++++++++++++++++++++--------------------- src/Menus.h | 8 ++-- src/Screens.c | 2 +- src/Server.c | 2 +- 7 files changed, 63 insertions(+), 67 deletions(-) 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); } } From ed71eaa5887877b2040e57ce3a6866efda82d81b Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 15 Aug 2019 15:24:11 +1000 Subject: [PATCH 11/46] rewrite OptionsGroupScreen --- src/Gui.c | 16 ----- src/Gui.h | 3 - src/Menus.c | 167 +++++++++++++++++++++++++--------------------------- 3 files changed, 80 insertions(+), 106 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 1cbf5a333..f6161e14c 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -30,22 +30,6 @@ void Gui_DefaultRecreate(void* elem) { Elem_Free(e); Elem_Init(e); } -void Screen_CommonInit(void* screen) { - struct Screen* s = (struct Screen*)screen; - Event_RegisterVoid(&GfxEvents.ContextLost, s, s->VTABLE->ContextLost); - Event_RegisterVoid(&GfxEvents.ContextRecreated, s, s->VTABLE->ContextRecreated); - - if (Gfx.LostContext) return; - s->VTABLE->ContextRecreated(s); -} - -void Screen_CommonFree(void* screen) { - struct Screen* s = (struct Screen*)screen; - Event_UnregisterVoid(&GfxEvents.ContextLost, s, s->VTABLE->ContextLost); - Event_UnregisterVoid(&GfxEvents.ContextRecreated, s, s->VTABLE->ContextRecreated); - s->VTABLE->ContextLost(s); -} - void Widget_SetLocation(void* widget, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { struct Widget* w = (struct Widget*)widget; w->horAnchor = horAnchor; w->verAnchor = verAnchor; diff --git a/src/Gui.h b/src/Gui.h index 1f25a0810..4e78994e7 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -66,9 +66,6 @@ struct ScreenVTABLE { /* Represents a container of widgets and other 2D elements. May cover entire window. */ struct Screen { Screen_Layout }; -void Screen_CommonInit(void* screen); -void Screen_CommonFree(void* screen); - typedef void (*Widget_LeftClick)(void* screen, void* widget); struct Widget; diff --git a/src/Menus.c b/src/Menus.c index 3fa7e5441..2aecbd136 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -341,17 +341,6 @@ static void ListScreen_MoveForwards(void* screen, void* b) { ListScreen_PageClick(s, true); } -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); - TextWidget_SetConst(&s->title, s->titleText, &s->font); - ButtonWidget_SetConst(&s->done, "Done", &s->font); - ListScreen_UpdatePage(s); -} - static void ListScreen_QuickSort(int left, int right) { StringsBuffer* buffer = &ListScreen.entries; uint32_t* keys = buffer->flagsBuffer; uint32_t key; @@ -390,13 +379,33 @@ static void ListScreen_Select(struct ListScreen* s, const String* str) { } } +static bool ListScreen_KeyDown(void* screen, Key key) { + struct ListScreen* s = (struct ListScreen*)screen; + if (key == KEY_LEFT || key == KEY_PAGEUP) { + ListScreen_PageClick(s, false); + } else if (key == KEY_RIGHT || key == KEY_PAGEDOWN) { + ListScreen_PageClick(s, true); + } else { + return false; + } + return true; +} + +static bool ListScreen_MouseScroll(void* screen, float delta) { + struct ListScreen* s = (struct ListScreen*)screen; + int steps = Utils_AccumulateWheelDelta(&s->wheelAcc, delta); + + if (steps) ListScreen_SetCurrentIndex(s, s->currentIndex - steps); + return true; +} + static void ListScreen_Init(void* screen) { static struct Widget* widgets[LIST_SCREEN_ITEMS + 3 + 2] = { (struct Widget*)&ListScreen.buttons[0], (struct Widget*)&ListScreen.buttons[1], (struct Widget*)&ListScreen.buttons[2], (struct Widget*)&ListScreen.buttons[3], (struct Widget*)&ListScreen.buttons[4], (struct Widget*)&ListScreen.left, (struct Widget*)&ListScreen.right, (struct Widget*)&ListScreen.done, - (struct Widget*)&ListScreen.title, (struct Widget*)&ListScreen.page, + (struct Widget*)&ListScreen.title, (struct Widget*)&ListScreen.page }; struct ListScreen* s = (struct ListScreen*)screen; int i; @@ -439,24 +448,15 @@ static void ListScreen_Free(void* screen) { StringsBuffer_Clear(&s->entries); } -static bool ListScreen_KeyDown(void* screen, Key key) { +static void ListScreen_ContextRecreated(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; - if (key == KEY_LEFT || key == KEY_PAGEUP) { - ListScreen_PageClick(s, false); - } else if (key == KEY_RIGHT || key == KEY_PAGEDOWN) { - ListScreen_PageClick(s, true); - } else { - return false; - } - return true; -} + ListScreen_RedrawEntries(s); -static bool ListScreen_MouseScroll(void* screen, float delta) { - struct ListScreen* s = (struct ListScreen*)screen; - int steps = Utils_AccumulateWheelDelta(&s->wheelAcc, delta); - - if (steps) ListScreen_SetCurrentIndex(s, s->currentIndex - steps); - return true; + ButtonWidget_SetConst(&s->left, "<", &s->font); + ButtonWidget_SetConst(&s->right, ">", &s->font); + TextWidget_SetConst(&s->title, s->titleText, &s->font); + ButtonWidget_SetConst(&s->done, "Done", &s->font); + ListScreen_UpdatePage(s); } static struct ScreenVTABLE ListScreen_VTABLE = { @@ -482,14 +482,8 @@ static bool MenuScreen_MouseScroll(void* screen, float delta) { return true; } static void MenuScreen_Init(void* screen) { struct MenuScreen* s = (struct MenuScreen*)screen; - if (!s->titleFont.Handle && !s->titleFont.Size) { - Drawer2D_MakeFont(&s->titleFont, 16, FONT_STYLE_BOLD); - } - if (!s->textFont.Handle && !s->textFont.Size) { - Drawer2D_MakeFont(&s->textFont, 16, FONT_STYLE_NORMAL); - } - - Screen_CommonInit(s); + if (!s->titleFont.Size) Menu_MakeTitleFont(&s->titleFont); + if (!s->textFont.Size) Menu_MakeBodyFont(&s->textFont); } static void MenuScreen_Render(void* screen, double delta) { @@ -503,8 +497,6 @@ static void MenuScreen_Free(void* screen) { struct MenuScreen* s = (struct MenuScreen*)screen; Font_Free(&s->titleFont); Font_Free(&s->textFont); - - Screen_CommonFree(s); } @@ -614,9 +606,10 @@ void PauseScreen_Show(void) { static struct OptionsGroupScreen { MenuScreen_Layout int selectedI; + struct ButtonWidget buttons[7]; struct TextWidget desc; - struct ButtonWidget buttons[8]; -} OptionsGroupScreen_Instance; + struct ButtonWidget done; +} OptionsGroupScreen; static const char* optsGroup_descs[7] = { "&eMusic/Sound, view bobbing, and more", @@ -627,52 +620,63 @@ static const char* optsGroup_descs[7] = { "&eEnv colours, water level, weather, and more", "&eSettings for resembling the original classic", }; +static const struct SimpleButtonDesc optsGroup_btns[7] = { + { -160, -100, "Misc options...", Menu_SwitchMisc }, + { -160, -50, "Gui options...", Menu_SwitchGui }, + { -160, 0, "Graphics options...", Menu_SwitchGfx }, + { -160, 50, "Controls...", Menu_SwitchKeysNormal }, + { 160, -50, "Hacks settings...", Menu_SwitchHacks }, + { 160, 0, "Env settings...", Menu_SwitchEnv }, + { 160, 50, "Nostalgia options...", Menu_SwitchNostalgia } +}; static void OptionsGroupScreen_CheckHacksAllowed(void* screen) { struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; s->buttons[5].disabled = !LocalPlayer_Instance.Hacks.CanAnyHacks; /* env settings */ } -static void OptionsGroupScreen_MakeButtons(struct OptionsGroupScreen* s) { - static const struct SimpleButtonDesc descs[7] = { - { -160, -100, "Misc options...", Menu_SwitchMisc }, - { -160, -50, "Gui options...", Menu_SwitchGui }, - { -160, 0, "Graphics options...", Menu_SwitchGfx }, - { -160, 50, "Controls...", Menu_SwitchKeysNormal }, - { 160, -50, "Hacks settings...", Menu_SwitchHacks }, - { 160, 0, "Env settings...", Menu_SwitchEnv }, - { 160, 50, "Nostalgia options...", Menu_SwitchNostalgia } - }; - int i; - - for (i = 0; i < Array_Elems(descs); i++) { - String text = String_FromReadonly(descs[i].title); - Menu_Button(s, i, &s->buttons[i], 300, &text, &s->titleFont, descs[i].onClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, descs[i].x, descs[i].y); - } -} - -static void OptionsGroupScreen_MakeDesc(struct OptionsGroupScreen* s) { - String text = String_FromReadonly(optsGroup_descs[s->selectedI]); - Menu_Label(s, 8, &s->desc, &text, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); +CC_NOINLINE static void OptionsGroupScreen_UpdateDesc(struct OptionsGroupScreen* s) { + TextWidget_SetConst(&s->desc, optsGroup_descs[s->selectedI], &s->textFont); } static void OptionsGroupScreen_ContextRecreated(void* screen) { struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; - OptionsGroupScreen_MakeButtons(s); + int i; + for (i = 0; i < Array_Elems(optsGroup_btns); i++) { + ButtonWidget_SetConst(&s->buttons[i], optsGroup_btns[i].title, &s->titleFont); + } - Menu_Back(s, 7, &s->buttons[7], "Done", &s->titleFont, Menu_SwitchPause); - s->widgets[8] = NULL; /* Description text widget placeholder */ - - if (s->selectedI >= 0) OptionsGroupScreen_MakeDesc(s); + ButtonWidget_SetConst(&s->done, "Done", &s->titleFont); + if (s->selectedI >= 0) OptionsGroupScreen_UpdateDesc(s); OptionsGroupScreen_CheckHacksAllowed(s); } static void OptionsGroupScreen_Init(void* screen) { + static struct Widget* widgets[9] = { + (struct Widget*)&OptionsGroupScreen.buttons[0], (struct Widget*)&OptionsGroupScreen.buttons[1], + (struct Widget*)&OptionsGroupScreen.buttons[2], (struct Widget*)&OptionsGroupScreen.buttons[3], + (struct Widget*)&OptionsGroupScreen.buttons[4], (struct Widget*)&OptionsGroupScreen.buttons[5], + (struct Widget*)&OptionsGroupScreen.buttons[6], (struct Widget*)&OptionsGroupScreen.desc, + (struct Widget*)&OptionsGroupScreen.done + }; struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; + int i; + MenuScreen_Init(s); Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, OptionsGroupScreen_CheckHacksAllowed); + + s->widgets = widgets; + s->widgetsCount = Array_Elems(widgets); + s->selectedI = -1; + + for (i = 0; i < Array_Elems(optsGroup_btns); i++) { + ButtonWidget_Make(&s->buttons[i], 300, optsGroup_btns[i].onClick); + Widget_SetLocation(&s->buttons[i], ANCHOR_CENTRE, ANCHOR_CENTRE, optsGroup_btns[i].x, optsGroup_btns[i].y); + } + + Menu_MakeBack(&s->done, Menu_SwitchPause); + TextWidget_Make(&s->desc); + Widget_SetLocation(&s->desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } static void OptionsGroupScreen_Free(void* screen) { @@ -688,8 +692,7 @@ static bool OptionsGroupScreen_MouseMove(void* screen, int x, int y) { if (i >= Array_Elems(optsGroup_descs)) return true; s->selectedI = i; - Elem_TryFree(&s->desc); - OptionsGroupScreen_MakeDesc(s); + OptionsGroupScreen_UpdateDesc(s); return true; } @@ -700,16 +703,10 @@ static struct ScreenVTABLE OptionsGroupScreen_VTABLE = { Menu_OnResize, Menu_ContextLost, OptionsGroupScreen_ContextRecreated, }; void OptionsGroupScreen_Show(void) { - static struct Widget* widgets[9]; - struct OptionsGroupScreen* s = &OptionsGroupScreen_Instance; - - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); - - s->VTABLE = &OptionsGroupScreen_VTABLE; - s->selectedI = -1; + struct OptionsGroupScreen* s = &OptionsGroupScreen; + s->grabsInput = true; + s->closable = true; + s->VTABLE = &OptionsGroupScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1167,20 +1164,17 @@ static struct SaveLevelScreen { } SaveLevelScreen_Instance; static void SaveLevelScreen_RemoveOverwrites(struct SaveLevelScreen* s) { - static const String save = String_FromConst("Save"); - static const String schem = String_FromConst("Save schematic"); struct ButtonWidget* btn; - btn = &s->buttons[0]; if (btn->optName) { btn->optName = NULL; - ButtonWidget_Set(btn, &save, &s->titleFont); + ButtonWidget_SetConst(btn, "Save", &s->titleFont); } btn = &s->buttons[1]; if (btn->optName) { btn->optName = NULL; - ButtonWidget_Set(btn, &schem, &s->titleFont); + ButtonWidget_SetConst(btn, "Save schematic", &s->titleFont); } } @@ -1225,7 +1219,6 @@ static void SaveLevelScreen_SaveMap(struct SaveLevelScreen* s, const String* pat } static void SaveLevelScreen_Save(void* screen, void* widget, const char* ext) { - static const String overMsg = String_FromConst("&cOverwrite existing?"); static const String fileMsg = String_FromConst("&ePlease enter a filename"); String path; char pathBuffer[FILENAME_SIZE]; @@ -1240,7 +1233,7 @@ static void SaveLevelScreen_Save(void* screen, void* widget, const char* ext) { String_Format2(&path, "maps/%s%c", &file, ext); if (File_Exists(&path) && !btn->optName) { - ButtonWidget_Set(btn, &overMsg, &s->titleFont); + ButtonWidget_SetConst(btn, "&cOverwrite existing?", &s->titleFont); btn->optName = "O"; } else { SaveLevelScreen_RemoveOverwrites(s); From ab6df2cc7ae5b8c0a1a807c174733dd2be5e8a13 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 16 Aug 2019 21:34:43 +1000 Subject: [PATCH 12/46] cleanup code a bit --- src/Menus.c | 65 ++++++++++++++++++++++----------------------------- src/Screens.c | 25 +++++++------------- src/Widgets.c | 25 +++++++------------- src/Widgets.h | 14 +++++------ 4 files changed, 51 insertions(+), 78 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 2aecbd136..1600b5cd0 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -49,19 +49,15 @@ struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; *--------------------------------------------------------Menu base--------------------------------------------------------* *#########################################################################################################################*/ static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, const String* text, const FontDesc* font, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { - struct Menu* menu = (struct Menu*)s; - ButtonWidget_Create(btn, width, text, font, onClick); - - menu->widgets[i] = (struct Widget*)btn; - Widget_SetLocation(menu->widgets[i], horAnchor, verAnchor, x, y); + ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); + ButtonWidget_Set(btn, text, font); + ((struct Menu*)s)->widgets[i] = (struct Widget*)btn; } static void Menu_Label(void* s, int i, struct TextWidget* label, const String* text, const FontDesc* font, int horAnchor, int verAnchor, int x, int y) { - struct Menu* menu = (struct Menu*)s; - TextWidget_Create(label, text, font); - - menu->widgets[i] = (struct Widget*)label; - Widget_SetLocation(menu->widgets[i], horAnchor, verAnchor, x, y); + TextWidget_Make(label, horAnchor, verAnchor, x, y); + TextWidget_Set(label, text, font); + ((struct Menu*)s)->widgets[i] = (struct Widget*)label; } static void Menu_Input(void* s, int i, struct MenuInputWidget* input, int width, const String* text, FontDesc* font, struct MenuInputDesc* desc, int horAnchor, int verAnchor, int x, int y) { @@ -81,8 +77,7 @@ static void Menu_Back(void* s, int i, struct ButtonWidget* btn, const char* labe 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); + ButtonWidget_Make(btn, width, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); } CC_NOINLINE static void Menu_MakeTitleFont(FontDesc* font) { @@ -416,21 +411,20 @@ static void ListScreen_Init(void* screen) { s->currentIndex = 0; for (i = 0; i < LIST_SCREEN_ITEMS; i++) { - ButtonWidget_Make(&s->buttons[i], 300, s->EntryClick); - Widget_SetLocation(&s->buttons[i], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, (i - 2) * 50); + ButtonWidget_Make(&s->buttons[i], 300, s->EntryClick, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, (i - 2) * 50); } - ButtonWidget_Make(&s->left, 40, ListScreen_MoveBackwards); - ButtonWidget_Make(&s->right, 40, ListScreen_MoveForwards); - TextWidget_Make(&s->title); - TextWidget_Make(&s->page); + ButtonWidget_Make(&s->left, 40, ListScreen_MoveBackwards, + ANCHOR_CENTRE, ANCHOR_CENTRE, -220, 0); + ButtonWidget_Make(&s->right, 40, ListScreen_MoveForwards, + ANCHOR_CENTRE, ANCHOR_CENTRE, 220, 0); + TextWidget_Make(&s->title, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -155); + TextWidget_Make(&s->page, + ANCHOR_CENTRE, ANCHOR_MAX, 0, 75); + 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); - Menu_MakeTitleFont(&s->font); s->LoadEntries(s); } @@ -670,13 +664,12 @@ static void OptionsGroupScreen_Init(void* screen) { s->selectedI = -1; for (i = 0; i < Array_Elems(optsGroup_btns); i++) { - ButtonWidget_Make(&s->buttons[i], 300, optsGroup_btns[i].onClick); - Widget_SetLocation(&s->buttons[i], ANCHOR_CENTRE, ANCHOR_CENTRE, optsGroup_btns[i].x, optsGroup_btns[i].y); + ButtonWidget_Make(&s->buttons[i], 300, optsGroup_btns[i].onClick, + ANCHOR_CENTRE, ANCHOR_CENTRE, optsGroup_btns[i].x, optsGroup_btns[i].y); } Menu_MakeBack(&s->done, Menu_SwitchPause); - TextWidget_Make(&s->desc); - Widget_SetLocation(&s->desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); + TextWidget_Make(&s->desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } static void OptionsGroupScreen_Free(void* screen) { @@ -1024,17 +1017,15 @@ static void GenLevelScreen_Input(struct GenLevelScreen* s, int i, int y, bool se input->base.MenuClick = GenLevelScreen_InputClick; } -static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int x, int y, const char* title) { +static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int y, const char* title) { struct TextWidget* label = &s->labels[i]; PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); String text = String_FromReadonly(title); Menu_Label(s, i + 4, label, &text, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); + ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 110, y); - label->col = col; - label->xOffset = -110 - label->width / 2; - Widget_Reposition(label); + label->col = col; } static bool GenLevelScreen_KeyDown(void* screen, Key key) { @@ -1064,10 +1055,10 @@ static void GenLevelScreen_ContextRecreated(void* screen) { GenLevelScreen_Input(s, 2, 0, false, World.Length); GenLevelScreen_Input(s, 3, 40, true, 0); - GenLevelScreen_Label(s, 0, -150, -80, "Width:"); - GenLevelScreen_Label(s, 1, -150, -40, "Height:"); - GenLevelScreen_Label(s, 2, -150, 0, "Length:"); - GenLevelScreen_Label(s, 3, -140, 40, "Seed:"); + GenLevelScreen_Label(s, 0, -80, "Width:"); + GenLevelScreen_Label(s, 1, -40, "Height:"); + GenLevelScreen_Label(s, 2, 0, "Length:"); + GenLevelScreen_Label(s, 3, 40, "Seed:"); Menu_Label(s, 8, &s->labels[4], &title, &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -130); diff --git a/src/Screens.c b/src/Screens.c index c798d4079..0c6d690cc 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -350,8 +350,7 @@ static void StatusScreen_ContextRecreated(void* screen) { Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); y = 2; - TextWidget_Make(line1); - Widget_SetLocation(line1, ANCHOR_MIN, ANCHOR_MIN, 2, y); + TextWidget_Make(line1, ANCHOR_MIN, ANCHOR_MIN, 2, y); line1->reducePadding = true; StatusScreen_Update(s, 1.0); @@ -360,8 +359,7 @@ static void StatusScreen_ContextRecreated(void* screen) { s->posAtlas.tex.Y = y; y += s->posAtlas.tex.Height; - TextWidget_Make(line2); - Widget_SetLocation(line2, ANCHOR_MIN, ANCHOR_MIN, 2, y); + TextWidget_Make(line2, ANCHOR_MIN, ANCHOR_MIN, 2, y); line2->reducePadding = true; if (Game_ClassicMode) { @@ -507,10 +505,8 @@ static void LoadingScreen_DrawBackground(void) { static void LoadingScreen_Init(void* screen) { struct LoadingScreen* s = (struct LoadingScreen*)screen; - TextWidget_Make(&s->title); - Widget_SetLocation(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -31); - TextWidget_Make(&s->message); - Widget_SetLocation(&s->message, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 17); + TextWidget_Make(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -31); + TextWidget_Make(&s->message, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 17); Gfx_SetFog(false); Event_RegisterFloat(&WorldEvents.Loading, s, LoadingScreen_MapLoading); @@ -734,8 +730,7 @@ static void HUDScreen_ConstructWidgets(struct HUDScreen* s) { Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); Elem_Init(&s->clientStatus); - TextWidget_Create(&s->announcement, &String_Empty, &s->announcementFont); - Widget_SetLocation(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -Window_Height / 4); + TextWidget_Make(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -Window_Height / 4); } static void HUDScreen_SetInitialMessages(struct HUDScreen* s) { @@ -1327,13 +1322,11 @@ static void DisconnectScreen_ContextRecreated(void* screen) { static void DisconnectScreen_Init(void* screen) { struct DisconnectScreen* s = (struct DisconnectScreen*)screen; - TextWidget_Make(&s->title); - Widget_SetLocation(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); - TextWidget_Make(&s->message); - Widget_SetLocation(&s->message, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 10); + TextWidget_Make(&s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); + TextWidget_Make(&s->message, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 10); - ButtonWidget_Make(&s->reconnect, 300, NULL); - Widget_SetLocation(&s->reconnect, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 80); + ButtonWidget_Make(&s->reconnect, 300, NULL, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 80); s->reconnect.disabled = !s->canReconnect; /* NOTE: changing VSync can't be done within frame, causes crash on some GPUs */ diff --git a/src/Widgets.c b/src/Widgets.c index a35845937..3944a6bb8 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -54,11 +54,12 @@ static struct WidgetVTABLE TextWidget_VTABLE = { Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, TextWidget_Reposition, }; -void TextWidget_Make(struct TextWidget* w) { +void TextWidget_Make(struct TextWidget* w, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { PackedCol col = PACKEDCOL_WHITE; Widget_Reset(w); w->VTABLE = &TextWidget_VTABLE; w->col = col; + Widget_SetLocation(w, horAnchor, verAnchor, xOffset, yOffset); } void TextWidget_Set(struct TextWidget* w, const String* text, const FontDesc* font) { @@ -87,11 +88,6 @@ void TextWidget_SetConst(struct TextWidget* w, const char* text, const FontDesc* TextWidget_Set(w, &str, font); } -void TextWidget_Create(struct TextWidget* w, const String* text, const FontDesc* font) { - TextWidget_Make(w); - TextWidget_Set(w, text, font); -} - /*########################################################################################################################* *------------------------------------------------------ButtonWidget-------------------------------------------------------* @@ -161,12 +157,13 @@ static struct WidgetVTABLE ButtonWidget_VTABLE = { Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, ButtonWidget_Reposition, }; -void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick) { +void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { Widget_Reset(w); w->VTABLE = &ButtonWidget_VTABLE; w->optName = NULL; w->minWidth = minWidth; w->MenuClick = onClick; + Widget_SetLocation(w, horAnchor, verAnchor, xOffset, yOffset); } void ButtonWidget_Set(struct ButtonWidget* w, const String* text, const FontDesc* font) { @@ -191,11 +188,6 @@ void ButtonWidget_SetConst(struct ButtonWidget* w, const char* text, const FontD ButtonWidget_Set(w, &str, font); } -void ButtonWidget_Create(struct ButtonWidget* w, int minWidth, const String* text, const FontDesc* font, Widget_LeftClick onClick) { - ButtonWidget_Make(w, minWidth, onClick); - ButtonWidget_Set(w, text, font); -} - /*########################################################################################################################* *-----------------------------------------------------ScrollbarWidget-----------------------------------------------------* @@ -256,7 +248,7 @@ static bool ScrollbarWidget_MouseDown(void* widget, int x, int y, MouseButton bt struct ScrollbarWidget* w = (struct ScrollbarWidget*)widget; int posY, height; - if (w->draggingMouse) return true; + if (w->draggingMouse) return true; if (btn != MOUSE_LEFT) return false; if (x < w->x || x >= w->x + w->width) return false; @@ -2094,7 +2086,6 @@ static void PlayerListWidget_TabEntryRemoved(void* widget, int id) { } static void PlayerListWidget_Init(void* widget) { - static const String title = String_FromConst("Connected players:"); struct PlayerListWidget* w = (struct PlayerListWidget*)widget; int id; @@ -2103,9 +2094,9 @@ static void PlayerListWidget_Init(void* widget) { PlayerListWidget_AddName(w, (EntityID)id, -1); } - PlayerListWidget_SortAndReposition(w); - TextWidget_Create(&w->title, &title, w->font); - Widget_SetLocation(&w->title, ANCHOR_CENTRE, ANCHOR_MIN, 0, 0); + PlayerListWidget_SortAndReposition(w); + TextWidget_Make(&w->title, ANCHOR_CENTRE, ANCHOR_MIN, 0, 0); + TextWidget_SetConst(&w->title, "Connected players:", w->font); Event_RegisterInt(&TabListEvents.Added, w, PlayerListWidget_TabEntryAdded); Event_RegisterInt(&TabListEvents.Changed, w, PlayerListWidget_TabEntryChanged); diff --git a/src/Widgets.h b/src/Widgets.h index 0fa8c7584..ec093e2bd 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -16,14 +16,13 @@ struct TextWidget { bool reducePadding; PackedCol col; }; -/* Resets state of the given text widget to default. */ -CC_NOINLINE void TextWidget_Make(struct TextWidget* w); +/* Initialises a text widget. */ +CC_NOINLINE void TextWidget_Make(struct TextWidget* w, + uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset); /* Draws the given text into a texture, then updates the position and size of this widget. */ CC_NOINLINE void TextWidget_Set(struct TextWidget* w, const String* text, const FontDesc* font); /* Shorthand for TextWidget_Set using String_FromReadonly */ CC_NOINLINE void TextWidget_SetConst(struct TextWidget* w, const char* text, const FontDesc* font); -/* Shorthand for TextWidget_Make then TextWidget_Set */ -CC_NOINLINE void TextWidget_Create(struct TextWidget* w, const String* text, const FontDesc* font); typedef void (*Button_Get)(String* raw); @@ -38,14 +37,13 @@ struct ButtonWidget { Button_Get GetValue; Button_Set SetValue; }; -/* Resets state of the given button widget to default. */ -CC_NOINLINE void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick); +/* Initialises a button widget. */ +CC_NOINLINE void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick, + uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset); /* Draws the given text into a texture, then updates the position and size of this widget. */ CC_NOINLINE void ButtonWidget_Set(struct ButtonWidget* w, const String* text, const FontDesc* font); /* Shorthand for ButtonWidget_Set using String_FromReadonly */ CC_NOINLINE void ButtonWidget_SetConst(struct ButtonWidget* w, const char* text, const FontDesc* font); -/* Resets state of the given button widget, then calls ButtonWidget_Set */ -CC_NOINLINE void ButtonWidget_Create(struct ButtonWidget* w, int minWidth, const String* text, const FontDesc* font, Widget_LeftClick onClick); /* Clickable and draggable scrollbar. */ struct ScrollbarWidget { From 2a4fb3208ab80433b24277249ec1f1e83c4d6e98 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 17 Aug 2019 07:53:03 +1000 Subject: [PATCH 13/46] Fix keydown not working --- src/InputHandler.c | 36 +++++++++++++++++++++++------------- src/Screens.c | 1 - src/Screens.h | 2 -- src/Widgets.c | 3 --- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/InputHandler.c b/src/InputHandler.c index 301e901b7..be4f9ebaa 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -395,10 +395,15 @@ void InputHandler_PickBlocks(bool cooldown, bool left, bool middle, bool right) } static void InputHandler_MouseWheel(void* obj, float delta) { - struct Screen* active = Gui_GetActiveScreen(); + struct Screen* s; + int i; struct Widget* widget; bool hotbar; - if (Elem_HandlesMouseScroll(active, delta)) return; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (s->VTABLE->HandlesMouseScroll(s, delta)) return; + } hotbar = Key_IsAltPressed() || Key_IsControlPressed() || Key_IsShiftPressed(); if (!hotbar && Camera.Active->Zoom(delta)) return; @@ -462,18 +467,18 @@ static bool InputHandler_SimulateMouse(Key key, bool pressed) { } static void InputHandler_KeyDown(void* obj, int key, bool was) { - struct Screen* active; - int idx; + struct Screen* s; + int i; struct HotkeyData* hkey; String text; if (!was && InputHandler_SimulateMouse(key, true)) return; - active = Gui_GetActiveScreen(); + s = Gui_GetActiveScreen(); #ifndef CC_BUILD_WEB - if (key == KEY_ESCAPE && active->closable) { + if (key == KEY_ESCAPE && (s = Gui_GetClosable())) { /* Don't want holding down escape to go in and out of pause menu */ - if (!was) Gui_Close(active); + if (!was) Gui_Remove(s); return; } #endif @@ -483,9 +488,14 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { Window_Close(); return; } else if (key == KeyBinds[KEYBIND_SCREENSHOT] && !was) { Game_ScreenshotRequested = true; return; - } else if (Elem_HandlesKeyDown(active, key)) { - return; - } else if ((key == KEY_ESCAPE || key == KEY_PAUSE) && !Gui_GetInputGrab()) { + } + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (s->VTABLE->HandlesKeyDown(s, key)) return; + } + + if ((key == KEY_ESCAPE || key == KEY_PAUSE) && !Gui_GetInputGrab()) { #ifdef CC_BUILD_WEB /* Can't do this in KeyUp, because pressing escape without having */ /* explicitly disabled mouse lock means a KeyUp event isn't sent. */ @@ -502,10 +512,10 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { if (InputHandler_HandleCoreKey(key)) { } else if (LocalPlayer_HandlesKey(key)) { } else { - idx = Hotkeys_FindPartial(key); - if (idx == -1) return; + i = Hotkeys_FindPartial(key); + if (i == -1) return; - hkey = &HotkeysList[idx]; + hkey = &HotkeysList[i]; text = StringsBuffer_UNSAFE_Get(&HotkeysText, hkey->TextIndex); if (!hkey->StaysOpen) { diff --git a/src/Screens.c b/src/Screens.c index 0c6d690cc..060d6cdb4 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -216,7 +216,6 @@ void InventoryScreen_Show(void) { s->VTABLE = &InventoryScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_INVENTORY); } -struct Screen* InventoryScreen_UNSAFE_RawPointer = (struct Screen*)&InventoryScreen_Instance; /*########################################################################################################################* diff --git a/src/Screens.h b/src/Screens.h index 9fd3e0843..4d6ae3505 100644 --- a/src/Screens.h +++ b/src/Screens.h @@ -14,8 +14,6 @@ void GeneratingScreen_Show(void); void HUDScreen_Show(void); void DisconnectScreen_Show(const String* title, const String* message); -/* Raw pointer to inventory screen. DO NOT USE THIS. Use InventoryScreen_MakeInstance() */ -extern struct Screen* InventoryScreen_UNSAFE_RawPointer; /* Raw pointer to loading screen. DO NOT USE THIS. Use LoadingScreen_MakeInstance() */ extern struct Screen* LoadingScreen_UNSAFE_RawPointer; /* Opens chat input for the HUD with the given initial text. */ diff --git a/src/Widgets.c b/src/Widgets.c index 3944a6bb8..1625bca20 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -450,13 +450,10 @@ static bool HotbarWidget_KeyUp(void* widget, Key key) { static bool HotbarWidget_MouseDown(void* widget, int x, int y, MouseButton btn) { struct HotbarWidget* w = (struct HotbarWidget*)widget; - struct Screen* screen; int width, height; int i, cellX, cellY; if (btn != MOUSE_LEFT || !Widget_Contains(w, x, y)) return false; - screen = Gui_GetActiveScreen(); - if (screen != InventoryScreen_UNSAFE_RawPointer) return false; width = (int)(w->elemSize + w->borderSize); height = Math_Ceil(w->barHeight); From 5006716c4cbbd5d4dcbbd61325805e5f674bb19d Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 17 Aug 2019 09:34:31 +1000 Subject: [PATCH 14/46] Move widgets to base Screen and move away from using Recreate method Also fix texture pack screen messing up after resize --- src/Gui.h | 6 +- src/Menus.c | 159 +++++++++++++++++++++++--------------------------- src/Screens.c | 10 ++-- src/Widgets.c | 26 ++++----- src/Widgets.h | 3 + 5 files changed, 96 insertions(+), 108 deletions(-) diff --git a/src/Gui.h b/src/Gui.h index 4e78994e7..d56260d49 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -17,6 +17,7 @@ enum GuiAnchor { struct IGameComponent; struct GuiElem; +struct Widget; extern struct IGameComponent Gui_Component; /* Whether vanilla Minecraft Classic gui texture is used. */ @@ -51,7 +52,6 @@ struct GuiElemVTABLE { GuiElemVTABLE_Layout() }; struct GuiElem { struct GuiElemVTABLE* VTABLE; }; void Gui_DefaultRecreate(void* elem); - struct ScreenVTABLE { GuiElemVTABLE_Layout() void (*OnResize)(void* elem); @@ -62,13 +62,13 @@ struct ScreenVTABLE { bool grabsInput; /* Whether this screen grabs input. Causes the cursor to become visible. */ \ bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ bool hidden; /* Whether this screen is prevented from rendering. */ \ - bool closable; /* Whether this screen is automatically closed when pressing Escape */ + bool closable; /* Whether this screen is automatically closed when pressing Escape */ \ + struct Widget** widgets; int numWidgets; /* Represents a container of widgets and other 2D elements. May cover entire window. */ struct Screen { Screen_Layout }; typedef void (*Widget_LeftClick)(void* screen, void* widget); -struct Widget; struct WidgetVTABLE { GuiElemVTABLE_Layout() void (*Reposition)(void* elem); diff --git a/src/Menus.c b/src/Menus.c index 1600b5cd0..72089b6dd 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -29,10 +29,7 @@ #include "Builder.h" #include "Logger.h" -#define MenuBase_Layout Screen_Layout struct Widget** widgets; int widgetsCount; -struct Menu { MenuBase_Layout }; - -#define MenuScreen_Layout MenuBase_Layout FontDesc titleFont, textFont; +#define MenuScreen_Layout Screen_Layout FontDesc titleFont, textFont; struct MenuScreen { MenuScreen_Layout }; /* Describes a menu option button */ @@ -51,22 +48,20 @@ struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, const String* text, const FontDesc* font, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); ButtonWidget_Set(btn, text, font); - ((struct Menu*)s)->widgets[i] = (struct Widget*)btn; + ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; } static void Menu_Label(void* s, int i, struct TextWidget* label, const String* text, const FontDesc* font, int horAnchor, int verAnchor, int x, int y) { TextWidget_Make(label, horAnchor, verAnchor, x, y); TextWidget_Set(label, text, font); - ((struct Menu*)s)->widgets[i] = (struct Widget*)label; + ((struct Screen*)s)->widgets[i] = (struct Widget*)label; } static void Menu_Input(void* s, int i, struct MenuInputWidget* input, int width, const String* text, FontDesc* font, struct MenuInputDesc* desc, int horAnchor, int verAnchor, int x, int y) { - struct Menu* menu = (struct Menu*)s; MenuInputWidget_Create(input, width, 30, text, font, desc); - - menu->widgets[i] = (struct Widget*)input; - Widget_SetLocation(menu->widgets[i], horAnchor, verAnchor, x, y); + Widget_SetLocation(input, horAnchor, verAnchor, x, y); input->base.showCaret = true; + ((struct Screen*)s)->widgets[i] = (struct Widget*)input; } static void Menu_Back(void* s, int i, struct ButtonWidget* btn, const char* label, const FontDesc* font, Widget_LeftClick onClick) { @@ -90,36 +85,33 @@ CC_NOINLINE static void Menu_MakeBodyFont(FontDesc* font) { static void Menu_ContextLost(void* screen) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; int i; - if (!widgets) return; - for (i = 0; i < s->widgetsCount; i++) { + for (i = 0; i < s->numWidgets; i++) { if (!widgets[i]) continue; Elem_Free(widgets[i]); } } static void Menu_OnResize(void* screen) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; int i; - if (!widgets) return; - for (i = 0; i < s->widgetsCount; i++) { + for (i = 0; i < s->numWidgets; i++) { if (!widgets[i]) continue; Widget_Reposition(widgets[i]); } } static void Menu_RenderWidgets(void* screen, double delta) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; int i; - if (!widgets) return; - for (i = 0; i < s->widgetsCount; i++) { + for (i = 0; i < s->numWidgets; i++) { if (!widgets[i]) continue; Elem_Render(widgets[i], delta); } @@ -135,9 +127,9 @@ static void Menu_RenderBounds(void) { } static int Menu_DoMouseDown(void* screen, int x, int y, MouseButton btn) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; - int i, count = s->widgetsCount; + int i, count = s->numWidgets; /* iterate backwards (because last elements rendered are shown over others) */ for (i = count - 1; i >= 0; i--) { @@ -159,9 +151,9 @@ static bool Menu_MouseDown(void* screen, int x, int y, MouseButton btn) { } static int Menu_DoMouseMove(void* screen, int x, int y) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; - int i, count = s->widgetsCount; + int i, count = s->numWidgets; for (i = 0; i < count; i++) { struct Widget* w = widgets[i]; @@ -191,19 +183,19 @@ static bool Menu_KeyUp(void* screen, Key key) { return true; } *------------------------------------------------------Menu utilities-----------------------------------------------------* *#########################################################################################################################*/ static int Menu_Index(void* screen, void* widget) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; int i; struct Widget* w = (struct Widget*)widget; - for (i = 0; i < s->widgetsCount; i++) { + for (i = 0; i < s->numWidgets; i++) { if (widgets[i] == w) return i; } return -1; } static void Menu_Remove(void* screen, int i) { - struct Menu* s = (struct Menu*)screen; + struct Screen* s = (struct Screen*)screen; struct Widget** widgets = s->widgets; if (widgets[i]) { Elem_TryFree(widgets[i]); } @@ -255,7 +247,7 @@ struct ListScreen; #define LIST_SCREEN_EMPTY "-----" static struct ListScreen { - MenuBase_Layout + Screen_Layout struct ButtonWidget buttons[LIST_SCREEN_ITEMS]; struct ButtonWidget left, right, done; FontDesc font; @@ -405,9 +397,9 @@ static void ListScreen_Init(void* screen) { struct ListScreen* s = (struct ListScreen*)screen; int i; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); - s->wheelAcc = 0.0f; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + s->wheelAcc = 0.0f; s->currentIndex = 0; for (i = 0; i < LIST_SCREEN_ITEMS; i++) { @@ -584,10 +576,10 @@ void PauseScreen_Show(void) { static struct Widget* widgets[8]; struct PauseScreen* s = &PauseScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); s->VTABLE = &PauseScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); @@ -659,9 +651,9 @@ static void OptionsGroupScreen_Init(void* screen) { MenuScreen_Init(s); Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, OptionsGroupScreen_CheckHacksAllowed); - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); - s->selectedI = -1; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + s->selectedI = -1; for (i = 0; i < Array_Elems(optsGroup_btns); i++) { ButtonWidget_Make(&s->buttons[i], 300, optsGroup_btns[i].onClick, @@ -913,13 +905,13 @@ struct Screen* EditHotkeyScreen_MakeInstance(struct HotkeyData original) { static struct Widget* widgets[7]; struct EditHotkeyScreen* s = &EditHotkeyScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); - s->VTABLE = &EditHotkeyScreen_VTABLE; - s->selectedI = -1; + s->VTABLE = &EditHotkeyScreen_VTABLE; + s->selectedI = -1; s->origHotkey = original; s->curHotkey = original; return (struct Screen*)s; @@ -1079,10 +1071,10 @@ void GenLevelScreen_Show(void) { static struct Widget* widgets[12]; struct GenLevelScreen* s = &GenLevelScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); s->VTABLE = &GenLevelScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); @@ -1134,10 +1126,10 @@ void ClassicGenScreen_Show(void) { static struct Widget* widgets[4]; struct ClassicGenScreen* s = &ClassicGenScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); s->VTABLE = &ClassicGenScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); @@ -1293,10 +1285,10 @@ void SaveLevelScreen_Show(void) { static struct Widget* widgets[6]; struct SaveLevelScreen* s = &SaveLevelScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); s->VTABLE = &SaveLevelScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); @@ -1310,20 +1302,15 @@ static void TexturePackScreen_EntryClick(void* screen, void* widget) { String path; char pathBuffer[FILENAME_SIZE]; struct ListScreen* s = (struct ListScreen*)screen; String filename; - int idx; filename = ListScreen_UNSAFE_GetCur(s, widget); String_InitArray(path, pathBuffer); String_Format1(&path, "texpacks/%s", &filename); if (!File_Exists(&path)) return; - idx = s->currentIndex; Game_SetDefaultTexturePack(&filename); World_TextureUrl.length = 0; TexturePack_ExtractCurrent(true); - - Elem_Recreate(s); - ListScreen_SetCurrentIndex(s, idx); } static void TexturePackScreen_FilterFiles(const String* path, void* obj) { @@ -1661,10 +1648,10 @@ static struct KeyBindingsScreen* KeyBindingsScreen_Make(int bindsCount, uint8_t* static struct Widget* widgets[12 + 4]; /* 12 buttons + buttons + 2 widgets used by MouseKeyBindings */ struct KeyBindingsScreen* s = &KeyBindingsScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = bindsCount + 4; + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = bindsCount + 4; s->VTABLE = &KeyBindingsScreen_VTABLE; s->VTABLE->ContextRecreated = contextRecreated; @@ -1795,7 +1782,7 @@ struct Screen* MouseKeyBindingsScreen_MakeInstance(void) { struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, MouseKeyBindingsScreen_ContextRecreated); s->leftPage = Menu_SwitchKeysOther; - s->widgetsCount++; /* Extra text widget for 'right click' message */ + s->numWidgets++; /* Extra text widget for 'right click' message */ return (struct Screen*)s; } @@ -1895,7 +1882,7 @@ static void MenuOptionsScreen_FreeInput(struct MenuOptionsScreen* s) { int i; if (s->activeI == -1) return; - for (i = s->widgetsCount - 3; i < s->widgetsCount; i++) { + for (i = s->numWidgets - 3; i < s->numWidgets; i++) { if (!s->widgets[i]) continue; Elem_TryFree(s->widgets[i]); s->widgets[i] = NULL; @@ -2085,7 +2072,7 @@ static void MenuOptionsScreen_Input(void* screen, void* widget) { String_InitArray(value, valueBuffer); btn->GetValue(&value); - i = s->widgetsCount; + i = s->numWidgets; Menu_Input(s, i - 1, &s->input, 400, &value, &s->textFont, &s->descs[s->activeI], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 110); @@ -2105,10 +2092,10 @@ struct Screen* MenuOptionsScreen_MakeInstance(int count, Event_Void_Callback con static struct Widget* widgets[11 + 3]; /* max buttons + 3 widgets for input */ struct MenuOptionsScreen* s = &MenuOptionsScreen_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = count; + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = count; s->extHelp.lines = 0; s->VTABLE = &MenuOptionsScreen_VTABLE; @@ -2572,7 +2559,7 @@ static void HacksSettingsScreen_CheckHacksAllowed(void* screen) { bool disabled; int i; - for (i = 0; i < s->widgetsCount; i++) { + for (i = 0; i < s->numWidgets; i++) { if (!widgets[i]) continue; widgets[i]->disabled = false; } @@ -3004,10 +2991,10 @@ void TexIdsOverlay_Show(void) { static struct Widget* widgets[1]; struct TexIdsOverlay* s = &TexIdsOverlay_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); s->VTABLE = &TexIdsOverlay_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_TEXIDS); @@ -3073,10 +3060,10 @@ void UrlWarningOverlay_Show(const String* url) { static struct Widget* widgets[6]; struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); String_InitArray(s->url, s->_urlBuffer); String_Copy(&s->url, url); @@ -3206,7 +3193,7 @@ static void TexPackOverlay_ContextRecreated(void* screen) { } else { TexPackOverlay_MakeNormalElements(s); } - s->widgetsCount = s->showingDeny ? 6 : 8; + s->numWidgets = s->showingDeny ? 6 : 8; } static struct ScreenVTABLE TexPackOverlay_VTABLE = { @@ -3219,11 +3206,11 @@ void TexPackOverlay_Show(const String* url) { static struct Widget* widgets[8]; struct TexPackOverlay* s = &TexPackOverlay_Instance; - s->showingDeny = false; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->widgetsCount = Array_Elems(widgets); + s->showingDeny = false; + s->grabsInput = true; + s->closable = true; + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); String_InitArray(s->identifier, s->_identifierBuffer); String_Format1(&s->identifier, "CL_%s", url); diff --git a/src/Screens.c b/src/Screens.c index 060d6cdb4..cce3cc113 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -87,13 +87,13 @@ static void InventoryScreen_ContextLost(void* screen) { static void InventoryScreen_ContextRecreated(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; Drawer2D_MakeFont(&s->font, 16, FONT_STYLE_NORMAL); - Elem_Recreate(&s->table); + TableWidget_Recreate(&s->table); } static void InventoryScreen_MoveToSelected(struct InventoryScreen* s) { struct TableWidget* table = &s->table; TableWidget_SetBlockTo(table, Inventory_SelectedBlock); - Elem_Recreate(table); + TableWidget_Recreate(table); s->deferredSelect = false; /* User is holding invalid block */ @@ -851,7 +851,7 @@ static void HUDScreen_ColCodeChanged(void* screen, int code) { /* Some servers have plugins that redefine colours constantly */ /* Preserve caret accumulator so caret blinking stays consistent */ caretAcc = s->input.base.caretAccumulator; - Elem_Recreate(&s->input.base); + InputWidget_UpdateText(&s->input.base); s->input.base.caretAccumulator = caretAcc; } @@ -1008,7 +1008,7 @@ static void HUDScreen_OnResize(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; /* TODO: Kill this awful hack with fire */ bool active = s->altText.active; - Elem_Recreate(s); + Gui_DefaultRecreate(s); SpecialInputWidget_SetActive(&s->altText, active); Widget_Reposition(&s->hotbar); @@ -1233,7 +1233,7 @@ void HUDScreen_OpenInput(const String* text) { Camera_CheckFocus(); String_Copy(&s->input.base.text, text); - Elem_Recreate(&s->input.base); + InputWidget_UpdateText(&s->input.base); } void HUDScreen_AppendInput(const String* text) { diff --git a/src/Widgets.c b/src/Widgets.c index 1625bca20..890451f21 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -699,8 +699,7 @@ static void TableWidget_Free(void* widget) { w->lastCreatedIndex = -1000; } -static void TableWidget_Recreate(void* widget) { - struct TableWidget* w = (struct TableWidget*)widget; +void TableWidget_Recreate(struct TableWidget* w) { Elem_TryFree(w); w->vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FT2FC4B, TABLE_MAX_VERTICES); TableWidget_RecreateDescTex(w); @@ -820,7 +819,7 @@ static bool TableWidget_KeyDown(void* widget, Key key) { } static struct WidgetVTABLE TableWidget_VTABLE = { - TableWidget_Init, TableWidget_Render, TableWidget_Free, TableWidget_Recreate, + TableWidget_Init, TableWidget_Render, TableWidget_Free, Gui_DefaultRecreate, TableWidget_KeyDown, Widget_Key, Widget_KeyPress, TableWidget_MouseDown, TableWidget_MouseUp, TableWidget_MouseMove, TableWidget_MouseScroll, TableWidget_Reposition, @@ -1023,12 +1022,12 @@ void InputWidget_AppendString(struct InputWidget* w, const String* text) { } if (!appended) return; - Elem_Recreate(w); + InputWidget_UpdateText(w); } void InputWidget_Append(struct InputWidget* w, char c) { if (!InputWidget_TryAppendChar(w, c)) return; - Elem_Recreate(w); + InputWidget_UpdateText(w); } static void InputWidget_DeleteChar(struct InputWidget* w) { @@ -1072,7 +1071,7 @@ static void InputWidget_BackspaceKey(struct InputWidget* w) { } else if (w->caretPos >= 0 && w->text.buffer[w->caretPos] != ' ') { String_InsertAt(&w->text, w->caretPos, ' '); } - Elem_Recreate(w); + InputWidget_UpdateText(w); } else if (w->text.length > 0 && w->caretPos != 0) { int index = w->caretPos == -1 ? w->text.length - 1 : w->caretPos; if (InputWidget_CheckCol(w, index - 1)) { @@ -1083,7 +1082,7 @@ static void InputWidget_BackspaceKey(struct InputWidget* w) { } InputWidget_DeleteChar(w); - Elem_Recreate(w); + InputWidget_UpdateText(w); } } @@ -1091,7 +1090,7 @@ static void InputWidget_DeleteKey(struct InputWidget* w) { if (w->text.length > 0 && w->caretPos != -1) { String_DeleteAt(&w->text, w->caretPos); if (w->caretPos >= w->text.length) { w->caretPos = -1; } - Elem_Recreate(w); + InputWidget_UpdateText(w); } } @@ -1177,8 +1176,7 @@ static void InputWidget_Free(void* widget) { Gfx_DeleteTexture(&w->caretTex.ID); } -static void InputWidget_Recreate(void* widget) { - struct InputWidget* w = (struct InputWidget*)widget; +void InputWidget_UpdateText(struct InputWidget* w) { Gfx_DeleteTexture(&w->inputTex.ID); InputWidget_Init(w); } @@ -1493,7 +1491,7 @@ static bool MenuInputWidget_AllowedChar(void* widget, char c) { static int MenuInputWidget_GetMaxLines(void) { return 1; } static struct WidgetVTABLE MenuInputWidget_VTABLE = { - InputWidget_Init, MenuInputWidget_Render, InputWidget_Free, InputWidget_Recreate, + InputWidget_Init, MenuInputWidget_Render, InputWidget_Free, Gui_DefaultRecreate, InputWidget_KeyDown, InputWidget_KeyUp, InputWidget_KeyPress, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition, @@ -1639,7 +1637,7 @@ static void ChatInputWidget_UpKey(struct InputWidget* w) { String_AppendString(&w->text, &prevInput); w->caretPos = -1; - Elem_Recreate(w); + InputWidget_UpdateText(w); } static void ChatInputWidget_DownKey(struct InputWidget* w) { @@ -1668,7 +1666,7 @@ static void ChatInputWidget_DownKey(struct InputWidget* w) { } w->caretPos = -1; - Elem_Recreate(w); + InputWidget_UpdateText(w); } static bool ChatInputWidget_IsNameChar(char c) { @@ -1746,7 +1744,7 @@ static int ChatInputWidget_GetMaxLines(void) { } static struct WidgetVTABLE ChatInputWidget_VTABLE = { - InputWidget_Init, ChatInputWidget_Render, InputWidget_Free, InputWidget_Recreate, + InputWidget_Init, ChatInputWidget_Render, InputWidget_Free, Gui_DefaultRecreate, ChatInputWidget_KeyDown, InputWidget_KeyUp, InputWidget_KeyPress, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition, diff --git a/src/Widgets.h b/src/Widgets.h index ec093e2bd..9841ab027 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -92,6 +92,7 @@ CC_NOINLINE void TableWidget_Create(struct TableWidget* w); CC_NOINLINE void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block); CC_NOINLINE void TableWidget_OnInventoryChanged(struct TableWidget* w); CC_NOINLINE void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block); +CC_NOINLINE void TableWidget_Recreate(struct TableWidget* w); #define INPUTWIDGET_MAX_LINES 3 @@ -128,6 +129,8 @@ CC_NOINLINE void InputWidget_Clear(struct InputWidget* w); CC_NOINLINE void InputWidget_AppendString(struct InputWidget* w, const String* text); /* Tries appending the given character, then updates the input texture. */ CC_NOINLINE void InputWidget_Append(struct InputWidget* w, char c); +/* Redraws text and recalculates associated state. */ +CC_NOINLINE void InputWidget_UpdateText(struct InputWidget* w); struct MenuInputDesc; From 26120c219a6a1af2b1a0c5a7622b46b302ba35b2 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 17 Aug 2019 09:45:54 +1000 Subject: [PATCH 15/46] Kill off GuiElem and Recreate method --- src/Gui.c | 5 ---- src/Gui.h | 12 +++------ src/Menus.c | 68 +++++++++++++++++++++++++-------------------------- src/Screens.c | 24 +++++++++--------- src/Widgets.c | 40 +++++++++++++++--------------- 5 files changed, 68 insertions(+), 81 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index f6161e14c..88546c88b 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -25,11 +25,6 @@ struct Screen* Gui_Screens[GUI_MAX_SCREENS]; int Gui_ScreensCount, Gui_OverlaysCount; static uint8_t priorities[GUI_MAX_SCREENS]; -void Gui_DefaultRecreate(void* elem) { - struct GuiElem* e = (struct GuiElem*)elem; - Elem_Free(e); Elem_Init(e); -} - void Widget_SetLocation(void* widget, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { struct Widget* w = (struct Widget*)widget; w->horAnchor = horAnchor; w->verAnchor = verAnchor; diff --git a/src/Gui.h b/src/Gui.h index d56260d49..6f448291a 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -39,7 +39,6 @@ extern bool Gui_ShowFPS; void (*Init)(void* elem); \ void (*Render)(void* elem, double delta); \ void (*Free)(void* elem); \ - void (*Recreate)(void* elem); \ bool (*HandlesKeyDown)(void* elem, Key key); \ bool (*HandlesKeyUp)(void* elem, Key key); \ bool (*HandlesKeyPress)(void* elem, char keyChar); \ @@ -48,10 +47,6 @@ extern bool Gui_ShowFPS; bool (*HandlesMouseMove)(void* elem, int x, int y); \ bool (*HandlesMouseScroll)(void* elem, float delta); -struct GuiElemVTABLE { GuiElemVTABLE_Layout() }; -struct GuiElem { struct GuiElemVTABLE* VTABLE; }; -void Gui_DefaultRecreate(void* elem); - struct ScreenVTABLE { GuiElemVTABLE_Layout() void (*OnResize)(void* elem); @@ -179,10 +174,9 @@ void TextAtlas_Add(struct TextAtlas* atlas, int charI, VertexP3fT2fC4b** vertice void TextAtlas_AddInt(struct TextAtlas* atlas, int value, VertexP3fT2fC4b** vertices); -#define Elem_Init(elem) (elem)->VTABLE->Init(elem) -#define Elem_Render(elem, delta) (elem)->VTABLE->Render(elem, delta) -#define Elem_Free(elem) (elem)->VTABLE->Free(elem) -#define Elem_Recreate(elem) (elem)->VTABLE->Recreate(elem) +#define Elem_Init(elem) (elem)->VTABLE->Init(elem) +#define Elem_Render(elem, delta) (elem)->VTABLE->Render(elem, delta) +#define Elem_Free(elem) (elem)->VTABLE->Free(elem) #define Elem_HandlesKeyPress(elem, key) (elem)->VTABLE->HandlesKeyPress(elem, key) #define Elem_HandlesKeyDown(elem, key) (elem)->VTABLE->HandlesKeyDown(elem, key) #define Elem_HandlesKeyUp(elem, key) (elem)->VTABLE->HandlesKeyUp(elem, key) diff --git a/src/Menus.c b/src/Menus.c index 72089b6dd..58194bab2 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -348,6 +348,12 @@ static void ListScreen_QuickSort(int left, int right) { } } +CC_NOINLINE static void ListScreen_Sort(struct ListScreen* s) { + if (s->entries.count) { + ListScreen_QuickSort(0, s->entries.count - 1); + } +} + static String ListScreen_UNSAFE_GetCur(struct ListScreen* s, void* widget) { int i = Menu_Index(s, widget); return ListScreen_UNSAFE_Get(s, s->currentIndex + i); @@ -446,10 +452,10 @@ static void ListScreen_ContextRecreated(void* screen) { } static struct ScreenVTABLE ListScreen_VTABLE = { - ListScreen_Init, ListScreen_Render, ListScreen_Free, Gui_DefaultRecreate, + ListScreen_Init, ListScreen_Render, ListScreen_Free, ListScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, ListScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, ListScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, ListScreen_ContextRecreated }; void ListScreen_Show(void) { struct ListScreen* s = &ListScreen; @@ -567,10 +573,10 @@ static void PauseScreen_Free(void* screen) { } static struct ScreenVTABLE PauseScreen_VTABLE = { - PauseScreen_Init, MenuScreen_Render, PauseScreen_Free, Gui_DefaultRecreate, + PauseScreen_Init, MenuScreen_Render, PauseScreen_Free, MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, PauseScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, PauseScreen_ContextRecreated }; void PauseScreen_Show(void) { static struct Widget* widgets[8]; @@ -682,10 +688,10 @@ static bool OptionsGroupScreen_MouseMove(void* screen, int x, int y) { } static struct ScreenVTABLE OptionsGroupScreen_VTABLE = { - OptionsGroupScreen_Init, MenuScreen_Render, OptionsGroupScreen_Free, Gui_DefaultRecreate, + OptionsGroupScreen_Init, MenuScreen_Render, OptionsGroupScreen_Free, MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, OptionsGroupScreen_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, OptionsGroupScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, OptionsGroupScreen_ContextRecreated }; void OptionsGroupScreen_Show(void) { struct OptionsGroupScreen* s = &OptionsGroupScreen; @@ -896,10 +902,10 @@ static void EditHotkeyScreen_ContextRecreated(void* screen) { } static struct ScreenVTABLE EditHotkeyScreen_VTABLE = { - MenuScreen_Init, EditHotkeyScreen_Render, EditHotkeyScreen_Free, Gui_DefaultRecreate, + MenuScreen_Init, EditHotkeyScreen_Render, EditHotkeyScreen_Free, EditHotkeyScreen_KeyDown, EditHotkeyScreen_KeyUp, EditHotkeyScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, EditHotkeyScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, EditHotkeyScreen_ContextRecreated }; struct Screen* EditHotkeyScreen_MakeInstance(struct HotkeyData original) { static struct Widget* widgets[7]; @@ -1062,10 +1068,10 @@ static void GenLevelScreen_ContextRecreated(void* screen) { } static struct ScreenVTABLE GenLevelScreen_VTABLE = { - MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, Gui_DefaultRecreate, + MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, GenLevelScreen_KeyDown, GenLevelScreen_KeyUp, GenLevelScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, GenLevelScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, GenLevelScreen_ContextRecreated }; void GenLevelScreen_Show(void) { static struct Widget* widgets[12]; @@ -1117,10 +1123,10 @@ static void ClassicGenScreen_ContextRecreated(void* screen) { } static struct ScreenVTABLE ClassicGenScreen_VTABLE = { - MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, Gui_DefaultRecreate, + MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, ClassicGenScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, ClassicGenScreen_ContextRecreated }; void ClassicGenScreen_Show(void) { static struct Widget* widgets[4]; @@ -1276,10 +1282,10 @@ static void SaveLevelScreen_ContextRecreated(void* screen) { } static struct ScreenVTABLE SaveLevelScreen_VTABLE = { - MenuScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, Gui_DefaultRecreate, + MenuScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, SaveLevelScreen_KeyDown, SaveLevelScreen_KeyUp, SaveLevelScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, SaveLevelScreen_ContextRecreated, + Menu_OnResize, Menu_ContextLost, SaveLevelScreen_ContextRecreated }; void SaveLevelScreen_Show(void) { static struct Widget* widgets[6]; @@ -1325,10 +1331,7 @@ static void TexturePackScreen_FilterFiles(const String* path, void* obj) { static void TexturePackScreen_LoadEntries(struct ListScreen* s) { static const String path = String_FromConst("texpacks"); Directory_Enum(&path, &s->entries, TexturePackScreen_FilterFiles); - - if (s->entries.count) { - ListScreen_QuickSort(0, s->entries.count - 1); - } + ListScreen_Sort(s); } void TexturePackScreen_Show(void) { @@ -1378,9 +1381,7 @@ static void FontListScreen_UpdateEntry(struct ListScreen* s, struct ButtonWidget static void FontListScreen_LoadEntries(struct ListScreen* s) { Font_GetNames(&s->entries); - if (s->entries.count) { - ListScreen_QuickSort(0, s->entries.count - 1); - } + ListScreen_Sort(s); ListScreen_Select(s, &Drawer2D_FontName); } @@ -1499,10 +1500,7 @@ static void LoadLevelScreen_FilterFiles(const String* path, void* obj) { static void LoadLevelScreen_LoadEntries(struct ListScreen* s) { static const String path = String_FromConst("maps"); Directory_Enum(&path, &s->entries, LoadLevelScreen_FilterFiles); - - if (s->entries.count) { - ListScreen_QuickSort(0, s->entries.count - 1); - } + ListScreen_Sort(s); } void LoadLevelScreen_Show(void) { @@ -1639,10 +1637,10 @@ static bool KeyBindingsScreen_MouseDown(void* screen, int x, int y, MouseButton } static struct ScreenVTABLE KeyBindingsScreen_VTABLE = { - MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, Gui_DefaultRecreate, + MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, KeyBindingsScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, KeyBindingsScreen_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, NULL, + Menu_OnResize, Menu_ContextLost, NULL }; static struct KeyBindingsScreen* KeyBindingsScreen_Make(int bindsCount, uint8_t* binds, const char** descs, Event_Void_Callback contextRecreated) { static struct Widget* widgets[12 + 4]; /* 12 buttons + buttons + 2 widgets used by MouseKeyBindings */ @@ -2083,10 +2081,10 @@ static void MenuOptionsScreen_Input(void* screen, void* widget) { } static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { - MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuScreen_Free, Gui_DefaultRecreate, + MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuScreen_Free, MenuOptionsScreen_KeyDown, MenuOptionsScreen_KeyUp, MenuOptionsScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, - MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, NULL, + MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, NULL }; struct Screen* MenuOptionsScreen_MakeInstance(int count, Event_Void_Callback contextRecreated, struct MenuInputDesc* descs, const char** descriptions, int descsCount) { static struct Widget* widgets[11 + 3]; /* max buttons + 3 widgets for input */ @@ -2982,10 +2980,10 @@ static bool TexIdsOverlay_KeyPress(void* screen, char keyChar) { return false; } static bool TexIdsOverlay_KeyUp(void* screen, Key key) { return false; } static struct ScreenVTABLE TexIdsOverlay_VTABLE = { - TexIdsOverlay_Init, TexIdsOverlay_Render, Overlay_Free, Gui_DefaultRecreate, + TexIdsOverlay_Init, TexIdsOverlay_Render, Overlay_Free, TexIdsOverlay_KeyDown, TexIdsOverlay_KeyUp, TexIdsOverlay_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated, + Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated }; void TexIdsOverlay_Show(void) { static struct Widget* widgets[1]; @@ -3051,10 +3049,10 @@ static void UrlWarningOverlay_ContextRecreated(void* screen) { } static struct ScreenVTABLE UrlWarningOverlay_VTABLE = { - MenuScreen_Init, MenuScreen_Render, Overlay_Free, Gui_DefaultRecreate, + MenuScreen_Init, MenuScreen_Render, Overlay_Free, Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, UrlWarningOverlay_ContextRecreated, + Menu_OnResize, Menu_ContextLost, UrlWarningOverlay_ContextRecreated }; void UrlWarningOverlay_Show(const String* url) { static struct Widget* widgets[6]; @@ -3197,10 +3195,10 @@ static void TexPackOverlay_ContextRecreated(void* screen) { } static struct ScreenVTABLE TexPackOverlay_VTABLE = { - MenuScreen_Init, TexPackOverlay_Render, Overlay_Free, Gui_DefaultRecreate, + MenuScreen_Init, TexPackOverlay_Render, Overlay_Free, Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, TexPackOverlay_ContextRecreated, + Menu_OnResize, Menu_ContextLost, TexPackOverlay_ContextRecreated }; void TexPackOverlay_Show(const String* url) { static struct Widget* widgets[8]; diff --git a/src/Screens.c b/src/Screens.c index cce3cc113..8d9367889 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -203,10 +203,10 @@ static bool InventoryScreen_MouseScroll(void* screen, float delta) { } static struct ScreenVTABLE InventoryScreen_VTABLE = { - InventoryScreen_Init, InventoryScreen_Render, InventoryScreen_Free, Gui_DefaultRecreate, + InventoryScreen_Init, InventoryScreen_Render, InventoryScreen_Free, InventoryScreen_KeyDown, InventoryScreen_KeyUp, Screen_TKeyPress, InventoryScreen_MouseDown, InventoryScreen_MouseUp, InventoryScreen_MouseMove, InventoryScreen_MouseScroll, - InventoryScreen_OnResize, InventoryScreen_ContextLost, InventoryScreen_ContextRecreated, + InventoryScreen_OnResize, InventoryScreen_ContextLost, InventoryScreen_ContextRecreated }; void InventoryScreen_Show(void) { struct InventoryScreen* s = &InventoryScreen_Instance; @@ -394,10 +394,10 @@ static void StatusScreen_Render(void* screen, double delta) { } static struct ScreenVTABLE StatusScreen_VTABLE = { - Screen_NullFunc, StatusScreen_Render, Screen_NullFunc, Gui_DefaultRecreate, + Screen_NullFunc, StatusScreen_Render, Screen_NullFunc, Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, - Screen_NullFunc, StatusScreen_ContextLost, StatusScreen_ContextRecreated, + Screen_NullFunc, StatusScreen_ContextLost, StatusScreen_ContextRecreated }; void StatusScreen_Show(void) { struct StatusScreen* s = &StatusScreen_Instance; @@ -556,10 +556,10 @@ CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const Stri } static struct ScreenVTABLE LoadingScreen_VTABLE = { - LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, + LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, - LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, + LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated }; void LoadingScreen_Show(const String* title, const String* message) { LoadingScreen_Instance.VTABLE = &LoadingScreen_VTABLE; @@ -626,10 +626,10 @@ static void GeneratingScreen_Render(void* screen, double delta) { } static struct ScreenVTABLE GeneratingScreen_VTABLE = { - GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Gui_DefaultRecreate, + GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, - LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated, + LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated }; void GeneratingScreen_Show(void) { static const String title = String_FromConst("Generating level"); @@ -1008,7 +1008,7 @@ static void HUDScreen_OnResize(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; /* TODO: Kill this awful hack with fire */ bool active = s->altText.active; - Gui_DefaultRecreate(s); + Elem_Free(s); Elem_Init(s); SpecialInputWidget_SetActive(&s->altText, active); Widget_Reposition(&s->hotbar); @@ -1210,10 +1210,10 @@ static void HUDScreen_Free(void* screen) { } static struct ScreenVTABLE HUDScreen_VTABLE = { - HUDScreen_Init, HUDScreen_Render, HUDScreen_Free, Gui_DefaultRecreate, + HUDScreen_Init, HUDScreen_Render, HUDScreen_Free, HUDScreen_KeyDown, HUDScreen_KeyUp, HUDScreen_KeyPress, HUDScreen_MouseDown, Screen_FMouse, Screen_FMouseMove, HUDScreen_MouseScroll, - HUDScreen_OnResize, HUDScreen_ContextLost, HUDScreen_ContextRecreated, + HUDScreen_OnResize, HUDScreen_ContextLost, HUDScreen_ContextRecreated }; void HUDScreen_Show(void) { struct HUDScreen* s = &HUDScreen_Instance; @@ -1381,7 +1381,7 @@ static bool DisconnectScreen_MouseMove(void* screen, int x, int y) { } static struct ScreenVTABLE DisconnectScreen_VTABLE = { - DisconnectScreen_Init, DisconnectScreen_Render, DisconnectScreen_Free, Gui_DefaultRecreate, + DisconnectScreen_Init, DisconnectScreen_Render, DisconnectScreen_Free, DisconnectScreen_KeyDown, Screen_TKey, Screen_TKeyPress, DisconnectScreen_MouseDown, Screen_TMouse, DisconnectScreen_MouseMove, Screen_TMouseScroll, DisconnectScreen_OnResize, DisconnectScreen_ContextLost, DisconnectScreen_ContextRecreated diff --git a/src/Widgets.c b/src/Widgets.c index 890451f21..e3dd4d590 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -49,10 +49,10 @@ static void TextWidget_Reposition(void* widget) { } static struct WidgetVTABLE TextWidget_VTABLE = { - Widget_NullFunc, TextWidget_Render, TextWidget_Free, Gui_DefaultRecreate, + Widget_NullFunc, TextWidget_Render, TextWidget_Free, Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - TextWidget_Reposition, + TextWidget_Reposition }; void TextWidget_Make(struct TextWidget* w, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { PackedCol col = PACKEDCOL_WHITE; @@ -152,10 +152,10 @@ static void ButtonWidget_Render(void* widget, double delta) { } static struct WidgetVTABLE ButtonWidget_VTABLE = { - Widget_NullFunc, ButtonWidget_Render, ButtonWidget_Free, Gui_DefaultRecreate, + Widget_NullFunc, ButtonWidget_Render, ButtonWidget_Free, Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - ButtonWidget_Reposition, + ButtonWidget_Reposition }; void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick onClick, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { Widget_Reset(w); @@ -298,10 +298,10 @@ static bool ScrollbarWidget_MouseMove(void* widget, int x, int y) { } static struct WidgetVTABLE ScrollbarWidget_VTABLE = { - Widget_NullFunc, ScrollbarWidget_Render, Widget_NullFunc, Gui_DefaultRecreate, + Widget_NullFunc, ScrollbarWidget_Render, Widget_NullFunc, Widget_Key, Widget_Key, Widget_KeyPress, ScrollbarWidget_MouseDown, ScrollbarWidget_MouseUp, ScrollbarWidget_MouseMove, ScrollbarWidget_MouseScroll, - Widget_CalcPosition, + Widget_CalcPosition }; void ScrollbarWidget_Create(struct ScrollbarWidget* w) { Widget_Reset(w); @@ -487,10 +487,10 @@ static bool HotbarWidget_MouseScroll(void* widget, float delta) { } static struct WidgetVTABLE HotbarWidget_VTABLE = { - HotbarWidget_Init, HotbarWidget_Render, Widget_NullFunc, Gui_DefaultRecreate, + HotbarWidget_Init, HotbarWidget_Render, Widget_NullFunc, HotbarWidget_KeyDown, HotbarWidget_KeyUp, Widget_KeyPress, HotbarWidget_MouseDown, Widget_Mouse, Widget_MouseMove, HotbarWidget_MouseScroll, - HotbarWidget_Reposition, + HotbarWidget_Reposition }; void HotbarWidget_Create(struct HotbarWidget* w) { Widget_Reset(w); @@ -819,10 +819,10 @@ static bool TableWidget_KeyDown(void* widget, Key key) { } static struct WidgetVTABLE TableWidget_VTABLE = { - TableWidget_Init, TableWidget_Render, TableWidget_Free, Gui_DefaultRecreate, + TableWidget_Init, TableWidget_Render, TableWidget_Free, TableWidget_KeyDown, Widget_Key, Widget_KeyPress, TableWidget_MouseDown, TableWidget_MouseUp, TableWidget_MouseMove, TableWidget_MouseScroll, - TableWidget_Reposition, + TableWidget_Reposition }; void TableWidget_Create(struct TableWidget* w) { Widget_Reset(w); @@ -1491,10 +1491,10 @@ static bool MenuInputWidget_AllowedChar(void* widget, char c) { static int MenuInputWidget_GetMaxLines(void) { return 1; } static struct WidgetVTABLE MenuInputWidget_VTABLE = { - InputWidget_Init, MenuInputWidget_Render, InputWidget_Free, Gui_DefaultRecreate, + InputWidget_Init, MenuInputWidget_Render, InputWidget_Free, InputWidget_KeyDown, InputWidget_KeyUp, InputWidget_KeyPress, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - InputWidget_Reposition, + InputWidget_Reposition }; void MenuInputWidget_Create(struct MenuInputWidget* w, int width, int height, const String* text, FontDesc* font, struct MenuInputDesc* desc) { InputWidget_Create(&w->base, font, &String_Empty); @@ -1744,10 +1744,10 @@ static int ChatInputWidget_GetMaxLines(void) { } static struct WidgetVTABLE ChatInputWidget_VTABLE = { - InputWidget_Init, ChatInputWidget_Render, InputWidget_Free, Gui_DefaultRecreate, + InputWidget_Init, ChatInputWidget_Render, InputWidget_Free, ChatInputWidget_KeyDown, InputWidget_KeyUp, InputWidget_KeyPress, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - InputWidget_Reposition, + InputWidget_Reposition }; void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font) { static const String prefix = String_FromConst("> "); @@ -2141,10 +2141,10 @@ static void PlayerListWidget_Free(void* widget) { } static struct WidgetVTABLE PlayerListWidget_VTABLE = { - PlayerListWidget_Init, PlayerListWidget_Render, PlayerListWidget_Free, Gui_DefaultRecreate, + PlayerListWidget_Init, PlayerListWidget_Render, PlayerListWidget_Free, Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - PlayerListWidget_Reposition, + PlayerListWidget_Reposition }; void PlayerListWidget_Create(struct PlayerListWidget* w, FontDesc* font, bool classic) { Widget_Reset(w); @@ -2573,10 +2573,10 @@ static void TextGroupWidget_Free(void* widget) { } static struct WidgetVTABLE TextGroupWidget_VTABLE = { - TextGroupWidget_Init, TextGroupWidget_Render, TextGroupWidget_Free, Gui_DefaultRecreate, + TextGroupWidget_Init, TextGroupWidget_Render, TextGroupWidget_Free, Widget_Key, Widget_Key, Widget_KeyPress, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - TextGroupWidget_Reposition, + TextGroupWidget_Reposition }; void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, FontDesc* font, struct Texture* textures, TextGroupWidget_Get getLine) { Widget_Reset(w); @@ -2826,10 +2826,10 @@ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active) { } static struct WidgetVTABLE SpecialInputWidget_VTABLE = { - SpecialInputWidget_Init, SpecialInputWidget_Render, SpecialInputWidget_Free, Gui_DefaultRecreate, + SpecialInputWidget_Init, SpecialInputWidget_Render, SpecialInputWidget_Free, Widget_Key, Widget_Key, Widget_KeyPress, SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - Widget_CalcPosition, + Widget_CalcPosition }; void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, struct InputWidget* target) { Widget_Reset(w); From 6c90fdd8848056604cf703d7e9ac8a4a190c2bfc Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 17 Aug 2019 17:56:36 +1000 Subject: [PATCH 16/46] Rename elementsXYZ to blocksXYZ in widgets --- src/Gui.c | 5 ++++- src/Gui.h | 36 +++++++++++++++++-------------- src/Screens.c | 6 +++--- src/Widgets.c | 60 +++++++++++++++++++++++++-------------------------- src/Widgets.h | 4 ++-- 5 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 88546c88b..117084327 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -327,9 +327,12 @@ void Gui_RenderGui(double delta) { } void Gui_OnResize(void) { + struct Screen* s; int i; + for (i = 0; i < Gui_ScreensCount; i++) { - Screen_OnResize(Gui_Screens[i]); + s = Gui_Screens[i]; + s->VTABLE->OnResize(s); } } diff --git a/src/Gui.h b/src/Gui.h index 6f448291a..dce112eb7 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -16,7 +16,6 @@ enum GuiAnchor { }; struct IGameComponent; -struct GuiElem; struct Widget; extern struct IGameComponent Gui_Component; @@ -35,20 +34,17 @@ extern bool Gui_TabAutocomplete; /* Whether FPS counter (and other info) is shown in top left. */ extern bool Gui_ShowFPS; -#define GuiElemVTABLE_Layout() \ - void (*Init)(void* elem); \ - void (*Render)(void* elem, double delta); \ - void (*Free)(void* elem); \ - bool (*HandlesKeyDown)(void* elem, Key key); \ - bool (*HandlesKeyUp)(void* elem, Key key); \ - bool (*HandlesKeyPress)(void* elem, char keyChar); \ - bool (*HandlesMouseDown)(void* elem, int x, int y, MouseButton btn); \ - bool (*HandlesMouseUp)(void* elem, int x, int y, MouseButton btn); \ - bool (*HandlesMouseMove)(void* elem, int x, int y); \ - bool (*HandlesMouseScroll)(void* elem, float delta); - struct ScreenVTABLE { - GuiElemVTABLE_Layout() + void (*Init)(void* elem); + void (*Render)(void* elem, double delta); + void (*Free)(void* elem); + bool (*HandlesKeyDown)(void* elem, Key key); + bool (*HandlesKeyUp)(void* elem, Key key); + bool (*HandlesKeyPress)(void* elem, char keyChar); + bool (*HandlesMouseDown)(void* elem, int x, int y, MouseButton btn); + bool (*HandlesMouseUp)(void* elem, int x, int y, MouseButton btn); + bool (*HandlesMouseMove)(void* elem, int x, int y); + bool (*HandlesMouseScroll)(void* elem, float delta); void (*OnResize)(void* elem); Event_Void_Callback ContextLost; Event_Void_Callback ContextRecreated; @@ -65,7 +61,16 @@ struct Screen { Screen_Layout }; typedef void (*Widget_LeftClick)(void* screen, void* widget); struct WidgetVTABLE { - GuiElemVTABLE_Layout() + void (*Init)(void* elem); + void (*Render)(void* elem, double delta); + void (*Free)(void* elem); + bool (*HandlesKeyDown)(void* elem, Key key); + bool (*HandlesKeyUp)(void* elem, Key key); + bool (*HandlesKeyPress)(void* elem, char keyChar); + bool (*HandlesMouseDown)(void* elem, int x, int y, MouseButton btn); + bool (*HandlesMouseUp)(void* elem, int x, int y, MouseButton btn); + bool (*HandlesMouseMove)(void* elem, int x, int y); + bool (*HandlesMouseScroll)(void* elem, float delta); void (*Reposition)(void* elem); }; #define Widget_Layout struct WidgetVTABLE* VTABLE; \ @@ -185,7 +190,6 @@ void TextAtlas_AddInt(struct TextAtlas* atlas, int value, VertexP3fT2fC4b** vert #define Elem_HandlesMouseMove(elem, x, y) (elem)->VTABLE->HandlesMouseMove(elem, x, y) #define Elem_HandlesMouseScroll(elem, delta) (elem)->VTABLE->HandlesMouseScroll(elem, delta) -#define Screen_OnResize(screen) (screen)->VTABLE->OnResize(screen); #define Widget_Reposition(widget) (widget)->VTABLE->Reposition(widget); #define Elem_TryFree(elem) if ((elem)->VTABLE) { Elem_Free(elem); } #endif diff --git a/src/Screens.c b/src/Screens.c index 8d9367889..afc15de9c 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -106,8 +106,8 @@ static void InventoryScreen_Init(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; TableWidget_Create(&s->table); - s->table.font = &s->font; - s->table.elementsPerRow = Game_PureClassic ? 9 : 10; + s->table.font = &s->font; + s->table.blocksPerRow = Game_PureClassic ? 9 : 10; Elem_Init(&s->table); /* Can't immediately move to selected here, because cursor grabbed */ @@ -143,7 +143,7 @@ static bool InventoryScreen_KeyDown(void* screen, Key key) { if (key == KeyBinds[KEYBIND_INVENTORY] && s->releasedInv) { Gui_Remove(screen); } else if (key == KEY_ENTER && table->selectedIndex != -1) { - Inventory_SetSelectedBlock(table->elements[table->selectedIndex]); + Inventory_SetSelectedBlock(table->blocks[table->selectedIndex]); Gui_Remove(screen); } else if (Elem_HandlesKeyDown(table, key)) { } else { diff --git a/src/Widgets.c b/src/Widgets.c index e3dd4d590..f2d32eb56 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -506,7 +506,7 @@ void HotbarWidget_Create(struct HotbarWidget* w) { static int Table_X(struct TableWidget* w) { return w->x - 5 - 10; } static int Table_Y(struct TableWidget* w) { return w->y - 5 - 30; } static int Table_Width(struct TableWidget* w) { - return w->elementsPerRow * w->cellSize + 10 + 20; + return w->blocksPerRow * w->cellSize + 10 + 20; } static int Table_Height(struct TableWidget* w) { return min(w->rowsCount, TABLE_MAX_ROWS_DISPLAYED) * w->cellSize + 10 + 40; @@ -516,8 +516,8 @@ static int Table_Height(struct TableWidget* w) { static bool TableWidget_GetCoords(struct TableWidget* w, int i, int* cellX, int* cellY) { int x, y; - x = i % w->elementsPerRow; - y = i / w->elementsPerRow - w->scroll.topRow; + x = i % w->blocksPerRow; + y = i / w->blocksPerRow - w->scroll.topRow; *cellX = w->x + w->cellSize * x; *cellY = w->y + w->cellSize * y + 3; @@ -565,7 +565,7 @@ static void TableWidget_UpdateDescTexPos(struct TableWidget* w) { static void TableWidget_UpdatePos(struct TableWidget* w) { int rowsDisplayed = min(TABLE_MAX_ROWS_DISPLAYED, w->rowsCount); - w->width = w->cellSize * w->elementsPerRow; + w->width = w->cellSize * w->blocksPerRow; w->height = w->cellSize * rowsDisplayed; w->x = Window_Width / 2 - w->width / 2; w->y = Window_Height / 2 - w->height / 2; @@ -574,12 +574,12 @@ static void TableWidget_UpdatePos(struct TableWidget* w) { static void TableWidget_RecreateDescTex(struct TableWidget* w) { if (w->selectedIndex == w->lastCreatedIndex) return; - if (w->elementsCount == 0) return; + if (w->blocksCount == 0) return; w->lastCreatedIndex = w->selectedIndex; Gfx_DeleteTexture(&w->descTex.ID); if (w->selectedIndex == -1) return; - TableWidget_MakeDescTex(w, w->elements[w->selectedIndex]); + TableWidget_MakeDescTex(w, w->blocks[w->selectedIndex]); } void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block) { @@ -597,7 +597,7 @@ void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block) { } static bool TableWidget_RowEmpty(struct TableWidget* w, int start) { - int i, end = min(start + w->elementsPerRow, Array_Elems(Inventory.Map)); + int i, end = min(start + w->blocksPerRow, Array_Elems(Inventory.Map)); for (i = start; i < end; i++) { if (Inventory.Map[i] != BLOCK_AIR) return false; @@ -608,19 +608,19 @@ static bool TableWidget_RowEmpty(struct TableWidget* w, int start) { static void TableWidget_RecreateElements(struct TableWidget* w) { int i, max = Game_UseCPEBlocks ? BLOCK_COUNT : BLOCK_ORIGINAL_COUNT; BlockID block; - w->elementsCount = 0; + w->blocksCount = 0; for (i = 0; i < Array_Elems(Inventory.Map); ) { - if ((i % w->elementsPerRow) == 0 && TableWidget_RowEmpty(w, i)) { - i += w->elementsPerRow; continue; + if ((i % w->blocksPerRow) == 0 && TableWidget_RowEmpty(w, i)) { + i += w->blocksPerRow; continue; } block = Inventory.Map[i]; - if (block < max) { w->elements[w->elementsCount++] = block; } + if (block < max) { w->blocks[w->blocksCount++] = block; } i++; } - w->rowsCount = Math_CeilDiv(w->elementsCount, w->elementsPerRow); + w->rowsCount = Math_CeilDiv(w->blocksCount, w->blocksPerRow); TableWidget_UpdateScrollbarPos(w); TableWidget_UpdatePos(w); } @@ -669,12 +669,12 @@ static void TableWidget_Render(void* widget, double delta) { Gfx_SetVertexFormat(VERTEX_FORMAT_P3FT2FC4B); IsometricDrawer_BeginBatch(vertices, w->vb); - for (i = 0; i < w->elementsCount; i++) { + for (i = 0; i < w->blocksCount; i++) { if (!TableWidget_GetCoords(w, i, &x, &y)) continue; /* We want to always draw the selected block on top of others */ if (i == w->selectedIndex) continue; - IsometricDrawer_DrawBatch(w->elements[i], cellSize * 0.7f / 2.0f, + IsometricDrawer_DrawBatch(w->blocks[i], cellSize * 0.7f / 2.0f, x + cellSize / 2, y + cellSize / 2); } @@ -682,7 +682,7 @@ static void TableWidget_Render(void* widget, double delta) { if (i != -1) { TableWidget_GetCoords(w, i, &x, &y); - IsometricDrawer_DrawBatch(w->elements[i], + IsometricDrawer_DrawBatch(w->blocks[i], (cellSize + w->selBlockExpand) * 0.7f / 2.0f, x + cellSize / 2, y + cellSize / 2); } @@ -719,11 +719,11 @@ static void TableWidget_ScrollRelative(struct TableWidget* w, int delta) { int start = w->selectedIndex, index = start; index += delta; if (index < 0) index -= delta; - if (index >= w->elementsCount) index -= delta; + if (index >= w->blocksCount) index -= delta; w->selectedIndex = index; /* adjust scrollbar by number of rows moved up/down */ - w->scroll.topRow += (index / w->elementsPerRow) - (start / w->elementsPerRow); + w->scroll.topRow += (index / w->blocksPerRow) - (start / w->blocksPerRow); ScrollbarWidget_ClampTopRow(&w->scroll); TableWidget_RecreateDescTex(w); @@ -737,8 +737,8 @@ static bool TableWidget_MouseDown(void* widget, int x, int y, MouseButton btn) { if (Elem_HandlesMouseDown(&w->scroll, x, y, btn)) { return true; - } else if (w->selectedIndex != -1 && w->elements[w->selectedIndex] != BLOCK_AIR) { - Inventory_SetSelectedBlock(w->elements[w->selectedIndex]); + } else if (w->selectedIndex != -1 && w->blocks[w->selectedIndex] != BLOCK_AIR) { + Inventory_SetSelectedBlock(w->blocks[w->selectedIndex]); w->pendingClose = true; return true; } else if (Gui_Contains(Table_X(w), Table_Y(w), Table_Width(w), Table_Height(w), x, y)) { @@ -765,8 +765,8 @@ static bool TableWidget_MouseScroll(void* widget, float delta) { if (w->selectedIndex == -1) return true; index = w->selectedIndex; - index += (w->scroll.topRow - origTopRow) * w->elementsPerRow; - if (index >= w->elementsCount) index = -1; + index += (w->scroll.topRow - origTopRow) * w->blocksPerRow; + if (index >= w->blocksCount) index = -1; w->selectedIndex = index; TableWidget_RecreateDescTex(w); @@ -787,7 +787,7 @@ static bool TableWidget_MouseMove(void* widget, int x, int y) { maxHeight = cellSize * TABLE_MAX_ROWS_DISPLAYED; if (Gui_Contains(w->x, w->y + 3, w->width, maxHeight - 3 * 2, x, y)) { - for (i = 0; i < w->elementsCount; i++) { + for (i = 0; i < w->blocksCount; i++) { TableWidget_GetCoords(w, i, &cellX, &cellY); if (Gui_Contains(cellX, cellY, cellSize, cellSize, x, y)) { @@ -809,9 +809,9 @@ static bool TableWidget_KeyDown(void* widget, Key key) { } else if (key == KEY_RIGHT || key == KEY_KP6) { TableWidget_ScrollRelative(w, 1); } else if (key == KEY_UP || key == KEY_KP8) { - TableWidget_ScrollRelative(w, -w->elementsPerRow); + TableWidget_ScrollRelative(w, -w->blocksPerRow); } else if (key == KEY_DOWN || key == KEY_KP2) { - TableWidget_ScrollRelative(w, w->elementsPerRow); + TableWidget_ScrollRelative(w, w->blocksPerRow); } else { return false; } @@ -834,13 +834,13 @@ void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block) { int i; w->selectedIndex = -1; - for (i = 0; i < w->elementsCount; i++) { - if (w->elements[i] == block) w->selectedIndex = i; + for (i = 0; i < w->blocksCount; i++) { + if (w->blocks[i] == block) w->selectedIndex = i; } /* When holding air, inventory should open at middle */ if (block == BLOCK_AIR) w->selectedIndex = -1; - w->scroll.topRow = w->selectedIndex / w->elementsPerRow; + w->scroll.topRow = w->selectedIndex / w->blocksPerRow; w->scroll.topRow -= (TABLE_MAX_ROWS_DISPLAYED - 1); ScrollbarWidget_ClampTopRow(&w->scroll); TableWidget_MoveCursorToSelected(w); @@ -849,12 +849,12 @@ void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block) { void TableWidget_OnInventoryChanged(struct TableWidget* w) { TableWidget_RecreateElements(w); - if (w->selectedIndex >= w->elementsCount) { - w->selectedIndex = w->elementsCount - 1; + if (w->selectedIndex >= w->blocksCount) { + w->selectedIndex = w->blocksCount - 1; } w->lastX = -1; w->lastY = -1; - w->scroll.topRow = w->selectedIndex / w->elementsPerRow; + w->scroll.topRow = w->selectedIndex / w->blocksPerRow; ScrollbarWidget_ClampTopRow(&w->scroll); TableWidget_RecreateDescTex(w); } diff --git a/src/Widgets.h b/src/Widgets.h index 9841ab027..acbc3e8a5 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -72,7 +72,7 @@ CC_NOINLINE void HotbarWidget_Create(struct HotbarWidget* w); /* A table of blocks. */ struct TableWidget { Widget_Layout - int elementsCount, elementsPerRow, rowsCount; + int blocksCount, blocksPerRow, rowsCount; int lastCreatedIndex; FontDesc* font; int selectedIndex, cellSize; @@ -80,7 +80,7 @@ struct TableWidget { GfxResourceID vb; bool pendingClose; - BlockID elements[BLOCK_COUNT]; + BlockID blocks[BLOCK_COUNT]; struct ScrollbarWidget scroll; struct Texture descTex; int lastX, lastY; From 02deabc0da678088e3378af08f58030f37c7bb70 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 17 Aug 2019 20:41:42 +1000 Subject: [PATCH 17/46] get rid of keypress from widgets (only inputwidget used and needs it), fix edithotkey screen not showing --- src/Gui.h | 1 - src/Menus.c | 35 ++++++++++++++++------------------- src/Screens.c | 2 +- src/Widgets.c | 27 ++++++++++----------------- 4 files changed, 27 insertions(+), 38 deletions(-) diff --git a/src/Gui.h b/src/Gui.h index dce112eb7..b16f57c17 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -66,7 +66,6 @@ struct WidgetVTABLE { void (*Free)(void* elem); bool (*HandlesKeyDown)(void* elem, Key key); bool (*HandlesKeyUp)(void* elem, Key key); - bool (*HandlesKeyPress)(void* elem, char keyChar); bool (*HandlesMouseDown)(void* elem, int x, int y, MouseButton btn); bool (*HandlesMouseUp)(void* elem, int x, int y, MouseButton btn); bool (*HandlesMouseMove)(void* elem, int x, int y); diff --git a/src/Menus.c b/src/Menus.c index 58194bab2..8b1a16aec 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -374,7 +374,7 @@ static void ListScreen_Select(struct ListScreen* s, const String* str) { static bool ListScreen_KeyDown(void* screen, Key key) { struct ListScreen* s = (struct ListScreen*)screen; - if (key == KEY_LEFT || key == KEY_PAGEUP) { + if (key == KEY_LEFT || key == KEY_PAGEUP) { ListScreen_PageClick(s, false); } else if (key == KEY_RIGHT || key == KEY_PAGEDOWN) { ListScreen_PageClick(s, true); @@ -753,21 +753,17 @@ static void EditHotkeyScreen_MakeLeaveOpen(struct EditHotkeyScreen* s, Widget_Le } static void EditHotkeyScreen_BaseKey(void* screen, void* b) { - static const String msg = String_FromConst("Key: press a key.."); struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; - s->selectedI = 0; s->supressNextPress = true; - ButtonWidget_Set(&s->buttons[0], &msg, &s->titleFont); + ButtonWidget_SetConst(&s->buttons[0], "Key: press a key..", &s->titleFont); } static void EditHotkeyScreen_Modifiers(void* screen, void* b) { - static const String msg = String_FromConst("Modifiers: press a key.."); struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; - s->selectedI = 1; s->supressNextPress = true; - ButtonWidget_Set(&s->buttons[1], &msg, &s->titleFont); + ButtonWidget_SetConst(&s->buttons[1], "Modifiers: press a key..", &s->titleFont); } static void EditHotkeyScreen_LeaveOpen(void* screen, void* b) { @@ -839,9 +835,10 @@ static bool EditHotkeyScreen_KeyPress(void* screen, char keyChar) { struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; if (s->supressNextPress) { s->supressNextPress = false; - return true; + } else { + InputWidget_Append(&s->input.base, keyChar); } - return Elem_HandlesKeyPress(&s->input.base, keyChar); + return true; } static bool EditHotkeyScreen_KeyDown(void* screen, Key key) { @@ -907,7 +904,7 @@ static struct ScreenVTABLE EditHotkeyScreen_VTABLE = { Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, EditHotkeyScreen_ContextRecreated }; -struct Screen* EditHotkeyScreen_MakeInstance(struct HotkeyData original) { +void EditHotkeyScreen_Show(struct HotkeyData original) { static struct Widget* widgets[7]; struct EditHotkeyScreen* s = &EditHotkeyScreen_Instance; @@ -920,7 +917,7 @@ struct Screen* EditHotkeyScreen_MakeInstance(struct HotkeyData original) { s->selectedI = -1; s->origHotkey = original; s->curHotkey = original; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1039,7 +1036,8 @@ static bool GenLevelScreen_KeyUp(void* screen, Key key) { static bool GenLevelScreen_KeyPress(void* screen, char keyChar) { struct GenLevelScreen* s = (struct GenLevelScreen*)screen; - return !s->selected || Elem_HandlesKeyPress(&s->selected->base, keyChar); + if (s->selected) InputWidget_Append(&s->selected->base, keyChar); + return true; } static void GenLevelScreen_ContextRecreated(void* screen) { @@ -1244,7 +1242,8 @@ static void SaveLevelScreen_Render(void* screen, double delta) { static bool SaveLevelScreen_KeyPress(void* screen, char keyChar) { struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; SaveLevelScreen_RemoveOverwrites(s); - return Elem_HandlesKeyPress(&s->input.base, keyChar); + InputWidget_Append(&s->input.base, keyChar); + return true; } static bool SaveLevelScreen_KeyDown(void* screen, Key key) { @@ -1412,8 +1411,7 @@ static void HotkeyListScreen_EntryClick(void* screen, void* widget) { text = ListScreen_UNSAFE_GetCur(s, widget); if (String_CaselessEqualsConst(&text, LIST_SCREEN_EMPTY)) { - Gui_FreeActive(); - Gui_SetActive(EditHotkeyScreen_MakeInstance(original)); + EditHotkeyScreen_Show(original); return; } @@ -1428,8 +1426,7 @@ static void HotkeyListScreen_EntryClick(void* screen, void* widget) { if (h.Trigger == trigger && h.Flags == flags) { original = h; break; } } - Gui_FreeActive(); - Gui_SetActive(EditHotkeyScreen_MakeInstance(original)); + EditHotkeyScreen_Show(original); } static void HotkeyListScreen_MakeFlags(int flags, String* str) { @@ -1940,8 +1937,8 @@ static void MenuOptionsScreen_ContextLost(void* screen) { static bool MenuOptionsScreen_KeyPress(void* screen, char keyChar) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - if (s->activeI == -1) return true; - return Elem_HandlesKeyPress(&s->input.base, keyChar); + if (s->activeI >= 0) InputWidget_Append(&s->input.base, keyChar); + return true; } static bool MenuOptionsScreen_KeyDown(void* screen, Key key) { diff --git a/src/Screens.c b/src/Screens.c index afc15de9c..65a2e0207 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1024,7 +1024,7 @@ static bool HUDScreen_KeyPress(void* screen, char keyChar) { return false; } - Elem_HandlesKeyPress(&s->input.base, keyChar); + InputWidget_Append(&s->input.base, keyChar); HUDScreen_UpdateAltTextY(s); return true; } diff --git a/src/Widgets.c b/src/Widgets.c index f2d32eb56..89a70f02f 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -24,7 +24,6 @@ static Size2D Size2D_Empty; static bool Widget_Mouse(void* elem, int x, int y, MouseButton btn) { return false; } static bool Widget_Key(void* elem, Key key) { return false; } -static bool Widget_KeyPress(void* elem, char keyChar) { return false; } static bool Widget_MouseMove(void* elem, int x, int y) { return false; } static bool Widget_MouseScroll(void* elem, float delta) { return false; } @@ -50,7 +49,7 @@ static void TextWidget_Reposition(void* widget) { static struct WidgetVTABLE TextWidget_VTABLE = { Widget_NullFunc, TextWidget_Render, TextWidget_Free, - Widget_Key, Widget_Key, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, TextWidget_Reposition }; @@ -153,7 +152,7 @@ static void ButtonWidget_Render(void* widget, double delta) { static struct WidgetVTABLE ButtonWidget_VTABLE = { Widget_NullFunc, ButtonWidget_Render, ButtonWidget_Free, - Widget_Key, Widget_Key, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, ButtonWidget_Reposition }; @@ -299,7 +298,7 @@ static bool ScrollbarWidget_MouseMove(void* widget, int x, int y) { static struct WidgetVTABLE ScrollbarWidget_VTABLE = { Widget_NullFunc, ScrollbarWidget_Render, Widget_NullFunc, - Widget_Key, Widget_Key, Widget_KeyPress, + Widget_Key, Widget_Key, ScrollbarWidget_MouseDown, ScrollbarWidget_MouseUp, ScrollbarWidget_MouseMove, ScrollbarWidget_MouseScroll, Widget_CalcPosition }; @@ -488,7 +487,7 @@ static bool HotbarWidget_MouseScroll(void* widget, float delta) { static struct WidgetVTABLE HotbarWidget_VTABLE = { HotbarWidget_Init, HotbarWidget_Render, Widget_NullFunc, - HotbarWidget_KeyDown, HotbarWidget_KeyUp, Widget_KeyPress, + HotbarWidget_KeyDown, HotbarWidget_KeyUp, HotbarWidget_MouseDown, Widget_Mouse, Widget_MouseMove, HotbarWidget_MouseScroll, HotbarWidget_Reposition }; @@ -820,7 +819,7 @@ static bool TableWidget_KeyDown(void* widget, Key key) { static struct WidgetVTABLE TableWidget_VTABLE = { TableWidget_Init, TableWidget_Render, TableWidget_Free, - TableWidget_KeyDown, Widget_Key, Widget_KeyPress, + TableWidget_KeyDown, Widget_Key, TableWidget_MouseDown, TableWidget_MouseUp, TableWidget_MouseMove, TableWidget_MouseScroll, TableWidget_Reposition }; @@ -1212,12 +1211,6 @@ static bool InputWidget_KeyDown(void* widget, Key key) { static bool InputWidget_KeyUp(void* widget, Key key) { return true; } -static bool InputWidget_KeyPress(void* widget, char keyChar) { - struct InputWidget* w = (struct InputWidget*)widget; - InputWidget_Append(w, keyChar); - return true; -} - static bool InputWidget_MouseDown(void* widget, int x, int y, MouseButton button) { String line; char lineBuffer[STRING_SIZE]; struct InputWidget* w = (struct InputWidget*)widget; @@ -1492,7 +1485,7 @@ static bool MenuInputWidget_AllowedChar(void* widget, char c) { static int MenuInputWidget_GetMaxLines(void) { return 1; } static struct WidgetVTABLE MenuInputWidget_VTABLE = { InputWidget_Init, MenuInputWidget_Render, InputWidget_Free, - InputWidget_KeyDown, InputWidget_KeyUp, InputWidget_KeyPress, + InputWidget_KeyDown, InputWidget_KeyUp, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition }; @@ -1745,7 +1738,7 @@ static int ChatInputWidget_GetMaxLines(void) { static struct WidgetVTABLE ChatInputWidget_VTABLE = { InputWidget_Init, ChatInputWidget_Render, InputWidget_Free, - ChatInputWidget_KeyDown, InputWidget_KeyUp, InputWidget_KeyPress, + ChatInputWidget_KeyDown, InputWidget_KeyUp, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition }; @@ -2142,7 +2135,7 @@ static void PlayerListWidget_Free(void* widget) { static struct WidgetVTABLE PlayerListWidget_VTABLE = { PlayerListWidget_Init, PlayerListWidget_Render, PlayerListWidget_Free, - Widget_Key, Widget_Key, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, PlayerListWidget_Reposition }; @@ -2574,7 +2567,7 @@ static void TextGroupWidget_Free(void* widget) { static struct WidgetVTABLE TextGroupWidget_VTABLE = { TextGroupWidget_Init, TextGroupWidget_Render, TextGroupWidget_Free, - Widget_Key, Widget_Key, Widget_KeyPress, + Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, TextGroupWidget_Reposition }; @@ -2827,7 +2820,7 @@ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active) { static struct WidgetVTABLE SpecialInputWidget_VTABLE = { SpecialInputWidget_Init, SpecialInputWidget_Render, SpecialInputWidget_Free, - Widget_Key, Widget_Key, Widget_KeyPress, + Widget_Key, Widget_Key, SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, Widget_CalcPosition }; From a8c9c471a0c9f3ec32e229bc329172a25811b1e1 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 17 Aug 2019 20:59:54 +1000 Subject: [PATCH 18/46] Fix list screen disabling left button even if there's still 1-4 more entries before the current one --- src/Menus.c | 182 +++++++++++++++++++++++++++------------------------- 1 file changed, 93 insertions(+), 89 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 8b1a16aec..502703e38 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -45,18 +45,41 @@ struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; /*########################################################################################################################* *--------------------------------------------------------Menu base--------------------------------------------------------* *#########################################################################################################################*/ -static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, const String* text, const FontDesc* font, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { +static void Menu_OldButton(void* s, int i, struct ButtonWidget* btn, int width, const String* text, const FontDesc* font, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); ButtonWidget_Set(btn, text, font); ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; } -static void Menu_Label(void* s, int i, struct TextWidget* label, const String* text, const FontDesc* font, int horAnchor, int verAnchor, int x, int y) { +static void Menu_OldLabel(void* s, int i, struct TextWidget* label, const String* text, const FontDesc* font, int horAnchor, int verAnchor, int x, int y) { TextWidget_Make(label, horAnchor, verAnchor, x, y); TextWidget_Set(label, text, font); ((struct Screen*)s)->widgets[i] = (struct Widget*)label; } +static void Menu_OldInput(void* s, int i, struct MenuInputWidget* input, int width, const String* text, FontDesc* font, struct MenuInputDesc* desc, int horAnchor, int verAnchor, int x, int y) { + MenuInputWidget_Create(input, width, 30, text, font, desc); + Widget_SetLocation(input, horAnchor, verAnchor, x, y); + input->base.showCaret = true; + ((struct Screen*)s)->widgets[i] = (struct Widget*)input; +} + +static void Menu_OldBack(void* s, int i, struct ButtonWidget* btn, const char* label, const FontDesc* font, Widget_LeftClick onClick) { + int width = Gui_ClassicMenu ? 400 : 200; + String msg = String_FromReadonly(label); + Menu_OldButton(s, i, btn, width, &msg, font, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); +} + +static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { + ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); + ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; +} + +static void Menu_Label(void* s, int i, struct TextWidget* label, int horAnchor, int verAnchor, int x, int y) { + TextWidget_Make(label, horAnchor, verAnchor, x, y); + ((struct Screen*)s)->widgets[i] = (struct Widget*)label; +} + static void Menu_Input(void* s, int i, struct MenuInputWidget* input, int width, const String* text, FontDesc* font, struct MenuInputDesc* desc, int horAnchor, int verAnchor, int x, int y) { MenuInputWidget_Create(input, width, 30, text, font, desc); Widget_SetLocation(input, horAnchor, verAnchor, x, y); @@ -64,10 +87,9 @@ static void Menu_Input(void* s, int i, struct MenuInputWidget* input, int width, ((struct Screen*)s)->widgets[i] = (struct Widget*)input; } -static void Menu_Back(void* s, int i, struct ButtonWidget* btn, const char* label, const FontDesc* font, Widget_LeftClick onClick) { +static void Menu_Back(void* s, int i, struct ButtonWidget* btn, Widget_LeftClick onClick) { int width = Gui_ClassicMenu ? 400 : 200; - String msg = String_FromReadonly(label); - Menu_Button(s, i, btn, width, &msg, font, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); + Menu_Button(s, i, btn, width, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); } CC_NOINLINE static void Menu_MakeBack(struct ButtonWidget* btn, Widget_LeftClick onClick) { @@ -75,13 +97,8 @@ CC_NOINLINE static void Menu_MakeBack(struct ButtonWidget* btn, Widget_LeftClick ButtonWidget_Make(btn, width, onClick, 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); -} +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) { @@ -272,12 +289,10 @@ static STRING_REF String ListScreen_UNSAFE_Get(struct ListScreen* s, int index) static void ListScreen_UpdatePage(struct ListScreen* s) { String page; char pageBuffer[STRING_SIZE]; - int beg, end; - int num, pages; + int end, num, pages; - beg = LIST_SCREEN_ITEMS; end = s->entries.count - LIST_SCREEN_ITEMS; - s->left.disabled = s->currentIndex < beg; + s->left.disabled = s->currentIndex <= 0; s->right.disabled = s->currentIndex >= end; if (Game_ClassicMode) return; @@ -393,13 +408,7 @@ static bool ListScreen_MouseScroll(void* screen, float delta) { } static void ListScreen_Init(void* screen) { - static struct Widget* widgets[LIST_SCREEN_ITEMS + 3 + 2] = { - (struct Widget*)&ListScreen.buttons[0], (struct Widget*)&ListScreen.buttons[1], - (struct Widget*)&ListScreen.buttons[2], (struct Widget*)&ListScreen.buttons[3], - (struct Widget*)&ListScreen.buttons[4], (struct Widget*)&ListScreen.left, - (struct Widget*)&ListScreen.right, (struct Widget*)&ListScreen.done, - (struct Widget*)&ListScreen.title, (struct Widget*)&ListScreen.page - }; + static struct Widget* widgets[LIST_SCREEN_ITEMS + 3 + 2]; struct ListScreen* s = (struct ListScreen*)screen; int i; @@ -409,20 +418,20 @@ static void ListScreen_Init(void* screen) { s->currentIndex = 0; for (i = 0; i < LIST_SCREEN_ITEMS; i++) { - ButtonWidget_Make(&s->buttons[i], 300, s->EntryClick, + Menu_Button(s, i, &s->buttons[i], 300, s->EntryClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, (i - 2) * 50); } - ButtonWidget_Make(&s->left, 40, ListScreen_MoveBackwards, + Menu_Button(s, 5, &s->left, 40, ListScreen_MoveBackwards, ANCHOR_CENTRE, ANCHOR_CENTRE, -220, 0); - ButtonWidget_Make(&s->right, 40, ListScreen_MoveForwards, + Menu_Button(s, 6, &s->right, 40, ListScreen_MoveForwards, ANCHOR_CENTRE, ANCHOR_CENTRE, 220, 0); - TextWidget_Make(&s->title, + Menu_Label(s, 7, &s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -155); - TextWidget_Make(&s->page, + Menu_Label(s, 8, &s->page, ANCHOR_CENTRE, ANCHOR_MAX, 0, 75); + Menu_Back(s, 9, &s->done, Menu_SwitchPause); - Menu_MakeBack(&s->done, Menu_SwitchPause); Menu_MakeTitleFont(&s->font); s->LoadEntries(s); } @@ -513,7 +522,7 @@ static void PauseScreen_MakeButtons(struct PauseScreen* s, int width, const stru int i; for (i = 0; i < count; i++) { String text = String_FromReadonly(descs[i].title); - Menu_Button(s, i, &s->buttons[i], width, &text, &s->titleFont, descs[i].onClick, + Menu_OldButton(s, i, &s->buttons[i], width, &text, &s->titleFont, descs[i].onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, descs[i].x, descs[i].y); } } @@ -540,7 +549,7 @@ static void PauseScreen_ContextRecreated(void* screen) { if (Gui_ClassicMenu) { PauseScreen_MakeButtons(s, 400, classicDescs, 5); - Menu_Back(s, 5, &s->buttons[5], "Back to game", &s->titleFont, PauseScreen_Game); + Menu_OldBack(s, 5, &s->buttons[5], "Back to game", &s->titleFont, PauseScreen_Game); /* Disable nostalgia options in classic mode */ if (Game_ClassicMode) Menu_Remove(s, 4); @@ -548,9 +557,9 @@ static void PauseScreen_ContextRecreated(void* screen) { s->widgets[7] = NULL; } else { PauseScreen_MakeButtons(s, 300, modernDescs, 6); - Menu_Button(s, 6, &s->buttons[6], 120, &quitMsg, &s->titleFont, PauseScreen_Quit, + Menu_OldButton(s, 6, &s->buttons[6], 120, &quitMsg, &s->titleFont, PauseScreen_Quit, ANCHOR_MAX, ANCHOR_MAX, 5, 5); - Menu_Back(s, 7, &s->buttons[7], "Back to game",&s->titleFont, PauseScreen_Game); + Menu_OldBack(s, 7, &s->buttons[7], "Back to game",&s->titleFont, PauseScreen_Game); } if (!Server.IsSinglePlayer) { @@ -644,13 +653,7 @@ static void OptionsGroupScreen_ContextRecreated(void* screen) { } static void OptionsGroupScreen_Init(void* screen) { - static struct Widget* widgets[9] = { - (struct Widget*)&OptionsGroupScreen.buttons[0], (struct Widget*)&OptionsGroupScreen.buttons[1], - (struct Widget*)&OptionsGroupScreen.buttons[2], (struct Widget*)&OptionsGroupScreen.buttons[3], - (struct Widget*)&OptionsGroupScreen.buttons[4], (struct Widget*)&OptionsGroupScreen.buttons[5], - (struct Widget*)&OptionsGroupScreen.buttons[6], (struct Widget*)&OptionsGroupScreen.desc, - (struct Widget*)&OptionsGroupScreen.done - }; + static struct Widget* widgets[9]; struct OptionsGroupScreen* s = (struct OptionsGroupScreen*)screen; int i; @@ -662,12 +665,13 @@ static void OptionsGroupScreen_Init(void* screen) { s->selectedI = -1; for (i = 0; i < Array_Elems(optsGroup_btns); i++) { - ButtonWidget_Make(&s->buttons[i], 300, optsGroup_btns[i].onClick, + Menu_Button(s, i, &s->buttons[i], 300, optsGroup_btns[i].onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, optsGroup_btns[i].x, optsGroup_btns[i].y); } - Menu_MakeBack(&s->done, Menu_SwitchPause); - TextWidget_Make(&s->desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); + Menu_Label(s, 7, &s->desc, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); + Menu_Back(s, 8, &s->done, Menu_SwitchPause); } static void OptionsGroupScreen_Free(void* screen) { @@ -715,7 +719,7 @@ static struct EditHotkeyScreen { } EditHotkeyScreen_Instance; static void EditHotkeyScreen_Make(struct EditHotkeyScreen* s, int i, int x, int y, const String* text, Widget_LeftClick onClick) { - Menu_Button(s, i, &s->buttons[i], 300, text, &s->titleFont, onClick, + Menu_OldButton(s, i, &s->buttons[i], 300, text, &s->titleFont, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); } @@ -893,8 +897,8 @@ static void EditHotkeyScreen_ContextRecreated(void* screen) { EditHotkeyScreen_Make(s, 4, 0, 130, existed ? &remHK : &cancel, EditHotkeyScreen_RemoveHotkey); - Menu_Back(s, 5, &s->buttons[5], "Cancel", &s->titleFont, Menu_SwitchHotkeys); - Menu_Input(s, 6, &s->input, 500, &text, &s->textFont, &desc, + Menu_OldBack(s, 5, &s->buttons[5], "Cancel", &s->titleFont, Menu_SwitchHotkeys); + Menu_OldInput(s, 6, &s->input, 500, &text, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35); } @@ -1005,7 +1009,7 @@ static void GenLevelScreen_Input(struct GenLevelScreen* s, int i, int y, bool se String_InitArray(tmp, tmpBuffer); desc.VTABLE->GetDefault(&desc, &tmp); - Menu_Input(s, i, input, 200, &tmp, &s->textFont, &desc, + Menu_OldInput(s, i, input, 200, &tmp, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); input->base.showCaret = false; @@ -1017,7 +1021,7 @@ static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int y, const c PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); String text = String_FromReadonly(title); - Menu_Label(s, i + 4, label, &text, &s->textFont, + Menu_OldLabel(s, i + 4, label, &text, &s->textFont, ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 110, y); label->col = col; @@ -1056,13 +1060,13 @@ static void GenLevelScreen_ContextRecreated(void* screen) { GenLevelScreen_Label(s, 2, 0, "Length:"); GenLevelScreen_Label(s, 3, 40, "Seed:"); - Menu_Label(s, 8, &s->labels[4], &title, &s->textFont, + Menu_OldLabel(s, 8, &s->labels[4], &title, &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -130); - Menu_Button(s, 9, &s->buttons[0], 200, &flat, &s->titleFont, GenLevelScreen_Flatgrass, + Menu_OldButton(s, 9, &s->buttons[0], 200, &flat, &s->titleFont, GenLevelScreen_Flatgrass, ANCHOR_CENTRE, ANCHOR_CENTRE, -120, 100); - Menu_Button(s, 10, &s->buttons[1], 200, &norm, &s->titleFont, GenLevelScreen_Notchy, + Menu_OldButton(s, 10, &s->buttons[1], 200, &norm, &s->titleFont, GenLevelScreen_Notchy, ANCHOR_CENTRE, ANCHOR_CENTRE, 120, 100); - Menu_Back(s, 11, &s->buttons[2], "Cancel", &s->titleFont, Menu_SwitchPause); + Menu_OldBack(s, 11, &s->buttons[2], "Cancel", &s->titleFont, Menu_SwitchPause); } static struct ScreenVTABLE GenLevelScreen_VTABLE = { @@ -1107,7 +1111,7 @@ static void ClassicGenScreen_Huge(void* a, void* b) { ClassicGenScreen_Gen(512 static void ClassicGenScreen_Make(struct ClassicGenScreen* s, int i, int y, const char* title, Widget_LeftClick onClick) { String text = String_FromReadonly(title); - Menu_Button(s, i, &s->buttons[i], 400, &text, &s->titleFont, onClick, + Menu_OldButton(s, i, &s->buttons[i], 400, &text, &s->titleFont, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); } @@ -1117,7 +1121,7 @@ static void ClassicGenScreen_ContextRecreated(void* screen) { ClassicGenScreen_Make(s, 1, -50, "Normal", ClassicGenScreen_Medium); ClassicGenScreen_Make(s, 2, 0, "Huge", ClassicGenScreen_Huge); - Menu_Back(s, 3, &s->buttons[3], "Cancel", &s->titleFont, Menu_SwitchPause); + Menu_OldBack(s, 3, &s->buttons[3], "Cancel", &s->titleFont, Menu_SwitchPause); } static struct ScreenVTABLE ClassicGenScreen_VTABLE = { @@ -1168,7 +1172,7 @@ static void SaveLevelScreen_RemoveOverwrites(struct SaveLevelScreen* s) { static void SaveLevelScreen_MakeDesc(struct SaveLevelScreen* s, const String* text) { if (s->widgets[5]) { Elem_TryFree(s->widgets[5]); } - Menu_Label(s, 5, &s->desc, text, &s->textFont, + Menu_OldLabel(s, 5, &s->desc, text, &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 65); } @@ -1267,15 +1271,15 @@ static void SaveLevelScreen_ContextRecreated(void* screen) { struct MenuInputDesc desc; MenuInput_Path(desc); - Menu_Button(s, 0, &s->buttons[0], 300, &save, &s->titleFont, SaveLevelScreen_Classic, + Menu_OldButton(s, 0, &s->buttons[0], 300, &save, &s->titleFont, SaveLevelScreen_Classic, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 20); - Menu_Button(s, 1, &s->buttons[1], 200, &schem, &s->titleFont, SaveLevelScreen_Schematic, + Menu_OldButton(s, 1, &s->buttons[1], 200, &schem, &s->titleFont, SaveLevelScreen_Schematic, ANCHOR_CENTRE, ANCHOR_CENTRE, -150, 120); - Menu_Label(s, 2, &s->mcEdit, &mcEdit, &s->textFont, + Menu_OldLabel(s, 2, &s->mcEdit, &mcEdit, &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 120); - Menu_Back(s, 3, &s->buttons[2], "Cancel", &s->titleFont, Menu_SwitchPause); - Menu_Input(s, 4, &s->input, 500, &String_Empty, &s->textFont, &desc, + Menu_OldBack(s, 3, &s->buttons[2], "Cancel", &s->titleFont, Menu_SwitchPause); + Menu_OldInput(s, 4, &s->input, 500, &String_Empty, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); s->widgets[5] = NULL; /* description widget placeholder */ } @@ -1573,22 +1577,22 @@ static int KeyBindingsScreen_MakeWidgets(struct KeyBindingsScreen* s, int y, int text.length = 0; KeyBindingsScreen_GetText(s, i, &text); - Menu_Button(s, i, &s->buttons[i], btnWidth, &text, &s->titleFont, KeyBindingsScreen_OnBindingClick, + Menu_OldButton(s, i, &s->buttons[i], btnWidth, &text, &s->titleFont, KeyBindingsScreen_OnBindingClick, ANCHOR_CENTRE, ANCHOR_CENTRE, xDir * xOffset, y); y += 50; /* distance between buttons */ } titleText = String_FromReadonly(title); - Menu_Label(s, i, &s->title, &titleText, &s->titleFont, + Menu_OldLabel(s, i, &s->title, &titleText, &s->titleFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -180); i++; backClick = Gui_ClassicMenu ? Menu_SwitchClassicOptions : Menu_SwitchOptions; - Menu_Back(s, i, &s->back, "Done", &s->titleFont, backClick); i++; + Menu_OldBack(s, i, &s->back, "Done", &s->titleFont, backClick); i++; if (!s->leftPage && !s->rightPage) return i; - Menu_Button(s, i, &s->left, 40, &lArrow, &s->titleFont, s->leftPage, + Menu_OldButton(s, i, &s->left, 40, &lArrow, &s->titleFont, s->leftPage, ANCHOR_CENTRE, ANCHOR_CENTRE, -btnWidth - 35, arrowsY); i++; - Menu_Button(s, i, &s->right, 40, &rArrow, &s->titleFont, s->rightPage, + Menu_OldButton(s, i, &s->right, 40, &rArrow, &s->titleFont, s->rightPage, ANCHOR_CENTRE, ANCHOR_CENTRE, btnWidth + 35, arrowsY); i++; s->left.disabled = !s->leftPage; @@ -1767,7 +1771,7 @@ static void MouseKeyBindingsScreen_ContextRecreated(void* screen) { static struct TextWidget text; int i = KeyBindingsScreen_MakeWidgets(s, -40, 10, -1, "Mouse key bindings", 260); - Menu_Label(s, i, &text, &msg, &s->textFont, + Menu_OldLabel(s, i, &text, &msg, &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } @@ -1865,7 +1869,7 @@ static void MenuOptionsScreen_SelectExtHelp(struct MenuOptionsScreen* s, int idx count = String_UNSAFE_Split(&descRaw, '\n', descLines, Array_Elems(descLines)); TextGroupWidget_Create(&s->extHelp, count, &s->textFont, s->extHelpTextures, MenuOptionsScreen_GetDesc); - Widget_SetLocation((struct Widget*)&s->extHelp, ANCHOR_MIN, ANCHOR_MIN, 0, 0); + Widget_SetLocation(&s->extHelp, ANCHOR_MIN, ANCHOR_MIN, 0, 0); Elem_Init(&s->extHelp); s->extHelp.getLineObj = desc; @@ -1985,7 +1989,7 @@ static void MenuOptionsScreen_MakeButtons(struct MenuOptionsScreen* s, const str } btn = &s->buttons[i]; - Menu_Button(s, i, btn, 300, &title, &s->titleFont, btns[i].OnClick, + Menu_OldButton(s, i, btn, 300, &title, &s->titleFont, btns[i].OnClick, ANCHOR_CENTRE, ANCHOR_CENTRE, btns[i].dir * 160, btns[i].y); btn->optName = btns[i].name; @@ -2069,11 +2073,11 @@ static void MenuOptionsScreen_Input(void* screen, void* widget) { btn->GetValue(&value); i = s->numWidgets; - Menu_Input(s, i - 1, &s->input, 400, &value, &s->textFont, &s->descs[s->activeI], + Menu_OldInput(s, i - 1, &s->input, 400, &value, &s->textFont, &s->descs[s->activeI], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 110); - Menu_Button(s, i - 2, &s->ok, 40, &okay, &s->titleFont, MenuOptionsScreen_OK, + Menu_OldButton(s, i - 2, &s->ok, 40, &okay, &s->titleFont, MenuOptionsScreen_OK, ANCHOR_CENTRE, ANCHOR_CENTRE, 240, 110); - Menu_Button(s, i - 3, &s->Default, 200, &def, &s->titleFont, MenuOptionsScreen_Default, + Menu_OldButton(s, i - 3, &s->Default, 200, &def, &s->titleFont, MenuOptionsScreen_Default, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 150); } @@ -2188,9 +2192,9 @@ static void ClassicOptionsScreen_ContextRecreated(void* screen) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Button(s, 9, &s->buttons[9], 400, &title, &s->titleFont, Menu_SwitchKeysClassic, + Menu_OldButton(s, 9, &s->buttons[9], 400, &title, &s->titleFont, Menu_SwitchKeysClassic, ANCHOR_CENTRE, ANCHOR_MAX, 0, 95); - Menu_Back(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchPause); + Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchPause); /* Disable certain options */ if (!Server.IsSinglePlayer) Menu_Remove(s, 3); @@ -2271,7 +2275,7 @@ static void EnvSettingsScreen_ContextRecreated(void* screen) { struct Widget** widgets = s->widgets; MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Back(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); + Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; } @@ -2352,7 +2356,7 @@ static void GraphicsOptionsScreen_ContextRecreated(void* screen) { struct Widget** widgets = s->widgets; MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Back(s, 6, &s->buttons[6], "Done", &s->titleFont, Menu_SwitchOptions); + Menu_OldBack(s, 6, &s->buttons[6], "Done", &s->titleFont, Menu_SwitchOptions); widgets[7] = NULL; widgets[8] = NULL; widgets[9] = NULL; } @@ -2462,7 +2466,7 @@ static void GuiOptionsScreen_ContextRecreated(void* screen) { struct Widget** widgets = s->widgets; MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Back(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); + Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; } @@ -2602,7 +2606,7 @@ static void HacksSettingsScreen_ContextRecreated(void* screen) { Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, HacksSettingsScreen_CheckHacksAllowed); MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Back(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); + Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; HacksSettingsScreen_CheckHacksAllowed(screen); } @@ -2692,7 +2696,7 @@ static void MiscOptionsScreen_ContextRecreated(void* screen) { struct Widget** widgets = s->widgets; MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Back(s, 8, &s->buttons[8], "Done", &s->titleFont, Menu_SwitchOptions); + Menu_OldBack(s, 8, &s->buttons[8], "Done", &s->titleFont, Menu_SwitchOptions); widgets[9] = NULL; widgets[10] = NULL; widgets[11] = NULL; /* Disable certain options */ @@ -2775,8 +2779,8 @@ static void NostalgiaScreen_ContextRecreated(void* screen) { static struct TextWidget desc; MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_Back(s, 8, &s->buttons[8], "Done", &s->titleFont, NostalgiaScreen_SwitchBack); - Menu_Label(s, 9, &desc, &descText, &s->textFont, + Menu_OldBack(s, 8, &s->buttons[8], "Done", &s->titleFont, NostalgiaScreen_SwitchBack); + Menu_OldLabel(s, 9, &desc, &descText, &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } @@ -2800,13 +2804,13 @@ static void Overlay_MakeLabels(void* menu, struct TextWidget* labels, const Stri struct MenuScreen* s = (struct MenuScreen*)menu; PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); int i; - Menu_Label(s, 0, &labels[0], &lines[0], &s->titleFont, + Menu_OldLabel(s, 0, &labels[0], &lines[0], &s->titleFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -120); for (i = 1; i < 4; i++) { if (!lines[i].length) continue; - Menu_Label(s, i, &labels[i], &lines[i], &s->textFont, + Menu_OldLabel(s, i, &labels[i], &lines[i], &s->textFont, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -70 + 20 * i); labels[i].col = col; } @@ -2819,15 +2823,15 @@ static void WarningOverlay_MakeButtons(void* menu, struct ButtonWidget* btns, bo static const String alwaysNo = String_FromConst("Always no"); struct MenuScreen* s = (struct MenuScreen*)menu; - Menu_Button(s, 4, &btns[0], 160, &yes, &s->titleFont, yesClick, + Menu_OldButton(s, 4, &btns[0], 160, &yes, &s->titleFont, yesClick, ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 30); - Menu_Button(s, 5, &btns[1], 160, &no, &s->titleFont, noClick, + Menu_OldButton(s, 5, &btns[1], 160, &no, &s->titleFont, noClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 30); if (!always) return; - Menu_Button(s, 6, &btns[2], 160, &alwaysYes, &s->titleFont, yesClick, + Menu_OldButton(s, 6, &btns[2], 160, &alwaysYes, &s->titleFont, yesClick, ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 85); - Menu_Button(s, 7, &btns[3], 160, &alwaysNo, &s->titleFont, noClick, + Menu_OldButton(s, 7, &btns[3], 160, &alwaysNo, &s->titleFont, noClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 85); } static bool WarningOverlay_IsAlways(void* screen, void* w) { return Menu_Index(screen, w) >= 6; } @@ -2872,7 +2876,7 @@ static void TexIdsOverlay_ContextRecreated(void* screen) { s->yOffset = Gui_CalcPos(ANCHOR_CENTRE, 0, size * ATLAS2D_TILES_PER_ROW, Window_Height); s->tileSize = size; - Menu_Label(s, 0, &s->title, &title, &s->titleFont, + Menu_OldLabel(s, 0, &s->title, &title, &s->titleFont, ANCHOR_CENTRE, ANCHOR_MIN, 0, s->yOffset - 30); } @@ -3175,9 +3179,9 @@ static void TexPackOverlay_MakeDenyElements(struct TexPackOverlay* s) { static const String goBack = String_FromConst("Go back"); Overlay_MakeLabels(s, s->labels, lines); - Menu_Button(s, 4, &s->buttons[0], 160, &imSure, &s->titleFont, TexPackOverlay_ConfirmNoClick, + Menu_OldButton(s, 4, &s->buttons[0], 160, &imSure, &s->titleFont, TexPackOverlay_ConfirmNoClick, ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 30); - Menu_Button(s, 5, &s->buttons[1], 160, &goBack, &s->titleFont, TexPackOverlay_GoBackClick, + Menu_OldButton(s, 5, &s->buttons[1], 160, &goBack, &s->titleFont, TexPackOverlay_GoBackClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 30); } From fa4e609c73a220bd8b54f565bd5f41d479505c21 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 09:31:06 +1000 Subject: [PATCH 19/46] Redesign genscreens and edithotkeyscreen to separate out init/contextrecreated stuff. This means resizing the window won't cause the 'key: press a key..' to reset itself to 'key: K', despite still intercepting the next key --- src/Menus.c | 268 +++++++++++++++++++++++++--------------------------- 1 file changed, 130 insertions(+), 138 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 502703e38..ea3e5bc13 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -92,11 +92,6 @@ static void Menu_Back(void* s, int i, struct ButtonWidget* btn, Widget_LeftClick Menu_Button(s, i, btn, width, 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, 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); } @@ -715,12 +710,11 @@ static struct EditHotkeyScreen { int selectedI; bool supressNextPress; struct MenuInputWidget input; - struct ButtonWidget buttons[6]; + struct ButtonWidget buttons[5], cancel; } EditHotkeyScreen_Instance; -static void EditHotkeyScreen_Make(struct EditHotkeyScreen* s, int i, int x, int y, const String* text, Widget_LeftClick onClick) { - Menu_OldButton(s, i, &s->buttons[i], 300, text, &s->titleFont, onClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); +static void EditHotkeyScreen_Make(struct EditHotkeyScreen* s, int i, int x, int y, Widget_LeftClick onClick) { + Menu_Button(s, i, &s->buttons[i], 300, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); } static void HotkeyListScreen_MakeFlags(int flags, String* str); @@ -729,61 +723,67 @@ static void EditHotkeyScreen_MakeFlags(int flags, String* str) { HotkeyListScreen_MakeFlags(flags, str); } -static void EditHotkeyScreen_MakeBaseKey(struct EditHotkeyScreen* s, Widget_LeftClick onClick) { +static void EditHotkeyScreen_UpdateBaseKey(struct EditHotkeyScreen* s) { String text; char textBuffer[STRING_SIZE]; String_InitArray(text, textBuffer); - String_AppendConst(&text, "Key: "); - String_AppendConst(&text, Key_Names[s->curHotkey.Trigger]); - EditHotkeyScreen_Make(s, 0, 0, -150, &text, onClick); + if (s->selectedI == 0) { + String_AppendConst(&text, "Key: press a key.."); + } else { + String_AppendConst(&text, "Key: "); + String_AppendConst(&text, Key_Names[s->curHotkey.Trigger]); + } + ButtonWidget_Set(&s->buttons[0], &text, &s->titleFont); } -static void EditHotkeyScreen_MakeModifiers(struct EditHotkeyScreen* s, Widget_LeftClick onClick) { +static void EditHotkeyScreen_UpdateModifiers(struct EditHotkeyScreen* s) { String text; char textBuffer[STRING_SIZE]; String_InitArray(text, textBuffer); - String_AppendConst(&text, "Modifiers:"); - EditHotkeyScreen_MakeFlags(s->curHotkey.Flags, &text); - EditHotkeyScreen_Make(s, 1, 0, -100, &text, onClick); + if (s->selectedI == 1) { + String_AppendConst(&text, "Modifiers: press a key.."); + } else { + String_AppendConst(&text, "Modifiers:"); + EditHotkeyScreen_MakeFlags(s->curHotkey.Flags, &text); + } + ButtonWidget_Set(&s->buttons[1], &text, &s->titleFont); } -static void EditHotkeyScreen_MakeLeaveOpen(struct EditHotkeyScreen* s, Widget_LeftClick onClick) { +static void EditHotkeyScreen_UpdateLeaveOpen(struct EditHotkeyScreen* s) { String text; char textBuffer[STRING_SIZE]; String_InitArray(text, textBuffer); String_AppendConst(&text, "Input stays open: "); String_AppendConst(&text, s->curHotkey.StaysOpen ? "ON" : "OFF"); - EditHotkeyScreen_Make(s, 2, -100, 10, &text, onClick); + ButtonWidget_Set(&s->buttons[2], &text, &s->titleFont); } static void EditHotkeyScreen_BaseKey(void* screen, void* b) { struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; - s->selectedI = 0; + s->selectedI = 0; s->supressNextPress = true; - ButtonWidget_SetConst(&s->buttons[0], "Key: press a key..", &s->titleFont); + EditHotkeyScreen_UpdateBaseKey(s); } static void EditHotkeyScreen_Modifiers(void* screen, void* b) { struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; - s->selectedI = 1; + s->selectedI = 1; s->supressNextPress = true; - ButtonWidget_SetConst(&s->buttons[1], "Modifiers: press a key..", &s->titleFont); + EditHotkeyScreen_UpdateModifiers(s); } static void EditHotkeyScreen_LeaveOpen(void* screen, void* b) { struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; /* Reset 'waiting for key..' state of two other buttons */ - if (s->selectedI == 0) { - EditHotkeyScreen_MakeBaseKey(s, EditHotkeyScreen_BaseKey); - s->supressNextPress = false; - } else if (s->selectedI == 1) { - EditHotkeyScreen_MakeModifiers(s, EditHotkeyScreen_Modifiers); + if (s->selectedI >= 0) { + s->selectedI = -1; s->supressNextPress = false; + EditHotkeyScreen_UpdateBaseKey(s); + EditHotkeyScreen_UpdateModifiers(s); } - - s->selectedI = -1; + s->curHotkey.StaysOpen = !s->curHotkey.StaysOpen; - EditHotkeyScreen_MakeLeaveOpen(s, EditHotkeyScreen_LeaveOpen); + EditHotkeyScreen_UpdateLeaveOpen(s); } static void EditHotkeyScreen_SaveChanges(void* screen, void* b) { @@ -801,8 +801,6 @@ static void EditHotkeyScreen_SaveChanges(void* screen, void* b) { Hotkeys_Add(hk.Trigger, hk.Flags, &text, hk.StaysOpen); Hotkeys_UserAddedHotkey(hk.Trigger, hk.Flags, hk.StaysOpen, &text); } - - Gui_Remove((struct Screen*)screen); HotkeyListScreen_Show(); } @@ -814,8 +812,6 @@ static void EditHotkeyScreen_RemoveHotkey(void* screen, void* b) { Hotkeys_Remove(hk.Trigger, hk.Flags); Hotkeys_UserRemovedHotkey(hk.Trigger, hk.Flags); } - - Gui_Remove((struct Screen*)screen); HotkeyListScreen_Show(); } @@ -850,34 +846,24 @@ static bool EditHotkeyScreen_KeyDown(void* screen, Key key) { if (s->selectedI >= 0) { if (s->selectedI == 0) { s->curHotkey.Trigger = key; - EditHotkeyScreen_MakeBaseKey(s, EditHotkeyScreen_BaseKey); } else if (s->selectedI == 1) { if (key == KEY_LCTRL || key == KEY_RCTRL) s->curHotkey.Flags |= HOTKEY_MOD_CTRL; else if (key == KEY_LSHIFT || key == KEY_RSHIFT) s->curHotkey.Flags |= HOTKEY_MOD_SHIFT; else if (key == KEY_LALT || key == KEY_RALT) s->curHotkey.Flags |= HOTKEY_MOD_ALT; else s->curHotkey.Flags = 0; - - EditHotkeyScreen_MakeModifiers(s, EditHotkeyScreen_Modifiers); } s->supressNextPress = true; - s->selectedI = -1; + s->selectedI = -1; + + EditHotkeyScreen_UpdateBaseKey(s); + EditHotkeyScreen_UpdateModifiers(s); return true; } return Elem_HandlesKeyDown(&s->input.base, key) || MenuScreen_KeyDown(s, key); } -static bool EditHotkeyScreen_KeyUp(void* screen, Key key) { - struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; - return Elem_HandlesKeyUp(&s->input.base, key); -} - static void EditHotkeyScreen_ContextRecreated(void* screen) { - static const String saveHK = String_FromConst("Save changes"); - static const String addHK = String_FromConst("Add hotkey"); - static const String remHK = String_FromConst("Remove hotkey"); - static const String cancel = String_FromConst("Cancel"); - struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; struct MenuInputDesc desc; String text; bool existed; @@ -888,37 +874,46 @@ static void EditHotkeyScreen_ContextRecreated(void* screen) { text = StringsBuffer_UNSAFE_Get(&HotkeysText, s->origHotkey.TextIndex); } else { text = String_Empty; } - EditHotkeyScreen_MakeBaseKey(s, EditHotkeyScreen_BaseKey); - EditHotkeyScreen_MakeModifiers(s, EditHotkeyScreen_Modifiers); - EditHotkeyScreen_MakeLeaveOpen(s, EditHotkeyScreen_LeaveOpen); + EditHotkeyScreen_UpdateBaseKey(s); + EditHotkeyScreen_UpdateModifiers(s); + EditHotkeyScreen_UpdateLeaveOpen(s); + ButtonWidget_SetConst(&s->buttons[3], existed ? "Save changes" : "Add hotkey", &s->titleFont); + ButtonWidget_SetConst(&s->buttons[4], existed ? "Remove hotkey" : "Cancel", &s->titleFont); - EditHotkeyScreen_Make(s, 3, 0, 80, existed ? &saveHK : &addHK, - EditHotkeyScreen_SaveChanges); - EditHotkeyScreen_Make(s, 4, 0, 130, existed ? &remHK : &cancel, - EditHotkeyScreen_RemoveHotkey); - - Menu_OldBack(s, 5, &s->buttons[5], "Cancel", &s->titleFont, Menu_SwitchHotkeys); + ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); Menu_OldInput(s, 6, &s->input, 500, &text, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35); } +static void EditHotkeyScreen_Init(void* screen) { + static struct Widget* widgets[7]; + struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; + + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + s->selectedI = -1; + MenuScreen_Init(screen); + + EditHotkeyScreen_Make(s, 0, 0, -150, EditHotkeyScreen_BaseKey); + EditHotkeyScreen_Make(s, 1, 0, -100, EditHotkeyScreen_Modifiers); + EditHotkeyScreen_Make(s, 2, -100, 10, EditHotkeyScreen_LeaveOpen); + EditHotkeyScreen_Make(s, 3, 0, 80, EditHotkeyScreen_SaveChanges); + EditHotkeyScreen_Make(s, 4, 0, 130, EditHotkeyScreen_RemoveHotkey); + + Menu_Back(s, 5, &s->cancel, Menu_SwitchHotkeys); +} + static struct ScreenVTABLE EditHotkeyScreen_VTABLE = { - MenuScreen_Init, EditHotkeyScreen_Render, EditHotkeyScreen_Free, - EditHotkeyScreen_KeyDown, EditHotkeyScreen_KeyUp, EditHotkeyScreen_KeyPress, + EditHotkeyScreen_Init, EditHotkeyScreen_Render, EditHotkeyScreen_Free, + EditHotkeyScreen_KeyDown, Menu_KeyUp, EditHotkeyScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, EditHotkeyScreen_ContextRecreated }; -void EditHotkeyScreen_Show(struct HotkeyData original) { - static struct Widget* widgets[7]; +void EditHotkeyScreen_Show(struct HotkeyData original) { struct EditHotkeyScreen* s = &EditHotkeyScreen_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); - s->VTABLE = &EditHotkeyScreen_VTABLE; - s->selectedI = -1; s->origHotkey = original; s->curHotkey = original; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); @@ -930,10 +925,10 @@ void EditHotkeyScreen_Show(struct HotkeyData original) { *#########################################################################################################################*/ static struct GenLevelScreen { MenuScreen_Layout - struct ButtonWidget buttons[3]; + struct ButtonWidget flatgrass, vanilla, cancel; struct MenuInputWidget* selected; struct MenuInputWidget inputs[4]; - struct TextWidget labels[5]; + struct TextWidget labels[4], title; } GenLevelScreen_Instance; CC_NOINLINE static int GenLevelScreen_GetInt(struct GenLevelScreen* s, int index) { @@ -1016,15 +1011,10 @@ static void GenLevelScreen_Input(struct GenLevelScreen* s, int i, int y, bool se input->base.MenuClick = GenLevelScreen_InputClick; } -static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int y, const char* title) { - struct TextWidget* label = &s->labels[i]; +static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int y) { PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); - - String text = String_FromReadonly(title); - Menu_OldLabel(s, i + 4, label, &text, &s->textFont, - ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 110, y); - - label->col = col; + Menu_Label(s, i + 4, &s->labels[i], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 110, y); + s->labels[i].col = col; } static bool GenLevelScreen_KeyDown(void* screen, Key key) { @@ -1033,11 +1023,6 @@ static bool GenLevelScreen_KeyDown(void* screen, Key key) { return MenuScreen_KeyDown(s, key); } -static bool GenLevelScreen_KeyUp(void* screen, Key key) { - struct GenLevelScreen* s = (struct GenLevelScreen*)screen; - return !s->selected || Elem_HandlesKeyUp(&s->selected->base, key); -} - static bool GenLevelScreen_KeyPress(void* screen, char keyChar) { struct GenLevelScreen* s = (struct GenLevelScreen*)screen; if (s->selected) InputWidget_Append(&s->selected->base, keyChar); @@ -1045,9 +1030,6 @@ static bool GenLevelScreen_KeyPress(void* screen, char keyChar) { } static void GenLevelScreen_ContextRecreated(void* screen) { - static const String title = String_FromConst("Generate new level"); - static const String flat = String_FromConst("Flatgrass"); - static const String norm = String_FromConst("Vanilla"); struct GenLevelScreen* s = (struct GenLevelScreen*)screen; GenLevelScreen_Input(s, 0, -80, false, World.Width); @@ -1055,35 +1037,49 @@ static void GenLevelScreen_ContextRecreated(void* screen) { GenLevelScreen_Input(s, 2, 0, false, World.Length); GenLevelScreen_Input(s, 3, 40, true, 0); - GenLevelScreen_Label(s, 0, -80, "Width:"); - GenLevelScreen_Label(s, 1, -40, "Height:"); - GenLevelScreen_Label(s, 2, 0, "Length:"); - GenLevelScreen_Label(s, 3, 40, "Seed:"); + TextWidget_SetConst(&s->labels[0], "Width:", &s->textFont); + TextWidget_SetConst(&s->labels[1], "Height:", &s->textFont); + TextWidget_SetConst(&s->labels[2], "Length:", &s->textFont);; + TextWidget_SetConst(&s->labels[3], "Seed:", &s->textFont); - Menu_OldLabel(s, 8, &s->labels[4], &title, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -130); - Menu_OldButton(s, 9, &s->buttons[0], 200, &flat, &s->titleFont, GenLevelScreen_Flatgrass, - ANCHOR_CENTRE, ANCHOR_CENTRE, -120, 100); - Menu_OldButton(s, 10, &s->buttons[1], 200, &norm, &s->titleFont, GenLevelScreen_Notchy, - ANCHOR_CENTRE, ANCHOR_CENTRE, 120, 100); - Menu_OldBack(s, 11, &s->buttons[2], "Cancel", &s->titleFont, Menu_SwitchPause); + TextWidget_SetConst(&s->title, "Generate new level", &s->textFont); + ButtonWidget_SetConst(&s->flatgrass, "Flatgrass", &s->titleFont); + ButtonWidget_SetConst(&s->vanilla, "Vanilla", &s->titleFont); + ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); } -static struct ScreenVTABLE GenLevelScreen_VTABLE = { - MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, - GenLevelScreen_KeyDown, GenLevelScreen_KeyUp, GenLevelScreen_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, GenLevelScreen_ContextRecreated -}; -void GenLevelScreen_Show(void) { +static void GenLevelScreen_Init(void* screen) { static struct Widget* widgets[12]; - struct GenLevelScreen* s = &GenLevelScreen_Instance; - - s->grabsInput = true; - s->closable = true; + struct GenLevelScreen* s = (struct GenLevelScreen*)screen; + + MenuScreen_Init(s); s->widgets = widgets; s->numWidgets = Array_Elems(widgets); + GenLevelScreen_Label(s, 0, -80); + GenLevelScreen_Label(s, 1, -40); + GenLevelScreen_Label(s, 2, 0); + GenLevelScreen_Label(s, 3, 40); + + Menu_Label(s, 8, &s->title, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -130); + Menu_Button(s, 9, &s->flatgrass, 200, GenLevelScreen_Flatgrass, + ANCHOR_CENTRE, ANCHOR_CENTRE, -120, 100); + Menu_Button(s, 10, &s->vanilla, 200, GenLevelScreen_Notchy, + ANCHOR_CENTRE, ANCHOR_CENTRE, 120, 100); + Menu_Back(s, 11, &s->cancel, Menu_SwitchPause); +} + +static struct ScreenVTABLE GenLevelScreen_VTABLE = { + GenLevelScreen_Init, MenuScreen_Render, MenuScreen_Free, + GenLevelScreen_KeyDown, Menu_KeyUp, GenLevelScreen_KeyPress, + Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Menu_OnResize, Menu_ContextLost, GenLevelScreen_ContextRecreated +}; +void GenLevelScreen_Show(void) { + struct GenLevelScreen* s = &GenLevelScreen_Instance; + s->grabsInput = true; + s->closable = true; s->VTABLE = &GenLevelScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1094,7 +1090,7 @@ void GenLevelScreen_Show(void) { *#########################################################################################################################*/ static struct ClassicGenScreen { MenuScreen_Layout - struct ButtonWidget buttons[4]; + struct ButtonWidget buttons[3], cancel; } ClassicGenScreen_Instance; static void ClassicGenScreen_Gen(int size) { @@ -1109,36 +1105,43 @@ static void ClassicGenScreen_Small(void* a, void* b) { ClassicGenScreen_Gen(128 static void ClassicGenScreen_Medium(void* a, void* b) { ClassicGenScreen_Gen(256); } static void ClassicGenScreen_Huge(void* a, void* b) { ClassicGenScreen_Gen(512); } -static void ClassicGenScreen_Make(struct ClassicGenScreen* s, int i, int y, const char* title, Widget_LeftClick onClick) { - String text = String_FromReadonly(title); - Menu_OldButton(s, i, &s->buttons[i], 400, &text, &s->titleFont, onClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); +static void ClassicGenScreen_Make(struct ClassicGenScreen* s, int i, int y, Widget_LeftClick onClick) { + Menu_Button(s, i, &s->buttons[i], 400, onClick, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); } static void ClassicGenScreen_ContextRecreated(void* screen) { struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; - ClassicGenScreen_Make(s, 0, -100, "Small", ClassicGenScreen_Small); - ClassicGenScreen_Make(s, 1, -50, "Normal", ClassicGenScreen_Medium); - ClassicGenScreen_Make(s, 2, 0, "Huge", ClassicGenScreen_Huge); + ButtonWidget_SetConst(&s->buttons[0], "Small", &s->titleFont); + ButtonWidget_SetConst(&s->buttons[1], "Normal", &s->titleFont); + ButtonWidget_SetConst(&s->buttons[2], "Huge", &s->titleFont); + ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); +} - Menu_OldBack(s, 3, &s->buttons[3], "Cancel", &s->titleFont, Menu_SwitchPause); +static void ClassicGenScreen_Init(void* screen) { + static struct Widget* widgets[4]; + struct ClassicGenScreen* s = (struct ClassicGenScreen*)screen; + + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + MenuScreen_Init(s); + + ClassicGenScreen_Make(s, 0, -100, ClassicGenScreen_Small); + ClassicGenScreen_Make(s, 1, -50, ClassicGenScreen_Medium); + ClassicGenScreen_Make(s, 2, 0, ClassicGenScreen_Huge); + + Menu_Back(s, 3, &s->cancel, Menu_SwitchPause); } static struct ScreenVTABLE ClassicGenScreen_VTABLE = { - MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, - MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, ClassicGenScreen_ContextRecreated + ClassicGenScreen_Init, MenuScreen_Render, MenuScreen_Free, + MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, + Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Menu_OnResize, Menu_ContextLost, ClassicGenScreen_ContextRecreated }; void ClassicGenScreen_Show(void) { - static struct Widget* widgets[4]; struct ClassicGenScreen* s = &ClassicGenScreen_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); - s->VTABLE = &ClassicGenScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1257,11 +1260,6 @@ static bool SaveLevelScreen_KeyDown(void* screen, Key key) { return MenuScreen_KeyDown(s, key); } -static bool SaveLevelScreen_KeyUp(void* screen, Key key) { - struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; - return Elem_HandlesKeyUp(&s->input.base, key); -} - static void SaveLevelScreen_ContextRecreated(void* screen) { static const String save = String_FromConst("Save"); static const String schem = String_FromConst("Save schematic"); @@ -1286,7 +1284,7 @@ static void SaveLevelScreen_ContextRecreated(void* screen) { static struct ScreenVTABLE SaveLevelScreen_VTABLE = { MenuScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, - SaveLevelScreen_KeyDown, SaveLevelScreen_KeyUp, SaveLevelScreen_KeyPress, + SaveLevelScreen_KeyDown, Menu_KeyUp, SaveLevelScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, SaveLevelScreen_ContextRecreated }; @@ -1957,12 +1955,6 @@ static bool MenuOptionsScreen_KeyDown(void* screen, Key key) { return MenuScreen_KeyDown(s, key); } -static bool MenuOptionsScreen_KeyUp(void* screen, Key key) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - if (s->activeI == -1) return true; - return Elem_HandlesKeyUp(&s->input.base, key); -} - static bool MenuOptionsScreen_MouseMove(void* screen, int x, int y) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; int i = Menu_DoMouseMove(s, x, y); @@ -2083,7 +2075,7 @@ static void MenuOptionsScreen_Input(void* screen, void* widget) { static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuScreen_Free, - MenuOptionsScreen_KeyDown, MenuOptionsScreen_KeyUp, MenuOptionsScreen_KeyPress, + MenuOptionsScreen_KeyDown, Menu_KeyUp, MenuOptionsScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, NULL }; From 45358517d90aa88b01a413e54a340e74d86d8365 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 12:29:40 +1000 Subject: [PATCH 20/46] Redesign SaveLevelScreen to seperate out init/contextrecreated stuff. Fixes 'overwrite existing?' getting reset on window resize. Also move to getting rid of widget->Init --- src/Menus.c | 88 +++++++++++++++++++++++++++------------------------ src/Screens.c | 4 +-- src/Widgets.c | 7 +--- 3 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index ea3e5bc13..23ec56c8c 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -881,7 +881,7 @@ static void EditHotkeyScreen_ContextRecreated(void* screen) { ButtonWidget_SetConst(&s->buttons[4], existed ? "Remove hotkey" : "Cancel", &s->titleFont); ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); - Menu_OldInput(s, 6, &s->input, 500, &text, &s->textFont, &desc, + Menu_OldInput(s, 6, &s->input, 500, &text, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35); } @@ -1152,31 +1152,30 @@ void ClassicGenScreen_Show(void) { *#########################################################################################################################*/ static struct SaveLevelScreen { MenuScreen_Layout - struct ButtonWidget buttons[3]; + struct ButtonWidget save, schem, cancel; struct MenuInputWidget input; struct TextWidget mcEdit, desc; } SaveLevelScreen_Instance; -static void SaveLevelScreen_RemoveOverwrites(struct SaveLevelScreen* s) { - struct ButtonWidget* btn; - btn = &s->buttons[0]; - if (btn->optName) { - btn->optName = NULL; - ButtonWidget_SetConst(btn, "Save", &s->titleFont); - } - - btn = &s->buttons[1]; - if (btn->optName) { - btn->optName = NULL; - ButtonWidget_SetConst(btn, "Save schematic", &s->titleFont); - } +static void SaveLevelScreen_UpdateSave(struct SaveLevelScreen* s) { + ButtonWidget_SetConst(&s->save, + s->save.optName ? "&cOverwrite existing?" : "Save", &s->titleFont); } -static void SaveLevelScreen_MakeDesc(struct SaveLevelScreen* s, const String* text) { - if (s->widgets[5]) { Elem_TryFree(s->widgets[5]); } +static void SaveLevelScreen_UpdateSchem(struct SaveLevelScreen* s) { + ButtonWidget_SetConst(&s->schem, + s->schem.optName ? "&cOverwrite existing?" : "Save schematic", &s->titleFont); +} - Menu_OldLabel(s, 5, &s->desc, text, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 65); +static void SaveLevelScreen_RemoveOverwrites(struct SaveLevelScreen* s) { + if (s->save.optName) { + s->save.optName = NULL; + SaveLevelScreen_UpdateSave(s); + } + if (s->schem.optName) { + s->schem.optName = NULL; + SaveLevelScreen_UpdateSchem(s); + } } static void SaveLevelScreen_SaveMap(struct SaveLevelScreen* s, const String* path) { @@ -1213,7 +1212,6 @@ static void SaveLevelScreen_SaveMap(struct SaveLevelScreen* s, const String* pat } static void SaveLevelScreen_Save(void* screen, void* widget, const char* ext) { - static const String fileMsg = String_FromConst("&ePlease enter a filename"); String path; char pathBuffer[FILENAME_SIZE]; struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; @@ -1221,14 +1219,16 @@ static void SaveLevelScreen_Save(void* screen, void* widget, const char* ext) { String file = s->input.base.text; if (!file.length) { - SaveLevelScreen_MakeDesc(s, &fileMsg); return; + TextWidget_SetConst(&s->desc, "&ePlease enter a filename", &s->textFont); + return; } String_InitArray(path, pathBuffer); String_Format2(&path, "maps/%s%c", &file, ext); if (File_Exists(&path) && !btn->optName) { - ButtonWidget_SetConst(btn, "&cOverwrite existing?", &s->titleFont); - btn->optName = "O"; + btn->optName = ""; + SaveLevelScreen_UpdateSave(s); + SaveLevelScreen_UpdateSchem(s); } else { SaveLevelScreen_RemoveOverwrites(s); SaveLevelScreen_SaveMap(s, &path); @@ -1261,42 +1261,48 @@ static bool SaveLevelScreen_KeyDown(void* screen, Key key) { } static void SaveLevelScreen_ContextRecreated(void* screen) { - static const String save = String_FromConst("Save"); - static const String schem = String_FromConst("Save schematic"); - static const String mcEdit = String_FromConst("&eCan be imported into MCEdit"); - struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; struct MenuInputDesc desc; MenuInput_Path(desc); - Menu_OldButton(s, 0, &s->buttons[0], 300, &save, &s->titleFont, SaveLevelScreen_Classic, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 20); - Menu_OldButton(s, 1, &s->buttons[1], 200, &schem, &s->titleFont, SaveLevelScreen_Schematic, - ANCHOR_CENTRE, ANCHOR_CENTRE, -150, 120); - Menu_OldLabel(s, 2, &s->mcEdit, &mcEdit, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 120); + SaveLevelScreen_UpdateSave(s); + SaveLevelScreen_UpdateSchem(s); + TextWidget_SetConst(&s->mcEdit, "&eCan be imported into MCEdit", &s->textFont); + ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); - Menu_OldBack(s, 3, &s->buttons[2], "Cancel", &s->titleFont, Menu_SwitchPause); Menu_OldInput(s, 4, &s->input, 500, &String_Empty, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); - s->widgets[5] = NULL; /* description widget placeholder */ +} + +static void SaveLevelScreen_Init(void* screen) { + static struct Widget* widgets[6]; + struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; + + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + MenuScreen_Init(s); + + Menu_Button(s, 0, &s->save, 300, SaveLevelScreen_Classic, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 20); + Menu_Button(s, 1, &s->schem, 200, SaveLevelScreen_Schematic, + ANCHOR_CENTRE, ANCHOR_CENTRE, -150, 120); + Menu_Label(s, 2, &s->mcEdit, + ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 120); + Menu_Back(s, 3, &s->cancel, Menu_SwitchPause); + Menu_Label(s, 5, &s->desc, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 65); } static struct ScreenVTABLE SaveLevelScreen_VTABLE = { - MenuScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, + SaveLevelScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, SaveLevelScreen_KeyDown, Menu_KeyUp, SaveLevelScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, SaveLevelScreen_ContextRecreated }; void SaveLevelScreen_Show(void) { - static struct Widget* widgets[6]; struct SaveLevelScreen* s = &SaveLevelScreen_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); - s->VTABLE = &SaveLevelScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } diff --git a/src/Screens.c b/src/Screens.c index 65a2e0207..c4437e96e 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -984,9 +984,6 @@ static void HUDScreen_ContextRecreated(void* screen) { int size; bool extended; - Elem_TryFree(&s->hotbar); - Elem_Init(&s->hotbar); - size = Drawer2D_BitmappedText ? 16 : 11; Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); HUDScreen_InitChatFonts(s); @@ -1000,6 +997,7 @@ static void HUDScreen_ContextRecreated(void* screen) { PlayerListWidget_Create(&s->playerList, &s->playerFont, !extended); s->showingList = true; + Widget_Reposition(&s->hotbar); Elem_Init(&s->playerList); Widget_Reposition(&s->playerList); } diff --git a/src/Widgets.c b/src/Widgets.c index 89a70f02f..3261bea9a 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -400,11 +400,6 @@ static void HotbarWidget_Reposition(void* widget) { HotbarWidget_RepositionSelectionTexture(w); } -static void HotbarWidget_Init(void* widget) { - struct HotbarWidget* w = (struct HotbarWidget*)widget; - Widget_Reposition(w); -} - static void HotbarWidget_Render(void* widget, double delta) { struct HotbarWidget* w = (struct HotbarWidget*)widget; HotbarWidget_RenderHotbarOutline(w); @@ -486,7 +481,7 @@ static bool HotbarWidget_MouseScroll(void* widget, float delta) { } static struct WidgetVTABLE HotbarWidget_VTABLE = { - HotbarWidget_Init, HotbarWidget_Render, Widget_NullFunc, + Widget_NullFunc, HotbarWidget_Render, Widget_NullFunc, HotbarWidget_KeyDown, HotbarWidget_KeyUp, HotbarWidget_MouseDown, Widget_Mouse, Widget_MouseMove, HotbarWidget_MouseScroll, HotbarWidget_Reposition From 777b31a66e1452548574a75c3ce8b22f8f43995e Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 13:36:02 +1000 Subject: [PATCH 21/46] Fix caret becoming apparently invisible when you type in 64 characters (a full line), then input a colour code for the next line Instead the second line is still drawn --- src/Menus.c | 8 ++++---- src/Widgets.c | 54 +++++++++++++++++++++++++-------------------------- src/Widgets.h | 7 ++++--- 3 files changed, 34 insertions(+), 35 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 23ec56c8c..c306af9d9 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -501,7 +501,7 @@ static void MenuScreen_Free(void* screen) { *#########################################################################################################################*/ static struct PauseScreen { MenuScreen_Layout - struct ButtonWidget buttons[8]; + struct ButtonWidget buttons[6], quit, back; } PauseScreen_Instance; static void PauseScreen_Quit(void* a, void* b) { Window_Close(); } @@ -544,7 +544,7 @@ static void PauseScreen_ContextRecreated(void* screen) { if (Gui_ClassicMenu) { PauseScreen_MakeButtons(s, 400, classicDescs, 5); - Menu_OldBack(s, 5, &s->buttons[5], "Back to game", &s->titleFont, PauseScreen_Game); + Menu_OldBack(s, 5, &s->back, "Back to game", &s->titleFont, PauseScreen_Game); /* Disable nostalgia options in classic mode */ if (Game_ClassicMode) Menu_Remove(s, 4); @@ -552,9 +552,9 @@ static void PauseScreen_ContextRecreated(void* screen) { s->widgets[7] = NULL; } else { PauseScreen_MakeButtons(s, 300, modernDescs, 6); - Menu_OldButton(s, 6, &s->buttons[6], 120, &quitMsg, &s->titleFont, PauseScreen_Quit, + Menu_OldButton(s, 6, &s->quit, 120, &quitMsg, &s->titleFont, PauseScreen_Quit, ANCHOR_MAX, ANCHOR_MAX, 5, 5); - Menu_OldBack(s, 7, &s->buttons[7], "Back to game",&s->titleFont, PauseScreen_Game); + Menu_OldBack(s, 7, &s->back, "Back to game",&s->titleFont, PauseScreen_Game); } if (!Server.IsSinglePlayer) { diff --git a/src/Widgets.c b/src/Widgets.c index 3261bea9a..c2362b806 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -871,13 +871,12 @@ static void InputWidget_FormatLine(struct InputWidget* w, int i, String* line) { static void InputWidget_CalculateLineSizes(struct InputWidget* w) { String line; char lineBuffer[STRING_SIZE]; struct DrawTextArgs args; - Size2D size; int y; for (y = 0; y < INPUTWIDGET_MAX_LINES; y++) { - w->lineSizes[y] = Size2D_Empty; + w->lineWidths[y] = 0; } - w->lineSizes[0].Width = w->prefixWidth; + w->lineWidths[0] = w->prefixWidth; DrawTextArgs_MakeEmpty(&args, w->font, true); String_InitArray(line, lineBuffer); @@ -886,13 +885,7 @@ static void InputWidget_CalculateLineSizes(struct InputWidget* w) { InputWidget_FormatLine(w, y, &line); args.text = line; - size = Drawer2D_MeasureText(&args); - w->lineSizes[y].Width += size.Width; - w->lineSizes[y].Height = size.Height; - } - - if (w->lineSizes[0].Height == 0) { - w->lineSizes[0].Height = w->prefixHeight; + w->lineWidths[y] += Drawer2D_TextWidth(&args); } } @@ -929,7 +922,7 @@ static void InputWidget_UpdateCaret(struct InputWidget* w) { /* Caret is at last character on line */ if (w->caretX == INPUTWIDGET_LEN) { - lineWidth = w->lineSizes[w->caretY].Width; + lineWidth = w->lineWidths[w->caretY]; } else { String_InitArray(line, lineBuffer); InputWidget_FormatLine(w, w->caretY, &line); @@ -946,7 +939,7 @@ static void InputWidget_UpdateCaret(struct InputWidget* w) { } w->caretTex.X = w->x + w->padding + lineWidth; - w->caretTex.Y = w->inputTex.Y + w->caretY * w->lineSizes[0].Height + 2; + w->caretTex.Y = w->inputTex.Y + w->caretY * w->lineHeight + 2; colCode = InputWidget_GetLastCol(w, w->caretX, w->caretY); if (colCode) { @@ -971,7 +964,7 @@ static void InputWidget_RenderCaret(struct InputWidget* w, double delta) { static void InputWidget_OnPressedEnter(void* widget) { struct InputWidget* w = (struct InputWidget*)widget; InputWidget_Clear(w); - w->height = w->prefixHeight; + w->height = w->lineHeight; } void InputWidget_Clear(struct InputWidget* w) { @@ -1269,7 +1262,7 @@ CC_NOINLINE static void InputWidget_Create(struct InputWidget* w, FontDesc* font DrawTextArgs_Make(&args, prefix, font, true); size = Drawer2D_MeasureText(&args); w->prefixWidth = size.Width; w->width = size.Width; - w->prefixHeight = size.Height; w->height = size.Height; + w->height = w->lineHeight; } @@ -1420,10 +1413,9 @@ static void MenuInputWidget_RemakeTexture(void* widget) { int hintX; Bitmap bmp; - DrawTextArgs_Make(&args, &w->base.lines[0], w->base.font, false); + DrawTextArgs_Make(&args, &w->base.text, w->base.font, false); size.Width = Drawer2D_TextWidth(&args); - /* Text may be empty, but don't want 0 height if so */ - size.Height = Drawer2D_FontHeight(w->base.font, false); + size.Height = w->base.lineHeight; w->base.caretAccumulator = 0.0; String_InitArray(range, rangeBuffer); @@ -1493,7 +1485,8 @@ void MenuInputWidget_Create(struct MenuInputWidget* w, int width, int height, co w->desc = *desc; w->base.convertPercents = false; - w->base.padding = 3; + w->base.padding = 3; + w->base.lineHeight = Drawer2D_FontHeight(font, false); String_InitArray(w->base.text, w->_textBuffer); w->base.GetMaxLines = MenuInputWidget_GetMaxLines; @@ -1515,12 +1508,16 @@ static void ChatInputWidget_RemakeTexture(void* widget) { Size2D size = { 0, 0 }; Bitmap bmp; char lastCol; - int i, x, y = 0; + int i, x, y; for (i = 0; i < w->GetMaxLines(); i++) { - size.Height += w->lineSizes[i].Height; - size.Width = max(size.Width, w->lineSizes[i].Width); + if (!w->lines[i].length) break; + size.Height += w->lineHeight; + size.Width = max(size.Width, w->lineWidths[i]); } + + if (!size.Width) size.Width = w->prefixWidth; + if (!size.Height) size.Height = w->lineHeight; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height); DrawTextArgs_MakeEmpty(&args, w->font, true); @@ -1530,7 +1527,7 @@ static void ChatInputWidget_RemakeTexture(void* widget) { } String_InitArray(line, lineBuffer); - for (i = 0; i < Array_Elems(w->lines); i++) { + for (i = 0, y = 0; i < Array_Elems(w->lines); i++) { if (!w->lines[i].length) break; line.length = 0; @@ -1545,7 +1542,7 @@ static void ChatInputWidget_RemakeTexture(void* widget) { x = i == 0 ? w->prefixWidth : 0; Drawer2D_DrawText(&bmp, &args, x, y); - y += w->lineSizes[i].Height; + y += w->lineHeight; } Drawer2D_Make2DTexture(&w->inputTex, &bmp, size, 0, 0); @@ -1553,7 +1550,7 @@ static void ChatInputWidget_RemakeTexture(void* widget) { w->caretAccumulator = 0; w->width = size.Width; - w->height = y == 0 ? w->prefixHeight : y; + w->height = size.Height; Widget_Reposition(w); w->inputTex.X = w->x + w->padding; w->inputTex.Y = w->y; @@ -1568,15 +1565,15 @@ static void ChatInputWidget_Render(void* widget, double delta) { Gfx_SetTexturing(false); for (i = 0; i < INPUTWIDGET_MAX_LINES; i++) { - if (i > 0 && !w->lineSizes[i].Height) break; + if (i > 0 && !w->lines[i].length) break; caretAtEnd = (w->caretY == i) && (w->caretX == INPUTWIDGET_LEN || w->caretPos == -1); - width = w->lineSizes[i].Width + (caretAtEnd ? w->caretTex.Width : 0); + width = w->lineWidths[i] + (caretAtEnd ? w->caretTex.Width : 0); /* Cover whole window width to match original classic behaviour */ if (Game_PureClassic) { width = max(width, Window_Width - x * 4); } - Gfx_Draw2DFlat(x, y, width + w->padding * 2, w->prefixHeight, backCol); - y += w->lineSizes[i].Height; + Gfx_Draw2DFlat(x, y, width + w->padding * 2, w->lineHeight, backCol); + y += w->lineHeight; } Gfx_SetTexturing(true); @@ -1747,6 +1744,7 @@ void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font) { w->base.convertPercents = !Game_ClassicMode; w->base.showCaret = true; w->base.padding = 5; + w->base.lineHeight = Drawer2D_FontHeight(font, true); w->base.GetMaxLines = ChatInputWidget_GetMaxLines; w->base.RemakeTexture = ChatInputWidget_RemakeTexture; w->base.OnPressedEnter = ChatInputWidget_OnPressedEnter; diff --git a/src/Widgets.h b/src/Widgets.h index acbc3e8a5..f1030c773 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -106,11 +106,12 @@ struct InputWidget { bool (*AllowedChar)(void* elem, char c); String text; - String lines[INPUTWIDGET_MAX_LINES]; /* raw text of each line */ - Size2D lineSizes[INPUTWIDGET_MAX_LINES]; /* size of each line in pixels */ + String lines[INPUTWIDGET_MAX_LINES]; /* raw text of each line */ + int lineWidths[INPUTWIDGET_MAX_LINES]; /* Width of each line in pixels */ + int lineHeight; struct Texture inputTex; String prefix; - int prefixWidth, prefixHeight; + int prefixWidth; bool convertPercents; uint8_t padding; From 3cca3ea61d5e28da24aa590024066793d538b35f Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 15:59:51 +1000 Subject: [PATCH 22/46] Fix input text in gen level/edit hotkey/save level being reset when window is resized --- src/Menus.c | 77 ++++++++++++++++++++++----------------------- src/Widgets.c | 87 +++++++++++++++++++++------------------------------ src/Widgets.h | 1 - 3 files changed, 72 insertions(+), 93 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index c306af9d9..e1e0227ad 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -61,6 +61,7 @@ static void Menu_OldInput(void* s, int i, struct MenuInputWidget* input, int wid MenuInputWidget_Create(input, width, 30, text, font, desc); Widget_SetLocation(input, horAnchor, verAnchor, x, y); input->base.showCaret = true; + InputWidget_UpdateText(&input->base); ((struct Screen*)s)->widgets[i] = (struct Widget*)input; } @@ -864,35 +865,29 @@ static bool EditHotkeyScreen_KeyDown(void* screen, Key key) { } static void EditHotkeyScreen_ContextRecreated(void* screen) { - struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; - struct MenuInputDesc desc; - String text; bool existed; - - MenuInput_String(desc); - existed = s->origHotkey.Trigger != KEY_NONE; - if (existed) { - text = StringsBuffer_UNSAFE_Get(&HotkeysText, s->origHotkey.TextIndex); - } else { text = String_Empty; } + struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; + bool existed = s->origHotkey.Trigger != KEY_NONE; EditHotkeyScreen_UpdateBaseKey(s); EditHotkeyScreen_UpdateModifiers(s); EditHotkeyScreen_UpdateLeaveOpen(s); ButtonWidget_SetConst(&s->buttons[3], existed ? "Save changes" : "Add hotkey", &s->titleFont); - ButtonWidget_SetConst(&s->buttons[4], existed ? "Remove hotkey" : "Cancel", &s->titleFont); - + ButtonWidget_SetConst(&s->buttons[4], existed ? "Remove hotkey" : "Cancel", &s->titleFont); + InputWidget_UpdateText(&s->input.base); ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); - Menu_OldInput(s, 6, &s->input, 500, &text, &s->textFont, &desc, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35); } static void EditHotkeyScreen_Init(void* screen) { static struct Widget* widgets[7]; struct EditHotkeyScreen* s = (struct EditHotkeyScreen*)screen; + struct MenuInputDesc desc; + String text; s->widgets = widgets; s->numWidgets = Array_Elems(widgets); s->selectedI = -1; MenuScreen_Init(screen); + MenuInput_String(desc); EditHotkeyScreen_Make(s, 0, 0, -150, EditHotkeyScreen_BaseKey); EditHotkeyScreen_Make(s, 1, 0, -100, EditHotkeyScreen_Modifiers); @@ -900,7 +895,13 @@ static void EditHotkeyScreen_Init(void* screen) { EditHotkeyScreen_Make(s, 3, 0, 80, EditHotkeyScreen_SaveChanges); EditHotkeyScreen_Make(s, 4, 0, 130, EditHotkeyScreen_RemoveHotkey); - Menu_Back(s, 5, &s->cancel, Menu_SwitchHotkeys); + if (s->origHotkey.Trigger) { + text = StringsBuffer_UNSAFE_Get(&HotkeysText, s->origHotkey.TextIndex); + } else { text = String_Empty; } + + Menu_Input(s, 6, &s->input, 500, &text, &s->textFont, &desc, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35); + Menu_Back(s, 5, &s->cancel, Menu_SwitchHotkeys); } static struct ScreenVTABLE EditHotkeyScreen_VTABLE = { @@ -990,12 +991,12 @@ static void GenLevelScreen_InputClick(void* screen, void* input) { s->selected->base.showCaret = true; } -static void GenLevelScreen_Input(struct GenLevelScreen* s, int i, int y, bool seed, int def) { +static void GenLevelScreen_Make(struct GenLevelScreen* s, int i, int y, int def) { String tmp; char tmpBuffer[STRING_SIZE]; - struct MenuInputWidget* input = &s->inputs[i]; struct MenuInputDesc desc; + PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); - if (seed) { + if (i == 3) { MenuInput_Seed(desc); } else { MenuInput_Int(desc, 1, 8192, def); @@ -1004,16 +1005,13 @@ static void GenLevelScreen_Input(struct GenLevelScreen* s, int i, int y, bool se String_InitArray(tmp, tmpBuffer); desc.VTABLE->GetDefault(&desc, &tmp); - Menu_OldInput(s, i, input, 200, &tmp, &s->textFont, &desc, + Menu_Input(s, i, &s->inputs[i], 200, &tmp, &s->textFont, &desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); + s->inputs[i].base.showCaret = false; + s->inputs[i].base.MenuClick = GenLevelScreen_InputClick; - input->base.showCaret = false; - input->base.MenuClick = GenLevelScreen_InputClick; -} - -static void GenLevelScreen_Label(struct GenLevelScreen* s, int i, int y) { - PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); - Menu_Label(s, i + 4, &s->labels[i], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 110, y); + Menu_Label(s, i + 4, &s->labels[i], + ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 110, y); s->labels[i].col = col; } @@ -1032,14 +1030,14 @@ static bool GenLevelScreen_KeyPress(void* screen, char keyChar) { static void GenLevelScreen_ContextRecreated(void* screen) { struct GenLevelScreen* s = (struct GenLevelScreen*)screen; - GenLevelScreen_Input(s, 0, -80, false, World.Width); - GenLevelScreen_Input(s, 1, -40, false, World.Height); - GenLevelScreen_Input(s, 2, 0, false, World.Length); - GenLevelScreen_Input(s, 3, 40, true, 0); + InputWidget_UpdateText(&s->inputs[0].base); + InputWidget_UpdateText(&s->inputs[1].base); + InputWidget_UpdateText(&s->inputs[2].base); + InputWidget_UpdateText(&s->inputs[3].base); TextWidget_SetConst(&s->labels[0], "Width:", &s->textFont); TextWidget_SetConst(&s->labels[1], "Height:", &s->textFont); - TextWidget_SetConst(&s->labels[2], "Length:", &s->textFont);; + TextWidget_SetConst(&s->labels[2], "Length:", &s->textFont); TextWidget_SetConst(&s->labels[3], "Seed:", &s->textFont); TextWidget_SetConst(&s->title, "Generate new level", &s->textFont); @@ -1056,10 +1054,10 @@ static void GenLevelScreen_Init(void* screen) { s->widgets = widgets; s->numWidgets = Array_Elems(widgets); - GenLevelScreen_Label(s, 0, -80); - GenLevelScreen_Label(s, 1, -40); - GenLevelScreen_Label(s, 2, 0); - GenLevelScreen_Label(s, 3, 40); + GenLevelScreen_Make(s, 0, -80, World.Width); + GenLevelScreen_Make(s, 1, -40, World.Height); + GenLevelScreen_Make(s, 2, 0, World.Length); + GenLevelScreen_Make(s, 3, 40, 0); Menu_Label(s, 8, &s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -130); @@ -1262,25 +1260,22 @@ static bool SaveLevelScreen_KeyDown(void* screen, Key key) { static void SaveLevelScreen_ContextRecreated(void* screen) { struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; - struct MenuInputDesc desc; - MenuInput_Path(desc); - SaveLevelScreen_UpdateSave(s); SaveLevelScreen_UpdateSchem(s); TextWidget_SetConst(&s->mcEdit, "&eCan be imported into MCEdit", &s->textFont); + InputWidget_UpdateText(&s->input.base); ButtonWidget_SetConst(&s->cancel, "Cancel", &s->titleFont); - - Menu_OldInput(s, 4, &s->input, 500, &String_Empty, &s->textFont, &desc, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); } static void SaveLevelScreen_Init(void* screen) { static struct Widget* widgets[6]; struct SaveLevelScreen* s = (struct SaveLevelScreen*)screen; + struct MenuInputDesc desc; s->widgets = widgets; s->numWidgets = Array_Elems(widgets); MenuScreen_Init(s); + MenuInput_Path(desc); Menu_Button(s, 0, &s->save, 300, SaveLevelScreen_Classic, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 20); @@ -1289,6 +1284,8 @@ static void SaveLevelScreen_Init(void* screen) { Menu_Label(s, 2, &s->mcEdit, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 120); Menu_Back(s, 3, &s->cancel, Menu_SwitchPause); + Menu_Input(s, 4, &s->input, 500, &String_Empty, &s->textFont, &desc, + ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30); Menu_Label(s, 5, &s->desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 65); } diff --git a/src/Widgets.c b/src/Widgets.c index c2362b806..681f342f5 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -906,11 +906,18 @@ static char InputWidget_GetLastCol(struct InputWidget* w, int x, int y) { } static void InputWidget_UpdateCaret(struct InputWidget* w) { + static const String caret = String_FromConst("_"); BitmapCol col; String line; char lineBuffer[STRING_SIZE]; struct DrawTextArgs args; int maxChars, lineWidth; char colCode; + + if (!w->caretTex.ID) { + DrawTextArgs_Make(&args, &caret, w->font, true); + Drawer2D_MakeTextTexture(&w->caretTex, &args, 0, 0); + w->caretWidth = (uint16_t)((w->caretTex.Width * 3) / 4); + } maxChars = w->GetMaxLines() * INPUTWIDGET_LEN; if (w->caretPos >= maxChars) w->caretPos = -1; @@ -1142,16 +1149,15 @@ static bool InputWidget_OtherKey(struct InputWidget* w, Key key) { return false; } -static void InputWidget_Init(void* widget) { - struct InputWidget* w = (struct InputWidget*)widget; +void InputWidget_UpdateText(struct InputWidget* w) { int lines = w->GetMaxLines(); - if (lines > 1) { WordWrap_Do(&w->text, w->lines, lines, INPUTWIDGET_LEN); } else { w->lines[0] = w->text; } + Gfx_DeleteTexture(&w->inputTex.ID); InputWidget_CalculateLineSizes(w); w->RemakeTexture(w); InputWidget_UpdateCaret(w); @@ -1163,11 +1169,6 @@ static void InputWidget_Free(void* widget) { Gfx_DeleteTexture(&w->caretTex.ID); } -void InputWidget_UpdateText(struct InputWidget* w) { - Gfx_DeleteTexture(&w->inputTex.ID); - InputWidget_Init(w); -} - static void InputWidget_Reposition(void* widget) { struct InputWidget* w = (struct InputWidget*)widget; int oldX = w->x, oldY = w->y; @@ -1240,31 +1241,6 @@ static bool InputWidget_MouseDown(void* widget, int x, int y, MouseButton button return true; } -CC_NOINLINE static void InputWidget_Create(struct InputWidget* w, FontDesc* font, STRING_REF const String* prefix) { - static const String caret = String_FromConst("_"); - struct DrawTextArgs args; - Size2D size; - Widget_Reset(w); - - w->font = font; - w->prefix = *prefix; - w->caretPos = -1; - w->OnPressedEnter = InputWidget_OnPressedEnter; - w->AllowedChar = InputWidget_AllowedChar; - - DrawTextArgs_Make(&args, &caret, font, true); - Gfx_DeleteTexture(&w->caretTex.ID); /* TODO: AWFUL HACK */ - Drawer2D_MakeTextTexture(&w->caretTex, &args, 0, 0); - w->caretTex.Width = (uint16_t)((w->caretTex.Width * 3) / 4); - w->caretWidth = w->caretTex.Width; - - if (!prefix->length) return; - DrawTextArgs_Make(&args, prefix, font, true); - size = Drawer2D_MeasureText(&args); - w->prefixWidth = size.Width; w->width = size.Width; - w->height = w->lineHeight; -} - /*########################################################################################################################* *-----------------------------------------------------MenuInputDesc-------------------------------------------------------* @@ -1471,14 +1447,16 @@ static bool MenuInputWidget_AllowedChar(void* widget, char c) { static int MenuInputWidget_GetMaxLines(void) { return 1; } static struct WidgetVTABLE MenuInputWidget_VTABLE = { - InputWidget_Init, MenuInputWidget_Render, InputWidget_Free, + Widget_NullFunc, MenuInputWidget_Render, InputWidget_Free, InputWidget_KeyDown, InputWidget_KeyUp, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition }; void MenuInputWidget_Create(struct MenuInputWidget* w, int width, int height, const String* text, FontDesc* font, struct MenuInputDesc* desc) { - InputWidget_Create(&w->base, font, &String_Empty); - w->base.VTABLE = &MenuInputWidget_VTABLE; + Widget_Reset(w); + w->base.VTABLE = &MenuInputWidget_VTABLE; + w->base.font = font; + w->base.caretPos = -1; w->minWidth = width; w->minHeight = height; @@ -1487,20 +1465,22 @@ void MenuInputWidget_Create(struct MenuInputWidget* w, int width, int height, co w->base.convertPercents = false; w->base.padding = 3; w->base.lineHeight = Drawer2D_FontHeight(font, false); + + w->base.GetMaxLines = MenuInputWidget_GetMaxLines; + w->base.RemakeTexture = MenuInputWidget_RemakeTexture; + w->base.OnPressedEnter = InputWidget_OnPressedEnter; + w->base.AllowedChar = MenuInputWidget_AllowedChar; + String_InitArray(w->base.text, w->_textBuffer); - - w->base.GetMaxLines = MenuInputWidget_GetMaxLines; - w->base.RemakeTexture = MenuInputWidget_RemakeTexture; - w->base.AllowedChar = MenuInputWidget_AllowedChar; - - Elem_Init(&w->base); - InputWidget_AppendString(&w->base, text); + String_Copy(&w->base.text, text); } /*########################################################################################################################* *-----------------------------------------------------ChatInputWidget-----------------------------------------------------* *#########################################################################################################################*/ +static const String chatInputPrefix = String_FromConst("> "); + static void ChatInputWidget_RemakeTexture(void* widget) { String line; char lineBuffer[STRING_SIZE + 2]; struct InputWidget* w = (struct InputWidget*)widget; @@ -1520,11 +1500,8 @@ static void ChatInputWidget_RemakeTexture(void* widget) { if (!size.Height) size.Height = w->lineHeight; Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height); - DrawTextArgs_MakeEmpty(&args, w->font, true); - if (w->prefix.length) { - args.text = w->prefix; - Drawer2D_DrawText(&bmp, &args, 0, 0); - } + DrawTextArgs_Make(&args, &chatInputPrefix, w->font, true); + Drawer2D_DrawText(&bmp, &args, 0, 0); String_InitArray(line, lineBuffer); for (i = 0, y = 0; i < Array_Elems(w->lines); i++) { @@ -1729,28 +1706,34 @@ static int ChatInputWidget_GetMaxLines(void) { } static struct WidgetVTABLE ChatInputWidget_VTABLE = { - InputWidget_Init, ChatInputWidget_Render, InputWidget_Free, + Widget_NullFunc, ChatInputWidget_Render, InputWidget_Free, ChatInputWidget_KeyDown, InputWidget_KeyUp, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition }; void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font) { - static const String prefix = String_FromConst("> "); - - InputWidget_Create(&w->base, font, &prefix); + struct DrawTextArgs args; + Widget_Reset(w); w->typingLogPos = Chat_InputLog.count; /* Index of newest entry + 1. */ w->base.VTABLE = &ChatInputWidget_VTABLE; + w->base.font = font; + w->base.caretPos = -1; w->base.convertPercents = !Game_ClassicMode; w->base.showCaret = true; w->base.padding = 5; w->base.lineHeight = Drawer2D_FontHeight(font, true); + w->base.GetMaxLines = ChatInputWidget_GetMaxLines; w->base.RemakeTexture = ChatInputWidget_RemakeTexture; w->base.OnPressedEnter = ChatInputWidget_OnPressedEnter; + w->base.AllowedChar = InputWidget_AllowedChar; String_InitArray(w->base.text, w->_textBuffer); String_InitArray(w->origStr, w->_origBuffer); + + DrawTextArgs_Make(&args, &chatInputPrefix, font, true); + w->base.prefixWidth = Drawer2D_TextWidth(&args); } diff --git a/src/Widgets.h b/src/Widgets.h index f1030c773..4dfc39651 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -110,7 +110,6 @@ struct InputWidget { int lineWidths[INPUTWIDGET_MAX_LINES]; /* Width of each line in pixels */ int lineHeight; struct Texture inputTex; - String prefix; int prefixWidth; bool convertPercents; From b95834a340f91c1a56b00a88f057d0c1f2c18eab Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 19:15:55 +1000 Subject: [PATCH 23/46] Control menus appear, redesign overlays to use new init/contextrecreated stuff --- src/Gui.c | 7 +- src/Gui.h | 2 + src/Menus.c | 316 +++++++++++++++++++++++--------------------------- src/Menus.h | 12 +- src/Program.c | 4 +- 5 files changed, 158 insertions(+), 183 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 117084327..cc5baf278 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -193,9 +193,10 @@ void Gui_RefreshAll(void) { Gui_ContextRecreated(NULL); } -void Gui_RefreshHud(void) { - Gui_HUD->VTABLE->ContextLost(Gui_HUD); - Gui_HUD->VTABLE->ContextRecreated(Gui_HUD); +void Gui_RefreshHud(void) { Gui_Refresh(Gui_HUD); } +void Gui_Refresh(struct Screen* s) { + s->VTABLE->ContextLost(s); + s->VTABLE->ContextRecreated(s); } int Gui_Index(struct Screen* s) { diff --git a/src/Gui.h b/src/Gui.h index b16f57c17..c8094924b 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -157,6 +157,8 @@ struct Screen* Gui_GetClosable(void); void Gui_RefreshAll(void); void Gui_RefreshHud(void); +void Gui_Refresh(struct Screen* s); + /* 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/Menus.c b/src/Menus.c index e1e0227ad..3b2c1bd6a 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -229,12 +229,12 @@ static void Menu_SwitchOptions(void* a, void* b) { OptionsGroupScreen_Sho static void Menu_SwitchPause(void* a, void* b) { PauseScreen_Show(); } static void Menu_SwitchClassicOptions(void* a, void* b) { Menu_ReplaceActive(ClassicOptionsScreen_MakeInstance()); } -static void Menu_SwitchKeysClassic(void* a, void* b) { Menu_ReplaceActive(ClassicKeyBindingsScreen_MakeInstance()); } -static void Menu_SwitchKeysClassicHacks(void* a, void* b) { Menu_ReplaceActive(ClassicHacksKeyBindingsScreen_MakeInstance()); } -static void Menu_SwitchKeysNormal(void* a, void* b) { Menu_ReplaceActive(NormalKeyBindingsScreen_MakeInstance()); } -static void Menu_SwitchKeysHacks(void* a, void* b) { Menu_ReplaceActive(HacksKeyBindingsScreen_MakeInstance()); } -static void Menu_SwitchKeysOther(void* a, void* b) { Menu_ReplaceActive(OtherKeyBindingsScreen_MakeInstance()); } -static void Menu_SwitchKeysMouse(void* a, void* b) { Menu_ReplaceActive(MouseKeyBindingsScreen_MakeInstance()); } +static void Menu_SwitchKeysClassic(void* a, void* b) { ClassicKeyBindingsScreen_Show(); } +static void Menu_SwitchKeysClassicHacks(void* a, void* b) { ClassicHacksKeyBindingsScreen_Show(); } +static void Menu_SwitchKeysNormal(void* a, void* b) { NormalKeyBindingsScreen_Show(); } +static void Menu_SwitchKeysHacks(void* a, void* b) { HacksKeyBindingsScreen_Show(); } +static void Menu_SwitchKeysOther(void* a, void* b) { OtherKeyBindingsScreen_Show(); } +static void Menu_SwitchKeysMouse(void* a, void* b) { MouseKeyBindingsScreen_Show(); } static void Menu_SwitchMisc(void* a, void* b) { Menu_ReplaceActive(MiscOptionsScreen_MakeInstance()); } static void Menu_SwitchGui(void* a, void* b) { Menu_ReplaceActive(GuiOptionsScreen_MakeInstance()); } @@ -1679,13 +1679,13 @@ static void ClassicKeyBindingsScreen_ContextRecreated(void* screen) { } } -struct Screen* ClassicKeyBindingsScreen_MakeInstance(void) { +void ClassicKeyBindingsScreen_Show(void) { static uint8_t binds[10] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN }; static const char* descs[10] = { "Forward", "Back", "Jump", "Chat", "Save loc", "Left", "Right", "Build", "Toggle fog", "Load loc" }; struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, ClassicKeyBindingsScreen_ContextRecreated); if (Game_ClassicHacks) s->rightPage = Menu_SwitchKeysClassicHacks; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1697,13 +1697,13 @@ static void ClassicHacksKeyBindingsScreen_ContextRecreated(void* screen) { KeyBindingsScreen_MakeWidgets(s, -90, -40, 3, "Hacks controls", 260); } -struct Screen* ClassicHacksKeyBindingsScreen_MakeInstance(void) { +void ClassicHacksKeyBindingsScreen_Show(void) { static uint8_t binds[6] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN }; static const char* descs[6] = { "Speed", "Noclip", "Half speed", "Fly", "Fly up", "Fly down" }; struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, ClassicHacksKeyBindingsScreen_ContextRecreated); s->leftPage = Menu_SwitchKeysClassic; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1715,13 +1715,13 @@ static void NormalKeyBindingsScreen_ContextRecreated(void* screen) { KeyBindingsScreen_MakeWidgets(s, -140, 10, 6, "Normal controls", 260); } -struct Screen* NormalKeyBindingsScreen_MakeInstance(void) { +void NormalKeyBindingsScreen_Show(void) { static uint8_t binds[12] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_PLAYER_LIST, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN, KEYBIND_SEND_CHAT }; static const char* descs[12] = { "Forward", "Back", "Jump", "Chat", "Set spawn", "Player list", "Left", "Right", "Inventory", "Toggle fog", "Respawn", "Send chat" }; struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, NormalKeyBindingsScreen_ContextRecreated); s->rightPage = Menu_SwitchKeysHacks; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1733,14 +1733,14 @@ static void HacksKeyBindingsScreen_ContextRecreated(void* screen) { KeyBindingsScreen_MakeWidgets(s, -40, 10, 4, "Hacks controls", 260); } -struct Screen* HacksKeyBindingsScreen_MakeInstance(void) { +void HacksKeyBindingsScreen_Show(void) { static uint8_t binds[8] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_ZOOM_SCROLL, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN, KEYBIND_THIRD_PERSON }; static const char* descs[8] = { "Speed", "Noclip", "Half speed", "Scroll zoom", "Fly", "Fly up", "Fly down", "Third person" }; struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, HacksKeyBindingsScreen_ContextRecreated); s->leftPage = Menu_SwitchKeysNormal; s->rightPage = Menu_SwitchKeysOther; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1752,14 +1752,14 @@ static void OtherKeyBindingsScreen_ContextRecreated(void* screen) { KeyBindingsScreen_MakeWidgets(s, -140, 10, 6, "Other controls", 260); } -struct Screen* OtherKeyBindingsScreen_MakeInstance(void) { +void OtherKeyBindingsScreen_Show(void) { static uint8_t binds[12] = { KEYBIND_EXT_INPUT, KEYBIND_HIDE_FPS, KEYBIND_HIDE_GUI, KEYBIND_HOTBAR_SWITCH, KEYBIND_DROP_BLOCK,KEYBIND_SCREENSHOT, KEYBIND_FULLSCREEN, KEYBIND_AXIS_LINES, KEYBIND_AUTOROTATE, KEYBIND_SMOOTH_CAMERA, KEYBIND_IDOVERLAY, KEYBIND_BREAK_LIQUIDS }; static const char* descs[12] = { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching", "Drop block", "Screenshot", "Fullscreen", "Show axis lines", "Auto-rotate", "Smooth camera", "ID overlay", "Breakable liquids" }; struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, OtherKeyBindingsScreen_ContextRecreated); s->leftPage = Menu_SwitchKeysHacks; s->rightPage = Menu_SwitchKeysMouse; - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -1776,14 +1776,14 @@ static void MouseKeyBindingsScreen_ContextRecreated(void* screen) { ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } -struct Screen* MouseKeyBindingsScreen_MakeInstance(void) { +void MouseKeyBindingsScreen_Show(void) { static uint8_t binds[3] = { KEYBIND_MOUSE_LEFT, KEYBIND_MOUSE_MIDDLE, KEYBIND_MOUSE_RIGHT }; static const char* descs[3] = { "Left", "Middle", "Right" }; struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, MouseKeyBindingsScreen_ContextRecreated); s->leftPage = Menu_SwitchKeysOther; s->numWidgets++; /* Extra text widget for 'right click' message */ - return (struct Screen*)s; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -2788,47 +2788,33 @@ struct Screen* NostalgiaScreen_MakeInstance(void) { /*########################################################################################################################* *---------------------------------------------------------Overlay---------------------------------------------------------* *#########################################################################################################################*/ -static void Overlay_Free(void* screen) { - MenuScreen_Free(screen); - Gui_RemoveOverlay(screen); -} - static bool Overlay_KeyDown(void* screen, Key key) { return true; } -static void Overlay_MakeLabels(void* menu, struct TextWidget* labels, const String* lines) { +static void Overlay_MakeLabels(void* menu, struct TextWidget* labels) { struct MenuScreen* s = (struct MenuScreen*)menu; PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); int i; - Menu_OldLabel(s, 0, &labels[0], &lines[0], &s->titleFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -120); + Menu_Label(s, 0, &labels[0], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -120); for (i = 1; i < 4; i++) { - if (!lines[i].length) continue; - - Menu_OldLabel(s, i, &labels[i], &lines[i], &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -70 + 20 * i); + Menu_Label(s, i, &labels[i], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -70 + 20 * i); labels[i].col = col; } } -static void WarningOverlay_MakeButtons(void* menu, struct ButtonWidget* btns, bool always, Widget_LeftClick yesClick, Widget_LeftClick noClick) { - static const String yes = String_FromConst("Yes"); - static const String no = String_FromConst("No"); - static const String alwaysYes = String_FromConst("Always yes"); - static const String alwaysNo = String_FromConst("Always no"); - - struct MenuScreen* s = (struct MenuScreen*)menu; - Menu_OldButton(s, 4, &btns[0], 160, &yes, &s->titleFont, yesClick, +static void Overlay_MakeMainButtons(void* s, struct ButtonWidget* btns) { + Menu_Button(s, 4, &btns[0], 160, NULL, ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 30); - Menu_OldButton(s, 5, &btns[1], 160, &no, &s->titleFont, noClick, + Menu_Button(s, 5, &btns[1], 160, NULL, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 30); - - if (!always) return; - Menu_OldButton(s, 6, &btns[2], 160, &alwaysYes, &s->titleFont, yesClick, +} +static void Overlay_MakeExtraButtons(void* s, struct ButtonWidget* btns) { + Menu_Button(s, 6, &btns[2], 160, NULL, ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 85); - Menu_OldButton(s, 7, &btns[3], 160, &alwaysNo, &s->titleFont, noClick, + Menu_Button(s, 7, &btns[3], 160, NULL, ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 85); } + static bool WarningOverlay_IsAlways(void* screen, void* w) { return Menu_Index(screen, w) >= 6; } @@ -2976,7 +2962,7 @@ static bool TexIdsOverlay_KeyPress(void* screen, char keyChar) { return false; } static bool TexIdsOverlay_KeyUp(void* screen, Key key) { return false; } static struct ScreenVTABLE TexIdsOverlay_VTABLE = { - TexIdsOverlay_Init, TexIdsOverlay_Render, Overlay_Free, + TexIdsOverlay_Init, TexIdsOverlay_Render, MenuScreen_Free, TexIdsOverlay_KeyDown, TexIdsOverlay_KeyUp, TexIdsOverlay_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated @@ -3000,7 +2986,6 @@ void TexIdsOverlay_Show(void) { *#########################################################################################################################*/ static struct UrlWarningOverlay { MenuScreen_Layout - bool openingUrl; String url; struct ButtonWidget buttons[2]; struct TextWidget labels[4]; @@ -3009,60 +2994,55 @@ static struct UrlWarningOverlay { static void UrlWarningOverlay_OpenUrl(void* screen, void* b) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; - if (s->openingUrl) return; - /* On windows, Process_StartOpen may end up calling our window procedure. */ - /* If a mouse click message is delivered (e.g. user spam clicking), then */ - /* UrlWarningOverlay_OpenUrl ends up getting called multiple times. */ - /* This will cause a crash as Elem_Free gets called multiple times. */ - /* (which attempts to unregister event handlers multiple times) */ - - s->openingUrl = true; Process_StartOpen(&s->url); - s->openingUrl = false; - Elem_Free(s); + Gui_Remove((struct Screen*)s); } static void UrlWarningOverlay_AppendUrl(void* screen, void* b) { struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; if (Gui_ClickableChat) HUDScreen_AppendInput(&s->url); - Elem_Free(s); + Gui_Remove((struct Screen*)s); } static void UrlWarningOverlay_ContextRecreated(void* screen) { - static String lines[4] = { - String_FromConst("&eAre you sure you want to open this link?"), - String_FromConst(""), - String_FromConst("Be careful - links from strangers may be websites that"), - String_FromConst(" have viruses, or things you may not want to open/see."), - }; - struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; - lines[1] = s->url; - Overlay_MakeLabels(s, s->labels, lines); + TextWidget_SetConst(&s->labels[0], "&eAre you sure you want to open this link?", &s->titleFont); + TextWidget_Set(&s->labels[1], &s->url, &s->textFont); + TextWidget_SetConst(&s->labels[2], "Be careful - links from strangers may be websites that", &s->textFont); + TextWidget_SetConst(&s->labels[3], " have viruses, or things you may not want to open/see.", &s->textFont); - WarningOverlay_MakeButtons((struct MenuScreen*)s, s->buttons, false, - UrlWarningOverlay_OpenUrl, UrlWarningOverlay_AppendUrl); + ButtonWidget_SetConst(&s->buttons[0], "Yes", &s->titleFont); + ButtonWidget_SetConst(&s->buttons[1], "No", &s->titleFont); +} + +static void UrlWarningOverlay_Init(void* screen) { + static struct Widget* widgets[6]; + struct UrlWarningOverlay* s = (struct UrlWarningOverlay*)screen; + + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + MenuScreen_Init(screen); + + Overlay_MakeLabels(s, s->labels); + Overlay_MakeMainButtons(s, s->buttons); + s->buttons[0].MenuClick = UrlWarningOverlay_OpenUrl; + s->buttons[1].MenuClick = UrlWarningOverlay_AppendUrl; } static struct ScreenVTABLE UrlWarningOverlay_VTABLE = { - MenuScreen_Init, MenuScreen_Render, Overlay_Free, - Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, UrlWarningOverlay_ContextRecreated + UrlWarningOverlay_Init, MenuScreen_Render, MenuScreen_Free, + Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, + Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Menu_OnResize, Menu_ContextLost, UrlWarningOverlay_ContextRecreated }; void UrlWarningOverlay_Show(const String* url) { - static struct Widget* widgets[6]; struct UrlWarningOverlay* s = &UrlWarningOverlay_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); + s->VTABLE = &UrlWarningOverlay_VTABLE; String_InitArray(s->url, s->_urlBuffer); String_Copy(&s->url, url); - - s->VTABLE = &UrlWarningOverlay_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_URLWARNING); } @@ -3072,9 +3052,9 @@ void UrlWarningOverlay_Show(const String* url) { *#########################################################################################################################*/ static struct TexPackOverlay { MenuScreen_Layout - bool showingDeny, alwaysDeny; + bool deny, alwaysDeny; uint32_t contentLength; - String identifier; + String url, identifier; struct ButtonWidget buttons[4]; struct TextWidget labels[4]; char _identifierBuffer[STRING_SIZE + 4]; @@ -3082,37 +3062,61 @@ static struct TexPackOverlay { static void TexPackOverlay_YesClick(void* screen, void* widget) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; - String url = String_UNSAFE_SubstringAt(&s->identifier, 3); - - World_ApplyTexturePack(&url); - if (WarningOverlay_IsAlways(s, widget)) TextureCache_Accept(&url); - Elem_Free(s); + World_ApplyTexturePack(&s->url); + if (WarningOverlay_IsAlways(s, widget)) TextureCache_Accept(&s->url); + Gui_Remove((struct Screen*)s); } static void TexPackOverlay_NoClick(void* screen, void* widget) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; - s->alwaysDeny = WarningOverlay_IsAlways(s, widget); - s->showingDeny = true; - - s->VTABLE->ContextLost(s); - s->VTABLE->ContextRecreated(s); + s->alwaysDeny = WarningOverlay_IsAlways(s, widget); + s->deny = true; + Gui_Refresh((struct Screen*)s); } static void TexPackOverlay_ConfirmNoClick(void* screen, void* b) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; - String url; - - url = String_UNSAFE_SubstringAt(&s->identifier, 3); - if (s->alwaysDeny) TextureCache_Deny(&url); - Elem_Free(s); + if (s->alwaysDeny) TextureCache_Deny(&s->url); + Gui_Remove((struct Screen*)s); } static void TexPackOverlay_GoBackClick(void* screen, void* b) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; - s->showingDeny = false; + s->deny = false; + Gui_Refresh((struct Screen*)s); +} - s->VTABLE->ContextLost(s); - s->VTABLE->ContextRecreated(s); +static void TexPackOverlay_UpdateLine2(struct TexPackOverlay* s) { + static const String https = String_FromConst("https://"); + static const String http = String_FromConst("http://"); + String url = String_Empty; + + if (!s->deny) { + url = s->url; + if (String_CaselessStarts(&url, &https)) { + url = String_UNSAFE_SubstringAt(&url, https.length); + } + if (String_CaselessStarts(&url, &http)) { + url = String_UNSAFE_SubstringAt(&url, http.length); + } + } + TextWidget_Set(&s->labels[2], &url, &s->textFont); +} + +static void TexPackOverlay_UpdateLine3(struct TexPackOverlay* s) { + String contents; char contentsBuffer[STRING_SIZE]; + float contentLengthMB; + + if (s->deny) { + TextWidget_SetConst(&s->labels[3], "Sure you don't want to download the texture pack?", &s->textFont); + } else if (s->contentLength) { + String_InitArray(contents, contentsBuffer); + contentLengthMB = s->contentLength / (1024.0f * 1024.0f); + String_Format1(&contents, "Download size: %f3 MB", &contentLengthMB); + TextWidget_Set(&s->labels[3], &contents, &s->textFont); + } else { + TextWidget_SetConst(&s->labels[3], "Download size: Determining...", &s->textFont); + } } static void TexPackOverlay_Render(void* screen, double delta) { @@ -3122,95 +3126,63 @@ static void TexPackOverlay_Render(void* screen, double delta) { MenuScreen_Render(s, delta); if (!Http_GetResult(&s->identifier, &item)) return; s->contentLength = item.ContentLength; - - if (!s->contentLength || Gfx.LostContext) return; - s->VTABLE->ContextLost(s); - s->VTABLE->ContextRecreated(s); -} - -static void TexPackOverlay_MakeNormalElements(struct TexPackOverlay* s) { - static String lines[4] = { - String_FromConst("Do you want to download the server's texture pack?"), - String_FromConst("Texture pack url:"), - String_FromConst(""), - String_FromConst(""), - }; - static const String defCL = String_FromConst("Download size: Determining..."); - static const String https = String_FromConst("https://"); - static const String http = String_FromConst("http://"); - String contents; char contentsBuffer[STRING_SIZE]; - float contentLengthMB; - String url; - - url = String_UNSAFE_SubstringAt(&s->identifier, 3); - if (String_CaselessStarts(&url, &https)) { - url = String_UNSAFE_SubstringAt(&url, https.length); - } - if (String_CaselessStarts(&url, &http)) { - url = String_UNSAFE_SubstringAt(&url, http.length); - } - - lines[2] = url; - if (s->contentLength) { - String_InitArray(contents, contentsBuffer); - contentLengthMB = s->contentLength / (1024.0f * 1024.0f); - String_Format1(&contents, "Download size: %f3 MB", &contentLengthMB); - lines[3] = contents; - } else { lines[3] = defCL; } - - Overlay_MakeLabels(s, s->labels, lines); - WarningOverlay_MakeButtons((struct MenuScreen*)s, s->buttons, true, - TexPackOverlay_YesClick, TexPackOverlay_NoClick); -} - -static void TexPackOverlay_MakeDenyElements(struct TexPackOverlay* s) { - static String lines[4] = { - String_FromConst("&eYou might be missing out."), - String_FromConst("Texture packs can play a vital role in the look and feel of maps."), - String_FromConst(""), - String_FromConst("Sure you don't want to download the texture pack?") - }; - static const String imSure = String_FromConst("I'm sure"); - static const String goBack = String_FromConst("Go back"); - Overlay_MakeLabels(s, s->labels, lines); - - Menu_OldButton(s, 4, &s->buttons[0], 160, &imSure, &s->titleFont, TexPackOverlay_ConfirmNoClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 30); - Menu_OldButton(s, 5, &s->buttons[1], 160, &goBack, &s->titleFont, TexPackOverlay_GoBackClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, 110, 30); + TexPackOverlay_UpdateLine3(s); } static void TexPackOverlay_ContextRecreated(void* screen) { struct TexPackOverlay* s = (struct TexPackOverlay*)screen; - if (s->showingDeny) { - TexPackOverlay_MakeDenyElements(s); - } else { - TexPackOverlay_MakeNormalElements(s); + TextWidget_SetConst(&s->labels[0], s->deny ? "&eYou might be missing out." + : "Do you want to download the server's texture pack?", &s->titleFont); + TextWidget_SetConst(&s->labels[1], !s->deny ? "Texture pack url:" + : "Texture packs can play a vital role in the look and feel of maps.", &s->textFont); + TexPackOverlay_UpdateLine2(s); + TexPackOverlay_UpdateLine3(s); + + ButtonWidget_SetConst(&s->buttons[0], s->deny ? "I'm sure" : "Yes", &s->titleFont); + ButtonWidget_SetConst(&s->buttons[1], s->deny ? "Go back" : "No", &s->titleFont); + s->buttons[0].MenuClick = s->deny ? TexPackOverlay_ConfirmNoClick : TexPackOverlay_YesClick; + s->buttons[1].MenuClick = s->deny ? TexPackOverlay_GoBackClick : TexPackOverlay_NoClick; + + if (!s->deny) { + ButtonWidget_SetConst(&s->buttons[2], "Always yes", &s->titleFont); + ButtonWidget_SetConst(&s->buttons[3], "Always no", &s->titleFont); + s->buttons[2].MenuClick = TexPackOverlay_YesClick; + s->buttons[3].MenuClick = TexPackOverlay_NoClick; } - s->numWidgets = s->showingDeny ? 6 : 8; + s->numWidgets = s->deny ? 6 : 8; +} + +static void TexPackOverlay_Init(void* screen) { + static struct Widget* widgets[8]; + struct TexPackOverlay* s = (struct TexPackOverlay*)screen; + + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + MenuScreen_Init(screen); + + s->contentLength = 0; + s->deny = false; + Overlay_MakeLabels(s, s->labels); + Overlay_MakeMainButtons(s, s->buttons); + Overlay_MakeExtraButtons(s, s->buttons); } static struct ScreenVTABLE TexPackOverlay_VTABLE = { - MenuScreen_Init, TexPackOverlay_Render, Overlay_Free, - Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, TexPackOverlay_ContextRecreated + TexPackOverlay_Init, TexPackOverlay_Render, MenuScreen_Free, + Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, + Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Menu_OnResize, Menu_ContextLost, TexPackOverlay_ContextRecreated }; void TexPackOverlay_Show(const String* url) { - static struct Widget* widgets[8]; struct TexPackOverlay* s = &TexPackOverlay_Instance; - - s->showingDeny = false; - s->grabsInput = true; - s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); - + s->grabsInput = true; + s->closable = true; + s->VTABLE = &TexPackOverlay_VTABLE; + String_InitArray(s->identifier, s->_identifierBuffer); String_Format1(&s->identifier, "CL_%s", url); - s->contentLength = 0; + s->url = String_UNSAFE_SubstringAt(&s->identifier, 3); Http_AsyncGetHeaders(url, true, &s->identifier); - s->VTABLE = &TexPackOverlay_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_TEXPACK); } diff --git a/src/Menus.h b/src/Menus.h index 0ff13bbfc..0dcca8eb5 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -11,12 +11,12 @@ void PauseScreen_Show(void); void OptionsGroupScreen_Show(void); struct Screen* ClassicOptionsScreen_MakeInstance(void); -struct Screen* ClassicKeyBindingsScreen_MakeInstance(void); -struct Screen* ClassicHacksKeyBindingsScreen_MakeInstance(void); -struct Screen* NormalKeyBindingsScreen_MakeInstance(void); -struct Screen* HacksKeyBindingsScreen_MakeInstance(void); -struct Screen* OtherKeyBindingsScreen_MakeInstance(void); -struct Screen* MouseKeyBindingsScreen_MakeInstance(void); +void ClassicKeyBindingsScreen_Show(void); +void ClassicHacksKeyBindingsScreen_Show(void); +void NormalKeyBindingsScreen_Show(void); +void HacksKeyBindingsScreen_Show(void); +void OtherKeyBindingsScreen_Show(void); +void MouseKeyBindingsScreen_Show(void); void GenLevelScreen_Show(void); void ClassicGenScreen_Show(void); diff --git a/src/Program.c b/src/Program.c index 0b68ee9e3..e7b57ff0b 100644 --- a/src/Program.c +++ b/src/Program.c @@ -105,8 +105,8 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ - /* String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); */ - String rawArgs = String_FromConst("UnknownShadow200"); + String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + //String rawArgs = String_FromConst("UnknownShadow200"); argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); if (argsCount == 0) { From b210c140e49bedc54eb6e9f8d4d4e6e2426cb07b Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 20:40:37 +1000 Subject: [PATCH 24/46] Fix 'accepting new key' getting reset on window resize keybindings is rewritten to separate init/contextrecreated --- src/Menus.c | 279 ++++++++++++++++++++++++---------------------------- 1 file changed, 129 insertions(+), 150 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 3b2c1bd6a..fa8be6b7c 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1518,107 +1518,57 @@ void LoadLevelScreen_Show(void) { /*########################################################################################################################* *---------------------------------------------------KeyBindingsScreen-----------------------------------------------------* *#########################################################################################################################*/ +struct KeyBindingsScreen; +typedef void (*InitKeyBindings)(struct KeyBindingsScreen* s); + static struct KeyBindingsScreen { MenuScreen_Layout int curI, bindsCount; const char** descs; - uint8_t* binds; + const uint8_t* binds; Widget_LeftClick leftPage, rightPage; - struct TextWidget title; + InitKeyBindings DoInit; + const char* titleText; + const char* msgText; + struct TextWidget title, msg; struct ButtonWidget back, left, right; struct ButtonWidget buttons[12]; } KeyBindingsScreen_Instance; -static void KeyBindingsScreen_GetText(struct KeyBindingsScreen* s, int i, String* text) { - Key key = KeyBinds[s->binds[i]]; - String_Format2(text, "%c: %c", s->descs[i], Key_Names[key]); +static void KeyBindingsScreen_Update(struct KeyBindingsScreen* s, int i) { + String text; char textBuffer[STRING_SIZE]; + String_InitArray(text, textBuffer); + + String_Format2(&text, s->curI == i ? "> %c: %c <" : "%c: %c", + s->descs[i], Key_Names[KeyBinds[s->binds[i]]]); + ButtonWidget_Set(&s->buttons[i], &text, &s->titleFont); } static void KeyBindingsScreen_OnBindingClick(void* screen, void* widget) { - String text; char textBuffer[STRING_SIZE]; struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - struct ButtonWidget* btn = (struct ButtonWidget*)widget; - struct ButtonWidget* cur; - - String_InitArray(text, textBuffer); - /* previously selected a different button for binding */ - if (s->curI >= 0) { - KeyBindingsScreen_GetText(s, s->curI, &text); - cur = (struct ButtonWidget*)s->widgets[s->curI]; - ButtonWidget_Set(cur, &text, &s->titleFont); - } - s->curI = Menu_Index(s, btn); + int old = s->curI; + s->curI = Menu_Index(s, widget); s->closable = false; - text.length = 0; - String_AppendConst(&text, "> "); - KeyBindingsScreen_GetText(s, s->curI, &text); - String_AppendConst(&text, " <"); - ButtonWidget_Set(btn, &text, &s->titleFont); -} - -static int KeyBindingsScreen_MakeWidgets(struct KeyBindingsScreen* s, int y, int arrowsY, int leftLength, const char* title, int btnWidth) { - static const String lArrow = String_FromConst("<"); - static const String rArrow = String_FromConst(">"); - String text; char textBuffer[STRING_SIZE]; - String titleText; - Widget_LeftClick backClick; - int origin, xOffset; - int i, xDir; - - origin = y; - xOffset = btnWidth / 2 + 5; - s->curI = -1; - String_InitArray(text, textBuffer); - - for (i = 0; i < s->bindsCount; i++) { - if (i == leftLength) y = origin; /* reset y for next column */ - xDir = leftLength == -1 ? 0 : (i < leftLength ? -1 : 1); - - text.length = 0; - KeyBindingsScreen_GetText(s, i, &text); - - Menu_OldButton(s, i, &s->buttons[i], btnWidth, &text, &s->titleFont, KeyBindingsScreen_OnBindingClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, xDir * xOffset, y); - y += 50; /* distance between buttons */ - } - - titleText = String_FromReadonly(title); - Menu_OldLabel(s, i, &s->title, &titleText, &s->titleFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -180); i++; - - backClick = Gui_ClassicMenu ? Menu_SwitchClassicOptions : Menu_SwitchOptions; - Menu_OldBack(s, i, &s->back, "Done", &s->titleFont, backClick); i++; - if (!s->leftPage && !s->rightPage) return i; - - Menu_OldButton(s, i, &s->left, 40, &lArrow, &s->titleFont, s->leftPage, - ANCHOR_CENTRE, ANCHOR_CENTRE, -btnWidth - 35, arrowsY); i++; - Menu_OldButton(s, i, &s->right, 40, &rArrow, &s->titleFont, s->rightPage, - ANCHOR_CENTRE, ANCHOR_CENTRE, btnWidth + 35, arrowsY); i++; - - s->left.disabled = !s->leftPage; - s->right.disabled = !s->rightPage; - return i; + KeyBindingsScreen_Update(s, s->curI); + /* previously selected a different button for binding */ + if (old >= 0) KeyBindingsScreen_Update(s, old); } static bool KeyBindingsScreen_KeyDown(void* screen, Key key) { - String text; char textBuffer[STRING_SIZE]; struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - struct ButtonWidget* cur; KeyBind bind; + int idx; if (s->curI == -1) return MenuScreen_KeyDown(s, key); bind = s->binds[s->curI]; if (key == KEY_ESCAPE) key = KeyBind_Defaults[bind]; - KeyBind_Set(bind, key); - String_InitArray(text, textBuffer); - KeyBindingsScreen_GetText(s, s->curI, &text); - cur = (struct ButtonWidget*)s->widgets[s->curI]; - ButtonWidget_Set(cur, &text, &s->titleFont); + idx = s->curI; s->curI = -1; s->closable = true; + KeyBindingsScreen_Update(s, idx); return true; } @@ -1638,152 +1588,181 @@ static bool KeyBindingsScreen_MouseDown(void* screen, int x, int y, MouseButton return true; } +static void KeyBindingsScreen_ContextRecreated(void* screen) { + struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; + int i; + for (i = 0; i < s->bindsCount; i++) { + KeyBindingsScreen_Update(s, i); + } + + TextWidget_SetConst(&s->title, s->titleText, &s->titleFont); + TextWidget_SetConst(&s->msg, s->msgText, &s->textFont); + ButtonWidget_SetConst(&s->back, "Done", &s->titleFont); + if (!s->leftPage && !s->rightPage) return; + + ButtonWidget_SetConst(&s->left, "<", &s->titleFont); + ButtonWidget_SetConst(&s->right, ">", &s->titleFont); +} + +static void KeyBindingsScreen_InitWidgets(struct KeyBindingsScreen* s, int y, int arrowsY, int leftLength, int btnWidth, const char* title) { + int origin, xOffset, i, xDir; + origin = y; + xOffset = btnWidth / 2 + 5; + s->titleText = title; + + for (i = 0; i < s->bindsCount; i++) { + if (i == leftLength) y = origin; /* reset y for next column */ + xDir = leftLength == -1 ? 0 : (i < leftLength ? -1 : 1); + + Menu_Button(s, i, &s->buttons[i], btnWidth, KeyBindingsScreen_OnBindingClick, + ANCHOR_CENTRE, ANCHOR_CENTRE, xDir * xOffset, y); + y += 50; /* distance between buttons */ + } + + Menu_Label(s, i, &s->title, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -180); i++; + Menu_Label(s, i, &s->msg, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); i++; + Menu_Back(s, i, &s->back, + Gui_ClassicMenu ? Menu_SwitchClassicOptions : Menu_SwitchOptions); i++; + if (!s->leftPage && !s->rightPage) return; + + Menu_Button(s, i, &s->left, 40, s->leftPage, + ANCHOR_CENTRE, ANCHOR_CENTRE, -btnWidth - 35, arrowsY); i++; + Menu_Button(s, i, &s->right, 40, s->rightPage, + ANCHOR_CENTRE, ANCHOR_CENTRE, btnWidth + 35, arrowsY); i++; + + s->left.disabled = !s->leftPage; + s->right.disabled = !s->rightPage; +} + +static void KeyBindingsScreen_Init(void* screen) { + static struct Widget* widgets[12 + 5]; /* 12 buttons + extra widgets */ + struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; + s->widgets = widgets; + s->numWidgets = s->bindsCount + 5; + s->curI = -1; + + s->leftPage = NULL; + s->rightPage = NULL; + s->titleText = NULL; + s->msgText = ""; + MenuScreen_Init(s); + s->DoInit(s); +} + static struct ScreenVTABLE KeyBindingsScreen_VTABLE = { - MenuScreen_Init, MenuScreen_Render, MenuScreen_Free, + KeyBindingsScreen_Init, MenuScreen_Render, MenuScreen_Free, KeyBindingsScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, KeyBindingsScreen_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, - Menu_OnResize, Menu_ContextLost, NULL + Menu_OnResize, Menu_ContextLost, KeyBindingsScreen_ContextRecreated }; -static struct KeyBindingsScreen* KeyBindingsScreen_Make(int bindsCount, uint8_t* binds, const char** descs, Event_Void_Callback contextRecreated) { - static struct Widget* widgets[12 + 4]; /* 12 buttons + buttons + 2 widgets used by MouseKeyBindings */ +static void KeyBindingsScreen_Show(int bindsCount, const uint8_t* binds, const char** descs, InitKeyBindings doInit) { struct KeyBindingsScreen* s = &KeyBindingsScreen_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = bindsCount + 4; - - s->VTABLE = &KeyBindingsScreen_VTABLE; - s->VTABLE->ContextRecreated = contextRecreated; + s->VTABLE = &KeyBindingsScreen_VTABLE; s->bindsCount = bindsCount; s->binds = binds; s->descs = descs; - - s->curI = -1; - s->leftPage = NULL; - s->rightPage = NULL; - return s; + s->DoInit = doInit; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } /*########################################################################################################################* *-----------------------------------------------ClassicKeyBindingsScreen--------------------------------------------------* *#########################################################################################################################*/ -static void ClassicKeyBindingsScreen_ContextRecreated(void* screen) { - struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; +static void ClassicKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { if (Game_ClassicHacks) { - KeyBindingsScreen_MakeWidgets(s, -140, -40, 5, "Normal controls", 260); + s->rightPage = Menu_SwitchKeysClassicHacks; + KeyBindingsScreen_InitWidgets(s, -140, -40, 5, 260, "Normal controls"); } else { - KeyBindingsScreen_MakeWidgets(s, -140, -40, 5, "Controls", 300); + KeyBindingsScreen_InitWidgets(s, -140, -40, 5, 300, "Controls"); } } void ClassicKeyBindingsScreen_Show(void) { - static uint8_t binds[10] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN }; - static const char* descs[10] = { "Forward", "Back", "Jump", "Chat", "Save loc", "Left", "Right", "Build", "Toggle fog", "Load loc" }; - - struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, ClassicKeyBindingsScreen_ContextRecreated); - if (Game_ClassicHacks) s->rightPage = Menu_SwitchKeysClassicHacks; - Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); + static const uint8_t binds[10] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN }; + static const char* descs[10] = { "Forward", "Back", "Jump", "Chat", "Save loc", "Left", "Right", "Build", "Toggle fog", "Load loc" }; + KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, ClassicKeyBindingsScreen_Init); } /*########################################################################################################################* *--------------------------------------------ClassicHacksKeyBindingsScreen------------------------------------------------* *#########################################################################################################################*/ -static void ClassicHacksKeyBindingsScreen_ContextRecreated(void* screen) { - struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - KeyBindingsScreen_MakeWidgets(s, -90, -40, 3, "Hacks controls", 260); +static void ClassicHacksKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { + s->leftPage = Menu_SwitchKeysClassic; + KeyBindingsScreen_InitWidgets(s, -90, -40, 3, 260, "Hacks controls"); } void ClassicHacksKeyBindingsScreen_Show(void) { - static uint8_t binds[6] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN }; - static const char* descs[6] = { "Speed", "Noclip", "Half speed", "Fly", "Fly up", "Fly down" }; - - struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, ClassicHacksKeyBindingsScreen_ContextRecreated); - s->leftPage = Menu_SwitchKeysClassic; - Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); + static const uint8_t binds[6] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN }; + static const char* descs[6] = { "Speed", "Noclip", "Half speed", "Fly", "Fly up", "Fly down" }; + KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, ClassicHacksKeyBindingsScreen_Init); } /*########################################################################################################################* *-----------------------------------------------NormalKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ -static void NormalKeyBindingsScreen_ContextRecreated(void* screen) { - struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - KeyBindingsScreen_MakeWidgets(s, -140, 10, 6, "Normal controls", 260); +static void NormalKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { + s->rightPage = Menu_SwitchKeysHacks; + KeyBindingsScreen_InitWidgets(s, -140, 10, 6, 250, "Normal controls"); } void NormalKeyBindingsScreen_Show(void) { - static uint8_t binds[12] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_PLAYER_LIST, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN, KEYBIND_SEND_CHAT }; - static const char* descs[12] = { "Forward", "Back", "Jump", "Chat", "Set spawn", "Player list", "Left", "Right", "Inventory", "Toggle fog", "Respawn", "Send chat" }; - - struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, NormalKeyBindingsScreen_ContextRecreated); - s->rightPage = Menu_SwitchKeysHacks; - Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); + static const uint8_t binds[12] = { KEYBIND_FORWARD, KEYBIND_BACK, KEYBIND_JUMP, KEYBIND_CHAT, KEYBIND_SET_SPAWN, KEYBIND_PLAYER_LIST, KEYBIND_LEFT, KEYBIND_RIGHT, KEYBIND_INVENTORY, KEYBIND_FOG, KEYBIND_RESPAWN, KEYBIND_SEND_CHAT }; + static const char* descs[12] = { "Forward", "Back", "Jump", "Chat", "Set spawn", "Player list", "Left", "Right", "Inventory", "Toggle fog", "Respawn", "Send chat" }; + KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, NormalKeyBindingsScreen_Init); } /*########################################################################################################################* *------------------------------------------------HacksKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ -static void HacksKeyBindingsScreen_ContextRecreated(void* screen) { - struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - KeyBindingsScreen_MakeWidgets(s, -40, 10, 4, "Hacks controls", 260); +static void HacksKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { + s->leftPage = Menu_SwitchKeysNormal; + s->rightPage = Menu_SwitchKeysOther; + KeyBindingsScreen_InitWidgets(s, -40, 10, 4, 260, "Hacks controls"); } void HacksKeyBindingsScreen_Show(void) { - static uint8_t binds[8] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_ZOOM_SCROLL, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN, KEYBIND_THIRD_PERSON }; + static const uint8_t binds[8] = { KEYBIND_SPEED, KEYBIND_NOCLIP, KEYBIND_HALF_SPEED, KEYBIND_ZOOM_SCROLL, KEYBIND_FLY, KEYBIND_FLY_UP, KEYBIND_FLY_DOWN, KEYBIND_THIRD_PERSON }; static const char* descs[8] = { "Speed", "Noclip", "Half speed", "Scroll zoom", "Fly", "Fly up", "Fly down", "Third person" }; - - struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, HacksKeyBindingsScreen_ContextRecreated); - s->leftPage = Menu_SwitchKeysNormal; - s->rightPage = Menu_SwitchKeysOther; - Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); + KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, HacksKeyBindingsScreen_Init); } /*########################################################################################################################* *------------------------------------------------OtherKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ -static void OtherKeyBindingsScreen_ContextRecreated(void* screen) { - struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - KeyBindingsScreen_MakeWidgets(s, -140, 10, 6, "Other controls", 260); +static void OtherKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { + s->leftPage = Menu_SwitchKeysHacks; + s->rightPage = Menu_SwitchKeysMouse; + KeyBindingsScreen_InitWidgets(s, -140, 10, 6, 260, "Other controls"); } void OtherKeyBindingsScreen_Show(void) { - static uint8_t binds[12] = { KEYBIND_EXT_INPUT, KEYBIND_HIDE_FPS, KEYBIND_HIDE_GUI, KEYBIND_HOTBAR_SWITCH, KEYBIND_DROP_BLOCK,KEYBIND_SCREENSHOT, KEYBIND_FULLSCREEN, KEYBIND_AXIS_LINES, KEYBIND_AUTOROTATE, KEYBIND_SMOOTH_CAMERA, KEYBIND_IDOVERLAY, KEYBIND_BREAK_LIQUIDS }; - static const char* descs[12] = { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching", "Drop block", "Screenshot", "Fullscreen", "Show axis lines", "Auto-rotate", "Smooth camera", "ID overlay", "Breakable liquids" }; - - struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, OtherKeyBindingsScreen_ContextRecreated); - s->leftPage = Menu_SwitchKeysHacks; - s->rightPage = Menu_SwitchKeysMouse; - Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); + static const uint8_t binds[12] = { KEYBIND_EXT_INPUT, KEYBIND_HIDE_FPS, KEYBIND_HIDE_GUI, KEYBIND_HOTBAR_SWITCH, KEYBIND_DROP_BLOCK,KEYBIND_SCREENSHOT, KEYBIND_FULLSCREEN, KEYBIND_AXIS_LINES, KEYBIND_AUTOROTATE, KEYBIND_SMOOTH_CAMERA, KEYBIND_IDOVERLAY, KEYBIND_BREAK_LIQUIDS }; + static const char* descs[12] = { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching", "Drop block", "Screenshot", "Fullscreen", "Show axis lines", "Auto-rotate", "Smooth camera", "ID overlay", "Breakable liquids" }; + KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, OtherKeyBindingsScreen_Init); } /*########################################################################################################################* *------------------------------------------------MouseKeyBindingsScreen---------------------------------------------------* *#########################################################################################################################*/ -static void MouseKeyBindingsScreen_ContextRecreated(void* screen) { - static const String msg = String_FromConst("&eRight click to remove the key binding"); - struct KeyBindingsScreen* s = (struct KeyBindingsScreen*)screen; - static struct TextWidget text; - - int i = KeyBindingsScreen_MakeWidgets(s, -40, 10, -1, "Mouse key bindings", 260); - Menu_OldLabel(s, i, &text, &msg, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); +static void MouseKeyBindingsScreen_Init(struct KeyBindingsScreen* s) { + s->leftPage = Menu_SwitchKeysOther; + s->msgText = "&eRight click to remove the key binding"; + KeyBindingsScreen_InitWidgets(s, -40, 10, -1, 260, "Mouse key bindings"); } void MouseKeyBindingsScreen_Show(void) { - static uint8_t binds[3] = { KEYBIND_MOUSE_LEFT, KEYBIND_MOUSE_MIDDLE, KEYBIND_MOUSE_RIGHT }; - static const char* descs[3] = { "Left", "Middle", "Right" }; - - struct KeyBindingsScreen* s = KeyBindingsScreen_Make(Array_Elems(binds), binds, descs, MouseKeyBindingsScreen_ContextRecreated); - s->leftPage = Menu_SwitchKeysOther; - s->numWidgets++; /* Extra text widget for 'right click' message */ - Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); + static const uint8_t binds[3] = { KEYBIND_MOUSE_LEFT, KEYBIND_MOUSE_MIDDLE, KEYBIND_MOUSE_RIGHT }; + static const char* descs[3] = { "Left", "Middle", "Right" }; + KeyBindingsScreen_Show(Array_Elems(binds), binds, descs, MouseKeyBindingsScreen_Init); } From 467bac486c77f75da52aa2c5ad5dd49b152785af Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 18 Aug 2019 22:33:52 +1000 Subject: [PATCH 25/46] Make menu options show (Still WIP), redesign PauseScreen to separate init/contextrecreated --- src/Gui.c | 42 +-------------- src/Gui.h | 14 ----- src/InputHandler.c | 1 - src/Menus.c | 128 ++++++++++++++++++++++++--------------------- src/Menus.h | 14 ++--- src/Program.c | 4 +- 6 files changed, 79 insertions(+), 124 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index cc5baf278..f87f93c41 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -20,9 +20,8 @@ GfxResourceID Gui_GuiTex, Gui_GuiClassicTex, Gui_IconsTex; struct Screen* Gui_Status; struct Screen* Gui_HUD; struct Screen* Gui_Active; -struct Screen* Gui_Overlays[GUI_MAX_OVERLAYS]; struct Screen* Gui_Screens[GUI_MAX_SCREENS]; -int Gui_ScreensCount, Gui_OverlaysCount; +int Gui_ScreensCount; static uint8_t priorities[GUI_MAX_SCREENS]; void Widget_SetLocation(void* widget, uint8_t horAnchor, uint8_t verAnchor, int xOffset, int yOffset) { @@ -128,11 +127,7 @@ static void Gui_Init(void) { } static void Gui_Reset(void) { - int i; - for (i = 0; i < Gui_OverlaysCount; i++) { - Elem_TryFree(Gui_Overlays[i]); - } - Gui_OverlaysCount = 0; + /* TODO:Should we reset all screens here.. ? */ } static void Gui_Free(void) { @@ -158,23 +153,12 @@ struct IGameComponent Gui_Component = { }; struct Screen* Gui_GetActiveScreen(void) { - return Gui_OverlaysCount ? Gui_Overlays[0] : Gui_GetUnderlyingScreen(); -} - -struct Screen* Gui_GetUnderlyingScreen(void) { return Gui_Active ? Gui_Active : Gui_HUD; } void Gui_FreeActive(void) { if (Gui_Active) { Elem_TryFree(Gui_Active); } } -void Gui_Close(void* screen) { - struct Screen* s = (struct Screen*)screen; - if (s) { Elem_TryFree(s); } - if (s == Gui_Active) Gui_SetActive(NULL); -} - -void Gui_CloseActive(void) { Gui_Close(Gui_Active); } void Gui_SetActive(struct Screen* screen) { InputHandler_ScreenChanged(Gui_Active, screen); @@ -292,28 +276,6 @@ struct Screen* Gui_GetClosable(void) { return NULL; } -int Gui_IndexOverlay(const void* screen) { - int i; - - for (i = 0; i < Gui_OverlaysCount; i++) { - if (Gui_Overlays[i] == screen) return i; - } - return -1; -} - -void Gui_RemoveOverlay(const void* screen) { - int i = Gui_IndexOverlay(screen); - if (i == -1) return; - - for (; i < Gui_OverlaysCount - 1; i++) { - Gui_Overlays[i] = Gui_Overlays[i + 1]; - } - - Gui_OverlaysCount--; - Gui_Overlays[Gui_OverlaysCount] = NULL; - Camera_CheckFocus(); -} - void Gui_RenderGui(double delta) { struct Screen* s; int i; diff --git a/src/Gui.h b/src/Gui.h index c8094924b..6e69715b4 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -109,11 +109,8 @@ extern struct Screen* Gui_Status; extern struct Screen* Gui_HUD; extern struct Screen* Gui_Active; #define GUI_MAX_SCREENS 10 -#define GUI_MAX_OVERLAYS 4 -extern struct Screen* Gui_Overlays[GUI_MAX_OVERLAYS]; extern struct Screen* Gui_Screens[GUI_MAX_SCREENS]; extern int Gui_ScreensCount; -extern int Gui_OverlaysCount; /* Calculates position of an element on a particular axis */ /* For example, to calculate X position of a text widget on screen */ @@ -123,9 +120,6 @@ bool Gui_Contains(int recX, int recY, int width, int height, int x, int y); /* Gets the screen that the user is currently interacting with. */ /* This means if an overlay is active, it will be over the top of other screens. */ struct Screen* Gui_GetActiveScreen(void); -/* Gets the non-overlay screen that the user is currently interacting with. */ -/* This means if an overlay is active, the screen under it is returned. */ -struct Screen* Gui_GetUnderlyingScreen(void); /* Frees the active screen if it is not NULL. */ /* NOTE: You should usually use Gui_CloseActive instead. */ @@ -133,10 +127,6 @@ CC_NOINLINE void Gui_FreeActive(void); /* Sets the active screen/menu that the user interacts with. */ /* NOTE: This doesn't free old active screen - must call Gui_FreeActive() first */ CC_NOINLINE void Gui_SetActive(struct Screen* screen); -/* Shortcut for Gui_Close(Gui_Active) */ -CC_NOINLINE void Gui_CloseActive(void); -/* Frees the given screen, and if == Gui_Active, calls Gui_SetActive(NULL) */ -CC_NOINLINE void Gui_Close(void* screen); /* Returns index of the given screen in the screens list, -1 if not */ int Gui_Index(struct Screen* screen); @@ -159,10 +149,6 @@ void Gui_RefreshAll(void); void Gui_RefreshHud(void); void Gui_Refresh(struct Screen* s); -/* 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 */ -void Gui_RemoveOverlay(const void* screen); void Gui_RenderGui(double delta); void Gui_OnResize(void); diff --git a/src/InputHandler.c b/src/InputHandler.c index be4f9ebaa..7a775e784 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -172,7 +172,6 @@ static bool InputHandler_HandleNonClassicKey(Key key) { Event_RaiseVoid(&UserEvents.HeldBlockChanged); } } else if (key == KeyBinds[KEYBIND_IDOVERLAY]) { - if (Gui_OverlaysCount) return true; TexIdsOverlay_Show(); } else if (key == KeyBinds[KEYBIND_BREAK_LIQUIDS]) { InputHandler_Toggle(key, &Game_BreakableLiquids, diff --git a/src/Menus.c b/src/Menus.c index fa8be6b7c..fc16c6dd5 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -223,11 +223,10 @@ static void Menu_HandleFontChange(struct Screen* s) { static int Menu_Int(const String* str) { int v; Convert_ParseInt(str, &v); return v; } static float Menu_Float(const String* str) { float v; Convert_ParseFloat(str, &v); return v; } 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) { OptionsGroupScreen_Show(); } static void Menu_SwitchPause(void* a, void* b) { PauseScreen_Show(); } -static void Menu_SwitchClassicOptions(void* a, void* b) { Menu_ReplaceActive(ClassicOptionsScreen_MakeInstance()); } +static void Menu_SwitchClassicOptions(void* a, void* b) { ClassicOptionsScreen_Show(); } static void Menu_SwitchKeysClassic(void* a, void* b) { ClassicKeyBindingsScreen_Show(); } static void Menu_SwitchKeysClassicHacks(void* a, void* b) { ClassicHacksKeyBindingsScreen_Show(); } @@ -236,12 +235,12 @@ static void Menu_SwitchKeysHacks(void* a, void* b) { HacksKeyBindingsScre static void Menu_SwitchKeysOther(void* a, void* b) { OtherKeyBindingsScreen_Show(); } static void Menu_SwitchKeysMouse(void* a, void* b) { MouseKeyBindingsScreen_Show(); } -static void Menu_SwitchMisc(void* a, void* b) { Menu_ReplaceActive(MiscOptionsScreen_MakeInstance()); } -static void Menu_SwitchGui(void* a, void* b) { Menu_ReplaceActive(GuiOptionsScreen_MakeInstance()); } -static void Menu_SwitchGfx(void* a, void* b) { Menu_ReplaceActive(GraphicsOptionsScreen_MakeInstance()); } -static void Menu_SwitchHacks(void* a, void* b) { Menu_ReplaceActive(HacksSettingsScreen_MakeInstance()); } -static void Menu_SwitchEnv(void* a, void* b) { Menu_ReplaceActive(EnvSettingsScreen_MakeInstance()); } -static void Menu_SwitchNostalgia(void* a, void* b) { Menu_ReplaceActive(NostalgiaScreen_MakeInstance()); } +static void Menu_SwitchMisc(void* a, void* b) { MiscOptionsScreen_Show(); } +static void Menu_SwitchGui(void* a, void* b) { GuiOptionsScreen_Show(); } +static void Menu_SwitchGfx(void* a, void* b) { GraphicsOptionsScreen_Show(); } +static void Menu_SwitchHacks(void* a, void* b) { HacksSettingsScreen_Show(); } +static void Menu_SwitchEnv(void* a, void* b) { EnvSettingsScreen_Show(); } +static void Menu_SwitchNostalgia(void* a, void* b) { NostalgiaScreen_Show(); } static void Menu_SwitchGenLevel(void* a, void* b) { GenLevelScreen_Show(); } static void Menu_SwitchClassicGenLevel(void* a, void* b) { ClassicGenScreen_Show(); } @@ -502,6 +501,7 @@ static void MenuScreen_Free(void* screen) { *#########################################################################################################################*/ static struct PauseScreen { MenuScreen_Layout + const struct SimpleButtonDesc* descs; struct ButtonWidget buttons[6], quit, back; } PauseScreen_Instance; @@ -514,18 +514,27 @@ static void PauseScreen_CheckHacksAllowed(void* screen) { s->buttons[4].disabled = !LocalPlayer_Instance.Hacks.CanAnyHacks; /* select texture pack */ } -static void PauseScreen_MakeButtons(struct PauseScreen* s, int width, const struct SimpleButtonDesc* descs, int count) { +static void PauseScreen_ContextRecreated(void* screen) { + struct PauseScreen* s = (struct PauseScreen*)screen; int i; - for (i = 0; i < count; i++) { - String text = String_FromReadonly(descs[i].title); - Menu_OldButton(s, i, &s->buttons[i], width, &text, &s->titleFont, descs[i].onClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, descs[i].x, descs[i].y); + for (i = 0; i < s->numWidgets - 2; i++) { + ButtonWidget_SetConst(&s->buttons[i], s->descs[i].title, &s->titleFont); } + + if (!Gui_ClassicMenu) ButtonWidget_SetConst(&s->quit, "Quit game", &s->titleFont); + ButtonWidget_SetConst(&s->back, "Back to game", &s->titleFont); + + if (!Server.IsSinglePlayer) { + s->buttons[1].disabled = true; + s->buttons[2].disabled = true; + } + PauseScreen_CheckHacksAllowed(s); } -static void PauseScreen_ContextRecreated(void* screen) { - static const String quitMsg = String_FromConst("Quit game"); +static void PauseScreen_Init(void* screen) { + static struct Widget* widgets[8]; struct PauseScreen* s = (struct PauseScreen*)screen; + int i, count, width; static const struct SimpleButtonDesc classicDescs[5] = { { 0, -100, "Options...", Menu_SwitchClassicOptions }, @@ -543,32 +552,30 @@ static void PauseScreen_ContextRecreated(void* screen) { { -160, 50, "Hotkeys...", Menu_SwitchHotkeys } }; - if (Gui_ClassicMenu) { - PauseScreen_MakeButtons(s, 400, classicDescs, 5); - Menu_OldBack(s, 5, &s->back, "Back to game", &s->titleFont, PauseScreen_Game); - - /* Disable nostalgia options in classic mode */ - if (Game_ClassicMode) Menu_Remove(s, 4); - s->widgets[6] = NULL; - s->widgets[7] = NULL; - } else { - PauseScreen_MakeButtons(s, 300, modernDescs, 6); - Menu_OldButton(s, 6, &s->quit, 120, &quitMsg, &s->titleFont, PauseScreen_Quit, - ANCHOR_MAX, ANCHOR_MAX, 5, 5); - Menu_OldBack(s, 7, &s->back, "Back to game",&s->titleFont, PauseScreen_Game); - } - - if (!Server.IsSinglePlayer) { - s->buttons[1].disabled = true; - s->buttons[2].disabled = true; - } - PauseScreen_CheckHacksAllowed(s); -} - -static void PauseScreen_Init(void* screen) { - struct PauseScreen* s = (struct PauseScreen*)screen; + s->widgets = widgets; MenuScreen_Init(s); Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, PauseScreen_CheckHacksAllowed); + + if (Gui_ClassicMenu) { + s->descs = classicDescs; /*400*/ + /* Don't show nostalgia options in classic mode */ + count = Game_ClassicMode ? 4 : 5; + } else { + s->descs = modernDescs; /*300*/ + count = 6; + } + + s->numWidgets = count + 2; + width = Gui_ClassicMenu ? 400 : 300; + + for (i = 0; i < count; i++) { + Menu_Button(s, i, &s->buttons[i], width, s->descs[i].onClick, + ANCHOR_CENTRE, ANCHOR_CENTRE, s->descs[i].x, s->descs[i].y); + } + + Menu_Button(s, count, &s->quit, 120, PauseScreen_Quit, + ANCHOR_MAX, ANCHOR_MAX, 5, 5); + Menu_Back(s, count + 1, &s->back, PauseScreen_Game); } static void PauseScreen_Free(void* screen) { @@ -584,15 +591,10 @@ static struct ScreenVTABLE PauseScreen_VTABLE = { Menu_OnResize, Menu_ContextLost, PauseScreen_ContextRecreated }; void PauseScreen_Show(void) { - static struct Widget* widgets[8]; struct PauseScreen* s = &PauseScreen_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); - - s->VTABLE = &PauseScreen_VTABLE; + s->VTABLE = &PauseScreen_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -2175,13 +2177,14 @@ static void ClassicOptionsScreen_ContextRecreated(void* screen) { if (!Game_ClassicHacks) Menu_Remove(s, 8); } -struct Screen* ClassicOptionsScreen_MakeInstance(void) { +void ClassicOptionsScreen_Show(void) { static struct MenuInputDesc descs[11]; MenuInput_Enum(descs[2], ViewDist_Names, VIEW_COUNT); MenuInput_Enum(descs[7], FpsLimit_Names, FPS_LIMIT_COUNT); - return MenuOptionsScreen_MakeInstance(11, + struct Screen* s = MenuOptionsScreen_MakeInstance(11, ClassicOptionsScreen_ContextRecreated, descs, NULL, 0); + Gui_Replace(s, GUI_PRIORITY_MENU); } @@ -2260,8 +2263,8 @@ static String String_InitAndClear(STRING_REF char* buffer, int capacity) { return str; } -struct Screen* EnvSettingsScreen_MakeInstance(void) { - static struct MenuInputDesc descs[1]; +void EnvSettingsScreen_Show(void) { + static struct MenuInputDesc descs[11]; MenuInput_Hex(descs[0], Env_DefaultCloudsCol); MenuInput_Hex(descs[1], Env_DefaultSkyCol); MenuInput_Hex(descs[2], Env_DefaultFogCol); @@ -2274,8 +2277,9 @@ struct Screen* EnvSettingsScreen_MakeInstance(void) { MenuInput_Float(descs[8], -100, 100, 1); MenuInput_Int(descs[9], -2048, 2048, World.Height / 2); - return MenuOptionsScreen_MakeInstance(4, + struct Screen* s = MenuOptionsScreen_MakeInstance(14, EnvSettingsScreen_ContextRecreated, descs, NULL, 0); + Gui_Replace(s, GUI_PRIORITY_MENU); } @@ -2334,7 +2338,7 @@ static void GraphicsOptionsScreen_ContextRecreated(void* screen) { widgets[7] = NULL; widgets[8] = NULL; widgets[9] = NULL; } -struct Screen* GraphicsOptionsScreen_MakeInstance(void) { +void GraphicsOptionsScreen_Show(void) { static struct MenuInputDesc descs[7]; static const char* extDescs[Array_Elems(descs)]; @@ -2361,8 +2365,9 @@ struct Screen* GraphicsOptionsScreen_MakeInstance(void) { MenuInput_Enum(descs[3], NameMode_Names, NAME_MODE_COUNT); MenuInput_Enum(descs[4], ShadowMode_Names, SHADOW_MODE_COUNT); - return MenuOptionsScreen_MakeInstance(10, + struct Screen* s = MenuOptionsScreen_MakeInstance(10, GraphicsOptionsScreen_ContextRecreated, descs, extDescs, Array_Elems(extDescs)); + Gui_Replace(s, GUI_PRIORITY_MENU); } @@ -2444,15 +2449,16 @@ static void GuiOptionsScreen_ContextRecreated(void* screen) { widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; } -struct Screen* GuiOptionsScreen_MakeInstance(void) { +void GuiOptionsScreen_Show(void) { static struct MenuInputDesc descs[11]; MenuInput_Float(descs[2], 0.25f, 4.00f, 1); MenuInput_Float(descs[3], 0.25f, 4.00f, 1); MenuInput_Float(descs[6], 0.25f, 4.00f, 1); MenuInput_Int(descs[7], 0, 30, 10); - return MenuOptionsScreen_MakeInstance(14, + struct Screen* s = MenuOptionsScreen_MakeInstance(14, GuiOptionsScreen_ContextRecreated, descs, NULL, 0); + Gui_Replace(s, GUI_PRIORITY_MENU); } @@ -2585,7 +2591,7 @@ static void HacksSettingsScreen_ContextRecreated(void* screen) { HacksSettingsScreen_CheckHacksAllowed(screen); } -struct Screen* HacksSettingsScreen_MakeInstance(void) { +void HacksSettingsScreen_Show(void) { static struct MenuInputDesc descs[11]; static const char* extDescs[Array_Elems(descs)]; @@ -2604,7 +2610,7 @@ struct Screen* HacksSettingsScreen_MakeInstance(void) { struct Screen* s = MenuOptionsScreen_MakeInstance(14, HacksSettingsScreen_ContextRecreated, descs, extDescs, Array_Elems(extDescs)); s->VTABLE->ContextLost = HacksSettingsScreen_ContextLost; - return s; + Gui_Replace(s, GUI_PRIORITY_MENU); } @@ -2678,7 +2684,7 @@ static void MiscOptionsScreen_ContextRecreated(void* screen) { if (!Server.IsSinglePlayer) Menu_Remove(s, 4); } -struct Screen* MiscOptionsScreen_MakeInstance(void) { +void MiscOptionsScreen_Show(void) { static struct MenuInputDesc descs[9]; MenuInput_Float(descs[0], 1, 1024, 5); MenuInput_Int(descs[1], 0, 100, 0); @@ -2689,8 +2695,9 @@ struct Screen* MiscOptionsScreen_MakeInstance(void) { MenuInput_Int(descs[7], 1, 200, 30); #endif - return MenuOptionsScreen_MakeInstance(12, + struct Screen* s = MenuOptionsScreen_MakeInstance(12, MiscOptionsScreen_ContextRecreated, descs, NULL, 0); + Gui_Replace(s, GUI_PRIORITY_MENU); } @@ -2758,9 +2765,10 @@ static void NostalgiaScreen_ContextRecreated(void* screen) { ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } -struct Screen* NostalgiaScreen_MakeInstance(void) { - return MenuOptionsScreen_MakeInstance(10, +void NostalgiaScreen_Show(void) { + struct Screen* s = MenuOptionsScreen_MakeInstance(10, NostalgiaScreen_ContextRecreated, NULL, NULL, 0); + Gui_Replace(s, GUI_PRIORITY_MENU); } diff --git a/src/Menus.h b/src/Menus.h index 0dcca8eb5..fa75feff6 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -9,7 +9,7 @@ struct Screen; void PauseScreen_Show(void); void OptionsGroupScreen_Show(void); -struct Screen* ClassicOptionsScreen_MakeInstance(void); +void ClassicOptionsScreen_Show(void); void ClassicKeyBindingsScreen_Show(void); void ClassicHacksKeyBindingsScreen_Show(void); @@ -26,12 +26,12 @@ void TexturePackScreen_Show(void); void FontListScreen_Show(void); void HotkeyListScreen_Show(void); -struct Screen* MiscOptionsScreen_MakeInstance(void); -struct Screen* GuiOptionsScreen_MakeInstance(void); -struct Screen* GraphicsOptionsScreen_MakeInstance(void); -struct Screen* HacksSettingsScreen_MakeInstance(void); -struct Screen* EnvSettingsScreen_MakeInstance(void); -struct Screen* NostalgiaScreen_MakeInstance(void); +void MiscOptionsScreen_Show(void); +void GuiOptionsScreen_Show(void); +void GraphicsOptionsScreen_Show(void); +void HacksSettingsScreen_Show(void); +void EnvSettingsScreen_Show(void); +void NostalgiaScreen_Show(void); void UrlWarningOverlay_Show(const String* url); void TexIdsOverlay_Show(void); diff --git a/src/Program.c b/src/Program.c index e7b57ff0b..8012b5279 100644 --- a/src/Program.c +++ b/src/Program.c @@ -105,8 +105,8 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ - String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); - //String rawArgs = String_FromConst("UnknownShadow200"); + //String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + String rawArgs = String_FromConst("UnknownShadow200"); argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); if (argsCount == 0) { From addeb72d30b50969a5134ef8ec3abcc367a1a4ba Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 19 Aug 2019 18:22:16 +1000 Subject: [PATCH 26/46] Replace TextGroupWidget_SetUsePlaceHolder with simpler method --- src/Gui.h | 4 ++-- src/Screens.c | 2 +- src/Widgets.c | 17 ++++++----------- src/Widgets.h | 4 +--- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/Gui.h b/src/Gui.h index 6e69715b4..f58a7b078 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -157,8 +157,8 @@ struct TextAtlas { struct Texture tex; int offset, curX; float uScale; - int16_t widths[TEXTATLAS_MAX_WIDTHS]; - int16_t offsets[TEXTATLAS_MAX_WIDTHS]; + short widths[TEXTATLAS_MAX_WIDTHS]; + short offsets[TEXTATLAS_MAX_WIDTHS]; }; void TextAtlas_Make(struct TextAtlas* atlas, const String* chars, const FontDesc* font, const String* prefix); void TextAtlas_Free(struct TextAtlas* atlas); diff --git a/src/Screens.c b/src/Screens.c index c4437e96e..65657d9e6 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -710,8 +710,8 @@ static void HUDScreen_ConstructWidgets(struct HUDScreen* s) { TextGroupWidget_Create(&s->status, CHAT_MAX_STATUS, &s->chatFont, s->statusTextures, HUDScreen_GetStatus); Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); + s->status.placeholderHeight[0] = false; /* Texture pack download status */ Elem_Init(&s->status); - TextGroupWidget_SetUsePlaceHolder(&s->status, 0, false); TextGroupWidget_Create(&s->bottomRight, CHAT_MAX_BOTTOMRIGHT, &s->chatFont, s->bottomRightTextures, HUDScreen_GetBottomRight); diff --git a/src/Widgets.c b/src/Widgets.c index 681f342f5..67e1fce81 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -2174,14 +2174,6 @@ static void TextGroupWidget_UpdateY(struct TextGroupWidget* w) { } } -void TextGroupWidget_SetUsePlaceHolder(struct TextGroupWidget* w, int index, bool placeHolder) { - w->placeholderHeight[index] = placeHolder; - if (w->textures[index].ID) return; - - w->textures[index].Height = placeHolder ? w->defaultHeight : 0; - TextGroupWidget_UpdateY(w); -} - int TextGroupWidget_UsedHeight(struct TextGroupWidget* w) { struct Texture* textures = w->textures; int i, height = 0; @@ -2221,7 +2213,7 @@ static void TextGroupWidget_UpdateDimensions(struct TextGroupWidget* w) { Widget_Reposition(w); } -struct Portion { int16_t Beg, Len, LineBeg, LineLen; }; +struct Portion { short Beg, Len, LineBeg, LineLen; }; #define TEXTGROUPWIDGET_HTTP_LEN 7 /* length of http:// */ #define TEXTGROUPWIDGET_URL 0x8000 #define TEXTGROUPWIDGET_PACKED_LEN 0x7FFF @@ -2515,8 +2507,7 @@ static void TextGroupWidget_Init(void* widget) { w->defaultHeight = height; for (i = 0; i < w->lines; i++) { - w->textures[i].Height = height; - w->placeholderHeight[i] = true; + w->textures[i].Height = w->placeholderHeight[i] ? height : 0; } TextGroupWidget_UpdateDimensions(w); } @@ -2548,8 +2539,12 @@ static struct WidgetVTABLE TextGroupWidget_VTABLE = { TextGroupWidget_Reposition }; void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, FontDesc* font, struct Texture* textures, TextGroupWidget_Get getLine) { + int i; Widget_Reset(w); w->VTABLE = &TextGroupWidget_VTABLE; + for (i = 0; i < lines; i++) { + w->placeholderHeight[i] = true; + } w->lines = lines; w->font = font; diff --git a/src/Widgets.h b/src/Widgets.h index 4dfc39651..1b3e544a3 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -203,6 +203,7 @@ struct TextGroupWidget { Widget_Layout int lines, defaultHeight; FontDesc* font; + /* Whether a line has non-zero height when that line has no text in it. */ bool placeholderHeight[TEXTGROUPWIDGET_MAX_LINES]; bool underlineUrls; struct Texture* textures; @@ -211,9 +212,6 @@ struct TextGroupWidget { }; CC_NOINLINE void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, FontDesc* font, struct Texture* textures, TextGroupWidget_Get getLine); -/* Sets whether the given line has non-zero height when that line has no text in it. */ -/* By default, all lines are placeholder lines. */ -CC_NOINLINE void TextGroupWidget_SetUsePlaceHolder(struct TextGroupWidget* w, int index, bool placeHolder); /* Deletes first line, then moves all other lines upwards, then redraws last line. */ /* NOTE: GetLine must also adjust the lines it returns for this to behave properly. */ CC_NOINLINE void TextGroupWidget_ShiftUp(struct TextGroupWidget* w); From b0b1518afd7ecdae73c060444524218d39f098af Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 19 Aug 2019 19:59:59 +1000 Subject: [PATCH 27/46] Make TextGroupWidget work with vertical anchor modes asides from min/max --- src/Menus.c | 7 +++-- src/Screens.c | 28 ++++++++++---------- src/Widgets.c | 72 ++++++++++++++++----------------------------------- src/Widgets.h | 3 ++- 4 files changed, 40 insertions(+), 70 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index fc16c6dd5..28850d104 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1824,7 +1824,6 @@ static void MenuOptionsScreen_FreeExtHelp(struct MenuOptionsScreen* s) { static void MenuOptionsScreen_RepositionExtHelp(struct MenuOptionsScreen* s) { s->extHelp.xOffset = Window_Width / 2 - s->extHelp.width / 2; - s->extHelp.yOffset = Window_Height / 2 + 100; Widget_Reposition(&s->extHelp); } @@ -1850,9 +1849,9 @@ static void MenuOptionsScreen_SelectExtHelp(struct MenuOptionsScreen* s, int idx descRaw = String_FromReadonly(desc); count = String_UNSAFE_Split(&descRaw, '\n', descLines, Array_Elems(descLines)); - TextGroupWidget_Create(&s->extHelp, count, &s->textFont, s->extHelpTextures, MenuOptionsScreen_GetDesc); - Widget_SetLocation(&s->extHelp, ANCHOR_MIN, ANCHOR_MIN, 0, 0); - Elem_Init(&s->extHelp); + TextGroupWidget_Create(&s->extHelp, count, s->extHelpTextures, MenuOptionsScreen_GetDesc); + Widget_SetLocation(&s->extHelp, ANCHOR_MIN, ANCHOR_CENTRE_MIN, 0, 100); + TextGroupWidget_SetFont(&s->extHelp, &s->textFont); s->extHelp.getLineObj = desc; TextGroupWidget_RedrawAll(&s->extHelp); diff --git a/src/Screens.c b/src/Screens.c index 65657d9e6..8e3262aae 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -557,8 +557,8 @@ CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const Stri static struct ScreenVTABLE LoadingScreen_VTABLE = { LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, - Screen_FKey, Screen_FKey, Screen_FKeyPress, - Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, + Screen_TKey, Screen_TKey, Screen_TKeyPress, + Screen_TMouse, Screen_TMouse, Screen_FMouseMove, Screen_TMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated }; void LoadingScreen_Show(const String* title, const String* message) { @@ -627,8 +627,8 @@ static void GeneratingScreen_Render(void* screen, double delta) { static struct ScreenVTABLE GeneratingScreen_VTABLE = { GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, - Screen_FKey, Screen_FKey, Screen_FKeyPress, - Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, + Screen_TKey, Screen_TKey, Screen_TKeyPress, + Screen_TMouse, Screen_TMouse, Screen_FMouseMove, Screen_TMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated }; void GeneratingScreen_Show(void) { @@ -707,27 +707,27 @@ static void HUDScreen_ConstructWidgets(struct HUDScreen* s) { Elem_Init(&s->altText); HUDScreen_UpdateAltTextY(s); - TextGroupWidget_Create(&s->status, CHAT_MAX_STATUS, &s->chatFont, + TextGroupWidget_Create(&s->status, CHAT_MAX_STATUS, s->statusTextures, HUDScreen_GetStatus); Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); s->status.placeholderHeight[0] = false; /* Texture pack download status */ - Elem_Init(&s->status); + TextGroupWidget_SetFont(&s->status, &s->chatFont); - TextGroupWidget_Create(&s->bottomRight, CHAT_MAX_BOTTOMRIGHT, &s->chatFont, + TextGroupWidget_Create(&s->bottomRight, CHAT_MAX_BOTTOMRIGHT, s->bottomRightTextures, HUDScreen_GetBottomRight); Widget_SetLocation(&s->bottomRight, ANCHOR_MAX, ANCHOR_MAX, 0, yOffset); - Elem_Init(&s->bottomRight); + TextGroupWidget_SetFont(&s->bottomRight, &s->chatFont); - TextGroupWidget_Create(&s->chat, Gui_Chatlines, &s->chatFont, + TextGroupWidget_Create(&s->chat, Gui_Chatlines, s->chatTextures, HUDScreen_GetChat); s->chat.underlineUrls = !Game_ClassicMode; Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); - Elem_Init(&s->chat); + TextGroupWidget_SetFont(&s->chat, &s->chatFont); - TextGroupWidget_Create(&s->clientStatus, CHAT_MAX_CLIENTSTATUS, &s->chatFont, + TextGroupWidget_Create(&s->clientStatus, CHAT_MAX_CLIENTSTATUS, s->clientStatusTextures, HUDScreen_GetClientStatus); Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); - Elem_Init(&s->clientStatus); + TextGroupWidget_SetFont(&s->clientStatus, &s->chatFont); TextWidget_Make(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -Window_Height / 4); } @@ -955,8 +955,6 @@ static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) { static void HUDScreen_ContextLost(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; - Elem_TryFree(&s->hotbar); - Font_Free(&s->playerFont); HUDScreen_FreeChatFonts(s); @@ -983,6 +981,7 @@ static void HUDScreen_ContextRecreated(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; int size; bool extended; + Widget_Reposition(&s->hotbar); size = Drawer2D_BitmappedText ? 16 : 11; Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); @@ -997,7 +996,6 @@ static void HUDScreen_ContextRecreated(void* screen) { PlayerListWidget_Create(&s->playerList, &s->playerFont, !extended); s->showingList = true; - Widget_Reposition(&s->hotbar); Elem_Init(&s->playerList); Widget_Reposition(&s->playerList); } diff --git a/src/Widgets.c b/src/Widgets.c index 67e1fce81..6e6e428d2 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -2155,25 +2155,6 @@ void TextGroupWidget_ShiftDown(struct TextGroupWidget* w) { TextGroupWidget_Redraw(w, 0); } -static void TextGroupWidget_UpdateY(struct TextGroupWidget* w) { - struct Texture* textures = w->textures; - int i, y; - - if (w->verAnchor == ANCHOR_MIN) { - y = w->y; - for (i = 0; i < w->lines; i++) { - textures[i].Y = y; - y += textures[i].Height; - } - } else { - y = Window_Height - w->yOffset; - for (i = w->lines - 1; i >= 0; i--) { - y -= textures[i].Height; - textures[i].Y = y; - } - } -} - int TextGroupWidget_UsedHeight(struct TextGroupWidget* w) { struct Texture* textures = w->textures; int i, height = 0; @@ -2190,27 +2171,22 @@ int TextGroupWidget_UsedHeight(struct TextGroupWidget* w) { static void TextGroupWidget_Reposition(void* widget) { struct TextGroupWidget* w = (struct TextGroupWidget*)widget; struct Texture* textures = w->textures; - int i, oldY = w->y; - Widget_CalcPosition(w); - - for (i = 0; i < w->lines; i++) { - textures[i].X = Gui_CalcPos(w->horAnchor, w->xOffset, textures[i].Width, Window_Width); - textures[i].Y += w->y - oldY; - } -} - -static void TextGroupWidget_UpdateDimensions(struct TextGroupWidget* w) { - struct Texture* textures = w->textures; - int i, width = 0, height = 0; - + int i, y, width = 0, height = 0; + + /* Work out how big the text group is now */ for (i = 0; i < w->lines; i++) { width = max(width, textures[i].Width); height += textures[i].Height; } - w->width = width; - w->height = height; - Widget_Reposition(w); + w->width = width; w->height = height; + Widget_CalcPosition(w); + + for (i = 0, y = w->y; i < w->lines; i++) { + textures[i].X = Gui_CalcPos(w->horAnchor, w->xOffset, textures[i].Width, Window_Width); + textures[i].Y = y; + y += textures[i].Height; + } } struct Portion { short Beg, Len, LineBeg, LineLen; }; @@ -2476,8 +2452,7 @@ void TextGroupWidget_Redraw(struct TextGroupWidget* w, int index) { tex.X = Gui_CalcPos(w->horAnchor, w->xOffset, tex.Width, Window_Width); w->textures[index] = tex; - TextGroupWidget_UpdateY(w); - TextGroupWidget_UpdateDimensions(w); + Widget_Reposition(w); } void TextGroupWidget_RedrawAllWithCol(struct TextGroupWidget* group, char col) { @@ -2498,18 +2473,18 @@ void TextGroupWidget_RedrawAllWithCol(struct TextGroupWidget* group, char col) { } -static void TextGroupWidget_Init(void* widget) { - struct TextGroupWidget* w = (struct TextGroupWidget*)widget; +void TextGroupWidget_SetFont(struct TextGroupWidget* w, FontDesc* font) { int i, height; - height = Drawer2D_FontHeight(w->font, true); - Drawer2D_ReducePadding_Height(&height, w->font->Size, 3); + height = Drawer2D_FontHeight(font, true); + Drawer2D_ReducePadding_Height(&height, font->Size, 3); w->defaultHeight = height; for (i = 0; i < w->lines; i++) { w->textures[i].Height = w->placeholderHeight[i] ? height : 0; } - TextGroupWidget_UpdateDimensions(w); + w->font = font; + Widget_Reposition(w); } static void TextGroupWidget_Render(void* widget, double delta) { @@ -2533,21 +2508,18 @@ static void TextGroupWidget_Free(void* widget) { } static struct WidgetVTABLE TextGroupWidget_VTABLE = { - TextGroupWidget_Init, TextGroupWidget_Render, TextGroupWidget_Free, - Widget_Key, Widget_Key, - Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, + Widget_NullFunc, TextGroupWidget_Render, TextGroupWidget_Free, + Widget_Key, Widget_Key, + Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, TextGroupWidget_Reposition }; -void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, FontDesc* font, struct Texture* textures, TextGroupWidget_Get getLine) { +void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, struct Texture* textures, TextGroupWidget_Get getLine) { int i; Widget_Reset(w); w->VTABLE = &TextGroupWidget_VTABLE; - for (i = 0; i < lines; i++) { - w->placeholderHeight[i] = true; - } + for (i = 0; i < lines; i++) { w->placeholderHeight[i] = true; } w->lines = lines; - w->font = font; w->textures = textures; w->GetLine = getLine; } diff --git a/src/Widgets.h b/src/Widgets.h index 1b3e544a3..3b34fa4df 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -211,7 +211,8 @@ struct TextGroupWidget { void* getLineObj; }; -CC_NOINLINE void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, FontDesc* font, struct Texture* textures, TextGroupWidget_Get getLine); +CC_NOINLINE void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, struct Texture* textures, TextGroupWidget_Get getLine); +CC_NOINLINE void TextGroupWidget_SetFont(struct TextGroupWidget* w, FontDesc* font); /* Deletes first line, then moves all other lines upwards, then redraws last line. */ /* NOTE: GetLine must also adjust the lines it returns for this to behave properly. */ CC_NOINLINE void TextGroupWidget_ShiftUp(struct TextGroupWidget* w); From 4eed4d62343fa769cf225db045450853e6528374 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 20 Aug 2019 19:34:27 +1000 Subject: [PATCH 28/46] WIP on redesigning menuoptionsscreen to separate init/contextrecreated --- src/Menus.c | 315 ++++++++++++++++++++++++++-------------------------- 1 file changed, 156 insertions(+), 159 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 28850d104..032a56776 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -65,12 +65,6 @@ static void Menu_OldInput(void* s, int i, struct MenuInputWidget* input, int wid ((struct Screen*)s)->widgets[i] = (struct Widget*)input; } -static void Menu_OldBack(void* s, int i, struct ButtonWidget* btn, const char* label, const FontDesc* font, Widget_LeftClick onClick) { - int width = Gui_ClassicMenu ? 400 : 200; - String msg = String_FromReadonly(label); - Menu_OldButton(s, i, btn, width, &msg, font, onClick, ANCHOR_CENTRE, ANCHOR_MAX, 0, 25); -} - static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; @@ -1771,18 +1765,22 @@ void MouseKeyBindingsScreen_Show(void) { /*########################################################################################################################* *--------------------------------------------------MenuOptionsScreen------------------------------------------------------* *#########################################################################################################################*/ -#define MENUOPTIONS_MAX_DESC 5 +struct MenuOptionsScreen; +typedef void (*InitMenuOptions)(struct MenuOptionsScreen* s); +#define MENUOPTIONS_CORE_WIDGETS 5 /* back + ext help + 3 input */ static struct MenuOptionsScreen { MenuScreen_Layout struct MenuInputDesc* descs; const char** descriptions; int activeI, selectedI, descriptionsCount; + InitMenuOptions DoInit, DoRecreateExtra, OnHacksChanged; + int numButtons; struct ButtonWidget ok, Default; struct MenuInputWidget input; struct TextGroupWidget extHelp; - struct Texture extHelpTextures[MENUOPTIONS_MAX_DESC]; - struct ButtonWidget buttons[11]; /* max buttons used is 11 */ + struct Texture extHelpTextures[5]; /* max lines is 5 */ + struct ButtonWidget buttons[10], done; } MenuOptionsScreen_Instance; static void Menu_GetBool(String* raw, bool v) { @@ -1803,19 +1801,23 @@ static void MenuOptionsScreen_SetFPS(const String* v) { Game_SetFpsLimit(method); } -static void MenuOptionsScreen_Set(struct MenuOptionsScreen* s, int i, const String* text) { +static void MenuOptionsScreen_Update(struct MenuOptionsScreen* s, int i) { String title; char titleBuffer[STRING_SIZE]; - - s->buttons[i].SetValue(text); String_InitArray(title, titleBuffer); - /* need to get btn again here (e.g. changing FPS invalidates all widgets) */ String_AppendConst(&title, s->buttons[i].optName); - String_AppendConst(&title, ": "); - s->buttons[i].GetValue(&title); + if (s->buttons[i].GetValue) { + String_AppendConst(&title, ": "); + s->buttons[i].GetValue(&title); + } ButtonWidget_Set(&s->buttons[i], &title, &s->titleFont); } +CC_NOINLINE static void MenuOptionsScreen_Set(struct MenuOptionsScreen* s, int i, const String* text) { + s->buttons[i].SetValue(text); + MenuOptionsScreen_Update(s, i); +} + static void MenuOptionsScreen_FreeExtHelp(struct MenuOptionsScreen* s) { if (!s->extHelp.lines) return; Elem_TryFree(&s->extHelp); @@ -1882,44 +1884,6 @@ static void MenuOptionsScreen_EnterInput(struct MenuOptionsScreen* s) { s->activeI = -1; } -static void MenuOptionsScreen_Init(void* screen) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - MenuScreen_Init(s); - s->selectedI = -1; -} - -#define EXTHELP_PAD 5 /* padding around extended help box */ -static void MenuOptionsScreen_Render(void* screen, double delta) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - struct TextGroupWidget* w; - PackedCol tableCol = PACKEDCOL_CONST(20, 20, 20, 200); - - MenuScreen_Render(s, delta); - if (!s->extHelp.lines) return; - - w = &s->extHelp; - Gfx_Draw2DFlat(w->x - EXTHELP_PAD, w->y - EXTHELP_PAD, - w->width + EXTHELP_PAD * 2, w->height + EXTHELP_PAD * 2, tableCol); - - Gfx_SetTexturing(true); - Elem_Render(&s->extHelp, delta); - Gfx_SetTexturing(false); -} - -static void MenuOptionsScreen_OnResize(void* screen) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - Menu_OnResize(s); - if (!s->extHelp.lines) return; - MenuOptionsScreen_RepositionExtHelp(s); -} - -static void MenuOptionsScreen_ContextLost(void* screen) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - Menu_ContextLost(s); - s->activeI = -1; - MenuOptionsScreen_FreeExtHelp(s); -} - static bool MenuOptionsScreen_KeyPress(void* screen, char keyChar) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; if (s->activeI >= 0) InputWidget_Append(&s->input.base, keyChar); @@ -1973,6 +1937,23 @@ static void MenuOptionsScreen_MakeButtons(struct MenuOptionsScreen* s, const str } } +static void MenuOptionsScreen_InitButtons(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]; + Menu_Button(s, i, btn, 300, btns[i].OnClick, + ANCHOR_CENTRE, ANCHOR_CENTRE, btns[i].dir * 160, btns[i].y); + + btn->optName = btns[i].name; + btn->GetValue = btns[i].GetValue; + btn->SetValue = btns[i].SetValue; + } + s->numButtons = count; + Menu_Back(s, s->numWidgets - 5, &s->done, backClick); +} + static void MenuOptionsScreen_OK(void* screen, void* widget) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; MenuOptionsScreen_EnterInput(s); @@ -2056,33 +2037,97 @@ static void MenuOptionsScreen_Input(void* screen, void* widget) { ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 150); } +static void MenuOptionsScreen_OnHacksChanged(void* screen) { + struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + if (s->OnHacksChanged) s->OnHacksChanged(s); +} + +static void MenuOptionsScreen_Init(void* screen) { + static struct Widget* widgets[10 + MENUOPTIONS_CORE_WIDGETS]; + struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + int i; + + s->widgets = widgets; + /* The various menu options screens might have different number of widgets */ + for (i = 0; i < Array_Elems(widgets); i++) { s->widgets[i] = NULL; } + MenuScreen_Init(s); + + s->activeI = -1; + s->selectedI = -1; + s->DoInit(s); + Event_RegisterVoid(&UserEvents.HackPermissionsChanged, screen, MenuOptionsScreen_OnHacksChanged); +} + +#define EXTHELP_PAD 5 /* padding around extended help box */ +static void MenuOptionsScreen_Render(void* screen, double delta) { + struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + struct TextGroupWidget* w; + PackedCol tableCol = PACKEDCOL_CONST(20, 20, 20, 200); + + MenuScreen_Render(s, delta); + if (!s->extHelp.lines) return; + + w = &s->extHelp; + Gfx_Draw2DFlat(w->x - EXTHELP_PAD, w->y - EXTHELP_PAD, + w->width + EXTHELP_PAD * 2, w->height + EXTHELP_PAD * 2, tableCol); + + Gfx_SetTexturing(true); + Elem_Render(&s->extHelp, delta); + Gfx_SetTexturing(false); +} + +static void MenuOptionsScreen_Free(void* screen) { + MenuScreen_Free(screen); + Event_UnregisterVoid(&UserEvents.HackPermissionsChanged, screen, MenuOptionsScreen_OnHacksChanged); +} + +static void MenuOptionsScreen_OnResize(void* screen) { + struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + Menu_OnResize(s); + if (!s->extHelp.lines) return; + MenuOptionsScreen_RepositionExtHelp(s); +} + +static void MenuOptionsScreen_ContextLost(void* screen) { + struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + Menu_ContextLost(s); + MenuOptionsScreen_FreeExtHelp(s); +} + +static void MenuOptionsScreen_ContextRecreated(void* screen) { + struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + int i; + + for (i = 0; i < s->numButtons; i++) { + if (s->widgets[i]) MenuOptionsScreen_Update(s, i); + } + + ButtonWidget_SetConst(&s->done, "Done", &s->titleFont); + if (s->DoRecreateExtra) s->DoRecreateExtra(s); +} + static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { - MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuScreen_Free, + MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuOptionsScreen_Free, MenuOptionsScreen_KeyDown, Menu_KeyUp, MenuOptionsScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, - MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, NULL + MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, MenuOptionsScreen_ContextRecreated }; -struct Screen* MenuOptionsScreen_MakeInstance(int count, Event_Void_Callback contextRecreated, struct MenuInputDesc* descs, const char** descriptions, int descsCount) { - static struct Widget* widgets[11 + 3]; /* max buttons + 3 widgets for input */ - +void MenuOptionsScreen_Show(struct MenuInputDesc* descs, const char** descriptions, int descsCount, InitMenuOptions init) { struct MenuOptionsScreen* s = &MenuOptionsScreen_Instance; s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = count; s->extHelp.lines = 0; s->VTABLE = &MenuOptionsScreen_VTABLE; - s->VTABLE->ContextLost = MenuOptionsScreen_ContextLost; - s->VTABLE->ContextRecreated = contextRecreated; s->descs = descs; s->descriptions = descriptions; s->descriptionsCount = descsCount; - s->activeI = -1; - s->selectedI = -1; - return (struct Screen*)s; + s->DoInit = init; + s->DoRecreateExtra = NULL; + s->OnHacksChanged = NULL; + Gui_Replace((struct Screen*)s, GUI_PRIORITY_MENU); } @@ -2141,7 +2186,11 @@ static void ClassicOptionsScreen_SetHacks(const String* v) { HacksComp_Update(&LocalPlayer_Instance.Hacks); } -static void ClassicOptionsScreen_ContextRecreated(void* screen) { +static void ClassicOptionsScreen_RecreateExtra(struct MenuOptionsScreen* s) { + ButtonWidget_SetConst(&s->buttons[9], "Controls...", &s->titleFont); +} + +static void ClassicOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[9] = { { -1, -150, "Music", MenuOptionsScreen_Bool, ClassicOptionsScreen_GetMusic, ClassicOptionsScreen_SetMusic }, @@ -2163,13 +2212,12 @@ static void ClassicOptionsScreen_ContextRecreated(void* screen) { { 0, 60, "Hacks enabled", MenuOptionsScreen_Bool, ClassicOptionsScreen_GetHacks, ClassicOptionsScreen_SetHacks } }; - static const String title = String_FromConst("Controls..."); - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; + s->numWidgets = 9 + 1 + MENUOPTIONS_CORE_WIDGETS; + s->DoRecreateExtra = ClassicOptionsScreen_RecreateExtra; - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldButton(s, 9, &s->buttons[9], 400, &title, &s->titleFont, Menu_SwitchKeysClassic, + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchPause); + Menu_Button(s, 9, &s->buttons[9], 400, Menu_SwitchKeysClassic, ANCHOR_CENTRE, ANCHOR_MAX, 0, 95); - Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchPause); /* Disable certain options */ if (!Server.IsSinglePlayer) Menu_Remove(s, 3); @@ -2181,9 +2229,7 @@ void ClassicOptionsScreen_Show(void) { MenuInput_Enum(descs[2], ViewDist_Names, VIEW_COUNT); MenuInput_Enum(descs[7], FpsLimit_Names, FPS_LIMIT_COUNT); - struct Screen* s = MenuOptionsScreen_MakeInstance(11, - ClassicOptionsScreen_ContextRecreated, descs, NULL, 0); - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(descs, NULL, 0, ClassicOptionsScreen_InitWidgets); } @@ -2223,7 +2269,7 @@ static void EnvSettingsScreen_SetWeatherSpeed(const String* v) { Env_SetWeatherS static void EnvSettingsScreen_GetEdgeHeight(String* v) { String_AppendInt(v, Env.EdgeHeight); } static void EnvSettingsScreen_SetEdgeHeight(const String* v) { Env_SetEdgeHeight(Menu_Int(v)); } -static void EnvSettingsScreen_ContextRecreated(void* screen) { +static void EnvSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[10] = { { -1, -150, "Clouds col", MenuOptionsScreen_Input, EnvSettingsScreen_GetCloudsCol, EnvSettingsScreen_SetCloudsCol }, @@ -2247,19 +2293,9 @@ static void EnvSettingsScreen_ContextRecreated(void* screen) { { 1, 50, "Water level", MenuOptionsScreen_Input, EnvSettingsScreen_GetEdgeHeight, EnvSettingsScreen_SetEdgeHeight } }; - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - struct Widget** widgets = s->widgets; - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); - widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; -} - -static String String_InitAndClear(STRING_REF char* buffer, int capacity) { - String str = String_Init(buffer, 0, capacity); - int i; - for (i = 0; i < capacity; i++) { buffer[i] = '\0'; } - return str; + s->numWidgets = 10 + MENUOPTIONS_CORE_WIDGETS; + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } void EnvSettingsScreen_Show(void) { @@ -2276,9 +2312,7 @@ void EnvSettingsScreen_Show(void) { MenuInput_Float(descs[8], -100, 100, 1); MenuInput_Int(descs[9], -2048, 2048, World.Height / 2); - struct Screen* s = MenuOptionsScreen_MakeInstance(14, - EnvSettingsScreen_ContextRecreated, descs, NULL, 0); - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(descs, NULL, 0, EnvSettingsScreen_InitWidgets); } @@ -2313,7 +2347,7 @@ static void GraphicsOptionsScreen_SetMipmaps(const String* v) { TexturePack_ExtractCurrent(true); } -static void GraphicsOptionsScreen_ContextRecreated(void* screen) { +static void GraphicsOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[6] = { { -1, -50, "FPS mode", MenuOptionsScreen_Enum, MenuOptionsScreen_GetFPS, MenuOptionsScreen_SetFPS }, @@ -2329,12 +2363,9 @@ static void GraphicsOptionsScreen_ContextRecreated(void* screen) { { 1, 50, "Mipmaps", MenuOptionsScreen_Bool, GraphicsOptionsScreen_GetMipmaps, GraphicsOptionsScreen_SetMipmaps } }; - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - struct Widget** widgets = s->widgets; - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldBack(s, 6, &s->buttons[6], "Done", &s->titleFont, Menu_SwitchOptions); - widgets[7] = NULL; widgets[8] = NULL; widgets[9] = NULL; + s->numWidgets = 6 + MENUOPTIONS_CORE_WIDGETS; + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } void GraphicsOptionsScreen_Show(void) { @@ -2364,9 +2395,7 @@ void GraphicsOptionsScreen_Show(void) { MenuInput_Enum(descs[3], NameMode_Names, NAME_MODE_COUNT); MenuInput_Enum(descs[4], ShadowMode_Names, SHADOW_MODE_COUNT); - struct Screen* s = MenuOptionsScreen_MakeInstance(10, - GraphicsOptionsScreen_ContextRecreated, descs, extDescs, Array_Elems(extDescs)); - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(descs, extDescs, Array_Elems(extDescs), GraphicsOptionsScreen_InitWidgets); } @@ -2416,7 +2445,7 @@ static void GuiOptionsScreen_SetUseFont(const String* v) { Menu_HandleFontChange((struct Screen*)&MenuOptionsScreen_Instance); } -static void GuiOptionsScreen_ContextRecreated(void* screen) { +static void GuiOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[10] = { { -1, -150, "Black text shadows", MenuOptionsScreen_Bool, GuiOptionsScreen_GetShadows, GuiOptionsScreen_SetShadows }, @@ -2440,12 +2469,9 @@ static void GuiOptionsScreen_ContextRecreated(void* screen) { { 1, 50, "Select system font", Menu_SwitchFont, NULL, NULL } }; - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - struct Widget** widgets = s->widgets; - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); - widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; + s->numWidgets = 10 + MENUOPTIONS_CORE_WIDGETS; + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); } void GuiOptionsScreen_Show(void) { @@ -2455,9 +2481,7 @@ void GuiOptionsScreen_Show(void) { MenuInput_Float(descs[6], 0.25f, 4.00f, 1); MenuInput_Int(descs[7], 0, 30, 10); - struct Screen* s = MenuOptionsScreen_MakeInstance(14, - GuiOptionsScreen_ContextRecreated, descs, NULL, 0); - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(descs, NULL, 0, GuiOptionsScreen_InitWidgets); } @@ -2530,33 +2554,18 @@ static void HacksSettingsScreen_SetFOV(const String* v) { Game_SetFov(fov); } -static void HacksSettingsScreen_CheckHacksAllowed(void* screen) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; +static void HacksSettingsScreen_CheckHacksAllowed(struct MenuOptionsScreen* s) { struct Widget** widgets = s->widgets; - struct LocalPlayer* p; - bool disabled; - int i; + struct LocalPlayer* p = &LocalPlayer_Instance; + bool disabled = !p->Hacks.Enabled; - for (i = 0; i < s->numWidgets; i++) { - if (!widgets[i]) continue; - widgets[i]->disabled = false; - } - p = &LocalPlayer_Instance; - - disabled = !p->Hacks.Enabled; widgets[3]->disabled = disabled || !p->Hacks.CanSpeed; widgets[4]->disabled = disabled || !p->Hacks.CanSpeed; widgets[5]->disabled = disabled || !p->Hacks.CanSpeed; widgets[7]->disabled = disabled || !p->Hacks.CanPushbackBlocks; } -static void HacksSettingsScreen_ContextLost(void* screen) { - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - MenuOptionsScreen_ContextLost(s); - Event_UnregisterVoid(&UserEvents.HackPermissionsChanged, s, HacksSettingsScreen_CheckHacksAllowed); -} - -static void HacksSettingsScreen_ContextRecreated(void* screen) { +static void HacksSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[10] = { { -1, -150, "Hacks enabled", MenuOptionsScreen_Bool, HacksSettingsScreen_GetHacks, HacksSettingsScreen_SetHacks }, @@ -2580,14 +2589,11 @@ static void HacksSettingsScreen_ContextRecreated(void* screen) { { 1, 50, "Field of view", MenuOptionsScreen_Input, HacksSettingsScreen_GetFOV, HacksSettingsScreen_SetFOV }, }; - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - struct Widget** widgets = s->widgets; - Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, HacksSettingsScreen_CheckHacksAllowed); + s->numWidgets = 10 + MENUOPTIONS_CORE_WIDGETS; + s->OnHacksChanged = HacksSettingsScreen_CheckHacksAllowed; - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldBack(s, 10, &s->buttons[10], "Done", &s->titleFont, Menu_SwitchOptions); - widgets[11] = NULL; widgets[12] = NULL; widgets[13] = NULL; - HacksSettingsScreen_CheckHacksAllowed(screen); + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); + HacksSettingsScreen_CheckHacksAllowed(s); } void HacksSettingsScreen_Show(void) { @@ -2606,10 +2612,7 @@ void HacksSettingsScreen_Show(void) { MenuInput_Float(descs[3], 0.1f, 2048, 1.233f); MenuInput_Int(descs[9], 1, 179, 70); - struct Screen* s = MenuOptionsScreen_MakeInstance(14, - HacksSettingsScreen_ContextRecreated, descs, extDescs, Array_Elems(extDescs)); - s->VTABLE->ContextLost = HacksSettingsScreen_ContextLost; - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(descs, extDescs, Array_Elems(extDescs), HacksSettingsScreen_InitWidgets); } @@ -2651,7 +2654,7 @@ static void MiscOptionsScreen_SetSensitivity(const String* v) { Options_Set(OPT_SENSITIVITY, v); } -static void MiscOptionsScreen_ContextRecreated(void* screen) { +static void MiscSettingsScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[8] = { { -1, -100, "Reach distance", MenuOptionsScreen_Input, MiscOptionsScreen_GetReach, MiscOptionsScreen_SetReach }, @@ -2671,12 +2674,8 @@ static void MiscOptionsScreen_ContextRecreated(void* screen) { { 1, 50, "Mouse sensitivity", MenuOptionsScreen_Input, MiscOptionsScreen_GetSensitivity, MiscOptionsScreen_SetSensitivity } }; - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - struct Widget** widgets = s->widgets; - - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldBack(s, 8, &s->buttons[8], "Done", &s->titleFont, Menu_SwitchOptions); - widgets[9] = NULL; widgets[10] = NULL; widgets[11] = NULL; + s->numWidgets = 8 + MENUOPTIONS_CORE_WIDGETS; + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), Menu_SwitchOptions); /* Disable certain options */ if (!Server.IsSinglePlayer) Menu_Remove(s, 0); @@ -2694,9 +2693,7 @@ void MiscOptionsScreen_Show(void) { MenuInput_Int(descs[7], 1, 200, 30); #endif - struct Screen* s = MenuOptionsScreen_MakeInstance(12, - MiscOptionsScreen_ContextRecreated, descs, NULL, 0); - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(descs, NULL, 0, MiscSettingsScreen_InitWidgets); } @@ -2734,7 +2731,12 @@ static void NostalgiaScreen_SwitchBack(void* a, void* b) { if (Gui_ClassicMenu) { Menu_SwitchPause(a, b); } else { Menu_SwitchOptions(a, b); } } -static void NostalgiaScreen_ContextRecreated(void* screen) { +static struct TextWidget nostalgia_desc; +static void NostalgiaScreen_RecreateExtra(struct MenuOptionsScreen* s) { + TextWidget_SetConst(&nostalgia_desc, "&eButtons on the right require restarting game", &s->textFont); +} + +static void NostalgiaScreen_InitWidgets(struct MenuOptionsScreen* s) { static const struct MenuOptionDesc buttons[8] = { { -1, -150, "Classic hand model", MenuOptionsScreen_Bool, NostalgiaScreen_GetHand, NostalgiaScreen_SetHand }, @@ -2754,20 +2756,15 @@ static void NostalgiaScreen_ContextRecreated(void* screen) { { 1, -50, "Use server textures", MenuOptionsScreen_Bool, NostalgiaScreen_GetTexs, NostalgiaScreen_SetTexs }, }; - static const String descText = String_FromConst("&eButtons on the right require restarting game"); - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; - static struct TextWidget desc; + s->numWidgets = 8 + 1 + MENUOPTIONS_CORE_WIDGETS; + s->DoRecreateExtra = NostalgiaScreen_RecreateExtra; - MenuOptionsScreen_MakeButtons(s, buttons, Array_Elems(buttons)); - Menu_OldBack(s, 8, &s->buttons[8], "Done", &s->titleFont, NostalgiaScreen_SwitchBack); - Menu_OldLabel(s, 9, &desc, &descText, &s->textFont, - ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); + MenuOptionsScreen_InitButtons(s, buttons, Array_Elems(buttons), NostalgiaScreen_SwitchBack); + Menu_Label(s, 8, &nostalgia_desc, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } void NostalgiaScreen_Show(void) { - struct Screen* s = MenuOptionsScreen_MakeInstance(10, - NostalgiaScreen_ContextRecreated, NULL, NULL, 0); - Gui_Replace(s, GUI_PRIORITY_MENU); + MenuOptionsScreen_Show(NULL, NULL, 0, NostalgiaScreen_InitWidgets); } From 42aa261440ec149ef4e5441932897e180d52668c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 20 Aug 2019 20:55:40 +1000 Subject: [PATCH 29/46] Fix extended help disappearing on window resize and changing FPS limit mode --- src/Menus.c | 59 +++++++++++++---------------------------------------- 1 file changed, 14 insertions(+), 45 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index 032a56776..083feb290 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -1767,7 +1767,7 @@ void MouseKeyBindingsScreen_Show(void) { *#########################################################################################################################*/ struct MenuOptionsScreen; typedef void (*InitMenuOptions)(struct MenuOptionsScreen* s); -#define MENUOPTIONS_CORE_WIDGETS 5 /* back + ext help + 3 input */ +#define MENUOPTIONS_CORE_WIDGETS 4 /* back + 3 input */ static struct MenuOptionsScreen { MenuScreen_Layout @@ -1819,13 +1819,12 @@ CC_NOINLINE static void MenuOptionsScreen_Set(struct MenuOptionsScreen* s, int i } static void MenuOptionsScreen_FreeExtHelp(struct MenuOptionsScreen* s) { - if (!s->extHelp.lines) return; Elem_TryFree(&s->extHelp); s->extHelp.lines = 0; } static void MenuOptionsScreen_RepositionExtHelp(struct MenuOptionsScreen* s) { - s->extHelp.xOffset = Window_Width / 2 - s->extHelp.width / 2; + s->extHelp.xOffset = Window_Width / 2 - s->extHelp.width / 2; Widget_Reposition(&s->extHelp); } @@ -1841,19 +1840,14 @@ static String MenuOptionsScreen_GetDesc(void* obj, int i) { static void MenuOptionsScreen_SelectExtHelp(struct MenuOptionsScreen* s, int idx) { const char* desc; String descRaw, descLines[5]; - int count; MenuOptionsScreen_FreeExtHelp(s); if (!s->descriptions || s->activeI >= 0) return; desc = s->descriptions[idx]; if (!desc) return; - descRaw = String_FromReadonly(desc); - count = String_UNSAFE_Split(&descRaw, '\n', descLines, Array_Elems(descLines)); - - TextGroupWidget_Create(&s->extHelp, count, s->extHelpTextures, MenuOptionsScreen_GetDesc); - Widget_SetLocation(&s->extHelp, ANCHOR_MIN, ANCHOR_CENTRE_MIN, 0, 100); - TextGroupWidget_SetFont(&s->extHelp, &s->textFont); + descRaw = String_FromReadonly(desc); + s->extHelp.lines = String_UNSAFE_Split(&descRaw, '\n', descLines, Array_Elems(descLines)); s->extHelp.getLineObj = desc; TextGroupWidget_RedrawAll(&s->extHelp); @@ -1913,30 +1907,6 @@ static bool MenuOptionsScreen_MouseMove(void* screen, int x, int y) { return true; } -static void MenuOptionsScreen_MakeButtons(struct MenuOptionsScreen* s, const struct MenuOptionDesc* btns, int count) { - String title; char titleBuffer[STRING_SIZE]; - struct ButtonWidget* btn; - int i; - - for (i = 0; i < count; i++) { - String_InitArray(title, titleBuffer); - String_AppendConst(&title, btns[i].name); - - if (btns[i].GetValue) { - String_AppendConst(&title, ": "); - btns[i].GetValue(&title); - } - - btn = &s->buttons[i]; - Menu_OldButton(s, i, btn, 300, &title, &s->titleFont, btns[i].OnClick, - ANCHOR_CENTRE, ANCHOR_CENTRE, btns[i].dir * 160, btns[i].y); - - btn->optName = btns[i].name; - btn->GetValue = btns[i].GetValue; - btn->SetValue = btns[i].SetValue; - } -} - static void MenuOptionsScreen_InitButtons(struct MenuOptionsScreen* s, const struct MenuOptionDesc* btns, int count, Widget_LeftClick backClick) { struct ButtonWidget* btn; int i; @@ -1951,7 +1921,12 @@ static void MenuOptionsScreen_InitButtons(struct MenuOptionsScreen* s, const str btn->SetValue = btns[i].SetValue; } s->numButtons = count; - Menu_Back(s, s->numWidgets - 5, &s->done, backClick); + Menu_Back(s, s->numWidgets - 4, &s->done, backClick); + + TextGroupWidget_Create(&s->extHelp, 5, s->extHelpTextures, MenuOptionsScreen_GetDesc); + TextGroupWidget_SetFont(&s->extHelp, &s->textFont); + s->extHelp.lines = 0; + Widget_SetLocation(&s->extHelp, ANCHOR_MIN, ANCHOR_CENTRE_MIN, 0, 100); } static void MenuOptionsScreen_OK(void* screen, void* widget) { @@ -1976,17 +1951,14 @@ static void MenuOptionsScreen_Bool(void* screen, void* widget) { String value; char valueBuffer[STRING_SIZE]; struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; struct ButtonWidget* btn = (struct ButtonWidget*)widget; - int index; bool isOn; - index = Menu_Index(s, btn); - MenuOptionsScreen_SelectExtHelp(s, index); String_InitArray(value, valueBuffer); btn->GetValue(&value); isOn = String_CaselessEqualsConst(&value, "ON"); value = String_FromReadonly(isOn ? "OFF" : "ON"); - MenuOptionsScreen_Set(s, index, &value); + MenuOptionsScreen_Set(s, Menu_Index(s, btn), &value); } static void MenuOptionsScreen_Enum(void* screen, void* widget) { @@ -1999,7 +1971,6 @@ static void MenuOptionsScreen_Enum(void* screen, void* widget) { int raw, count; index = Menu_Index(s, btn); - MenuOptionsScreen_SelectExtHelp(s, index); String_InitArray(value, valueBuffer); btn->GetValue(&value); @@ -2084,14 +2055,13 @@ static void MenuOptionsScreen_Free(void* screen) { static void MenuOptionsScreen_OnResize(void* screen) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; Menu_OnResize(s); - if (!s->extHelp.lines) return; MenuOptionsScreen_RepositionExtHelp(s); } static void MenuOptionsScreen_ContextLost(void* screen) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; Menu_ContextLost(s); - MenuOptionsScreen_FreeExtHelp(s); + Elem_Free(&s->extHelp); } static void MenuOptionsScreen_ContextRecreated(void* screen) { @@ -2104,6 +2074,7 @@ static void MenuOptionsScreen_ContextRecreated(void* screen) { ButtonWidget_SetConst(&s->done, "Done", &s->titleFont); if (s->DoRecreateExtra) s->DoRecreateExtra(s); + TextGroupWidget_RedrawAll(&s->extHelp); } static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { @@ -2116,9 +2087,7 @@ void MenuOptionsScreen_Show(struct MenuInputDesc* descs, const char** descriptio struct MenuOptionsScreen* s = &MenuOptionsScreen_Instance; s->grabsInput = true; s->closable = true; - - s->extHelp.lines = 0; - s->VTABLE = &MenuOptionsScreen_VTABLE; + s->VTABLE = &MenuOptionsScreen_VTABLE; s->descs = descs; s->descriptions = descriptions; From 711c77a48d544a2f9d453178784eb9313b322553 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 20 Aug 2019 21:32:04 +1000 Subject: [PATCH 30/46] Fix menu input disappearing on resize Also make all screen/widget VTABLEs const --- src/Gui.h | 4 ++-- src/Menus.c | 59 ++++++++++++++++++++++----------------------------- src/Screens.c | 12 +++++------ src/Widgets.c | 20 ++++++++--------- 4 files changed, 43 insertions(+), 52 deletions(-) diff --git a/src/Gui.h b/src/Gui.h index f58a7b078..e0798569b 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -49,7 +49,7 @@ struct ScreenVTABLE { Event_Void_Callback ContextLost; Event_Void_Callback ContextRecreated; }; -#define Screen_Layout struct ScreenVTABLE* VTABLE; \ +#define Screen_Layout const struct ScreenVTABLE* VTABLE; \ bool grabsInput; /* Whether this screen grabs input. Causes the cursor to become visible. */ \ bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ bool hidden; /* Whether this screen is prevented from rendering. */ \ @@ -72,7 +72,7 @@ struct WidgetVTABLE { bool (*HandlesMouseScroll)(void* elem, float delta); void (*Reposition)(void* elem); }; -#define Widget_Layout struct WidgetVTABLE* VTABLE; \ +#define Widget_Layout const struct WidgetVTABLE* VTABLE; \ int x, y, width, height; /* Top left corner, and dimensions, of this widget */ \ bool active; /* Whether this widget is currently being moused over */ \ bool disabled; /* Whether widget is prevented from being interacted with */ \ diff --git a/src/Menus.c b/src/Menus.c index 083feb290..d36a6e630 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -45,26 +45,12 @@ struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; /*########################################################################################################################* *--------------------------------------------------------Menu base--------------------------------------------------------* *#########################################################################################################################*/ -static void Menu_OldButton(void* s, int i, struct ButtonWidget* btn, int width, const String* text, const FontDesc* font, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { - ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); - ButtonWidget_Set(btn, text, font); - ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; -} - static void Menu_OldLabel(void* s, int i, struct TextWidget* label, const String* text, const FontDesc* font, int horAnchor, int verAnchor, int x, int y) { TextWidget_Make(label, horAnchor, verAnchor, x, y); TextWidget_Set(label, text, font); ((struct Screen*)s)->widgets[i] = (struct Widget*)label; } -static void Menu_OldInput(void* s, int i, struct MenuInputWidget* input, int width, const String* text, FontDesc* font, struct MenuInputDesc* desc, int horAnchor, int verAnchor, int x, int y) { - MenuInputWidget_Create(input, width, 30, text, font, desc); - Widget_SetLocation(input, horAnchor, verAnchor, x, y); - input->base.showCaret = true; - InputWidget_UpdateText(&input->base); - ((struct Screen*)s)->widgets[i] = (struct Widget*)input; -} - static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; @@ -449,7 +435,7 @@ static void ListScreen_ContextRecreated(void* screen) { ListScreen_UpdatePage(s); } -static struct ScreenVTABLE ListScreen_VTABLE = { +static const struct ScreenVTABLE ListScreen_VTABLE = { ListScreen_Init, ListScreen_Render, ListScreen_Free, ListScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, ListScreen_MouseScroll, @@ -578,7 +564,7 @@ static void PauseScreen_Free(void* screen) { Event_UnregisterVoid(&UserEvents.HackPermissionsChanged, s, PauseScreen_CheckHacksAllowed); } -static struct ScreenVTABLE PauseScreen_VTABLE = { +static const struct ScreenVTABLE PauseScreen_VTABLE = { PauseScreen_Init, MenuScreen_Render, PauseScreen_Free, MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -683,7 +669,7 @@ static bool OptionsGroupScreen_MouseMove(void* screen, int x, int y) { return true; } -static struct ScreenVTABLE OptionsGroupScreen_VTABLE = { +static const struct ScreenVTABLE OptionsGroupScreen_VTABLE = { OptionsGroupScreen_Init, MenuScreen_Render, OptionsGroupScreen_Free, MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, OptionsGroupScreen_MouseMove, MenuScreen_MouseScroll, @@ -900,7 +886,7 @@ static void EditHotkeyScreen_Init(void* screen) { Menu_Back(s, 5, &s->cancel, Menu_SwitchHotkeys); } -static struct ScreenVTABLE EditHotkeyScreen_VTABLE = { +static const struct ScreenVTABLE EditHotkeyScreen_VTABLE = { EditHotkeyScreen_Init, EditHotkeyScreen_Render, EditHotkeyScreen_Free, EditHotkeyScreen_KeyDown, Menu_KeyUp, EditHotkeyScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -1064,7 +1050,7 @@ static void GenLevelScreen_Init(void* screen) { Menu_Back(s, 11, &s->cancel, Menu_SwitchPause); } -static struct ScreenVTABLE GenLevelScreen_VTABLE = { +static const struct ScreenVTABLE GenLevelScreen_VTABLE = { GenLevelScreen_Init, MenuScreen_Render, MenuScreen_Free, GenLevelScreen_KeyDown, Menu_KeyUp, GenLevelScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -1126,7 +1112,7 @@ static void ClassicGenScreen_Init(void* screen) { Menu_Back(s, 3, &s->cancel, Menu_SwitchPause); } -static struct ScreenVTABLE ClassicGenScreen_VTABLE = { +static const struct ScreenVTABLE ClassicGenScreen_VTABLE = { ClassicGenScreen_Init, MenuScreen_Render, MenuScreen_Free, MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -1286,7 +1272,7 @@ static void SaveLevelScreen_Init(void* screen) { ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 65); } -static struct ScreenVTABLE SaveLevelScreen_VTABLE = { +static const struct ScreenVTABLE SaveLevelScreen_VTABLE = { SaveLevelScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, SaveLevelScreen_KeyDown, Menu_KeyUp, SaveLevelScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -1645,7 +1631,7 @@ static void KeyBindingsScreen_Init(void* screen) { s->DoInit(s); } -static struct ScreenVTABLE KeyBindingsScreen_VTABLE = { +static const struct ScreenVTABLE KeyBindingsScreen_VTABLE = { KeyBindingsScreen_Init, MenuScreen_Render, MenuScreen_Free, KeyBindingsScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, KeyBindingsScreen_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -1818,7 +1804,7 @@ CC_NOINLINE static void MenuOptionsScreen_Set(struct MenuOptionsScreen* s, int i MenuOptionsScreen_Update(s, i); } -static void MenuOptionsScreen_FreeExtHelp(struct MenuOptionsScreen* s) { +CC_NOINLINE static void MenuOptionsScreen_FreeExtHelp(struct MenuOptionsScreen* s) { Elem_TryFree(&s->extHelp); s->extHelp.lines = 0; } @@ -1865,6 +1851,13 @@ static void MenuOptionsScreen_FreeInput(struct MenuOptionsScreen* s) { } } +static void MenuOptionsScreen_RedrawInput(struct MenuOptionsScreen* s) { + if (s->activeI == -1) return; + InputWidget_UpdateText(&s->input.base); + ButtonWidget_SetConst(&s->ok, "OK", &s->titleFont); + ButtonWidget_SetConst(&s->Default, "Default value", &s->titleFont); +} + static void MenuOptionsScreen_EnterInput(struct MenuOptionsScreen* s) { struct MenuInputDesc* desc = &s->input.desc; String text = s->input.base.text; @@ -1984,10 +1977,7 @@ static void MenuOptionsScreen_Enum(void* screen, void* widget) { } static void MenuOptionsScreen_Input(void* screen, void* widget) { - static const String okay = String_FromConst("OK"); - static const String def = String_FromConst("Default value"); String value; char valueBuffer[STRING_SIZE]; - struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; struct ButtonWidget* btn = (struct ButtonWidget*)widget; int i; @@ -2000,12 +1990,13 @@ static void MenuOptionsScreen_Input(void* screen, void* widget) { btn->GetValue(&value); i = s->numWidgets; - Menu_OldInput(s, i - 1, &s->input, 400, &value, &s->textFont, &s->descs[s->activeI], + Menu_Input(s, i - 1, &s->input, 400, &value, &s->textFont, &s->descs[s->activeI], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 110); - Menu_OldButton(s, i - 2, &s->ok, 40, &okay, &s->titleFont, MenuOptionsScreen_OK, + Menu_Button(s, i - 2, &s->ok, 40, MenuOptionsScreen_OK, ANCHOR_CENTRE, ANCHOR_CENTRE, 240, 110); - Menu_OldButton(s, i - 3, &s->Default, 200, &def, &s->titleFont, MenuOptionsScreen_Default, + Menu_Button(s, i - 3, &s->Default, 200, MenuOptionsScreen_Default, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 150); + MenuOptionsScreen_RedrawInput(s); } static void MenuOptionsScreen_OnHacksChanged(void* screen) { @@ -2067,7 +2058,6 @@ static void MenuOptionsScreen_ContextLost(void* screen) { static void MenuOptionsScreen_ContextRecreated(void* screen) { struct MenuOptionsScreen* s = (struct MenuOptionsScreen*)screen; int i; - for (i = 0; i < s->numButtons; i++) { if (s->widgets[i]) MenuOptionsScreen_Update(s, i); } @@ -2075,9 +2065,10 @@ static void MenuOptionsScreen_ContextRecreated(void* screen) { ButtonWidget_SetConst(&s->done, "Done", &s->titleFont); if (s->DoRecreateExtra) s->DoRecreateExtra(s); TextGroupWidget_RedrawAll(&s->extHelp); + MenuOptionsScreen_RedrawInput(s); } -static struct ScreenVTABLE MenuOptionsScreen_VTABLE = { +static const struct ScreenVTABLE MenuOptionsScreen_VTABLE = { MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuOptionsScreen_Free, MenuOptionsScreen_KeyDown, Menu_KeyUp, MenuOptionsScreen_KeyPress, Menu_MouseDown, Menu_MouseUp, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, @@ -2913,7 +2904,7 @@ static bool TexIdsOverlay_KeyDown(void* screen, Key key) { static bool TexIdsOverlay_KeyPress(void* screen, char keyChar) { return false; } static bool TexIdsOverlay_KeyUp(void* screen, Key key) { return false; } -static struct ScreenVTABLE TexIdsOverlay_VTABLE = { +static const struct ScreenVTABLE TexIdsOverlay_VTABLE = { TexIdsOverlay_Init, TexIdsOverlay_Render, MenuScreen_Free, TexIdsOverlay_KeyDown, TexIdsOverlay_KeyUp, TexIdsOverlay_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -2981,7 +2972,7 @@ static void UrlWarningOverlay_Init(void* screen) { s->buttons[1].MenuClick = UrlWarningOverlay_AppendUrl; } -static struct ScreenVTABLE UrlWarningOverlay_VTABLE = { +static const struct ScreenVTABLE UrlWarningOverlay_VTABLE = { UrlWarningOverlay_Init, MenuScreen_Render, MenuScreen_Free, Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, @@ -3119,7 +3110,7 @@ static void TexPackOverlay_Init(void* screen) { Overlay_MakeExtraButtons(s, s->buttons); } -static struct ScreenVTABLE TexPackOverlay_VTABLE = { +static const struct ScreenVTABLE TexPackOverlay_VTABLE = { TexPackOverlay_Init, TexPackOverlay_Render, MenuScreen_Free, Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, diff --git a/src/Screens.c b/src/Screens.c index 8e3262aae..0bb0e43a6 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -202,7 +202,7 @@ static bool InventoryScreen_MouseScroll(void* screen, float delta) { return Elem_HandlesMouseScroll(table, delta); } -static struct ScreenVTABLE InventoryScreen_VTABLE = { +static const struct ScreenVTABLE InventoryScreen_VTABLE = { InventoryScreen_Init, InventoryScreen_Render, InventoryScreen_Free, InventoryScreen_KeyDown, InventoryScreen_KeyUp, Screen_TKeyPress, InventoryScreen_MouseDown, InventoryScreen_MouseUp, InventoryScreen_MouseMove, InventoryScreen_MouseScroll, @@ -393,7 +393,7 @@ static void StatusScreen_Render(void* screen, double delta) { Gfx_SetTexturing(false); } -static struct ScreenVTABLE StatusScreen_VTABLE = { +static const struct ScreenVTABLE StatusScreen_VTABLE = { Screen_NullFunc, StatusScreen_Render, Screen_NullFunc, Screen_FKey, Screen_FKey, Screen_FKeyPress, Screen_FMouse, Screen_FMouse, Screen_FMouseMove, Screen_FMouseScroll, @@ -555,7 +555,7 @@ CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const Stri Gui_Replace((struct Screen*)s, GUI_PRIORITY_LOADING); } -static struct ScreenVTABLE LoadingScreen_VTABLE = { +static const struct ScreenVTABLE LoadingScreen_VTABLE = { LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Screen_TKey, Screen_TKey, Screen_TKeyPress, Screen_TMouse, Screen_TMouse, Screen_FMouseMove, Screen_TMouseScroll, @@ -625,7 +625,7 @@ static void GeneratingScreen_Render(void* screen, double delta) { LoadingScreen_SetMessage(s); } -static struct ScreenVTABLE GeneratingScreen_VTABLE = { +static const struct ScreenVTABLE GeneratingScreen_VTABLE = { GeneratingScreen_Init, GeneratingScreen_Render, LoadingScreen_Free, Screen_TKey, Screen_TKey, Screen_TKeyPress, Screen_TMouse, Screen_TMouse, Screen_FMouseMove, Screen_TMouseScroll, @@ -1205,7 +1205,7 @@ static void HUDScreen_Free(void* screen) { Event_UnregisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged); } -static struct ScreenVTABLE HUDScreen_VTABLE = { +static const struct ScreenVTABLE HUDScreen_VTABLE = { HUDScreen_Init, HUDScreen_Render, HUDScreen_Free, HUDScreen_KeyDown, HUDScreen_KeyUp, HUDScreen_KeyPress, HUDScreen_MouseDown, Screen_FMouse, Screen_FMouseMove, HUDScreen_MouseScroll, @@ -1376,7 +1376,7 @@ static bool DisconnectScreen_MouseMove(void* screen, int x, int y) { return true; } -static struct ScreenVTABLE DisconnectScreen_VTABLE = { +static const struct ScreenVTABLE DisconnectScreen_VTABLE = { DisconnectScreen_Init, DisconnectScreen_Render, DisconnectScreen_Free, DisconnectScreen_KeyDown, Screen_TKey, Screen_TKeyPress, DisconnectScreen_MouseDown, Screen_TMouse, DisconnectScreen_MouseMove, Screen_TMouseScroll, diff --git a/src/Widgets.c b/src/Widgets.c index 6e6e428d2..933870b16 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -47,7 +47,7 @@ static void TextWidget_Reposition(void* widget) { w->texture.Y = w->y; } -static struct WidgetVTABLE TextWidget_VTABLE = { +static const struct WidgetVTABLE TextWidget_VTABLE = { Widget_NullFunc, TextWidget_Render, TextWidget_Free, Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, @@ -150,7 +150,7 @@ static void ButtonWidget_Render(void* widget, double delta) { Texture_RenderShaded(&w->texture, col); } -static struct WidgetVTABLE ButtonWidget_VTABLE = { +static const struct WidgetVTABLE ButtonWidget_VTABLE = { Widget_NullFunc, ButtonWidget_Render, ButtonWidget_Free, Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, @@ -296,7 +296,7 @@ static bool ScrollbarWidget_MouseMove(void* widget, int x, int y) { return false; } -static struct WidgetVTABLE ScrollbarWidget_VTABLE = { +static const struct WidgetVTABLE ScrollbarWidget_VTABLE = { Widget_NullFunc, ScrollbarWidget_Render, Widget_NullFunc, Widget_Key, Widget_Key, ScrollbarWidget_MouseDown, ScrollbarWidget_MouseUp, ScrollbarWidget_MouseMove, ScrollbarWidget_MouseScroll, @@ -480,7 +480,7 @@ static bool HotbarWidget_MouseScroll(void* widget, float delta) { return true; } -static struct WidgetVTABLE HotbarWidget_VTABLE = { +static const struct WidgetVTABLE HotbarWidget_VTABLE = { Widget_NullFunc, HotbarWidget_Render, Widget_NullFunc, HotbarWidget_KeyDown, HotbarWidget_KeyUp, HotbarWidget_MouseDown, Widget_Mouse, Widget_MouseMove, HotbarWidget_MouseScroll, @@ -812,7 +812,7 @@ static bool TableWidget_KeyDown(void* widget, Key key) { return true; } -static struct WidgetVTABLE TableWidget_VTABLE = { +static const struct WidgetVTABLE TableWidget_VTABLE = { TableWidget_Init, TableWidget_Render, TableWidget_Free, TableWidget_KeyDown, Widget_Key, TableWidget_MouseDown, TableWidget_MouseUp, TableWidget_MouseMove, TableWidget_MouseScroll, @@ -1446,7 +1446,7 @@ static bool MenuInputWidget_AllowedChar(void* widget, char c) { } static int MenuInputWidget_GetMaxLines(void) { return 1; } -static struct WidgetVTABLE MenuInputWidget_VTABLE = { +static const struct WidgetVTABLE MenuInputWidget_VTABLE = { Widget_NullFunc, MenuInputWidget_Render, InputWidget_Free, InputWidget_KeyDown, InputWidget_KeyUp, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, @@ -1705,7 +1705,7 @@ static int ChatInputWidget_GetMaxLines(void) { return !Game_ClassicMode && Server.SupportsPartialMessages ? INPUTWIDGET_MAX_LINES : 1; } -static struct WidgetVTABLE ChatInputWidget_VTABLE = { +static const struct WidgetVTABLE ChatInputWidget_VTABLE = { Widget_NullFunc, ChatInputWidget_Render, InputWidget_Free, ChatInputWidget_KeyDown, InputWidget_KeyUp, InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, @@ -2109,7 +2109,7 @@ static void PlayerListWidget_Free(void* widget) { Event_UnregisterInt(&TabListEvents.Removed, w, PlayerListWidget_TabEntryRemoved); } -static struct WidgetVTABLE PlayerListWidget_VTABLE = { +static const struct WidgetVTABLE PlayerListWidget_VTABLE = { PlayerListWidget_Init, PlayerListWidget_Render, PlayerListWidget_Free, Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, @@ -2507,7 +2507,7 @@ static void TextGroupWidget_Free(void* widget) { } } -static struct WidgetVTABLE TextGroupWidget_VTABLE = { +static const struct WidgetVTABLE TextGroupWidget_VTABLE = { Widget_NullFunc, TextGroupWidget_Render, TextGroupWidget_Free, Widget_Key, Widget_Key, Widget_Mouse, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, @@ -2761,7 +2761,7 @@ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active) { if (active && w->pendingRedraw) SpecialInputWidget_Redraw(w); } -static struct WidgetVTABLE SpecialInputWidget_VTABLE = { +static const struct WidgetVTABLE SpecialInputWidget_VTABLE = { SpecialInputWidget_Init, SpecialInputWidget_Render, SpecialInputWidget_Free, Widget_Key, Widget_Key, SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, From 60565346fa10d2b96f4ed1f5c29736da2628abf0 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 20 Aug 2019 22:21:19 +1000 Subject: [PATCH 31/46] Changing font doesn't need to call Elem_HandlesMouseMove anymore, separate Init/ContextRecreated in TexIdsOverlay. This means all screens in Menus.c are now separated. Now onto the mess that is HUDScreen. --- src/Menus.c | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/src/Menus.c b/src/Menus.c index d36a6e630..b86e45ff4 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -45,12 +45,6 @@ struct SimpleButtonDesc { int x, y; const char* title; Widget_LeftClick onClick; /*########################################################################################################################* *--------------------------------------------------------Menu base--------------------------------------------------------* *#########################################################################################################################*/ -static void Menu_OldLabel(void* s, int i, struct TextWidget* label, const String* text, const FontDesc* font, int horAnchor, int verAnchor, int x, int y) { - TextWidget_Make(label, horAnchor, verAnchor, x, y); - TextWidget_Set(label, text, font); - ((struct Screen*)s)->widgets[i] = (struct Widget*)label; -} - static void Menu_Button(void* s, int i, struct ButtonWidget* btn, int width, Widget_LeftClick onClick, int horAnchor, int verAnchor, int x, int y) { ButtonWidget_Make(btn, width, onClick, horAnchor, verAnchor, x, y); ((struct Screen*)s)->widgets[i] = (struct Widget*)btn; @@ -195,11 +189,6 @@ static void Menu_Remove(void* screen, int i) { widgets[i] = NULL; } -static void Menu_HandleFontChange(struct Screen* s) { - Event_RaiseVoid(&ChatEvents.FontChanged); - Elem_HandlesMouseMove(s, Mouse_X, Mouse_Y); -} - static int Menu_Int(const String* str) { int v; Convert_ParseInt(str, &v); return v; } static float Menu_Float(const String* str) { float v; Convert_ParseFloat(str, &v); return v; } static PackedCol Menu_HexCol(const String* str) { PackedCol v; PackedCol_TryParseHex(str, &v); return v; } @@ -1336,15 +1325,11 @@ void TexturePackScreen_Show(void) { static void FontListScreen_EntryClick(void* screen, void* widget) { struct ListScreen* s = (struct ListScreen*)screen; String fontName = ListScreen_UNSAFE_GetCur(s, widget); - int cur = s->currentIndex; if (String_CaselessEqualsConst(&fontName, LIST_SCREEN_EMPTY)) return; String_Copy(&Drawer2D_FontName, &fontName); Options_Set(OPT_FONT_NAME, &fontName); - - /* changing font recreates list menu */ - Menu_HandleFontChange((struct Screen*)s); - ListScreen_SetCurrentIndex(s, cur); + Event_RaiseVoid(&ChatEvents.FontChanged); } static void FontListScreen_UpdateEntry(struct ListScreen* s, struct ButtonWidget* button, const String* text) { @@ -2365,7 +2350,7 @@ void GraphicsOptionsScreen_Show(void) { static void GuiOptionsScreen_GetShadows(String* v) { Menu_GetBool(v, Drawer2D_BlackTextShadows); } static void GuiOptionsScreen_SetShadows(const String* v) { Drawer2D_BlackTextShadows = Menu_SetBool(v, OPT_BLACK_TEXT); - Menu_HandleFontChange((struct Screen*)&MenuOptionsScreen_Instance); + Event_RaiseVoid(&ChatEvents.FontChanged); } static void GuiOptionsScreen_GetShowFPS(String* v) { Menu_GetBool(v, Gui_ShowFPS); } @@ -2402,7 +2387,7 @@ static void GuiOptionsScreen_SetChatlines(const String* v) { static void GuiOptionsScreen_GetUseFont(String* v) { Menu_GetBool(v, !Drawer2D_BitmappedText); } static void GuiOptionsScreen_SetUseFont(const String* v) { Drawer2D_BitmappedText = !Menu_SetBool(v, OPT_USE_CHAT_FONT); - Menu_HandleFontChange((struct Screen*)&MenuOptionsScreen_Instance); + Event_RaiseVoid(&ChatEvents.FontChanged); } static void GuiOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) { @@ -2785,7 +2770,6 @@ static void TexIdsOverlay_ContextLost(void* screen) { static void TexIdsOverlay_ContextRecreated(void* screen) { static const String chars = String_FromConst("0123456789"); static const String prefix = String_FromConst("f"); - static const String title = String_FromConst("Texture ID reference sheet"); struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen; int size; @@ -2800,8 +2784,8 @@ static void TexIdsOverlay_ContextRecreated(void* screen) { s->yOffset = Gui_CalcPos(ANCHOR_CENTRE, 0, size * ATLAS2D_TILES_PER_ROW, Window_Height); s->tileSize = size; - Menu_OldLabel(s, 0, &s->title, &title, &s->titleFont, - ANCHOR_CENTRE, ANCHOR_MIN, 0, s->yOffset - 30); + s->title.yOffset = s->yOffset - 30; + TextWidget_SetConst(&s->title, "Texture ID reference sheet", &s->titleFont); } static void TexIdsOverlay_RenderTerrain(struct TexIdsOverlay* s) { @@ -2866,9 +2850,14 @@ static void TexIdsOverlay_RenderTextOverlay(struct TexIdsOverlay* s) { } static void TexIdsOverlay_Init(void* screen) { + static struct Widget* widgets[1]; struct TexIdsOverlay* s = (struct TexIdsOverlay*)screen; Drawer2D_MakeFont(&s->textFont, 8, FONT_STYLE_NORMAL); MenuScreen_Init(s); + + s->widgets = widgets; + s->numWidgets = Array_Elems(widgets); + Menu_Label(s, 0, &s->title, ANCHOR_CENTRE, ANCHOR_MIN, 0, 0); } static void TexIdsOverlay_Render(void* screen, double delta) { @@ -2911,15 +2900,10 @@ static const struct ScreenVTABLE TexIdsOverlay_VTABLE = { Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated }; void TexIdsOverlay_Show(void) { - static struct Widget* widgets[1]; struct TexIdsOverlay* s = &TexIdsOverlay_Instance; - s->grabsInput = true; s->closable = true; - s->widgets = widgets; - s->numWidgets = Array_Elems(widgets); - - s->VTABLE = &TexIdsOverlay_VTABLE; + s->VTABLE = &TexIdsOverlay_VTABLE; Gui_Replace((struct Screen*)s, GUI_PRIORITY_TEXIDS); } From b6d9b9b88dcd278eeb1bcd44e2f9790a7dfcb6ab Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 19:26:03 +1000 Subject: [PATCH 32/46] Fix scroll position in chat and chat input caret getting reset on window resize by separating out init/contextrecreated --- src/Screens.c | 102 ++++++++++++++++++++++---------------------------- src/Widgets.c | 47 ++++++++++------------- src/Widgets.h | 4 +- 3 files changed, 68 insertions(+), 85 deletions(-) diff --git a/src/Screens.c b/src/Screens.c index 0bb0e43a6..317163acd 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -646,10 +646,6 @@ void GeneratingScreen_Show(void) { static struct HUDScreen HUDScreen_Instance; #define CH_EXTENT 16 -/* needed for lost contexts, to restore chat typed in */ -static char chatInputBuffer[INPUTWIDGET_MAX_LINES * INPUTWIDGET_LEN]; -static String chatInputStr = String_FromArray(chatInputBuffer); - static int HUDScreen_BottomOffset(void) { return HUDScreen_Instance.hotbar.height; } static int HUDScreen_InputUsedHeight(struct HUDScreen* s) { if (s->altText.height == 0) { @@ -698,50 +694,53 @@ static void HUDScreen_InitChatFonts(struct HUDScreen* s) { Drawer2D_MakeFont(&s->announcementFont, size, FONT_STYLE_NORMAL); } -static void HUDScreen_ConstructWidgets(struct HUDScreen* s) { - int yOffset = HUDScreen_BottomOffset() + 15; - ChatInputWidget_Create(&s->input, &s->chatFont); - Widget_SetLocation(&s->input.base, ANCHOR_MIN, ANCHOR_MAX, 5, 5); +static void HUDScreen_ChatUpdateFont(struct HUDScreen* s) { + ChatInputWidget_SetFont(&s->input, &s->chatFont); + TextGroupWidget_SetFont(&s->status, &s->chatFont); + TextGroupWidget_SetFont(&s->bottomRight, &s->chatFont); + TextGroupWidget_SetFont(&s->chat, &s->chatFont); + TextGroupWidget_SetFont(&s->clientStatus, &s->chatFont); +} - SpecialInputWidget_Create(&s->altText, &s->chatFont, &s->input.base); - Elem_Init(&s->altText); +static void HUDScreen_ChatUpdateLayout(struct HUDScreen* s) { + int yOffset = HUDScreen_BottomOffset() + 15; + Widget_SetLocation(&s->input.base, ANCHOR_MIN, ANCHOR_MAX, 5, 5); HUDScreen_UpdateAltTextY(s); + Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); + Widget_SetLocation(&s->bottomRight, ANCHOR_MAX, ANCHOR_MAX, 0, yOffset); + Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); + Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); +} + +static void HUDScreen_ChatInit(struct HUDScreen* s) { + ChatInputWidget_Create(&s->input); + SpecialInputWidget_Create(&s->altText, &s->chatFont, &s->input.base); + TextGroupWidget_Create(&s->status, CHAT_MAX_STATUS, s->statusTextures, HUDScreen_GetStatus); - Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); - s->status.placeholderHeight[0] = false; /* Texture pack download status */ - TextGroupWidget_SetFont(&s->status, &s->chatFont); - TextGroupWidget_Create(&s->bottomRight, CHAT_MAX_BOTTOMRIGHT, s->bottomRightTextures, HUDScreen_GetBottomRight); - Widget_SetLocation(&s->bottomRight, ANCHOR_MAX, ANCHOR_MAX, 0, yOffset); - TextGroupWidget_SetFont(&s->bottomRight, &s->chatFont); - TextGroupWidget_Create(&s->chat, Gui_Chatlines, s->chatTextures, HUDScreen_GetChat); - s->chat.underlineUrls = !Game_ClassicMode; - Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); - TextGroupWidget_SetFont(&s->chat, &s->chatFont); - TextGroupWidget_Create(&s->clientStatus, CHAT_MAX_CLIENTSTATUS, s->clientStatusTextures, HUDScreen_GetClientStatus); - Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); - TextGroupWidget_SetFont(&s->clientStatus, &s->chatFont); - TextWidget_Make(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -Window_Height / 4); + + s->status.placeholderHeight[0] = false; /* Texture pack download status */ + s->chat.underlineUrls = !Game_ClassicMode; + s->chatIndex = Chat_Log.count - Gui_Chatlines; } -static void HUDScreen_SetInitialMessages(struct HUDScreen* s) { - s->chatIndex = Chat_Log.count - Gui_Chatlines; +static void HUDScreen_Redraw(struct HUDScreen* s) { TextGroupWidget_RedrawAll(&s->chat); TextWidget_Set(&s->announcement, &Chat_Announcement, &s->announcementFont); - TextGroupWidget_RedrawAll(&s->status); TextGroupWidget_RedrawAll(&s->bottomRight); TextGroupWidget_RedrawAll(&s->clientStatus); - if (s->grabsInput) HUDScreen_OpenInput(&chatInputStr); + if (s->grabsInput) InputWidget_UpdateText(&s->input.base); + SpecialInputWidget_Redraw(&s->altText); } static void HUDScreen_UpdateChatYOffset(struct HUDScreen* s, bool force) { @@ -787,9 +786,7 @@ static void HUDScreen_EnterChatInput(struct HUDScreen* s, bool close) { s->grabsInput = false; Camera_CheckFocus(); - if (close) InputWidget_Clear(&s->input.base); - chatInputStr.length = 0; input = &s->input.base; input->OnPressedEnter(input); @@ -958,12 +955,6 @@ static void HUDScreen_ContextLost(void* screen) { Font_Free(&s->playerFont); HUDScreen_FreeChatFonts(s); - if (s->grabsInput) { - String_Copy(&chatInputStr, &s->input.base.text); - /* TODO: Why are we checking camera here */ - Camera_CheckFocus(); - } - Elem_TryFree(&s->chat); Elem_TryFree(&s->input.base); Elem_TryFree(&s->altText); @@ -977,22 +968,9 @@ static void HUDScreen_ContextLost(void* screen) { s->showingList = false; } -static void HUDScreen_ContextRecreated(void* screen) { - struct HUDScreen* s = (struct HUDScreen*)screen; - int size; - bool extended; - Widget_Reposition(&s->hotbar); - - size = Drawer2D_BitmappedText ? 16 : 11; - Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); - HUDScreen_InitChatFonts(s); - - HUDScreen_ConstructWidgets(s); - HUDScreen_SetInitialMessages(s); - HUDScreen_UpdateChatYOffset(s, true); - +static void HUDScreen_RemakePlayerList(struct HUDScreen* s) { + bool extended = Server.SupportsExtPlayerList && !Gui_ClassicTabList; if (!s->wasShowingList) return; - extended = Server.SupportsExtPlayerList && !Gui_ClassicTabList; PlayerListWidget_Create(&s->playerList, &s->playerFont, !extended); s->showingList = true; @@ -1000,13 +978,22 @@ static void HUDScreen_ContextRecreated(void* screen) { Widget_Reposition(&s->playerList); } +static void HUDScreen_ContextRecreated(void* screen) { + struct HUDScreen* s = (struct HUDScreen*)screen; + int size = Drawer2D_BitmappedText ? 16 : 11; + Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); + HUDScreen_InitChatFonts(s); + HUDScreen_ChatUpdateFont(s); + + HUDScreen_Redraw(s); + HUDScreen_UpdateChatYOffset(s, true); + HUDScreen_RemakePlayerList(s); + Widget_Reposition(&s->hotbar); +} + static void HUDScreen_OnResize(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; - /* TODO: Kill this awful hack with fire */ - bool active = s->altText.active; - Elem_Free(s); Elem_Init(s); - SpecialInputWidget_SetActive(&s->altText, active); - + HUDScreen_ChatUpdateLayout(s); Widget_Reposition(&s->hotbar); if (s->showingList) { Widget_Reposition(&s->playerList); } } @@ -1034,7 +1021,7 @@ static bool HUDScreen_KeyDown(void* screen, Key key) { if (key == playerListKey && handlesList) { if (!s->showingList && !Server.IsSinglePlayer) { s->wasShowingList = true; - HUDScreen_ContextRecreated(s); + HUDScreen_RemakePlayerList(s); } return true; } @@ -1157,6 +1144,7 @@ static void HUDScreen_Init(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; s->wasShowingList = false; HotbarWidget_Create(&s->hotbar); + HUDScreen_ChatInit(s); Event_RegisterChat(&ChatEvents.ChatReceived, s, HUDScreen_ChatReceived); Event_RegisterInt(&ChatEvents.ColCodeChanged, s, HUDScreen_ColCodeChanged); diff --git a/src/Widgets.c b/src/Widgets.c index 933870b16..98cde52a8 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -20,8 +20,6 @@ #define Widget_UV(u1,v1, u2,v2) Tex_UV(u1/256.0f,v1/256.0f, u2/256.0f,v2/256.0f) static void Widget_NullFunc(void* widget) { } -static Size2D Size2D_Empty; - static bool Widget_Mouse(void* elem, int x, int y, MouseButton btn) { return false; } static bool Widget_Key(void* elem, Key key) { return false; } static bool Widget_MouseMove(void* elem, int x, int y) { return false; } @@ -1711,27 +1709,28 @@ static const struct WidgetVTABLE ChatInputWidget_VTABLE = { InputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, InputWidget_Reposition }; -void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font) { - struct DrawTextArgs args; +void ChatInputWidget_Create(struct ChatInputWidget* w) { Widget_Reset(w); - w->typingLogPos = Chat_InputLog.count; /* Index of newest entry + 1. */ - w->base.VTABLE = &ChatInputWidget_VTABLE; - w->base.font = font; + w->typingLogPos = Chat_InputLog.count; /* Index of newest entry + 1. */ + w->base.VTABLE = &ChatInputWidget_VTABLE; w->base.caretPos = -1; w->base.convertPercents = !Game_ClassicMode; w->base.showCaret = true; w->base.padding = 5; - w->base.lineHeight = Drawer2D_FontHeight(font, true); - - w->base.GetMaxLines = ChatInputWidget_GetMaxLines; - w->base.RemakeTexture = ChatInputWidget_RemakeTexture; - w->base.OnPressedEnter = ChatInputWidget_OnPressedEnter; - w->base.AllowedChar = InputWidget_AllowedChar; + w->base.GetMaxLines = ChatInputWidget_GetMaxLines; + w->base.RemakeTexture = ChatInputWidget_RemakeTexture; + w->base.OnPressedEnter = ChatInputWidget_OnPressedEnter; + w->base.AllowedChar = InputWidget_AllowedChar; String_InitArray(w->base.text, w->_textBuffer); String_InitArray(w->origStr, w->_origBuffer); +} +void ChatInputWidget_SetFont(struct ChatInputWidget* w, FontDesc* font) { + struct DrawTextArgs args; + w->base.font = font; + w->base.lineHeight = Drawer2D_FontHeight(font, true); DrawTextArgs_Make(&args, &chatInputPrefix, font, true); w->base.prefixWidth = Drawer2D_TextWidth(&args); } @@ -2577,7 +2576,8 @@ static void SpecialInputWidget_IntersectsBody(struct SpecialInputWidget* w, int static void SpecialInputTab_Init(struct SpecialInputTab* tab, STRING_REF String* title, int itemsPerRow, int charsPerItem, STRING_REF String* contents) { tab->title = *title; - tab->titleSize = Size2D_Empty; + tab->titleSize.Width = 0; + tab->titleSize.Height = 0; tab->contents = *contents; tab->itemsPerRow = itemsPerRow; tab->charsPerItem = charsPerItem; @@ -2707,22 +2707,13 @@ static void SpecialInputWidget_Make(struct SpecialInputWidget* w, struct Special Mem_Free(bmp.Scan0); } -static void SpecialInputWidget_Redraw(struct SpecialInputWidget* w) { +void SpecialInputWidget_Redraw(struct SpecialInputWidget* w) { SpecialInputWidget_Make(w, &w->tabs[w->selectedIndex]); w->width = w->tex.Width; - w->height = w->tex.Height; + w->height = w->active ? w->tex.Height : 0; w->pendingRedraw = false; } -static void SpecialInputWidget_Init(void* widget) { - struct SpecialInputWidget* w = (struct SpecialInputWidget*)widget; - w->x = 5; w->y = 5; - - SpecialInputWidget_InitTabs(w); - SpecialInputWidget_Redraw(w); - SpecialInputWidget_SetActive(w, w->active); -} - static void SpecialInputWidget_Render(void* widget, double delta) { struct SpecialInputWidget* w = (struct SpecialInputWidget*)widget; Texture_Render(&w->tex); @@ -2762,7 +2753,7 @@ void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active) { } static const struct WidgetVTABLE SpecialInputWidget_VTABLE = { - SpecialInputWidget_Init, SpecialInputWidget_Render, SpecialInputWidget_Free, + Widget_NullFunc, SpecialInputWidget_Render, SpecialInputWidget_Free, Widget_Key, Widget_Key, SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, Widget_CalcPosition @@ -2772,5 +2763,7 @@ void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, str w->VTABLE = &SpecialInputWidget_VTABLE; w->verAnchor = ANCHOR_MAX; w->font = font; - w->target = target; + w->target = target; + SpecialInputWidget_InitTabs(w); + w->x = 5; w->y = 5; } diff --git a/src/Widgets.h b/src/Widgets.h index 3b34fa4df..453a57faf 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -190,7 +190,8 @@ struct ChatInputWidget { char _origBuffer[INPUTWIDGET_MAX_LINES * INPUTWIDGET_LEN]; }; -CC_NOINLINE void ChatInputWidget_Create(struct ChatInputWidget* w, FontDesc* font); +CC_NOINLINE void ChatInputWidget_Create(struct ChatInputWidget* w); +CC_NOINLINE void ChatInputWidget_SetFont(struct ChatInputWidget* w, FontDesc* font); /* Retrieves the text for the i'th line in the group */ @@ -269,6 +270,7 @@ struct SpecialInputWidget { }; CC_NOINLINE void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, struct InputWidget* target); +CC_NOINLINE void SpecialInputWidget_Redraw(struct SpecialInputWidget* w); CC_NOINLINE void SpecialInputWidget_UpdateCols(struct SpecialInputWidget* w); CC_NOINLINE void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active); #endif From 3d7957570b10127fdea3db43d0c5b6e607c9b623 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 19:58:18 +1000 Subject: [PATCH 33/46] try to use TextHeight instead of MeasureText --- src/Drawer2D.c | 6 +++++- src/Drawer2D.h | 5 ++++- src/LWidgets.c | 4 ++-- src/Widgets.c | 45 +++++++++++++++++++++------------------------ src/Widgets.h | 4 ++-- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/Drawer2D.c b/src/Drawer2D.c index fb4822df0..d5b0a2f97 100644 --- a/src/Drawer2D.c +++ b/src/Drawer2D.c @@ -542,6 +542,10 @@ int Drawer2D_TextWidth(struct DrawTextArgs* args) { return width; } +int Drawer2D_TextHeight(struct DrawTextArgs* args) { + return Drawer2D_FontHeight(&args->font, args->useShadow); +} + int Drawer2D_FontHeight(const FontDesc* font, bool useShadow) { int height, point; if (Drawer2D_BitmappedText) { @@ -560,7 +564,7 @@ int Drawer2D_FontHeight(const FontDesc* font, bool useShadow) { Size2D Drawer2D_MeasureText(struct DrawTextArgs* args) { Size2D size; size.Width = Drawer2D_TextWidth(args); - size.Height = Drawer2D_FontHeight(&args->font, args->useShadow); + size.Height = Drawer2D_TextHeight(args); if (!size.Width) size.Height = 0; return size; diff --git a/src/Drawer2D.h b/src/Drawer2D.h index 0a5f36d34..d4efb6546 100644 --- a/src/Drawer2D.h +++ b/src/Drawer2D.h @@ -63,8 +63,11 @@ void Drawer2D_Underline(Bitmap* bmp, int x, int y, int width, int height, Bitmap CC_API void Drawer2D_DrawText(Bitmap* bmp, struct DrawTextArgs* args, int x, int y); /* Returns how wide the given text would be when drawn. */ int Drawer2D_TextWidth(struct DrawTextArgs* args); +/* Returns how tall the given text would be when drawn. */ +/* NOTE: Height returned only depends on the font. (see Drawer2D_FontHeight). */ +int Drawer2D_TextHeight(struct DrawTextArgs* args); /* Returns size the given text would be when drawn. */ -/* NOTE: Height returned only depends on the font. (see Drawer2D_FontHeight).*/ +/* NOTE: Height returned only depends on the font. (see Drawer2D_FontHeight). */ CC_API Size2D Drawer2D_MeasureText(struct DrawTextArgs* args); /* Similar to Drawer2D_DrawText, but trims the text with trailing ".." if wider than maxWidth. */ void Drawer2D_DrawClippedText(Bitmap* bmp, struct DrawTextArgs* args, int x, int y, int maxWidth); diff --git a/src/LWidgets.c b/src/LWidgets.c index 2390ea93b..41185f14a 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -235,7 +235,7 @@ static void LInput_BlendBoxTop(struct LInput* w) { } static void LInput_DrawText(struct LInput* w, struct DrawTextArgs* args) { - int hintHeight, y; + int y, hintHeight; if (w->Text.length || !w->HintText) { y = w->Y + (w->Height - w->_TextHeight) / 2; @@ -244,7 +244,7 @@ static void LInput_DrawText(struct LInput* w, struct DrawTextArgs* args) { args->text = String_FromReadonly(w->HintText); args->font = Launcher_HintFont; - hintHeight = Drawer2D_MeasureText(args).Height; + hintHeight = Drawer2D_TextHeight(args); y = w->Y + (w->Height - hintHeight) / 2; Drawer2D_DrawText(&Launcher_Framebuffer, args, w->X + 5, y); } diff --git a/src/Widgets.c b/src/Widgets.c index 98cde52a8..4bf2be0c1 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -1728,11 +1728,12 @@ void ChatInputWidget_Create(struct ChatInputWidget* w) { } void ChatInputWidget_SetFont(struct ChatInputWidget* w, FontDesc* font) { - struct DrawTextArgs args; - w->base.font = font; - w->base.lineHeight = Drawer2D_FontHeight(font, true); + struct DrawTextArgs args; DrawTextArgs_Make(&args, &chatInputPrefix, font, true); + + w->base.font = font; w->base.prefixWidth = Drawer2D_TextWidth(&args); + w->base.lineHeight = Drawer2D_TextHeight(&args); } @@ -2541,16 +2542,15 @@ static void SpecialInputWidget_UpdateColString(struct SpecialInputWidget* w) { } static bool SpecialInputWidget_IntersectsTitle(struct SpecialInputWidget* w, int x, int y) { - Size2D size; - int i, titleX = 0; + int i, width, titleX = 0; for (i = 0; i < Array_Elems(w->tabs); i++) { - size = w->tabs[i].titleSize; - if (Gui_Contains(titleX, 0, size.Width, size.Height, x, y)) { + width = w->tabs[i].titleWidth; + if (Gui_Contains(titleX, 0, width, w->titleHeight, x, y)) { w->selectedIndex = i; return true; } - titleX += size.Width; + titleX += width; } return false; } @@ -2560,7 +2560,7 @@ static void SpecialInputWidget_IntersectsBody(struct SpecialInputWidget* w, int String str; int i; - y -= w->tabs[0].titleSize.Height; + y -= w->titleHeight; x /= w->elementSize.Width; y /= w->elementSize.Height; i = (x + y * e.itemsPerRow) * e.charsPerItem; @@ -2575,10 +2575,9 @@ static void SpecialInputWidget_IntersectsBody(struct SpecialInputWidget* w, int } static void SpecialInputTab_Init(struct SpecialInputTab* tab, STRING_REF String* title, int itemsPerRow, int charsPerItem, STRING_REF String* contents) { - tab->title = *title; - tab->titleSize.Width = 0; - tab->titleSize.Height = 0; - tab->contents = *contents; + tab->title = *title; + tab->titleWidth = 0; + tab->contents = *contents; tab->itemsPerRow = itemsPerRow; tab->charsPerItem = charsPerItem; } @@ -2613,12 +2612,12 @@ static Size2D SpecialInputWidget_MeasureTitles(struct SpecialInputWidget* w) { for (i = 0; i < Array_Elems(w->tabs); i++) { args.text = w->tabs[i].title; - w->tabs[i].titleSize = Drawer2D_MeasureText(&args); - w->tabs[i].titleSize.Width += SPECIAL_TITLE_SPACING; - size.Width += w->tabs[i].titleSize.Width; + w->tabs[i].titleWidth = Drawer2D_TextWidth(&args) + SPECIAL_TITLE_SPACING; + size.Width += w->tabs[i].titleWidth; } - size.Height = w->tabs[0].titleSize.Height; + w->titleHeight = Drawer2D_TextHeight(&args); + size.Height = w->titleHeight; return size; } @@ -2626,20 +2625,18 @@ static void SpecialInputWidget_DrawTitles(struct SpecialInputWidget* w, Bitmap* BitmapCol col_selected = BITMAPCOL_CONST(30, 30, 30, 200); BitmapCol col_inactive = BITMAPCOL_CONST( 0, 0, 0, 127); BitmapCol col; - struct DrawTextArgs args; - Size2D size; - int i, x = 0; + int i, width, x = 0; DrawTextArgs_MakeEmpty(&args, w->font, false); for (i = 0; i < Array_Elems(w->tabs); i++) { args.text = w->tabs[i].title; - col = i == w->selectedIndex ? col_selected : col_inactive; - size = w->tabs[i].titleSize; + col = i == w->selectedIndex ? col_selected : col_inactive; + width = w->tabs[i].titleWidth; - Drawer2D_Clear(bmp, col, x, 0, size.Width, size.Height); + Drawer2D_Clear(bmp, col, x, 0, width, w->titleHeight); Drawer2D_DrawText(bmp, &args, x + SPECIAL_TITLE_SPACING / 2, 0); - x += size.Width; + x += width; } } diff --git a/src/Widgets.h b/src/Widgets.h index 453a57faf..55ef53191 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -251,8 +251,7 @@ CC_NOINLINE void PlayerListWidget_GetNameUnder(struct PlayerListWidget* w, int m typedef void (*SpecialInputAppendFunc)(void* userData, char c); struct SpecialInputTab { - int itemsPerRow, charsPerItem; - Size2D titleSize; + int itemsPerRow, charsPerItem, titleWidth; String title, contents; }; @@ -264,6 +263,7 @@ struct SpecialInputWidget { struct InputWidget* target; struct Texture tex; FontDesc* font; + int titleHeight; struct SpecialInputTab tabs[5]; String colString; char _colBuffer[DRAWER2D_MAX_COLS * 4]; From 15b67e1b02036b2cea16ef418679bd9b5ce6a96c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 20:13:46 +1000 Subject: [PATCH 34/46] Fix generating screen not getting closed, fixed MouseUp PlayerClick not being sent when going into a screen --- src/Gui.c | 29 ++++++++--------------------- src/Gui.h | 7 ------- src/InputHandler.c | 8 ++------ src/InputHandler.h | 2 +- src/Menus.c | 19 ++++++++++--------- 5 files changed, 21 insertions(+), 44 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index f87f93c41..4d9462971 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -156,22 +156,6 @@ struct Screen* Gui_GetActiveScreen(void) { return Gui_Active ? Gui_Active : Gui_HUD; } -void Gui_FreeActive(void) { - if (Gui_Active) { Elem_TryFree(Gui_Active); } -} - -void Gui_SetActive(struct Screen* screen) { - InputHandler_ScreenChanged(Gui_Active, screen); - Gui_Active = screen; - - if (screen) { - Elem_Init(screen); - /* for selecting active button etc */ - Elem_HandlesMouseMove(screen, Mouse_X, Mouse_Y); - } - Camera_CheckFocus(); -} - void Gui_RefreshAll(void) { Gui_ContextLost(NULL); Gui_ContextRecreated(NULL); @@ -230,14 +214,19 @@ static void Gui_RemoveCore(struct Screen* s) { s->VTABLE->Free(s); } +CC_NOINLINE static void Gui_OnScreensChanged(void) { + Camera_CheckFocus(); + InputHandler_OnScreensChanged(); +} + void Gui_Add(struct Screen* s, int priority) { Gui_AddCore(s, priority); - Camera_CheckFocus(); + Gui_OnScreensChanged(); } void Gui_Remove(struct Screen* s) { Gui_RemoveCore(s); - Camera_CheckFocus(); + Gui_OnScreensChanged(); } void Gui_Replace(struct Screen* s, int priority) { @@ -247,9 +236,7 @@ void Gui_Replace(struct Screen* s, int priority) { for (i = Gui_ScreensCount - 1; i >= 0; i--) { if (priorities[i] == priority) Gui_RemoveCore(Gui_Screens[i]); } - - Gui_AddCore(s, priority); - Camera_CheckFocus(); + Gui_OnScreensChanged(); } struct Screen* Gui_GetInputGrab(void) { diff --git a/src/Gui.h b/src/Gui.h index e0798569b..b2b3ac289 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -121,13 +121,6 @@ bool Gui_Contains(int recX, int recY, int width, int height, int x, int y); /* This means if an overlay is active, it will be over the top of other screens. */ struct Screen* Gui_GetActiveScreen(void); -/* Frees the active screen if it is not NULL. */ -/* NOTE: You should usually use Gui_CloseActive instead. */ -CC_NOINLINE void Gui_FreeActive(void); -/* Sets the active screen/menu that the user interacts with. */ -/* NOTE: This doesn't free old active screen - must call Gui_FreeActive() first */ -CC_NOINLINE void Gui_SetActive(struct Screen* screen); - /* Returns index of the given screen in the screens list, -1 if not */ int Gui_Index(struct Screen* screen); /* Inserts a screen into the screen lists with the given priority. */ diff --git a/src/InputHandler.c b/src/InputHandler.c index 7a775e784..b3ee2aa49 100644 --- a/src/InputHandler.c +++ b/src/InputHandler.c @@ -62,10 +62,8 @@ static void InputHandler_ButtonStateChanged(MouseButton button, bool pressed) { } } -void InputHandler_ScreenChanged(struct Screen* oldScreen, struct Screen* newScreen) { - if (oldScreen && oldScreen->grabsInput) { - input_lastClick = DateTime_CurrentUTC_MS(); - } +void InputHandler_OnScreensChanged(void) { + input_lastClick = DateTime_CurrentUTC_MS(); if (Server.SupportsPlayerClick) { input_pickingId = -1; @@ -472,8 +470,6 @@ static void InputHandler_KeyDown(void* obj, int key, bool was) { String text; if (!was && InputHandler_SimulateMouse(key, true)) return; - s = Gui_GetActiveScreen(); - #ifndef CC_BUILD_WEB if (key == KEY_ESCAPE && (s = Gui_GetClosable())) { /* Don't want holding down escape to go in and out of pause menu */ diff --git a/src/InputHandler.h b/src/InputHandler.h index 357c02700..e17cebe23 100644 --- a/src/InputHandler.h +++ b/src/InputHandler.h @@ -10,5 +10,5 @@ bool InputHandler_IsMousePressed(MouseButton button); bool InputHandler_SetFOV(int fov); void InputHandler_PickBlocks(bool cooldown, bool left, bool middle, bool right); void InputHandler_Init(void); -void InputHandler_ScreenChanged(struct Screen* oldScreen, struct Screen* newScreen); +void InputHandler_OnScreensChanged(void); #endif diff --git a/src/Menus.c b/src/Menus.c index b86e45ff4..b061c2fac 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -189,6 +189,12 @@ static void Menu_Remove(void* screen, int i) { widgets[i] = NULL; } +static void Menu_BeginGen(int width, int height, int length) { + World_Reset(); + World_SetDimensions(width, height, length); + GeneratingScreen_Show(); +} + static int Menu_Int(const String* str) { int v; Convert_ParseInt(str, &v); return v; } static float Menu_Float(const String* str) { float v; Convert_ParseFloat(str, &v); return v; } static PackedCol Menu_HexCol(const String* str) { PackedCol v; PackedCol_TryParseHex(str, &v); return v; } @@ -925,13 +931,6 @@ CC_NOINLINE static int GenLevelScreen_GetSeedInt(struct GenLevelScreen* s, int i return GenLevelScreen_GetInt(s, index); } -static void GenLevelScreen_Begin(int width, int height, int length) { - World_Reset(); - World_SetDimensions(width, height, length); - Gui_FreeActive(); // TODO: fix for classicgen - GeneratingScreen_Show(); -} - static void GenLevelScreen_Gen(void* screen, bool vanilla) { struct GenLevelScreen* s = (struct GenLevelScreen*)screen; int width = GenLevelScreen_GetInt(s, 0); @@ -946,7 +945,8 @@ static void GenLevelScreen_Gen(void* screen, bool vanilla) { Chat_AddRaw("&cOne of the map dimensions is invalid."); } else { Gen_Vanilla = vanilla; Gen_Seed = seed; - GenLevelScreen_Begin(width, height, length); + Gui_Remove((struct Screen*)s); + Menu_BeginGen(width, height, length); } } @@ -1067,7 +1067,8 @@ static void ClassicGenScreen_Gen(int size) { Gen_Vanilla = true; Gen_Seed = Random_Next(&rnd, Int32_MaxValue); - GenLevelScreen_Begin(size, 64, size); + Gui_Remove((struct Screen*)&ClassicGenScreen_Instance); + Menu_BeginGen(size, 64, size); } static void ClassicGenScreen_Small(void* a, void* b) { ClassicGenScreen_Gen(128); } From ac7e02208ce6f8099b5096dab995e9af2f2be45c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 20:26:38 +1000 Subject: [PATCH 35/46] Fix position/hacks status still showing in top-left even when in menus --- src/Gui.c | 7 ++----- src/Gui.h | 4 ---- src/Program.c | 2 +- src/Screens.c | 16 +++++++++++++--- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 4d9462971..fa23c9f80 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -19,7 +19,6 @@ bool Gui_ClickableChat, Gui_TabAutocomplete, Gui_ShowFPS; GfxResourceID Gui_GuiTex, Gui_GuiClassicTex, Gui_IconsTex; struct Screen* Gui_Status; struct Screen* Gui_HUD; -struct Screen* Gui_Active; struct Screen* Gui_Screens[GUI_MAX_SCREENS]; int Gui_ScreensCount; static uint8_t priorities[GUI_MAX_SCREENS]; @@ -152,10 +151,6 @@ struct IGameComponent Gui_Component = { NULL, /* OnNewMapLoaded */ }; -struct Screen* Gui_GetActiveScreen(void) { - return Gui_Active ? Gui_Active : Gui_HUD; -} - void Gui_RefreshAll(void) { Gui_ContextLost(NULL); Gui_ContextRecreated(NULL); @@ -236,6 +231,8 @@ void Gui_Replace(struct Screen* s, int priority) { for (i = Gui_ScreensCount - 1; i >= 0; i--) { if (priorities[i] == priority) Gui_RemoveCore(Gui_Screens[i]); } + + Gui_AddCore(s, priority); Gui_OnScreensChanged(); } diff --git a/src/Gui.h b/src/Gui.h index b2b3ac289..d68ac9bee 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -107,7 +107,6 @@ enum GuiPriority { extern struct Screen* Gui_Status; extern struct Screen* Gui_HUD; -extern struct Screen* Gui_Active; #define GUI_MAX_SCREENS 10 extern struct Screen* Gui_Screens[GUI_MAX_SCREENS]; extern int Gui_ScreensCount; @@ -117,9 +116,6 @@ extern int Gui_ScreensCount; int Gui_CalcPos(uint8_t anchor, int offset, int size, int axisLen); /* Returns whether the given rectangle contains the given point. */ bool Gui_Contains(int recX, int recY, int width, int height, int x, int y); -/* Gets the screen that the user is currently interacting with. */ -/* This means if an overlay is active, it will be over the top of other screens. */ -struct Screen* Gui_GetActiveScreen(void); /* Returns index of the given screen in the screens list, -1 if not */ int Gui_Index(struct Screen* screen); diff --git a/src/Program.c b/src/Program.c index 8012b5279..0b68ee9e3 100644 --- a/src/Program.c +++ b/src/Program.c @@ -105,7 +105,7 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ - //String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + /* String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); */ String rawArgs = String_FromConst("UnknownShadow200"); argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); diff --git a/src/Screens.c b/src/Screens.c index 317163acd..6da9dc567 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -49,7 +49,6 @@ struct HUDScreen { struct Texture chatTextures[TEXTGROUPWIDGET_MAX_LINES]; }; - static bool Screen_FKey(void* elem, Key key) { return false; } static bool Screen_FKeyPress(void* elem, char keyChar) { return false; } static bool Screen_FMouseScroll(void* elem, float delta) { return false; } @@ -62,6 +61,17 @@ static bool Screen_TMouseScroll(void* screen, float delta) { return true; } static bool Screen_TMouse(void* screen, int x, int y, int btn) { return true; } static void Screen_NullFunc(void* screen) { } +CC_NOINLINE static bool IsOnlyHudActive(void) { + struct Screen* s; + int i; + + for (i = 0; i < Gui_ScreensCount; i++) { + s = Gui_Screens[i]; + if (s->grabsInput && s != Gui_HUD) return false; + } + return true; +} + /*########################################################################################################################* *-----------------------------------------------------InventoryScreen-----------------------------------------------------* @@ -385,7 +395,7 @@ static void StatusScreen_Render(void* screen, double delta) { if (Game_ClassicMode) { Elem_Render(&s->line2, delta); - } else if (!Gui_Active && Gui_ShowFPS) { + } else if (IsOnlyHudActive() && Gui_ShowFPS) { if (StatusScreen_HacksChanged(s)) { StatusScreen_UpdateHackState(s); } StatusScreen_DrawPosition(s); Elem_Render(&s->line2, delta); @@ -1175,7 +1185,7 @@ static void HUDScreen_Render(void* screen, double delta) { if (!showMinimal) { Elem_Render(&s->hotbar, delta); } HUDScreen_DrawChat(s, delta); - if (s->showingList && Gui_GetActiveScreen() == (struct Screen*)s) { + if (s->showingList && IsOnlyHudActive()) { s->playerList.active = s->grabsInput; Elem_Render(&s->playerList, delta); /* NOTE: Should usually be caught by KeyUp, but just in case. */ From 5febbe41d01780cfd2c72e19ba7b7d2b23e8401f Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 20:44:10 +1000 Subject: [PATCH 36/46] Fix texpack/url overlays not properly stopping mouse events propagating to menus underneath --- src/Gui.c | 2 +- src/Gui.h | 1 - src/Menus.c | 58 +++++++++++++++++++++++---------------------------- src/Program.c | 4 ++-- src/Screens.c | 19 +++++++++-------- src/Screens.h | 14 +++++++++++++ 6 files changed, 53 insertions(+), 45 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index fa23c9f80..79a0a15cf 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -268,7 +268,7 @@ void Gui_RenderGui(double delta) { /* Draw back to front so highest priority screen is on top */ for (i = Gui_ScreensCount - 1; i >= 0; i--) { s = Gui_Screens[i]; - if (!s->hidden) Elem_Render(s, delta); + s->VTABLE->Render(s, delta); } Gfx_Mode3D(); } diff --git a/src/Gui.h b/src/Gui.h index d68ac9bee..2e650dd80 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -52,7 +52,6 @@ struct ScreenVTABLE { #define Screen_Layout const struct ScreenVTABLE* VTABLE; \ bool grabsInput; /* Whether this screen grabs input. Causes the cursor to become visible. */ \ bool blocksWorld; /* Whether this screen completely and opaquely covers the game world behind it. */ \ - bool hidden; /* Whether this screen is prevented from rendering. */ \ bool closable; /* Whether this screen is automatically closed when pressing Escape */ \ struct Widget** widgets; int numWidgets; diff --git a/src/Menus.c b/src/Menus.c index b061c2fac..7d7a1d935 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -134,7 +134,7 @@ static int Menu_DoMouseDown(void* screen, int x, int y, MouseButton btn) { return -1; } static bool Menu_MouseDown(void* screen, int x, int y, MouseButton btn) { - return Menu_DoMouseDown(screen, x, y, btn) >= 0; + Menu_DoMouseDown(screen, x, y, btn); return true; } static int Menu_DoMouseMove(void* screen, int x, int y) { @@ -158,13 +158,9 @@ static int Menu_DoMouseMove(void* screen, int x, int y) { } static bool Menu_MouseMove(void* screen, int x, int y) { - return Menu_DoMouseMove(screen, x, y) >= 0; + Menu_DoMouseMove(screen, x, y); return true; } -static bool Menu_MouseUp(void* screen, int x, int y, MouseButton btn) { return true; } -static bool Menu_KeyPress(void* screen, char keyChar) { return true; } -static bool Menu_KeyUp(void* screen, Key key) { return true; } - /*########################################################################################################################* *------------------------------------------------------Menu utilities-----------------------------------------------------* @@ -432,8 +428,8 @@ static void ListScreen_ContextRecreated(void* screen) { static const struct ScreenVTABLE ListScreen_VTABLE = { ListScreen_Init, ListScreen_Render, ListScreen_Free, - ListScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, ListScreen_MouseScroll, + ListScreen_KeyDown, Screen_TKey, Screen_TKeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, ListScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, ListScreen_ContextRecreated }; void ListScreen_Show(void) { @@ -561,8 +557,8 @@ static void PauseScreen_Free(void* screen) { static const struct ScreenVTABLE PauseScreen_VTABLE = { PauseScreen_Init, MenuScreen_Render, PauseScreen_Free, - MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + MenuScreen_KeyDown, Screen_TKey, Screen_TKeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, PauseScreen_ContextRecreated }; void PauseScreen_Show(void) { @@ -666,8 +662,8 @@ static bool OptionsGroupScreen_MouseMove(void* screen, int x, int y) { static const struct ScreenVTABLE OptionsGroupScreen_VTABLE = { OptionsGroupScreen_Init, MenuScreen_Render, OptionsGroupScreen_Free, - MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, OptionsGroupScreen_MouseMove, MenuScreen_MouseScroll, + MenuScreen_KeyDown, Screen_TKey, Screen_TKeyPress, + Menu_MouseDown, Screen_TMouse, OptionsGroupScreen_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, OptionsGroupScreen_ContextRecreated }; void OptionsGroupScreen_Show(void) { @@ -883,8 +879,8 @@ static void EditHotkeyScreen_Init(void* screen) { static const struct ScreenVTABLE EditHotkeyScreen_VTABLE = { EditHotkeyScreen_Init, EditHotkeyScreen_Render, EditHotkeyScreen_Free, - EditHotkeyScreen_KeyDown, Menu_KeyUp, EditHotkeyScreen_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + EditHotkeyScreen_KeyDown, Screen_TKey, EditHotkeyScreen_KeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, EditHotkeyScreen_ContextRecreated }; void EditHotkeyScreen_Show(struct HotkeyData original) { @@ -1041,8 +1037,8 @@ static void GenLevelScreen_Init(void* screen) { static const struct ScreenVTABLE GenLevelScreen_VTABLE = { GenLevelScreen_Init, MenuScreen_Render, MenuScreen_Free, - GenLevelScreen_KeyDown, Menu_KeyUp, GenLevelScreen_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + GenLevelScreen_KeyDown, Screen_TKey, GenLevelScreen_KeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, GenLevelScreen_ContextRecreated }; void GenLevelScreen_Show(void) { @@ -1104,8 +1100,8 @@ static void ClassicGenScreen_Init(void* screen) { static const struct ScreenVTABLE ClassicGenScreen_VTABLE = { ClassicGenScreen_Init, MenuScreen_Render, MenuScreen_Free, - MenuScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + MenuScreen_KeyDown, Screen_TKey, Screen_TKeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, ClassicGenScreen_ContextRecreated }; void ClassicGenScreen_Show(void) { @@ -1264,8 +1260,8 @@ static void SaveLevelScreen_Init(void* screen) { static const struct ScreenVTABLE SaveLevelScreen_VTABLE = { SaveLevelScreen_Init, SaveLevelScreen_Render, MenuScreen_Free, - SaveLevelScreen_KeyDown, Menu_KeyUp, SaveLevelScreen_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + SaveLevelScreen_KeyDown, Screen_TKey, SaveLevelScreen_KeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, SaveLevelScreen_ContextRecreated }; void SaveLevelScreen_Show(void) { @@ -1546,7 +1542,7 @@ static bool KeyBindingsScreen_MouseDown(void* screen, int x, int y, MouseButton if (btn != MOUSE_RIGHT) { return Menu_MouseDown(s, x, y, btn); } i = Menu_DoMouseDown(s, x, y, btn); - if (i == -1) return false; + if (i == -1) return true; /* Reset a key binding by right clicking */ if ((s->curI == -1 || s->curI == i) && i < s->bindsCount) { @@ -1619,8 +1615,8 @@ static void KeyBindingsScreen_Init(void* screen) { static const struct ScreenVTABLE KeyBindingsScreen_VTABLE = { KeyBindingsScreen_Init, MenuScreen_Render, MenuScreen_Free, - KeyBindingsScreen_KeyDown, Menu_KeyUp, Menu_KeyPress, - KeyBindingsScreen_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + KeyBindingsScreen_KeyDown, Screen_TKey, Screen_TKeyPress, + KeyBindingsScreen_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, KeyBindingsScreen_ContextRecreated }; static void KeyBindingsScreen_Show(int bindsCount, const uint8_t* binds, const char** descs, InitKeyBindings doInit) { @@ -2056,8 +2052,8 @@ static void MenuOptionsScreen_ContextRecreated(void* screen) { static const struct ScreenVTABLE MenuOptionsScreen_VTABLE = { MenuOptionsScreen_Init, MenuOptionsScreen_Render, MenuOptionsScreen_Free, - MenuOptionsScreen_KeyDown, Menu_KeyUp, MenuOptionsScreen_KeyPress, - Menu_MouseDown, Menu_MouseUp, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, + MenuOptionsScreen_KeyDown, Screen_TKey, MenuOptionsScreen_KeyPress, + Menu_MouseDown, Screen_TMouse, MenuOptionsScreen_MouseMove, MenuScreen_MouseScroll, MenuOptionsScreen_OnResize, MenuOptionsScreen_ContextLost, MenuOptionsScreen_ContextRecreated }; void MenuOptionsScreen_Show(struct MenuInputDesc* descs, const char** descriptions, int descsCount, InitMenuOptions init) { @@ -2717,8 +2713,6 @@ void NostalgiaScreen_Show(void) { /*########################################################################################################################* *---------------------------------------------------------Overlay---------------------------------------------------------* *#########################################################################################################################*/ -static bool Overlay_KeyDown(void* screen, Key key) { return true; } - static void Overlay_MakeLabels(void* menu, struct TextWidget* labels) { struct MenuScreen* s = (struct MenuScreen*)menu; PackedCol col = PACKEDCOL_CONST(224, 224, 224, 255); @@ -2897,7 +2891,7 @@ static bool TexIdsOverlay_KeyUp(void* screen, Key key) { return false; } static const struct ScreenVTABLE TexIdsOverlay_VTABLE = { TexIdsOverlay_Init, TexIdsOverlay_Render, MenuScreen_Free, TexIdsOverlay_KeyDown, TexIdsOverlay_KeyUp, TexIdsOverlay_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated }; void TexIdsOverlay_Show(void) { @@ -2959,8 +2953,8 @@ static void UrlWarningOverlay_Init(void* screen) { static const struct ScreenVTABLE UrlWarningOverlay_VTABLE = { UrlWarningOverlay_Init, MenuScreen_Render, MenuScreen_Free, - Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Screen_TKey, Screen_TKey, Screen_TKeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, UrlWarningOverlay_ContextRecreated }; void UrlWarningOverlay_Show(const String* url) { @@ -3097,8 +3091,8 @@ static void TexPackOverlay_Init(void* screen) { static const struct ScreenVTABLE TexPackOverlay_VTABLE = { TexPackOverlay_Init, TexPackOverlay_Render, MenuScreen_Free, - Overlay_KeyDown, Menu_KeyUp, Menu_KeyPress, - Menu_MouseDown, Menu_MouseUp, Menu_MouseMove, MenuScreen_MouseScroll, + Screen_TKey, Screen_TKey, Screen_TKeyPress, + Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, Menu_ContextLost, TexPackOverlay_ContextRecreated }; void TexPackOverlay_Show(const String* url) { diff --git a/src/Program.c b/src/Program.c index 0b68ee9e3..e7b57ff0b 100644 --- a/src/Program.c +++ b/src/Program.c @@ -105,8 +105,8 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ - /* String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); */ - String rawArgs = String_FromConst("UnknownShadow200"); + String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + //String rawArgs = String_FromConst("UnknownShadow200"); argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); if (argsCount == 0) { diff --git a/src/Screens.c b/src/Screens.c index 6da9dc567..39a4b2dd0 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -49,16 +49,17 @@ struct HUDScreen { struct Texture chatTextures[TEXTGROUPWIDGET_MAX_LINES]; }; -static bool Screen_FKey(void* elem, Key key) { return false; } -static bool Screen_FKeyPress(void* elem, char keyChar) { return false; } -static bool Screen_FMouseScroll(void* elem, float delta) { return false; } -static bool Screen_FMouse(void* elem, int x, int y, int btn) { return false; } -static bool Screen_FMouseMove(void* elem, int x, int y) { return false; } +bool Screen_FKey(void* elem, int key) { return false; } +bool Screen_FKeyPress(void* elem, char keyChar) { return false; } +bool Screen_FMouseScroll(void* elem, float delta) { return false; } +bool Screen_FMouse(void* elem, int x, int y, int btn) { return false; } +bool Screen_FMouseMove(void* elem, int x, int y) { return false; } -static bool Screen_TKeyPress(void* elem, char keyChar) { return true; } -static bool Screen_TKey(void* s, Key key) { return true; } -static bool Screen_TMouseScroll(void* screen, float delta) { return true; } -static bool Screen_TMouse(void* screen, int x, int y, int btn) { return true; } +bool Screen_TKeyPress(void* elem, char keyChar) { return true; } +bool Screen_TKey(void* s, int key) { return true; } +bool Screen_TMouseScroll(void* screen, float delta) { return true; } +bool Screen_TMouse(void* screen, int x, int y, int btn) { return true; } +bool Screen_TMouseMove(void* elem, int x, int y) { return true; } static void Screen_NullFunc(void* screen) { } CC_NOINLINE static bool IsOnlyHudActive(void) { diff --git a/src/Screens.h b/src/Screens.h index 4d6ae3505..1d42100cb 100644 --- a/src/Screens.h +++ b/src/Screens.h @@ -7,6 +7,20 @@ struct Screen; struct Widget; +/* These always return false */ +bool Screen_FKey(void* elem, int key); +bool Screen_FKeyPress(void* elem, char keyChar); +bool Screen_FMouseScroll(void* elem, float delta); +bool Screen_FMouse(void* elem, int x, int y, int btn); +bool Screen_FMouseMove(void* elem, int x, int y); + +/* These always return true */ +bool Screen_TKeyPress(void* elem, char keyChar); +bool Screen_TKey(void* s, int key); +bool Screen_TMouseScroll(void* screen, float delta); +bool Screen_TMouse(void* screen, int x, int y, int btn); +bool Screen_TMouseMove(void* elem, int x, int y); + void InventoryScreen_Show(void); void StatusScreen_Show(void); void LoadingScreen_Show(const String* title, const String* message); From f9bf1029fa51b38a2fa7cf4d3b0ec495bd905b9f Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 20:52:04 +1000 Subject: [PATCH 37/46] Fix disconnect screen not disappearing when you click Reconnect --- src/Gui.c | 9 ++++++--- src/Gui.h | 2 ++ src/Menus.c | 5 +---- src/Screens.c | 7 ++++++- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Gui.c b/src/Gui.c index 79a0a15cf..02e77f8c7 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -70,6 +70,11 @@ bool Gui_Contains(int recX, int recY, int width, int height, int x, int y) { return x >= recX && y >= recY && x < (recX + width) && y < (recY + height); } +void Gui_ShowDefault(void) { + StatusScreen_Show(); + HUDScreen_Show(); +} + static void Gui_ContextLost(void* obj) { struct Screen* s; int i; @@ -120,9 +125,7 @@ static void Gui_Init(void) { Event_RegisterVoid(&GfxEvents.ContextLost, NULL, Gui_ContextLost); Event_RegisterVoid(&GfxEvents.ContextRecreated, NULL, Gui_ContextRecreated); Gui_LoadOptions(); - - StatusScreen_Show(); - HUDScreen_Show(); + Gui_ShowDefault(); } static void Gui_Reset(void) { diff --git a/src/Gui.h b/src/Gui.h index 2e650dd80..f72fcb9fe 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -115,6 +115,8 @@ extern int Gui_ScreensCount; int Gui_CalcPos(uint8_t anchor, int offset, int size, int axisLen); /* Returns whether the given rectangle contains the given point. */ bool Gui_Contains(int recX, int recY, int width, int height, int x, int y); +/* Shows HUD and Status screens. */ +void Gui_ShowDefault(void); /* Returns index of the given screen in the screens list, -1 if not */ int Gui_Index(struct Screen* screen); diff --git a/src/Menus.c b/src/Menus.c index 7d7a1d935..bca53f0e2 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -2885,12 +2885,9 @@ static bool TexIdsOverlay_KeyDown(void* screen, Key key) { return false; } -static bool TexIdsOverlay_KeyPress(void* screen, char keyChar) { return false; } -static bool TexIdsOverlay_KeyUp(void* screen, Key key) { return false; } - static const struct ScreenVTABLE TexIdsOverlay_VTABLE = { TexIdsOverlay_Init, TexIdsOverlay_Render, MenuScreen_Free, - TexIdsOverlay_KeyDown, TexIdsOverlay_KeyUp, TexIdsOverlay_KeyPress, + TexIdsOverlay_KeyDown, Screen_FKey, Screen_FKeyPress, Menu_MouseDown, Screen_TMouse, Menu_MouseMove, MenuScreen_MouseScroll, Menu_OnResize, TexIdsOverlay_ContextLost, TexIdsOverlay_ContextRecreated }; diff --git a/src/Screens.c b/src/Screens.c index 39a4b2dd0..7982fa12b 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1363,7 +1363,12 @@ static bool DisconnectScreen_MouseDown(void* screen, int x, int y, MouseButton b struct ButtonWidget* w = &s->reconnect; if (btn != MOUSE_LEFT) return true; - if (!w->disabled && Widget_Contains(w, x, y)) Server.BeginConnect(); + + if (!w->disabled && Widget_Contains(w, x, y)) { + Gui_Remove((struct Screen*)s); + Gui_ShowDefault(); + Server.BeginConnect(); + } return true; } From 812094465b720bf1532c5d1ab26983d1b32ee752 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 21:05:41 +1000 Subject: [PATCH 38/46] To make original classic, loading menu disables showing or interacting with all other menus --- src/Gui.h | 3 ++- src/Program.c | 4 ++-- src/Screens.c | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Gui.h b/src/Gui.h index f72fcb9fe..e41718366 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -93,7 +93,8 @@ extern GfxResourceID Gui_GuiTex, Gui_GuiClassicTex, Gui_IconsTex; /* Higher priority handles input first and draws on top */ enum GuiPriority { - GUI_PRIORITY_DISCONNECT = 45, + GUI_PRIORITY_DISCONNECT = 50, + GUI_PRIORITY_OLDLOADING = 45, GUI_PRIORITY_STATUS = 40, GUI_PRIORITY_URLWARNING = 35, GUI_PRIORITY_TEXPACK = 30, diff --git a/src/Program.c b/src/Program.c index e7b57ff0b..caa1e567e 100644 --- a/src/Program.c +++ b/src/Program.c @@ -105,9 +105,9 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ - String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + //String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); //String rawArgs = String_FromConst("UnknownShadow200"); - argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); + //argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); if (argsCount == 0) { #ifdef CC_BUILD_WEB diff --git a/src/Screens.c b/src/Screens.c index 7982fa12b..479aeb47e 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -563,13 +563,14 @@ CC_NOINLINE static void LoadingScreen_ShowCommon(const String* title, const Stri s->grabsInput = true; s->blocksWorld = true; - Gui_Replace((struct Screen*)s, GUI_PRIORITY_LOADING); + Gui_Replace((struct Screen*)s, + Game_ClassicMode ? GUI_PRIORITY_OLDLOADING : GUI_PRIORITY_LOADING); } static const struct ScreenVTABLE LoadingScreen_VTABLE = { LoadingScreen_Init, LoadingScreen_Render, LoadingScreen_Free, Screen_TKey, Screen_TKey, Screen_TKeyPress, - Screen_TMouse, Screen_TMouse, Screen_FMouseMove, Screen_TMouseScroll, + Screen_TMouse, Screen_TMouse, Screen_TMouseMove, Screen_TMouseScroll, LoadingScreen_OnResize, LoadingScreen_ContextLost, LoadingScreen_ContextRecreated }; void LoadingScreen_Show(const String* title, const String* message) { From 451400fd19d7d360822e274a4635edbf93692e0c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Wed, 21 Aug 2019 21:16:03 +1000 Subject: [PATCH 39/46] Fix alt input widget not being moved up when you append to input by clicking on chat Also fix chat geting positioned wrongly in OpenGL build and when reconnecting --- src/Program.c | 4 ++-- src/Screens.c | 3 +++ src/Widgets.c | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Program.c b/src/Program.c index caa1e567e..e7b57ff0b 100644 --- a/src/Program.c +++ b/src/Program.c @@ -105,9 +105,9 @@ static int Program_Run(int argc, char** argv) { int argsCount = Platform_GetCommandLineArgs(argc, argv, args); /* NOTE: Make sure to comment this out before pushing a commit */ - //String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); + String rawArgs = String_FromConst("UnknownShadow200 fffff 127.0.0.1 25565"); //String rawArgs = String_FromConst("UnknownShadow200"); - //argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); + argsCount = String_UNSAFE_Split(&rawArgs, ' ', args, 4); if (argsCount == 0) { #ifdef CC_BUILD_WEB diff --git a/src/Screens.c b/src/Screens.c index 479aeb47e..3dde25735 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -717,6 +717,7 @@ static void HUDScreen_ChatUpdateFont(struct HUDScreen* s) { static void HUDScreen_ChatUpdateLayout(struct HUDScreen* s) { int yOffset = HUDScreen_BottomOffset() + 15; Widget_SetLocation(&s->input.base, ANCHOR_MIN, ANCHOR_MAX, 5, 5); + Widget_SetLocation(&s->altText, ANCHOR_MIN, ANCHOR_MAX, 5, 5); HUDScreen_UpdateAltTextY(s); Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); @@ -996,6 +997,7 @@ static void HUDScreen_ContextRecreated(void* screen) { Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); HUDScreen_InitChatFonts(s); HUDScreen_ChatUpdateFont(s); + HUDScreen_ChatUpdateLayout(s); HUDScreen_Redraw(s); HUDScreen_UpdateChatYOffset(s, true); @@ -1148,6 +1150,7 @@ static bool HUDScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { UrlWarningOverlay_Show(&text); } else if (Gui_ClickableChat) { InputWidget_AppendString(&s->input.base, &text); + HUDScreen_UpdateAltTextY(s); } return true; } diff --git a/src/Widgets.c b/src/Widgets.c index 4bf2be0c1..9ecd251b9 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -2762,5 +2762,4 @@ void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, str w->font = font; w->target = target; SpecialInputWidget_InitTabs(w); - w->x = 5; w->y = 5; } From e10237c5e54967fbe19b7cb9ae9761bd386a008e Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 22 Aug 2019 08:00:13 +1000 Subject: [PATCH 40/46] Status should be rendered behind menus/inventory menu instead of on top --- ClassicalSharp/known_bugs.txt | 6 +++++- src/Gui.h | 12 ++++++------ src/Widgets.c | 19 ++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/ClassicalSharp/known_bugs.txt b/ClassicalSharp/known_bugs.txt index 8b583c0a1..b7986e318 100644 --- a/ClassicalSharp/known_bugs.txt +++ b/ClassicalSharp/known_bugs.txt @@ -7,4 +7,8 @@ * catbox.moe texture packs/terrain.png links insta-crash the game * Sometimes you randomly crash reading leveldatachunk packet on OSX * Models with size of over 2 are not supported at all -* Direct3D9 backend uses an ill-formed vertex format that works by accident \ No newline at end of file +* Direct3D9 backend uses an ill-formed vertex format that works by accident +* Alt text doesn't update its Y position if you click on chat +* Menu inputs (save, edit hotkey, water level, etc) are reset on window resize +* Chat input caret is reset on window resize +* Position in chat (if you scrolled up into history) is reset on window resize \ No newline at end of file diff --git a/src/Gui.h b/src/Gui.h index e41718366..6d6c9583e 100644 --- a/src/Gui.h +++ b/src/Gui.h @@ -95,12 +95,12 @@ extern GfxResourceID Gui_GuiTex, Gui_GuiClassicTex, Gui_IconsTex; enum GuiPriority { GUI_PRIORITY_DISCONNECT = 50, GUI_PRIORITY_OLDLOADING = 45, - GUI_PRIORITY_STATUS = 40, - GUI_PRIORITY_URLWARNING = 35, - GUI_PRIORITY_TEXPACK = 30, - GUI_PRIORITY_TEXIDS = 25, - GUI_PRIORITY_MENU = 20, - GUI_PRIORITY_INVENTORY = 15, + GUI_PRIORITY_URLWARNING = 40, + GUI_PRIORITY_TEXPACK = 35, + GUI_PRIORITY_TEXIDS = 30, + GUI_PRIORITY_MENU = 25, + GUI_PRIORITY_INVENTORY = 20, + GUI_PRIORITY_STATUS = 15, GUI_PRIORITY_HUD = 10, GUI_PRIORITY_LOADING = 5, }; diff --git a/src/Widgets.c b/src/Widgets.c index 9ecd251b9..44804dabc 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -619,9 +619,6 @@ static void TableWidget_RecreateElements(struct TableWidget* w) { static void TableWidget_Init(void* widget) { struct TableWidget* w = (struct TableWidget*)widget; - w->lastX = Mouse_X; w->lastY = Mouse_Y; - - ScrollbarWidget_Create(&w->scroll); TableWidget_RecreateElements(w); Widget_Reposition(w); } @@ -820,6 +817,8 @@ void TableWidget_Create(struct TableWidget* w) { Widget_Reset(w); w->VTABLE = &TableWidget_VTABLE; w->lastCreatedIndex = -1000; + ScrollbarWidget_Create(&w->scroll); + w->lastX = Mouse_X; w->lastY = Mouse_Y; } void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block) { @@ -2390,20 +2389,22 @@ static void TextGroupWidget_DrawAdvanced(struct TextGroupWidget* w, struct Textu char chars[TEXTGROUPWIDGET_MAX_LINES * TEXTGROUPWIDGET_LEN]; struct Portion portions[2 * (TEXTGROUPWIDGET_LEN / TEXTGROUPWIDGET_HTTP_LEN)]; struct Portion bit; - Size2D size = { 0, 0 }; - Size2D partSizes[Array_Elems(portions)]; + Size2D size; + int partWidths[Array_Elems(portions)]; Bitmap bmp; int portionsCount; int i, x, ul; + size.Width = 0; + size.Height = Drawer2D_TextHeight(args); portionsCount = TextGroupWidget_Reduce(w, chars, index, portions); + for (i = 0; i < portionsCount; i++) { bit = portions[i]; args->text = String_UNSAFE_Substring(text, bit.LineBeg, bit.LineLen); - partSizes[i] = Drawer2D_MeasureText(args); - size.Height = max(partSizes[i].Height, size.Height); - size.Width += partSizes[i].Width; + partWidths[i] = Drawer2D_TextWidth(args); + size.Width += partWidths[i]; } Bitmap_AllocateClearedPow2(&bmp, size.Width, size.Height); @@ -2418,7 +2419,7 @@ static void TextGroupWidget_DrawAdvanced(struct TextGroupWidget* w, struct Textu Drawer2D_DrawText(&bmp, args, x, 0); if (ul) args->font.Style &= ~FONT_FLAG_UNDERLINE; - x += partSizes[i].Width; + x += partWidths[i]; } Drawer2D_Make2DTexture(tex, &bmp, size, 0, 0); } From 9c8037b95dc4ec71f5117743f641a2b51fdbd1f3 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 23 Aug 2019 08:01:56 +1000 Subject: [PATCH 41/46] Fix blank line appearing when you type /client cuboid --- ClassicalSharp/known_bugs.txt | 3 ++- src/Screens.c | 28 ++++++++++++---------------- src/Widgets.c | 2 +- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/ClassicalSharp/known_bugs.txt b/ClassicalSharp/known_bugs.txt index b7986e318..317b21da0 100644 --- a/ClassicalSharp/known_bugs.txt +++ b/ClassicalSharp/known_bugs.txt @@ -11,4 +11,5 @@ * Alt text doesn't update its Y position if you click on chat * Menu inputs (save, edit hotkey, water level, etc) are reset on window resize * Chat input caret is reset on window resize -* Position in chat (if you scrolled up into history) is reset on window resize \ No newline at end of file +* Position in chat (if you scrolled up into history) is reset on window resize +* Two blank lines get shown in chat when you type /client cuboid \ No newline at end of file diff --git a/src/Screens.c b/src/Screens.c index 3dde25735..44991733c 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -720,9 +720,9 @@ static void HUDScreen_ChatUpdateLayout(struct HUDScreen* s) { Widget_SetLocation(&s->altText, ANCHOR_MIN, ANCHOR_MAX, 5, 5); HUDScreen_UpdateAltTextY(s); - Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); - Widget_SetLocation(&s->bottomRight, ANCHOR_MAX, ANCHOR_MAX, 0, yOffset); - Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); + Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); + Widget_SetLocation(&s->bottomRight, ANCHOR_MAX, ANCHOR_MAX, 0, yOffset); + Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); } @@ -740,7 +740,10 @@ static void HUDScreen_ChatInit(struct HUDScreen* s) { s->clientStatusTextures, HUDScreen_GetClientStatus); TextWidget_Make(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -Window_Height / 4); - s->status.placeholderHeight[0] = false; /* Texture pack download status */ + s->status.placeholderHeight[0] = false; /* Texture pack download status */ + s->clientStatus.placeholderHeight[0] = false; + s->clientStatus.placeholderHeight[1] = false; + s->chat.underlineUrls = !Game_ClassicMode; s->chatIndex = Chat_Log.count - Gui_Chatlines; } @@ -762,8 +765,8 @@ static void HUDScreen_UpdateChatYOffset(struct HUDScreen* s, bool force) { int bottomOffset = HUDScreen_BottomOffset() + 15; s->clientStatus.yOffset = max(bottomOffset, height); Widget_Reposition(&s->clientStatus); - - s->chat.yOffset = s->clientStatus.yOffset + TextGroupWidget_UsedHeight(&s->clientStatus); + + s->chat.yOffset = s->clientStatus.yOffset + s->clientStatus.height; Widget_Reposition(&s->chat); s->inputOldHeight = height; } @@ -908,7 +911,7 @@ static void HUDScreen_DrawChatBackground(struct HUDScreen* s) { int y = s->chat.y + s->chat.height - usedHeight; int width = max(s->clientStatus.width, s->chat.width); - int height = usedHeight + TextGroupWidget_UsedHeight(&s->clientStatus); + int height = usedHeight + s->clientStatus.height; if (height > 0) { PackedCol backCol = PACKEDCOL_CONST(0, 0, 0, 127); @@ -919,21 +922,14 @@ static void HUDScreen_DrawChatBackground(struct HUDScreen* s) { static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) { struct Texture tex; TimeMS now; - int i, y, logIdx; + int i, logIdx; HUDScreen_UpdateTexpackStatus(s); if (!Game_PureClassic) { Elem_Render(&s->status, delta); } Elem_Render(&s->bottomRight, delta); HUDScreen_UpdateChatYOffset(s, false); - y = s->clientStatus.y + s->clientStatus.height; - for (i = 0; i < s->clientStatus.lines; i++) { - tex = s->clientStatus.textures[i]; - if (!tex.ID) continue; - - y -= tex.Height; tex.Y = y; - Texture_Render(&tex); - } + Elem_Render(&s->clientStatus, delta); now = DateTime_CurrentUTC_MS(); if (s->grabsInput) { diff --git a/src/Widgets.c b/src/Widgets.c index 44804dabc..f6236c2e6 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -1208,7 +1208,7 @@ static bool InputWidget_MouseDown(void* widget, int x, int y, MouseButton button x -= w->inputTex.X; y -= w->inputTex.Y; DrawTextArgs_MakeEmpty(&args, w->font, true); - charHeight = w->caretTex.Height; + charHeight = w->lineHeight; String_InitArray(line, lineBuffer); for (cy = 0; cy < w->GetMaxLines(); cy++) { From ffb92f652fecf0bd14f34190657369f95767d043 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 23 Aug 2019 21:14:45 +1000 Subject: [PATCH 42/46] Fix chatlines not updating --- ClassicalSharp/known_bugs.txt | 3 ++- src/Menus.c | 2 +- src/Screens.c | 14 +++++++++++--- src/Screens.h | 1 + src/Widgets.c | 9 +++------ src/Widgets.h | 4 ++-- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ClassicalSharp/known_bugs.txt b/ClassicalSharp/known_bugs.txt index 317b21da0..36e14c2b3 100644 --- a/ClassicalSharp/known_bugs.txt +++ b/ClassicalSharp/known_bugs.txt @@ -12,4 +12,5 @@ * Menu inputs (save, edit hotkey, water level, etc) are reset on window resize * Chat input caret is reset on window resize * Position in chat (if you scrolled up into history) is reset on window resize -* Two blank lines get shown in chat when you type /client cuboid \ No newline at end of file +* Two blank lines get shown in chat when you type /client cuboid +* Alt text is closed on window resize \ No newline at end of file diff --git a/src/Menus.c b/src/Menus.c index bca53f0e2..ddc3ed394 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -2377,8 +2377,8 @@ static void GuiOptionsScreen_SetChatScale(const String* v) { GuiOptionsScreen_Se static void GuiOptionsScreen_GetChatlines(String* v) { String_AppendInt(v, Gui_Chatlines); } static void GuiOptionsScreen_SetChatlines(const String* v) { Gui_Chatlines = Menu_Int(v); + HUDScreen_SetChatlines(Gui_Chatlines); Options_Set(OPT_CHATLINES, v); - Gui_RefreshHud(); } static void GuiOptionsScreen_GetUseFont(String* v) { Menu_GetBool(v, !Drawer2D_BitmappedText); } diff --git a/src/Screens.c b/src/Screens.c index 44991733c..bd97fec2e 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -740,9 +740,9 @@ static void HUDScreen_ChatInit(struct HUDScreen* s) { s->clientStatusTextures, HUDScreen_GetClientStatus); TextWidget_Make(&s->announcement, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -Window_Height / 4); - s->status.placeholderHeight[0] = false; /* Texture pack download status */ - s->clientStatus.placeholderHeight[0] = false; - s->clientStatus.placeholderHeight[1] = false; + s->status.collapsible[0] = true; /* Texture pack download status */ + s->clientStatus.collapsible[0] = true; + s->clientStatus.collapsible[1] = true; s->chat.underlineUrls = !Game_ClassicMode; s->chatIndex = Chat_Log.count - Gui_Chatlines; @@ -1236,6 +1236,14 @@ void HUDScreen_AppendInput(const String* text) { InputWidget_AppendString(&s->input.base, text); } +void HUDScreen_SetChatlines(int lines) { + struct HUDScreen* s = &HUDScreen_Instance; + Elem_Free(&s->chat); + s->chatIndex += s->chat.lines - lines; + s->chat.lines = lines; + TextGroupWidget_RedrawAll(&s->chat); +} + struct Widget* HUDScreen_GetHotbar(void) { return (struct Widget*)&HUDScreen_Instance.hotbar; } diff --git a/src/Screens.h b/src/Screens.h index 1d42100cb..67e8ff816 100644 --- a/src/Screens.h +++ b/src/Screens.h @@ -34,5 +34,6 @@ extern struct Screen* LoadingScreen_UNSAFE_RawPointer; void HUDScreen_OpenInput(const String* text); /* Appends text to the chat input in the HUD. */ void HUDScreen_AppendInput(const String* text); +void HUDScreen_SetChatlines(int lines); struct Widget* HUDScreen_GetHotbar(void); #endif diff --git a/src/Widgets.c b/src/Widgets.c index f6236c2e6..f9d9fc868 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -2448,7 +2448,7 @@ void TextGroupWidget_Redraw(struct TextGroupWidget* w, int index) { } Drawer2D_ReducePadding_Tex(&tex, w->font->Size, 3); } else { - tex.Height = w->placeholderHeight[index] ? w->defaultHeight : 0; + tex.Height = w->collapsible[index] ? 0 : w->defaultHeight; } tex.X = Gui_CalcPos(w->horAnchor, w->xOffset, tex.Width, Window_Width); @@ -2482,7 +2482,7 @@ void TextGroupWidget_SetFont(struct TextGroupWidget* w, FontDesc* font) { w->defaultHeight = height; for (i = 0; i < w->lines; i++) { - w->textures[i].Height = w->placeholderHeight[i] ? height : 0; + w->textures[i].Height = w->collapsible[i] ? 0 : height; } w->font = font; Widget_Reposition(w); @@ -2515,11 +2515,8 @@ static const struct WidgetVTABLE TextGroupWidget_VTABLE = { TextGroupWidget_Reposition }; void TextGroupWidget_Create(struct TextGroupWidget* w, int lines, struct Texture* textures, TextGroupWidget_Get getLine) { - int i; Widget_Reset(w); - w->VTABLE = &TextGroupWidget_VTABLE; - for (i = 0; i < lines; i++) { w->placeholderHeight[i] = true; } - + w->VTABLE = &TextGroupWidget_VTABLE; w->lines = lines; w->textures = textures; w->GetLine = getLine; diff --git a/src/Widgets.h b/src/Widgets.h index 55ef53191..9feea614e 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -204,8 +204,8 @@ struct TextGroupWidget { Widget_Layout int lines, defaultHeight; FontDesc* font; - /* Whether a line has non-zero height when that line has no text in it. */ - bool placeholderHeight[TEXTGROUPWIDGET_MAX_LINES]; + /* Whether a line has zero height when that line has no text in it. */ + bool collapsible[TEXTGROUPWIDGET_MAX_LINES]; bool underlineUrls; struct Texture* textures; TextGroupWidget_Get GetLine; From fae4fcbb1af03a715ce70c602b718deaea748f85 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 24 Aug 2019 20:09:43 +1000 Subject: [PATCH 43/46] Inventory table widget isn't hardcoded to centre alignment anymore --- src/Screens.c | 2 +- src/Widgets.c | 83 +++++++++++++++++++++++---------------------------- src/Widgets.h | 6 ++-- 3 files changed, 41 insertions(+), 50 deletions(-) diff --git a/src/Screens.c b/src/Screens.c index bd97fec2e..25ee65e96 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -954,7 +954,7 @@ static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) { } } - if (s->announcement.texture.ID && now > Chat_AnnouncementReceived + (5 * 1000)) { + if (s->announcement.tex.ID && now > Chat_AnnouncementReceived + (5 * 1000)) { Elem_TryFree(&s->announcement); } } diff --git a/src/Widgets.c b/src/Widgets.c index f9d9fc868..56aa8db44 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -30,19 +30,18 @@ static bool Widget_MouseScroll(void* elem, float delta) { return false; } *#########################################################################################################################*/ static void TextWidget_Render(void* widget, double delta) { struct TextWidget* w = (struct TextWidget*)widget; - if (w->texture.ID) Texture_RenderShaded(&w->texture, w->col); + if (w->tex.ID) Texture_RenderShaded(&w->tex, w->col); } static void TextWidget_Free(void* widget) { struct TextWidget* w = (struct TextWidget*)widget; - Gfx_DeleteTexture(&w->texture.ID); + Gfx_DeleteTexture(&w->tex.ID); } static void TextWidget_Reposition(void* widget) { struct TextWidget* w = (struct TextWidget*)widget; Widget_CalcPosition(w); - w->texture.X = w->x; - w->texture.Y = w->y; + w->tex.X = w->x; w->tex.Y = w->y; } static const struct WidgetVTABLE TextWidget_VTABLE = { @@ -61,23 +60,22 @@ void TextWidget_Make(struct TextWidget* w, uint8_t horAnchor, uint8_t verAnchor, void TextWidget_Set(struct TextWidget* w, const String* text, const FontDesc* font) { struct DrawTextArgs args; - Gfx_DeleteTexture(&w->texture.ID); + Gfx_DeleteTexture(&w->tex.ID); if (Drawer2D_IsEmptyText(text)) { - w->texture.Width = 0; - w->texture.Height = Drawer2D_FontHeight(font, true); + w->tex.Width = 0; + w->tex.Height = Drawer2D_FontHeight(font, true); } else { DrawTextArgs_Make(&args, text, font, true); - Drawer2D_MakeTextTexture(&w->texture, &args, 0, 0); + Drawer2D_MakeTextTexture(&w->tex, &args, 0, 0); } if (w->reducePadding) { - Drawer2D_ReducePadding_Tex(&w->texture, font->Size, 4); + Drawer2D_ReducePadding_Tex(&w->tex, font->Size, 4); } - w->width = w->texture.Width; w->height = w->texture.Height; + w->width = w->tex.Width; w->height = w->tex.Height; Widget_Reposition(w); - w->texture.X = w->x; w->texture.Y = w->y; } void TextWidget_SetConst(struct TextWidget* w, const char* text, const FontDesc* font) { @@ -98,15 +96,15 @@ static struct Texture Button_DisabledTex = { GFX_NULL, Tex_Rect(0,0, 0,0), Widge static void ButtonWidget_Free(void* widget) { struct ButtonWidget* w = (struct ButtonWidget*)widget; - Gfx_DeleteTexture(&w->texture.ID); + Gfx_DeleteTexture(&w->tex.ID); } static void ButtonWidget_Reposition(void* widget) { struct ButtonWidget* w = (struct ButtonWidget*)widget; Widget_CalcPosition(w); - w->texture.X = w->x + (w->width / 2 - w->texture.Width / 2); - w->texture.Y = w->y + (w->height / 2 - w->texture.Height / 2); + w->tex.X = w->x + (w->width / 2 - w->tex.Width / 2); + w->tex.Y = w->y + (w->height / 2 - w->tex.Height / 2); } static void ButtonWidget_Render(void* widget, double delta) { @@ -143,9 +141,9 @@ static void ButtonWidget_Render(void* widget, double delta) { Gfx_Draw2DTexture(&back, white); } - if (!w->texture.ID) return; + if (!w->tex.ID) return; col = w->disabled ? disabledCol : (w->active ? activeCol : normCol); - Texture_RenderShaded(&w->texture, col); + Texture_RenderShaded(&w->tex, col); } static const struct WidgetVTABLE ButtonWidget_VTABLE = { @@ -165,18 +163,18 @@ void ButtonWidget_Make(struct ButtonWidget* w, int minWidth, Widget_LeftClick on void ButtonWidget_Set(struct ButtonWidget* w, const String* text, const FontDesc* font) { struct DrawTextArgs args; - Gfx_DeleteTexture(&w->texture.ID); + Gfx_DeleteTexture(&w->tex.ID); if (Drawer2D_IsEmptyText(text)) { - w->texture.Width = 0; - w->texture.Height = Drawer2D_FontHeight(font, true); + w->tex.Width = 0; + w->tex.Height = Drawer2D_FontHeight(font, true); } else { DrawTextArgs_Make(&args, text, font, true); - Drawer2D_MakeTextTexture(&w->texture, &args, 0, 0); + Drawer2D_MakeTextTexture(&w->tex, &args, 0, 0); } - w->width = max(w->texture.Width, w->minWidth); - w->height = max(w->texture.Height, BUTTON_MIN_WIDTH); + w->width = max(w->tex.Width, w->minWidth); + w->height = max(w->tex.Height, BUTTON_MIN_WIDTH); Widget_Reposition(w); } @@ -516,14 +514,6 @@ static bool TableWidget_GetCoords(struct TableWidget* w, int i, int* cellX, int* return y >= 0 && y < TABLE_MAX_ROWS_DISPLAYED; } -static void TableWidget_UpdateScrollbarPos(struct TableWidget* w) { - struct ScrollbarWidget* scroll = &w->scroll; - scroll->x = Table_X(w) + Table_Width(w); - scroll->y = Table_Y(w); - scroll->height = Table_Height(w); - scroll->totalRows = w->rowsCount; -} - static void TableWidget_MoveCursorToSelected(struct TableWidget* w) { int x, y, idx; if (w->selectedIndex == -1) return; @@ -555,15 +545,6 @@ static void TableWidget_UpdateDescTexPos(struct TableWidget* w) { w->descTex.Y = w->y - w->descTex.Height - 5; } -static void TableWidget_UpdatePos(struct TableWidget* w) { - int rowsDisplayed = min(TABLE_MAX_ROWS_DISPLAYED, w->rowsCount); - w->width = w->cellSize * w->blocksPerRow; - w->height = w->cellSize * rowsDisplayed; - w->x = Window_Width / 2 - w->width / 2; - w->y = Window_Height / 2 - w->height / 2; - TableWidget_UpdateDescTexPos(w); -} - static void TableWidget_RecreateDescTex(struct TableWidget* w) { if (w->selectedIndex == w->lastCreatedIndex) return; if (w->blocksCount == 0) return; @@ -613,8 +594,7 @@ static void TableWidget_RecreateElements(struct TableWidget* w) { } w->rowsCount = Math_CeilDiv(w->blocksCount, w->blocksPerRow); - TableWidget_UpdateScrollbarPos(w); - TableWidget_UpdatePos(w); + Widget_Reposition(w); } static void TableWidget_Init(void* widget) { @@ -697,11 +677,21 @@ void TableWidget_Recreate(struct TableWidget* w) { static void TableWidget_Reposition(void* widget) { struct TableWidget* w = (struct TableWidget*)widget; float scale = Game_GetInventoryScale(); - w->cellSize = (int)(50 * Math_SqrtF(scale)); - w->selBlockExpand = 25.0f * Math_SqrtF(scale); + int rowsDisplayed; - TableWidget_UpdatePos(w); - TableWidget_UpdateScrollbarPos(w); + w->cellSize = (int)(50 * Math_SqrtF(scale)); + w->selBlockExpand = 25.0f * Math_SqrtF(scale); + rowsDisplayed = min(TABLE_MAX_ROWS_DISPLAYED, w->rowsCount); + + w->width = w->cellSize * w->blocksPerRow; + w->height = w->cellSize * rowsDisplayed; + Widget_CalcPosition(w); + TableWidget_UpdateDescTexPos(w); + + w->scroll.x = Table_X(w) + Table_Width(w); + w->scroll.y = Table_Y(w); + w->scroll.height = Table_Height(w); + w->scroll.totalRows = w->rowsCount; } static void TableWidget_ScrollRelative(struct TableWidget* w, int delta) { @@ -818,6 +808,9 @@ void TableWidget_Create(struct TableWidget* w) { w->VTABLE = &TableWidget_VTABLE; w->lastCreatedIndex = -1000; ScrollbarWidget_Create(&w->scroll); + + w->horAnchor = ANCHOR_CENTRE; + w->verAnchor = ANCHOR_CENTRE; w->lastX = Mouse_X; w->lastY = Mouse_Y; } diff --git a/src/Widgets.h b/src/Widgets.h index 9feea614e..ebd05d473 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -11,8 +11,7 @@ /* A text label. */ struct TextWidget { Widget_Layout - struct Texture texture; - + struct Texture tex; bool reducePadding; PackedCol col; }; @@ -30,9 +29,8 @@ typedef void (*Button_Set)(const String* raw); /* A labelled button that can be clicked on. */ struct ButtonWidget { Widget_Layout - struct Texture texture; + struct Texture tex; int minWidth; - const char* optName; Button_Get GetValue; Button_Set SetValue; From 8da37b0437e130832072b14ffe08d1593971cc4b Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 24 Aug 2019 20:34:05 +1000 Subject: [PATCH 44/46] WIP on getting alt text input to layout properly on unminimise --- src/Screens.c | 6 +++--- src/Widgets.c | 21 +++++++++++---------- src/Widgets.h | 1 + 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Screens.c b/src/Screens.c index 25ee65e96..07dbcb0cb 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -119,7 +119,7 @@ static void InventoryScreen_Init(void* screen) { TableWidget_Create(&s->table); s->table.font = &s->font; s->table.blocksPerRow = Game_PureClassic ? 9 : 10; - Elem_Init(&s->table); + TableWidget_RecreateBlocks(&s->table); /* Can't immediately move to selected here, because cursor grabbed */ /* status might be toggled after InventoryScreen_Init() is called. */ @@ -672,8 +672,8 @@ static void HUDScreen_UpdateAltTextY(struct HUDScreen* s) { int height = max(input->height + input->yOffset, HUDScreen_BottomOffset()); height += input->yOffset; - s->altText.tex.Y = Window_Height - (height + s->altText.tex.Height); - s->altText.y = s->altText.tex.Y; + s->altText.yOffset = height; + Widget_Reposition(&s->altText); } static String HUDScreen_GetChat(void* obj, int i) { diff --git a/src/Widgets.c b/src/Widgets.c index 56aa8db44..a68eeb426 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -578,7 +578,7 @@ static bool TableWidget_RowEmpty(struct TableWidget* w, int start) { return true; } -static void TableWidget_RecreateElements(struct TableWidget* w) { +void TableWidget_RecreateBlocks(struct TableWidget* w) { int i, max = Game_UseCPEBlocks ? BLOCK_COUNT : BLOCK_ORIGINAL_COUNT; BlockID block; w->blocksCount = 0; @@ -597,12 +597,6 @@ static void TableWidget_RecreateElements(struct TableWidget* w) { Widget_Reposition(w); } -static void TableWidget_Init(void* widget) { - struct TableWidget* w = (struct TableWidget*)widget; - TableWidget_RecreateElements(w); - Widget_Reposition(w); -} - static void TableWidget_Render(void* widget, double delta) { struct TableWidget* w = (struct TableWidget*)widget; VertexP3fT2fC4b vertices[TABLE_MAX_VERTICES]; @@ -798,7 +792,7 @@ static bool TableWidget_KeyDown(void* widget, Key key) { } static const struct WidgetVTABLE TableWidget_VTABLE = { - TableWidget_Init, TableWidget_Render, TableWidget_Free, + Widget_NullFunc, TableWidget_Render, TableWidget_Free, TableWidget_KeyDown, Widget_Key, TableWidget_MouseDown, TableWidget_MouseUp, TableWidget_MouseMove, TableWidget_MouseScroll, TableWidget_Reposition @@ -832,7 +826,7 @@ void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block) { } void TableWidget_OnInventoryChanged(struct TableWidget* w) { - TableWidget_RecreateElements(w); + TableWidget_RecreateBlocks(w); if (w->selectedIndex >= w->blocksCount) { w->selectedIndex = w->blocksCount - 1; } @@ -2700,6 +2694,7 @@ void SpecialInputWidget_Redraw(struct SpecialInputWidget* w) { w->width = w->tex.Width; w->height = w->active ? w->tex.Height : 0; w->pendingRedraw = false; + Widget_Reposition(w); } static void SpecialInputWidget_Render(void* widget, double delta) { @@ -2712,6 +2707,12 @@ static void SpecialInputWidget_Free(void* widget) { Gfx_DeleteTexture(&w->tex.ID); } +static void SpecialInputWidget_Reposition(void* widget) { + struct SpecialInputWidget* w = (struct SpecialInputWidget*)widget; + Widget_CalcPosition(w); + w->tex.X = w->x; w->tex.Y = w->y; +} + static bool SpecialInputWidget_MouseDown(void* widget, int x, int y, MouseButton btn) { struct SpecialInputWidget* w = (struct SpecialInputWidget*)widget; x -= w->x; y -= w->y; @@ -2744,7 +2745,7 @@ static const struct WidgetVTABLE SpecialInputWidget_VTABLE = { Widget_NullFunc, SpecialInputWidget_Render, SpecialInputWidget_Free, Widget_Key, Widget_Key, SpecialInputWidget_MouseDown, Widget_Mouse, Widget_MouseMove, Widget_MouseScroll, - Widget_CalcPosition + SpecialInputWidget_Reposition }; void SpecialInputWidget_Create(struct SpecialInputWidget* w, FontDesc* font, struct InputWidget* target) { Widget_Reset(w); diff --git a/src/Widgets.h b/src/Widgets.h index ebd05d473..f0c71143c 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -88,6 +88,7 @@ CC_NOINLINE void TableWidget_Create(struct TableWidget* w); /* 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_SetBlockTo(struct TableWidget* w, BlockID block); +CC_NOINLINE void TableWidget_RecreateBlocks(struct TableWidget* w); CC_NOINLINE void TableWidget_OnInventoryChanged(struct TableWidget* w); CC_NOINLINE void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block); CC_NOINLINE void TableWidget_Recreate(struct TableWidget* w); From 5d4a3a0df43fe5b7346206e68bc7f1849abc42f3 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 25 Aug 2019 09:48:18 +1000 Subject: [PATCH 45/46] fix alt text being placed improperly on resize --- src/Screens.c | 73 ++++++++++++++++++++------------------------------- src/Widgets.c | 10 +++---- 2 files changed, 33 insertions(+), 50 deletions(-) diff --git a/src/Screens.c b/src/Screens.c index 07dbcb0cb..da5ffca29 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -658,22 +658,19 @@ void GeneratingScreen_Show(void) { static struct HUDScreen HUDScreen_Instance; #define CH_EXTENT 16 -static int HUDScreen_BottomOffset(void) { return HUDScreen_Instance.hotbar.height; } -static int HUDScreen_InputUsedHeight(struct HUDScreen* s) { - if (s->altText.height == 0) { - return s->input.base.height + 20; - } else { - return (Window_Height - s->altText.y) + 5; - } -} - -static void HUDScreen_UpdateAltTextY(struct HUDScreen* s) { - struct InputWidget* input = &s->input.base; - int height = max(input->height + input->yOffset, HUDScreen_BottomOffset()); - height += input->yOffset; - - s->altText.yOffset = height; +static void HUDScreen_UpdateChatYOffsets(struct HUDScreen* s) { + int pad, y; + + y = min(s->input.base.y, s->hotbar.y); + y -= s->input.base.yOffset; /* add some padding */ + s->altText.yOffset = Window_Height - y; Widget_Reposition(&s->altText); + + pad = s->altText.active ? 5 : 10; + s->clientStatus.yOffset = Window_Height - s->altText.y + pad; + Widget_Reposition(&s->clientStatus); + s->chat.yOffset = s->clientStatus.yOffset + s->clientStatus.height; + Widget_Reposition(&s->chat); } static String HUDScreen_GetChat(void* obj, int i) { @@ -715,15 +712,14 @@ static void HUDScreen_ChatUpdateFont(struct HUDScreen* s) { } static void HUDScreen_ChatUpdateLayout(struct HUDScreen* s) { - int yOffset = HUDScreen_BottomOffset() + 15; - Widget_SetLocation(&s->input.base, ANCHOR_MIN, ANCHOR_MAX, 5, 5); - Widget_SetLocation(&s->altText, ANCHOR_MIN, ANCHOR_MAX, 5, 5); - HUDScreen_UpdateAltTextY(s); - - Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); + int yOffset = s->hotbar.height + 15; + Widget_SetLocation(&s->input.base, ANCHOR_MIN, ANCHOR_MAX, 5, 5); + Widget_SetLocation(&s->altText, ANCHOR_MIN, ANCHOR_MAX, 5, 5); + Widget_SetLocation(&s->status, ANCHOR_MAX, ANCHOR_MIN, 0, 0); Widget_SetLocation(&s->bottomRight, ANCHOR_MAX, ANCHOR_MAX, 0, yOffset); - Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); - Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, yOffset); + Widget_SetLocation(&s->chat, ANCHOR_MIN, ANCHOR_MAX, 10, 0); + Widget_SetLocation(&s->clientStatus, ANCHOR_MIN, ANCHOR_MAX, 10, 0); + HUDScreen_UpdateChatYOffsets(s); } static void HUDScreen_ChatInit(struct HUDScreen* s) { @@ -759,19 +755,6 @@ static void HUDScreen_Redraw(struct HUDScreen* s) { SpecialInputWidget_Redraw(&s->altText); } -static void HUDScreen_UpdateChatYOffset(struct HUDScreen* s, bool force) { - int height = HUDScreen_InputUsedHeight(s); - if (force || height != s->inputOldHeight) { - int bottomOffset = HUDScreen_BottomOffset() + 15; - s->clientStatus.yOffset = max(bottomOffset, height); - Widget_Reposition(&s->clientStatus); - - s->chat.yOffset = s->clientStatus.yOffset + s->clientStatus.height; - Widget_Reposition(&s->chat); - s->inputOldHeight = height; - } -} - static int HUDScreen_ClampChatIndex(int index) { int maxIndex = Chat_Log.count - Gui_Chatlines; int minIndex = min(0, maxIndex); @@ -807,6 +790,7 @@ static void HUDScreen_EnterChatInput(struct HUDScreen* s, bool close) { input = &s->input.base; input->OnPressedEnter(input); SpecialInputWidget_SetActive(&s->altText, false); + HUDScreen_UpdateChatYOffsets(s); /* Reset chat when user has scrolled up in chat history */ defaultIndex = Chat_Log.count - Gui_Chatlines; @@ -886,7 +870,7 @@ static void HUDScreen_ChatReceived(void* screen, const String* msg, int type) { TextWidget_Set(&s->announcement, msg, &s->announcementFont); } else if (type >= MSG_TYPE_CLIENTSTATUS_1 && type <= MSG_TYPE_CLIENTSTATUS_2) { TextGroupWidget_Redraw(&s->clientStatus, type - MSG_TYPE_CLIENTSTATUS_1); - HUDScreen_UpdateChatYOffset(s, true); + HUDScreen_UpdateChatYOffsets(s); } } @@ -927,8 +911,6 @@ static void HUDScreen_DrawChat(struct HUDScreen* s, double delta) { HUDScreen_UpdateTexpackStatus(s); if (!Game_PureClassic) { Elem_Render(&s->status, delta); } Elem_Render(&s->bottomRight, delta); - - HUDScreen_UpdateChatYOffset(s, false); Elem_Render(&s->clientStatus, delta); now = DateTime_CurrentUTC_MS(); @@ -996,7 +978,7 @@ static void HUDScreen_ContextRecreated(void* screen) { HUDScreen_ChatUpdateLayout(s); HUDScreen_Redraw(s); - HUDScreen_UpdateChatYOffset(s, true); + HUDScreen_UpdateChatYOffsets(s); HUDScreen_RemakePlayerList(s); Widget_Reposition(&s->hotbar); } @@ -1018,7 +1000,7 @@ static bool HUDScreen_KeyPress(void* screen, char keyChar) { } InputWidget_Append(&s->input.base, keyChar); - HUDScreen_UpdateAltTextY(s); + HUDScreen_UpdateChatYOffsets(s); return true; } @@ -1053,7 +1035,7 @@ static bool HUDScreen_KeyDown(void* screen, Key key) { HUDScreen_ScrollChatBy(s, +Gui_Chatlines); } else { Elem_HandlesKeyDown(&s->input.base, key); - HUDScreen_UpdateAltTextY(s); + HUDScreen_UpdateChatYOffsets(s); } return key < KEY_F1 || key > KEY_F35; } @@ -1088,6 +1070,7 @@ static bool HUDScreen_KeyUp(void* screen, Key key) { if (Server.SupportsFullCP437 && key == KeyBinds[KEYBIND_EXT_INPUT]) { if (!Window_Focused) return true; SpecialInputWidget_SetActive(&s->altText, !s->altText.active); + HUDScreen_UpdateChatYOffsets(s); } return true; } @@ -1127,7 +1110,7 @@ static bool HUDScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { if (!Widget_Contains(&s->chat, x, y)) { if (s->altText.active && Widget_Contains(&s->altText, x, y)) { Elem_HandlesMouseDown(&s->altText, x, y, btn); - HUDScreen_UpdateAltTextY(s); + HUDScreen_UpdateChatYOffsets(s); return true; } Elem_HandlesMouseDown(&s->input.base, x, y, btn); @@ -1145,8 +1128,7 @@ static bool HUDScreen_MouseDown(void* screen, int x, int y, MouseButton btn) { if (Utils_IsUrlPrefix(&text)) { UrlWarningOverlay_Show(&text); } else if (Gui_ClickableChat) { - InputWidget_AppendString(&s->input.base, &text); - HUDScreen_UpdateAltTextY(s); + HUDScreen_AppendInput(&text); } return true; } @@ -1234,6 +1216,7 @@ void HUDScreen_OpenInput(const String* text) { void HUDScreen_AppendInput(const String* text) { struct HUDScreen* s = &HUDScreen_Instance; InputWidget_AppendString(&s->input.base, text); + HUDScreen_UpdateChatYOffsets(s); } void HUDScreen_SetChatlines(int lines) { diff --git a/src/Widgets.c b/src/Widgets.c index a68eeb426..46f73b8e1 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -351,7 +351,6 @@ static void HotbarWidget_RenderHotbarBlocks(struct HotbarWidget* w) { } static void HotbarWidget_RepositonBackgroundTexture(struct HotbarWidget* w) { - w->backTex.ID = GFX_NULL; Tex_SetRect(w->backTex, w->x,w->y, w->width,w->height); Tex_SetUV(w->backTex, 0,0, 182/256.0f,22/256.0f); } @@ -362,7 +361,6 @@ static void HotbarWidget_RepositionSelectionTexture(struct HotbarWidget* w) { int vSize = (int)(22.0f * scale); int y = w->y + (w->height - (int)(23.0f * scale)); - w->selTex.ID = GFX_NULL; Tex_SetRect(w->selTex, 0,y, hSize,vSize); Tex_SetUV(w->selTex, 0,22/256.0f, 24/256.0f,44/256.0f); } @@ -956,6 +954,8 @@ static void InputWidget_OnPressedEnter(void* widget) { struct InputWidget* w = (struct InputWidget*)widget; InputWidget_Clear(w); w->height = w->lineHeight; + /* TODO get rid of this awful hack.. */ + Widget_Reposition(w); } void InputWidget_Clear(struct InputWidget* w) { @@ -2691,8 +2691,7 @@ static void SpecialInputWidget_Make(struct SpecialInputWidget* w, struct Special void SpecialInputWidget_Redraw(struct SpecialInputWidget* w) { SpecialInputWidget_Make(w, &w->tabs[w->selectedIndex]); - w->width = w->tex.Width; - w->height = w->active ? w->tex.Height : 0; + w->width = w->tex.Width; w->pendingRedraw = false; Widget_Reposition(w); } @@ -2709,6 +2708,7 @@ static void SpecialInputWidget_Free(void* widget) { static void SpecialInputWidget_Reposition(void* widget) { struct SpecialInputWidget* w = (struct SpecialInputWidget*)widget; + w->height = w->active ? w->tex.Height : 0; Widget_CalcPosition(w); w->tex.X = w->x; w->tex.Y = w->y; } @@ -2737,8 +2737,8 @@ void SpecialInputWidget_UpdateCols(struct SpecialInputWidget* w) { void SpecialInputWidget_SetActive(struct SpecialInputWidget* w, bool active) { w->active = active; - w->height = active ? w->tex.Height : 0; if (active && w->pendingRedraw) SpecialInputWidget_Redraw(w); + Widget_Reposition(w); } static const struct WidgetVTABLE SpecialInputWidget_VTABLE = { From 88c8ed3cc667567cb9ce5e896fb324f00e611eba Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 25 Aug 2019 10:36:57 +1000 Subject: [PATCH 46/46] fix font resizing for OpenGL --- src/Screens.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/Screens.c b/src/Screens.c index da5ffca29..070069741 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -691,24 +691,25 @@ static void HUDScreen_FreeChatFonts(struct HUDScreen* s) { Font_Free(&s->announcementFont); } -static void HUDScreen_InitChatFonts(struct HUDScreen* s) { - int size; - - size = (int)(8 * Game_GetChatScale()); +static bool HUDScreen_ChatUpdateFont(struct HUDScreen* s) { + int size = (int)(8 * Game_GetChatScale()); Math_Clamp(size, 8, 60); + + /* don't recreate font if possible */ + if (size == s->chatFont.Size) return false; + HUDScreen_FreeChatFonts(s); Drawer2D_MakeFont(&s->chatFont, size, FONT_STYLE_NORMAL); size = (int)(16 * Game_GetChatScale()); Math_Clamp(size, 8, 60); Drawer2D_MakeFont(&s->announcementFont, size, FONT_STYLE_NORMAL); -} -static void HUDScreen_ChatUpdateFont(struct HUDScreen* s) { - ChatInputWidget_SetFont(&s->input, &s->chatFont); - TextGroupWidget_SetFont(&s->status, &s->chatFont); - TextGroupWidget_SetFont(&s->bottomRight, &s->chatFont); - TextGroupWidget_SetFont(&s->chat, &s->chatFont); + ChatInputWidget_SetFont(&s->input, &s->chatFont); + TextGroupWidget_SetFont(&s->status, &s->chatFont); + TextGroupWidget_SetFont(&s->bottomRight, &s->chatFont); + TextGroupWidget_SetFont(&s->chat, &s->chatFont); TextGroupWidget_SetFont(&s->clientStatus, &s->chatFont); + return true; } static void HUDScreen_ChatUpdateLayout(struct HUDScreen* s) { @@ -973,20 +974,20 @@ static void HUDScreen_ContextRecreated(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; int size = Drawer2D_BitmappedText ? 16 : 11; Drawer2D_MakeFont(&s->playerFont, size, FONT_STYLE_NORMAL); - HUDScreen_InitChatFonts(s); HUDScreen_ChatUpdateFont(s); - HUDScreen_ChatUpdateLayout(s); HUDScreen_Redraw(s); - HUDScreen_UpdateChatYOffsets(s); - HUDScreen_RemakePlayerList(s); Widget_Reposition(&s->hotbar); + HUDScreen_ChatUpdateLayout(s); + HUDScreen_RemakePlayerList(s); } static void HUDScreen_OnResize(void* screen) { struct HUDScreen* s = (struct HUDScreen*)screen; - HUDScreen_ChatUpdateLayout(s); Widget_Reposition(&s->hotbar); + + if (HUDScreen_ChatUpdateFont(s)) HUDScreen_Redraw(s); + HUDScreen_ChatUpdateLayout(s); if (s->showingList) { Widget_Reposition(&s->playerList); } }