From 0c8b76e3d7d2ef11a9cb11757e64a219423615d4 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 13 Apr 2018 17:39:45 +1000 Subject: [PATCH] Mostly port KeyBindingsScreen to C --- .../2D/Screens/Menu/KeyBindingsScreen.cs | 113 +++++--------- .../2D/Screens/Menu/KeyBindingsScreens.cs | 37 ++--- .../2D/Screens/Menu/SaveLevelScreen.cs | 17 +-- src/Client/GraphicsCommon.c | 1 + src/Client/GraphicsCommon.h | 2 +- src/Client/Menus.c | 142 ++++++++++++++++++ src/Client/Widgets.c | 6 +- 7 files changed, 206 insertions(+), 112 deletions(-) diff --git a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs index 8880f82a1..2f1e144fa 100644 --- a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs @@ -12,42 +12,40 @@ namespace ClassicalSharp.Gui.Screens { static string[] keyNames; protected string[] desc; protected KeyBind[] binds; - protected int leftLength = -1; - - protected int btnWidth = 260; - protected string title; - protected int index; protected ClickHandler leftPage, rightPage; + int curI = -1; - protected void MakeWidgets(int y, int arrowsY) { - index = 0; - int origin = y; - - if (leftLength == -1) { - for (; index < binds.Length;) - Make(0, ref y); - } else { - for (; index < leftLength;) - Make(-btnWidth / 2 - 5, ref y); + protected int MakeWidgets(int y, int arrowsY, int leftLength, string title, int btnWidth) { + int i, origin = y, xOffset = btnWidth / 2 + 5; + for (i = 0; i < binds.Length; i++) { + if (i == leftLength) y = origin; // reset y for next column + int xDir = leftLength == -1 ? 0 : (i < leftLength ? -1 : 1); - y = origin; - for (; index < binds.Length;) - Make(btnWidth / 2 + 5, ref y); + string text = ButtonText(i); + widgets[i] = ButtonWidget.Create(game, btnWidth, text, titleFont, OnBindingClick) + .SetLocation(Anchor.Centre, Anchor.Centre, xDir * xOffset, y); + y += 50; // distance between buttons } - MakeOthers(); - MakePages(arrowsY); - } - - void MakeOthers() { - widgets[index++] = TextWidget.Create(game, title, titleFont) + widgets[i++] = TextWidget.Create(game, title, titleFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -180); - if (game.UseClassicOptions) { - widgets[index++] = MakeBack(false, titleFont, SwitchClassicOptions); + widgets[i++] = MakeBack(false, titleFont, SwitchClassicOptions); } else { - widgets[index++] = MakeBack(false, titleFont, SwitchOptions); + widgets[i++] = MakeBack(false, titleFont, SwitchOptions); } + if (leftPage == null && rightPage == null) return i; + + ButtonWidget left = ButtonWidget.Create(game, 40, "<", titleFont, leftPage) + .SetLocation(Anchor.Centre, Anchor.Centre, -btnWidth - 35, arrowsY); + left.Disabled = leftPage == null; + widgets[i++] = left; + + ButtonWidget right = ButtonWidget.Create(game, 40, ">", titleFont, rightPage) + .SetLocation(Anchor.Centre, Anchor.Centre, btnWidth + 35, arrowsY); + right.Disabled = rightPage == null; + widgets[i++] = right; + return i; } static void SwitchClassicOptions(Game g, Widget w) { g.Gui.SetNewScreen(new ClassicOptionsScreen(g)); } @@ -58,41 +56,15 @@ namespace ClassicalSharp.Gui.Screens { protected static void SwitchOther(Game g, Widget w) { g.Gui.SetNewScreen(new OtherKeyBindingsScreen(g)); } protected static void SwitchMouse(Game g, Widget w) { g.Gui.SetNewScreen(new MouseKeyBindingsScreen(g)); } - void MakePages(int btnY) { - if (leftPage == null && rightPage == null) return; - - ButtonWidget left = ButtonWidget.Create(game, 40, "<", titleFont, leftPage) - .SetLocation(Anchor.Centre, Anchor.Centre, -btnWidth - 35, btnY); - left.Disabled = leftPage == null; - widgets[index++] = left; - - ButtonWidget right = ButtonWidget.Create(game, 40, ">", titleFont, rightPage) - .SetLocation(Anchor.Centre, Anchor.Centre, btnWidth + 35, btnY); - right.Disabled = rightPage == null; - widgets[index++] = right; - } - - void Make(int x, ref int y) { - string text = ButtonText(index); - widgets[index++] = ButtonWidget.Create(game, btnWidth, text, titleFont, OnBindingClick) - .SetLocation(Anchor.Centre, Anchor.Centre, x, y); - y += 50; // distance between buttons - } - - - ButtonWidget curWidget; void OnBindingClick(Game game, Widget widget) { - int index = 0; - if (curWidget != null) { - index = IndexOfWidget(curWidget); - curWidget.SetText(ButtonText(index)); - curWidget = null; + if (curI >= 0) { + ButtonWidget curButton = (ButtonWidget)widgets[curI]; + curButton.SetText(ButtonText(curI)); } - index = IndexOfWidget(widget); - string text = ButtonText(index); - curWidget = (ButtonWidget)widget; - curWidget.SetText("> " + text + " <"); + curI = IndexOfWidget(widget); + string text = ButtonText(curI); + ((ButtonWidget)widget).SetText("> " + text + " <"); } string ButtonText(int i) { @@ -102,29 +74,26 @@ namespace ClassicalSharp.Gui.Screens { } public override bool HandlesKeyDown(Key key) { - if (curWidget == null) return base.HandlesKeyDown(key); + if (curI == -1) return base.HandlesKeyDown(key); - int index = IndexOfWidget(curWidget); - game.Input.Keys[binds[index]] = key; - curWidget.SetText(ButtonText(index)); - curWidget = null; + game.Input.Keys[binds[curI]] = key; + ButtonWidget curButton = (ButtonWidget)widgets[curI]; + curButton.SetText(ButtonText(curI)); + curI = -1; return true; } public override bool HandlesMouseDown(int mouseX, int mouseY, MouseButton button) { if (button != MouseButton.Right) { return base.HandlesMouseDown(mouseX, mouseY, button); - } + } int i = HandleMouseDown(widgets, mouseX, mouseY, button); if (i == -1) return false; - if (curWidget == null || curWidget == widgets[i]) { - // Reset a key binding - if (i < binds.Length) { - curWidget = (ButtonWidget)widgets[i]; - KeyBind mapping = binds[i]; - HandlesKeyDown(game.Input.Keys.GetDefault(mapping)); - } + // Reset a key binding + if ((curI == -1 || curI == i) && i < binds.Length) { + curI = i; + HandlesKeyDown(game.Input.Keys.GetDefault(binds[i])); } return true; } diff --git a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs index 6f67bc64d..f27b32ca5 100644 --- a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs +++ b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs @@ -20,21 +20,18 @@ namespace ClassicalSharp.Gui.Screens { desc = new string[] { "Forward", "Back", "Jump", "Chat", "Save loc", "Left", "Right", "Build", "Toggle fog", "Load loc" }; - leftLength = 5; - if (game.ClassicHacks) { - title = "Normal controls"; - rightPage = SwitchClassicHacks; - } else { - title = "Controls"; - btnWidth = 300; - } + if (game.ClassicHacks) rightPage = SwitchClassicHacks; ContextRecreated(); } protected override void ContextRecreated() { widgets = new Widget[binds.Length + 4]; - MakeWidgets(-140, -40); + if (game.ClassicHacks) { + MakeWidgets(-140, -40, 5, "Normal controls", 260); + } else { + MakeWidgets(-140, -40, 5, "Controls", 300); + } } } @@ -49,18 +46,15 @@ namespace ClassicalSharp.Gui.Screens { binds[3] = KeyBind.Fly; binds[4] = KeyBind.FlyUp; binds[5] = KeyBind.FlyDown; desc = new string[] { "Speed", "Noclip", "Half speed", - "Fly", "Fly up", "Fly down" }; - leftLength = 3; - + "Fly", "Fly up", "Fly down" }; leftPage = SwitchClassic; - title = "Hacks controls"; ContextRecreated(); } protected override void ContextRecreated() { widgets = new Widget[binds.Length + 4]; - MakeWidgets(-90, -40); + MakeWidgets(-90, -40, 3, "Hacks controls", 260); } } @@ -78,16 +72,14 @@ namespace ClassicalSharp.Gui.Screens { desc = new string[] { "Forward", "Back", "Jump", "Chat", "Set spawn", "Player list", "Left", "Right", "Inventory", "Toggle fog", "Respawn", "Send chat" }; - leftLength = 6; - title = "Normal controls"; rightPage = SwitchHacks; ContextRecreated(); } protected override void ContextRecreated() { widgets = new Widget[binds.Length + 4]; - MakeWidgets(-140, 10); + MakeWidgets(-140, 10, 6, "Normal controls", 260); } } @@ -103,9 +95,7 @@ namespace ClassicalSharp.Gui.Screens { desc = new string[] { "Speed", "Noclip", "Half speed", "Scroll zoom", "Fly", "Fly up", "Fly down", "Third person" }; - leftLength = 4; - title = "Hacks controls"; leftPage = SwitchNormal; rightPage = SwitchOther; ContextRecreated(); @@ -113,7 +103,7 @@ namespace ClassicalSharp.Gui.Screens { protected override void ContextRecreated() { widgets = new Widget[binds.Length + 4]; - MakeWidgets(-40, 10); + MakeWidgets(-40, 10, 4, "Hacks controls", 260); } } @@ -131,9 +121,7 @@ namespace ClassicalSharp.Gui.Screens { desc = new string[] { "Show ext input", "Hide FPS", "Hide gui", "Hotbar switching", "Drop block", "Screenshot", "Fullscreen", "Show axis lines", "Auto-rotate", "Smooth camera", "ID overlay" }; - leftLength = 6; - title = "Other controls"; leftPage = SwitchHacks; rightPage = SwitchMouse; ContextRecreated(); @@ -141,7 +129,7 @@ namespace ClassicalSharp.Gui.Screens { protected override void ContextRecreated() { widgets = new Widget[binds.Length + 4]; - MakeWidgets(-140, 10); + MakeWidgets(-140, 10, 6, "Other controls", 260); } } @@ -155,14 +143,13 @@ namespace ClassicalSharp.Gui.Screens { binds[0] = KeyBind.MouseLeft; binds[1] = KeyBind.MouseMiddle; binds[2] = KeyBind.MouseRight; desc = new string[] { "Left", "Middle", "Right" }; - title = "Mouse key bindings"; leftPage = SwitchOther; ContextRecreated(); } protected override void ContextRecreated() { widgets = new Widget[binds.Length + 5]; - MakeWidgets(-40, 10); + int index = MakeWidgets(-40, 10, -1, "Mouse key bindings", 260); widgets[index++] = TextWidget.Create(game, "&eRight click to remove the key binding", textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100); diff --git a/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs index 9eabcc30f..8ecbbf1cd 100644 --- a/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs @@ -13,19 +13,14 @@ namespace ClassicalSharp.Gui.Screens { } InputWidget input; - TextWidget desc; const int overwriteIndex = 2; static FastColour grey = new FastColour(150, 150, 150); public override void Render(double delta) { - RenderMenuBounds(); - game.Graphics.Texturing = true; - RenderWidgets(widgets, delta); - if (desc != null) desc.Render(delta); - game.Graphics.Texturing = false; - + base.Render(delta); int cX = game.Width / 2, cY = game.Height / 2; game.Graphics.Draw2DQuad(cX - 250, cY + 90, 500, 2, grey); + if (textPath == null) return; SaveMap(textPath); textPath = null; @@ -141,14 +136,14 @@ namespace ClassicalSharp.Gui.Screens { void MakeDescWidget(string text) { DisposeDescWidget(); - desc = TextWidget.Create(game, text, textFont) + widgets[widgets.Length - 1] = TextWidget.Create(game, text, textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 65); } void DisposeDescWidget() { - if (desc != null) { - desc.Dispose(); - desc = null; + if (widgets[widgets.Length - 1] != null) { + widgets[widgets.Length - 1].Dispose(); + widgets[widgets.Length - 1] = null; } } } diff --git a/src/Client/GraphicsCommon.c b/src/Client/GraphicsCommon.c index c03a33e6f..36a88a239 100644 --- a/src/Client/GraphicsCommon.c +++ b/src/Client/GraphicsCommon.c @@ -5,6 +5,7 @@ #include "Event.h" #include "Funcs.h" #include "ExtMath.h" +#include "Texture.h" void GfxCommon_Init(void) { GfxCommon_quadVb = Gfx_CreateDynamicVb(VERTEX_FORMAT_P3FC4B, 4); diff --git a/src/Client/GraphicsCommon.h b/src/Client/GraphicsCommon.h index 64797b270..db4ff31bc 100644 --- a/src/Client/GraphicsCommon.h +++ b/src/Client/GraphicsCommon.h @@ -1,12 +1,12 @@ #ifndef CC_GFXCOMMON_H #define CC_GFXCOMMON_H #include "String.h" -#include "Texture.h" #include "VertexStructs.h" /* Provides common/shared methods for a 3D graphics rendering API. Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3 */ +typedef struct Texture_ Texture; void GfxCommon_Init(void); void GfxCommon_Free(void); diff --git a/src/Client/Menus.c b/src/Client/Menus.c index db66603da..902a31a8a 100644 --- a/src/Client/Menus.c +++ b/src/Client/Menus.c @@ -94,6 +94,17 @@ typedef struct ClassicGenScreen_ { ButtonWidget Buttons[4]; } ClassicGenScreen; +typedef struct KeyBindingsScreen_ { + MenuScreen_Layout + Int32 CurI, BindsCount; + const UInt8** Descs; + KeyBind* Binds; + Widget_LeftClick LeftPage, RightPage; + ButtonWidget* Buttons; + TextWidget Title; + ButtonWidget Back, Left, Right; +} KeyBindingsScreen; + void Menu_FreeWidgets(Widget** widgets, Int32 widgetsCount) { if (widgets == NULL) return; @@ -1313,4 +1324,135 @@ Screen* LoadLevelScreen_MakeInstance(void) { ListScreen_QuickSort(0, screen->Entries.Count - 1); } return (Screen*)screen; +} + + +/*########################################################################################################################* +*---------------------------------------------------KeyBindingsScreen-----------------------------------------------------* +*#########################################################################################################################*/ +KeyBindingsScreen KeyBindingsScreen_Instance; +GuiElementVTABLE KeyBindingsScreen_VTABLE; +void KeyBindingsScreen_ClassicOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicOptionsScreen_MakeInstance()); } +void KeyBindingsScreen_Classic(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicKeyBindingsScreen_MakeInstance()); } +void KeyBindingsScreen_ClassicHacks(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicHacksKeyBindingsScreen_MakeInstance()); } +void KeyBindingsScreen_Normal(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NormalKeyBindingsScreen_MakeInstance()); } +void KeyBindingsScreen_Hacks(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(HacksKeyBindingsScreen_MakeInstance()); } +void KeyBindingsScreen_Other(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(OtherKeyBindingsScreen_MakeInstance()); } +void KeyBindingsScreen_Mouse(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(MouseKeyBindingsScreen_MakeInstance()); } + +void KeyBindingsScreen_OnBindingClick(GuiElement* screenElem, GuiElement* widget) { + KeyBindingsScreen* screen = (KeyBindingsScreen*)screenElem; + UInt8 textBuffer[String_BufferSize(STRING_SIZE)]; + String text = String_InitAndClearArray(textBuffer); + + if (screen->CurI >= 0) { + KeyBindingsScreen_ButtonText(screen, screen->CurI, &text); + ButtonWidget* curButton = (ButtonWidget*)screen->WidgetsPtr[screen->CurI]; + ButtonWidget_SetText(curButton, &text); + } + screen->CurI = Menu_Index(screen->WidgetsPtr, screen->WidgetsCount, (Widget*)widget); + + String_Clear(&text); + String_AppendConst(&text, "> "); + KeyBindingsScreen_ButtonText(screen, screen->CurI, &text); + String_AppendConst(&text, " <"); + ButtonWidget_SetText((ButtonWidget*)widget, &text); +} + +void KeyBindingsScreen_ButtonText(KeyBindingsScreen* screen, Int32 i, STRING_TRANSIENT String* text) { + Key key = KeyBind_Get(screen->Binds[i]); + String_AppendConst(text, screen->Descs[i]); + String_AppendConst(text, ": "); + String_AppendConst(text, Key_Names[key]); +} + +bool KeyBindingsScreen_HandlesKeyDown(GuiElement* elem, Key key) { + KeyBindingsScreen* screen = (KeyBindingsScreen*)elem; + if (screen->CurI == -1) return MenuScreen_HandlesKeyDown(elem, key); + KeyBind_Set(screen->Binds[screen->CurI], key); + + UInt8 textBuffer[String_BufferSize(STRING_SIZE)]; + String text = String_InitAndClearArray(textBuffer); + KeyBindingsScreen_ButtonText(screen, screen->CurI, &text); + + ButtonWidget* curButton = (ButtonWidget*)screen->WidgetsPtr[screen->CurI]; + ButtonWidget_SetText(curButton, &text); + screen->CurI = -1; + return true; +} + +bool KeyBindingsScreen_HandlesMouseDown(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { + if (btn != MouseButton_Right) { + return MenuScreen_HandlesMouseDown(elem, x, y, btn); + } + + KeyBindingsScreen* screen = (KeyBindingsScreen*)elem; + Int32 i = Menu_HandleMouseDown(elem, screen->WidgetsPtr, screen->WidgetsCount, x, y, btn); + if (i == -1) return false; + + /* Reset a key binding */ + if ((screen->CurI == -1 || screen->CurI == i) && i < screen->BindsCount) { + screen->CurI = i; + Elem_HandlesKeyDown(elem, KeyBind_GetDefault(screen->Binds[i])); + } + return true; +} + +Int32 KeyBindingsScreen_MakeWidgets(KeyBindingsScreen* screen, Int32 y, Int32 arrowsY, Int32 leftLength, STRING_PURE const UInt8* title, Int32 btnWidth) { + Int32 i, origin = y, xOffset = btnWidth / 2 + 5; + screen->CurI = -1; + + Widget** widgets = screen->WidgetsPtr; + UInt8 textBuffer[String_BufferSize(STRING_SIZE)]; + String text = String_InitAndClearArray(textBuffer); + + for (i = 0; i < screen->BindsCount; i++) { + if (i == leftLength) y = origin; /* reset y for next column */ + Int32 xDir = leftLength == -1 ? 0 : (i < leftLength ? -1 : 1); + + String_Clear(&text); + KeyBindingsScreen_ButtonText(screen, i, &text); + + ButtonWidget_Create(&screen->Buttons[i], btnWidth, &text, &screen->TitleFont, KeyBindingsScreen_OnBindingClick); + widgets[i] = (Widget*)(&screen->Buttons[i]); + Widget_SetLocation(widgets[i], ANCHOR_CENTRE, ANCHOR_CENTRE, xDir * xOffset, y); + y += 50; /* distance between buttons */ + } + + String titleText = String_FromReadonly(title); + TextWidget_Create(&screen->Title, &titleText, &screen->TitleFont); + Widget_SetLocation((Widget*)(&screen->Title), ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -180); + widgets[i++] = (Widget*)(&screen->Title); + + Widget_LeftClick backClick = Game_UseClassicOptions ? KeyBindingsScreen_ClassicOptions : Menu_SwitchOptions; + Menu_MakeDefaultBack(&screen->Back, false, &screen->TitleFont, backClick); + widgets[i++] = (Widget*)(&screen->Back); + if (screen->LeftPage == NULL && screen->RightPage == NULL) return i; + + String lArrow = String_FromConst("<"); + ButtonWidget_Create(&screen->Left, &lArrow, 40, &screen->TitleFont, screen->LeftPage); + Widget_SetLocation((Widget*)(&screen->Left), ANCHOR_CENTRE, ANCHOR_CENTRE, -btnWidth - 35, arrowsY); + screen->Left.Disabled = screen->LeftPage == NULL; + widgets[i++] = (Widget*)(&screen->Left); + + String rArrow = String_FromConst("<"); + ButtonWidget_Create(&screen->Right, &rArrow, 40, &screen->TitleFont, screen->LeftPage); + Widget_SetLocation((Widget*)(&screen->Right), ANCHOR_CENTRE, ANCHOR_CENTRE, btnWidth + 35, arrowsY); + screen->Right.Disabled = screen->RightPage == NULL; + widgets[i++] = (Widget*)(&screen->Right); + return i; +} + +Screen* KeyBindingsScreen_MakeInstance(Int32 CurI, BindsCount, const UInt8** Descs, KeyBind* Binds, Widget_LeftClick LeftPage, RightPage, ButtonWidget* Buttons) { +ButtonWidget Back, Left, Right; + KeyBindingsScreen* screen = &KeyBindingsScreen_Instance; + MenuScreen_MakeInstance((MenuScreen*)screen, screen->Widgets, + Array_Elems(screen->Widgets), ClassicGenScreen_ContextRecreated); + KeyBindingsScreen_VTABLE = *screen->VTABLE; + screen->VTABLE = &KeyBindingsScreen_VTABLE; + + screen->VTABLE->Init = KeyBindingsScreen_Init; + screen->VTABLE->HandlesKeyDown = KeyBindingsScreen_HandlesKeyDown; + screen->VTABLE->HandlesMouseDown = KeyBindingsScreen_HandlesMouseDown; + return (Screen*)screen; } \ No newline at end of file diff --git a/src/Client/Widgets.c b/src/Client/Widgets.c index 863e61506..c0acdbc8c 100644 --- a/src/Client/Widgets.c +++ b/src/Client/Widgets.c @@ -105,9 +105,9 @@ void TextWidget_SetText(TextWidget* widget, STRING_PURE String* text) { *------------------------------------------------------ButtonWidget-------------------------------------------------------* *#########################################################################################################################*/ #define BUTTON_uWIDTH (200.0f / 256.0f) -Texture Button_ShadowTex = { 0, 0, 0, 0, 0, 0.0f, 66.0f / 256.0f, 200.0f / 256.0f, 86.0f / 256.0f }; -Texture Button_SelectedTex = { 0, 0, 0, 0, 0, 0.0f, 86.0f / 256.0f, 200.0f / 256.0f, 106.0f / 256.0f }; -Texture Button_DisabledTex = { 0, 0, 0, 0, 0, 0.0f, 46.0f / 256.0f, 200.0f / 256.0f, 66.0f / 256.0f }; +Texture Button_ShadowTex = { 0, 0, 0, 0, 0, 0.0f, 66.0f / 256.0f, BUTTON_uWIDTH, 86.0f / 256.0f }; +Texture Button_SelectedTex = { 0, 0, 0, 0, 0, 0.0f, 86.0f / 256.0f, BUTTON_uWIDTH, 106.0f / 256.0f }; +Texture Button_DisabledTex = { 0, 0, 0, 0, 0, 0.0f, 46.0f / 256.0f, BUTTON_uWIDTH, 66.0f / 256.0f }; void ButtonWidget_Init(GuiElement* elem) { ButtonWidget* widget = (ButtonWidget*)elem;