From 09bfca521742a3045e6847499dd5367fb696c695 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 14 Oct 2023 12:49:06 +1100 Subject: [PATCH] Launcher: Simplify button initialisation code --- src/LScreens.c | 199 ++++++++++++++++++++++++------------------------- src/LWidgets.c | 3 +- src/LWidgets.h | 33 ++++---- 3 files changed, 116 insertions(+), 119 deletions(-) diff --git a/src/LScreens.c b/src/LScreens.c index 40b042134..cb44d161b 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -221,41 +221,37 @@ static void UseModeEnhanced(void* w) { ChooseMode_Click(false, false); } static void UseModeClassicHax(void* w) { ChooseMode_Click(true, true); } static void UseModeClassic(void* w) { ChooseMode_Click(true, false); } -static void ChooseModeScreen_AddWidgets(struct ChooseModeScreen* s) { - LLine_Init(s, &s->seps[0], 490, mode_seps0); - LLine_Init(s, &s->seps[1], 490, mode_seps1); - - LButton_Init(s, &s->btnEnhanced, 145, 35, "Enhanced", mode_btnEnhanced); - LLabel_Init(s, &s->lblEnhanced[0], "&eEnables custom blocks, changing env", mode_lblEnhanced0); - LLabel_Init(s, &s->lblEnhanced[1], "&esettings, longer messages, and more", mode_lblEnhanced1); - - LButton_Init(s, &s->btnClassicHax, 145, 35, "Classic +hax", mode_btnClassicHax); - LLabel_Init(s, &s->lblClassicHax[0], "&eSame as Classic mode, except that", mode_lblClassicHax0); - LLabel_Init(s, &s->lblClassicHax[1], "&ehacks (noclip/fly/speed) are enabled", mode_lblClassicHax1); - - LButton_Init(s, &s->btnClassic, 145, 35, "Classic", mode_btnClassic); - LLabel_Init(s, &s->lblClassic[0], "&eOnly uses blocks and features from", mode_lblClassic0); - LLabel_Init(s, &s->lblClassic[1], "ðe original minecraft classic", mode_lblClassic1); - - if (s->firstTime) { - LLabel_Init(s, &s->lblHelp, "&eClick &fEnhanced &eif you're not sure which mode to choose.", mode_lblHelp); - } else { - LButton_Init(s, &s->btnBack, 80, 35, "Back", mode_btnBack); - } -} - static void ChooseModeScreen_Show(struct LScreen* s_) { struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_; s->widgets = chooseMode_widgets; s->maxWidgets = Array_Elems(chooseMode_widgets); s->numWidgets = 0; - ChooseModeScreen_AddWidgets(s); - s->btnEnhanced.OnClick = UseModeEnhanced; - s->btnClassicHax.OnClick = UseModeClassicHax; - s->btnClassic.OnClick = UseModeClassic; - s->btnBack.OnClick = SwitchToSettings; + LLine_Init(s, &s->seps[0], 490, mode_seps0); + LLine_Init(s, &s->seps[1], 490, mode_seps1); + + LButton_Init(s, &s->btnEnhanced, 145, 35, "Enhanced", + UseModeEnhanced, mode_btnEnhanced); + LLabel_Init(s, &s->lblEnhanced[0], "&eEnables custom blocks, changing env", mode_lblEnhanced0); + LLabel_Init(s, &s->lblEnhanced[1], "&esettings, longer messages, and more", mode_lblEnhanced1); + + LButton_Init(s, &s->btnClassicHax, 145, 35, "Classic +hax", + UseModeClassicHax, mode_btnClassicHax); + LLabel_Init(s, &s->lblClassicHax[0], "&eSame as Classic mode, except that", mode_lblClassicHax0); + LLabel_Init(s, &s->lblClassicHax[1], "&ehacks (noclip/fly/speed) are enabled", mode_lblClassicHax1); + + LButton_Init(s, &s->btnClassic, 145, 35, "Classic", + UseModeClassic, mode_btnClassic); + LLabel_Init(s, &s->lblClassic[0], "&eOnly uses blocks and features from", mode_lblClassic0); + LLabel_Init(s, &s->lblClassic[1], "ðe original minecraft classic", mode_lblClassic1); + + if (s->firstTime) { + LLabel_Init(s, &s->lblHelp, "&eClick &fEnhanced &eif you're not sure which mode to choose.", mode_lblHelp); + } else { + LButton_Init(s, &s->btnBack, 80, 35, "Back", + SwitchToSettings, mode_btnBack); + } } void ChooseModeScreen_SetActive(cc_bool firstTime) { @@ -402,7 +398,8 @@ static void ColoursScreen_Init(struct LScreen* s_) { s->widgets = colours_widgets; s->maxWidgets = Array_Elems(colours_widgets); - for (i = 0; i < 5 * 3; i++) { + for (i = 0; i < 5 * 3; i++) + { s->iptColours[i].inputType = KEYBOARD_TYPE_INTEGER; s->iptColours[i].TextChanged = ColoursScreen_TextChanged; LInput_Init(s, &s->iptColours[i], 55, NULL, clr_iptColours[i]); @@ -417,11 +414,11 @@ static void ColoursScreen_Init(struct LScreen* s_) { LLabel_Init(s, &s->lblRGB[0], "Red", clr_lblRGB0); LLabel_Init(s, &s->lblRGB[1], "Green", clr_lblRGB1); LLabel_Init(s, &s->lblRGB[2], "Blue", clr_lblRGB2); - LButton_Init(s, &s->btnBack, 80, 35, "Back", clr_btnBack); + LButton_Init(s, &s->btnBack, 80, 35, "Back", + SwitchToThemes, clr_btnBack); LCheckbox_Init(s, &s->cbClassic, "Classic style", clr_cbClassic); s->cbClassic.ValueChanged = ColoursScreen_ToggleBG; - s->btnBack.OnClick = SwitchToThemes; } static void ColoursScreen_Show(struct LScreen* s_) { @@ -559,16 +556,16 @@ static void DirectConnectScreen_Init(struct LScreen* s_) { LInput_Init(s, &s->iptAddress, 330, "IP address:Port number..", dc_iptAddress); LInput_Init(s, &s->iptMppass, 330, "Mppass..", dc_iptMppass); - LButton_Init(s, &s->btnConnect, 110, 35, "Connect", dc_btnConnect); - LButton_Init(s, &s->btnBack, 80, 35, "Back", dc_btnBack); - LLabel_Init(s, &s->lblStatus, "", dc_lblStatus); + LButton_Init(s, &s->btnConnect, 110, 35, "Connect", + DirectConnectScreen_StartClient, dc_btnConnect); + LButton_Init(s, &s->btnBack, 80, 35, "Back", + SwitchToMain, dc_btnBack); + LLabel_Init(s, &s->lblStatus, "", dc_lblStatus); s->iptUsername.ClipboardFilter = DirectConnectScreen_UrlFilter; s->iptAddress.ClipboardFilter = DirectConnectScreen_UrlFilter; s->iptMppass.ClipboardFilter = DirectConnectScreen_UrlFilter; - s->btnConnect.OnClick = DirectConnectScreen_StartClient; - s->btnBack.OnClick = SwitchToMain; /* Init input text from options */ DirectConnectScreen_Load(s); } @@ -621,11 +618,11 @@ static void MFAScreen_Init(struct LScreen* s_) { LLabel_Init(s, &s->lblTitle, "", mfa_lblTitle); LInput_Init(s, &s->iptCode, 280, "Login code..", mfa_iptCode); - LButton_Init(s, &s->btnSignIn, 100, 35, "Sign in", mfa_btnSignIn); - LButton_Init(s, &s->btnCancel, 100, 35, "Cancel", mfa_btnCancel); + LButton_Init(s, &s->btnSignIn, 100, 35, "Sign in", + MFAScreen_SignIn, mfa_btnSignIn); + LButton_Init(s, &s->btnCancel, 100, 35, "Cancel", + MFAScreen_Cancel, mfa_btnCancel); - s->btnSignIn.OnClick = MFAScreen_SignIn; - s->btnCancel.OnClick = MFAScreen_Cancel; s->iptCode.inputType = KEYBOARD_TYPE_INTEGER; } @@ -804,31 +801,30 @@ static void MainScreen_Init(struct LScreen* s_) { LInput_Init(s, &s->iptUsername, 280, "Username..", main_iptUsername); LInput_Init(s, &s->iptPassword, 280, "Password..", main_iptPassword); - LButton_Init(s, &s->btnLogin, 100, 35, "Sign in", main_btnLogin); - LButton_Init(s, &s->btnResume, 100, 35, "Resume", main_btnResume); + LButton_Init(s, &s->btnLogin, 100, 35, "Sign in", + MainScreen_Login, main_btnLogin); + LButton_Init(s, &s->btnResume, 100, 35, "Resume", + MainScreen_Resume, main_btnResume); - LLabel_Init(s, &s->lblStatus, "", main_lblStatus); - LButton_Init(s, &s->btnDirect, 200, 35, "Direct connect", main_btnDirect); - LButton_Init(s, &s->btnSPlayer, 200, 35, "Singleplayer", main_btnSPlayer); + LLabel_Init(s, &s->lblStatus, "", main_lblStatus); + LButton_Init(s, &s->btnDirect, 200, 35, "Direct connect", + SwitchToDirectConnect, main_btnDirect); + LButton_Init(s, &s->btnSPlayer, 200, 35, "Singleplayer", + MainScreen_Singleplayer, main_btnSPlayer); LLabel_Init(s, &s->lblUpdate, "&eChecking..", Updater_Supported ? main_lblUpdate_N : main_lblUpdate_H); if (Process_OpenSupported) { - LButton_Init(s, &s->btnRegister, 100, 35, "Register", main_btnRegister); + LButton_Init(s, &s->btnRegister, 100, 35, "Register", + MainScreen_Register, main_btnRegister); } - LButton_Init(s, &s->btnOptions, 100, 35, "Options", main_btnOptions); + LButton_Init(s, &s->btnOptions, 100, 35, "Options", + SwitchToSettings, main_btnOptions); if (Updater_Supported) { - LButton_Init(s, &s->btnUpdates, 100, 35, "Updates", main_btnUpdates); + LButton_Init(s, &s->btnUpdates, 100, 35, "Updates", + SwitchToUpdates, main_btnUpdates); } - - s->btnLogin.OnClick = MainScreen_Login; - s->btnResume.OnClick = MainScreen_Resume; - s->btnDirect.OnClick = SwitchToDirectConnect; - s->btnSPlayer.OnClick = MainScreen_Singleplayer; - s->btnRegister.OnClick = MainScreen_Register; - s->btnOptions.OnClick = SwitchToSettings; - s->btnUpdates.OnClick = SwitchToUpdates; s->btnResume.OnHover = MainScreen_ResumeHover; s->btnResume.OnUnhover = MainScreen_ResumeUnhover; @@ -1015,10 +1011,10 @@ static void CheckResourcesScreen_Init(struct LScreen* s_) { LLabel_Init(s, &s->lblLine2, "Okay to download?", cres_lblLine2); LLabel_Init(s, &s->lblStatus, "", cres_lblStatus); - LButton_Init(s, &s->btnYes, 70, 35, "Yes", cres_btnYes); - LButton_Init(s, &s->btnNo, 70, 35, "No", cres_btnNo); - s->btnYes.OnClick = CheckResourcesScreen_Yes; - s->btnNo.OnClick = CheckResourcesScreen_Next; + LButton_Init(s, &s->btnYes, 70, 35, "Yes", + CheckResourcesScreen_Yes, cres_btnYes); + LButton_Init(s, &s->btnNo, 70, 35, "No", + CheckResourcesScreen_Next, cres_btnNo); } static void CheckResourcesScreen_Show(struct LScreen* s_) { @@ -1086,10 +1082,9 @@ static void FetchResourcesScreen_Init(struct LScreen* s_) { s->lblStatus.small = true; LLabel_Init(s, &s->lblStatus, "", fres_lblStatus); - LButton_Init(s, &s->btnCancel, 120, 35, "Cancel", fres_btnCancel); + LButton_Init(s, &s->btnCancel, 120, 35, "Cancel", + CheckResourcesScreen_Next, fres_btnCancel); LSlider_Init(s, &s->sdrProgress, 200, 12, BitmapColor_RGB(0, 220, 0), fres_sdrProgress); - - s->btnCancel.OnClick = CheckResourcesScreen_Next; } static void FetchResourcesScreen_Error(struct HttpRequest* req) { @@ -1237,7 +1232,8 @@ static void ServersScreen_ReloadServers(struct ServersScreen* s) { int i; LTable_Sort(&s->table); - for (i = 0; i < FetchServersTask.numServers; i++) { + for (i = 0; i < FetchServersTask.numServers; i++) + { FetchFlagsTask_Add(&FetchServersTask.servers[i]); } } @@ -1250,13 +1246,12 @@ static void ServersScreen_Init(struct LScreen* s_) { LInput_Init(s, &s->iptSearch, 370, "Search servers..", srv_iptSearch); LInput_Init(s, &s->iptHash, 475, "classicube.net/server/play/...", srv_iptHash); - LButton_Init(s, &s->btnBack, 110, 30, "Back", srv_btnBack); - LButton_Init(s, &s->btnConnect, 130, 30, "Connect", srv_btnConnect); - LButton_Init(s, &s->btnRefresh, 110, 30, "Refresh", srv_btnRefresh); - - s->btnBack.OnClick = SwitchToMain; - s->btnConnect.OnClick = ServersScreen_Connect; - s->btnRefresh.OnClick = ServersScreen_Refresh; + LButton_Init(s, &s->btnBack, 110, 30, "Back", + SwitchToMain, srv_btnBack); + LButton_Init(s, &s->btnConnect, 130, 30, "Connect", + ServersScreen_Connect, srv_btnConnect); + LButton_Init(s, &s->btnRefresh, 110, 30, "Refresh", + ServersScreen_Refresh, srv_btnRefresh); s->iptSearch.skipsEnter = true; s->iptSearch.TextChanged = ServersScreen_SearchChanged; @@ -1395,11 +1390,13 @@ static void SettingsScreen_DPIScaling(struct LCheckbox* w) { static void SettingsScreen_AddWidgets(struct SettingsScreen* s) { LLine_Init(s, &s->sep, 380, set_sep); - LButton_Init(s, &s->btnMode, 110, 35, "Mode", set_btnMode); + LButton_Init(s, &s->btnMode, 110, 35, "Mode", + SwitchToChooseMode, set_btnMode); LLabel_Init(s, &s->lblMode, "&eChange the enabled features", set_lblMode); if (!Options_GetBool(OPT_CLASSIC_MODE, false)) { - LButton_Init(s, &s->btnColours, 110, 35, "Theme", set_btnColours); + LButton_Init(s, &s->btnColours, 110, 35, "Theme", + SwitchToThemes, set_btnColours); LLabel_Init(s, &s->lblColours, "&eChange how the launcher looks", set_lblColours); } @@ -1411,7 +1408,8 @@ static void SettingsScreen_AddWidgets(struct SettingsScreen* s) { LCheckbox_Init(s, &s->cbEmpty, "Show empty servers in list", set_cbEmpty); LCheckbox_Init(s, &s->cbScale, "Use display scaling", set_cbScale); - LButton_Init(s, &s->btnBack, 80, 35, "Back", set_btnBack); + LButton_Init(s, &s->btnBack, 80, 35, "Back", + SwitchToMain, set_btnBack); } static void SettingsScreen_Show(struct LScreen* s_) { @@ -1422,10 +1420,6 @@ static void SettingsScreen_Show(struct LScreen* s_) { s->numWidgets = 0; SettingsScreen_AddWidgets(s); - s->btnMode.OnClick = SwitchToChooseMode; - s->btnColours.OnClick = SwitchToThemes; - s->btnBack.OnClick = SwitchToMain; - #if defined CC_BUILD_MOBILE s->cbExtra.ValueChanged = SettingsScreen_LockOrientation; LCheckbox_Set(&s->cbExtra, Options_GetBool(OPT_LANDSCAPE_MODE, false)); @@ -1489,20 +1483,21 @@ static void ThemesScreen_Nordic(void* w) { static void ThemesScreen_Show(struct LScreen* s_) { struct ThemesScreen* s = (struct ThemesScreen*)s_; + s->widgets = themes_widgets; s->maxWidgets = Array_Elems(themes_widgets); + s->numWidgets = 0; - LButton_Init(s, &s->btnModern, 200, 35, "Modern", the_btnModern); - LButton_Init(s, &s->btnClassic, 200, 35, "Classic", the_btnClassic); - LButton_Init(s, &s->btnNordic, 200, 35, "Nordic", the_btnNordic); - LButton_Init(s, &s->btnCustom, 200, 35, "Custom", the_btnCustom); - LButton_Init(s, &s->btnBack, 80, 35, "Back", the_btnBack); - - s->btnModern.OnClick = ThemesScreen_Modern; - s->btnClassic.OnClick = ThemesScreen_Classic; - s->btnNordic.OnClick = ThemesScreen_Nordic; - s->btnCustom.OnClick = SwitchToColours; - s->btnBack.OnClick = SwitchToSettings; + LButton_Init(s, &s->btnModern, 200, 35, "Modern", + ThemesScreen_Modern, the_btnModern); + LButton_Init(s, &s->btnClassic, 200, 35, "Classic", + ThemesScreen_Classic, the_btnClassic); + LButton_Init(s, &s->btnNordic, 200, 35, "Nordic", + ThemesScreen_Nordic, the_btnNordic); + LButton_Init(s, &s->btnCustom, 200, 35, "Custom", + SwitchToColours, the_btnCustom); + LButton_Init(s, &s->btnBack, 80, 35, "Back", + SwitchToSettings, the_btnBack); } void ThemesScreen_SetActive(void) { @@ -1696,26 +1691,24 @@ static void UpdatesScreen_Init(struct LScreen* s_) { LLabel_Init(s, &s->lblRel, "Latest release: Checking..", upd_lblRel); LLabel_Init(s, &s->lblDev, "Latest dev build: Checking..", upd_lblDev); - LLabel_Init(s, &s->lblStatus, "", upd_lblStatus); - LButton_Init(s, &s->btnBack, 80, 35, "Back", upd_btnBack); + LLabel_Init(s, &s->lblStatus, "", upd_lblStatus); LLabel_Init(s, &s->lblInfo, Updater_Info.info, upd_lblInfo); + LButton_Init(s, &s->btnBack, 80, 35, "Back", + SwitchToMain, upd_btnBack); if (builds >= 1) { - LButton_Init(s, &s->btnRel[0], 130, 35, Updater_Info.builds[0].name, - builds == 1 ? upd_btnRel0_1 : upd_btnRel0_2); + LButton_Init(s, &s->btnRel[0], 130, 35, Updater_Info.builds[0].name, + UpdatesScreen_Rel_0, builds == 1 ? upd_btnRel0_1 : upd_btnRel0_2); LButton_Init(s, &s->btnDev[0], 130, 35, Updater_Info.builds[0].name, - builds == 1 ? upd_btnDev0_1 : upd_btnDev0_2); - } - if (builds >= 2) { - LButton_Init(s, &s->btnRel[1], 130, 35, Updater_Info.builds[1].name, upd_btnRel1_2); - LButton_Init(s, &s->btnDev[1], 130, 35, Updater_Info.builds[1].name, upd_btnDev1_2); + UpdatesScreen_Dev_0, builds == 1 ? upd_btnDev0_1 : upd_btnDev0_2); } - s->btnRel[0].OnClick = UpdatesScreen_Rel_0; - s->btnRel[1].OnClick = UpdatesScreen_Rel_1; - s->btnDev[0].OnClick = UpdatesScreen_Dev_0; - s->btnDev[1].OnClick = UpdatesScreen_Dev_1; - s->btnBack.OnClick = SwitchToMain; + if (builds >= 2) { + LButton_Init(s, &s->btnRel[1], 130, 35, Updater_Info.builds[1].name, + UpdatesScreen_Rel_1, upd_btnRel1_2); + LButton_Init(s, &s->btnDev[1], 130, 35, Updater_Info.builds[1].name, + UpdatesScreen_Dev_1, upd_btnDev1_2); + } } static void UpdatesScreen_Show(struct LScreen* s_) { diff --git a/src/LWidgets.c b/src/LWidgets.c index 38617cbe2..d9e175568 100644 --- a/src/LWidgets.c +++ b/src/LWidgets.c @@ -114,9 +114,10 @@ static const struct LWidgetVTABLE lbutton_VTABLE = { LButton_OnSelect, LButton_OnUnselect /* Select */ }; void LButton_Init(void* screen, struct LButton* w, int width, int height, const char* text, - const struct LLayout* layouts) { + LWidgetFunc onClick, const struct LLayout* layouts) { w->VTABLE = &lbutton_VTABLE; w->type = LWIDGET_BUTTON; + w->OnClick = onClick; w->layouts = layouts; w->autoSelectable = true; diff --git a/src/LWidgets.h b/src/LWidgets.h index 88838a69d..06755ed5d 100644 --- a/src/LWidgets.h +++ b/src/LWidgets.h @@ -43,23 +43,26 @@ struct LWidgetVTABLE { void (*TextChanged)(void* elem, const cc_string* str); }; + + #define LWidget_Layout \ - const struct LWidgetVTABLE* VTABLE; /* General widget functions */ \ - int x, y, width, height; /* Top left corner and dimensions of this widget */ \ - cc_bool hovered; /* Whether this widget is currently being moused over */ \ - cc_bool selected; /* Whether this widget is last widget to be clicked on */ \ - cc_bool autoSelectable; /* Whether this widget can get auto selected (e.g. pressing tab) */ \ - cc_bool dirty; /* Whether this widget needs to be redrawn */ \ - cc_bool opaque; /* Whether this widget completely obscures background behind it */ \ - cc_uint8 type; /* Type of this widget */ \ - cc_bool skipsEnter; /* Whether clicking this widget DOESN'T trigger OnEnterWidget */ \ - void (*OnClick)(void* widget); /* Called when widget is clicked */ \ - void (*OnHover)(void* widget); /* Called when widget is hovered over */ \ - void (*OnUnhover)(void* widget);/*Called when widget is no longer hovered over */ \ - Rect2D last; /* Widget's last drawn area */ \ - void* meta; /* Backend specific data */ \ + const struct LWidgetVTABLE* VTABLE; /* General widget functions */ \ + int x, y, width, height; /* Top left corner and dimensions of this widget */ \ + cc_bool hovered; /* Whether this widget is currently being moused over */ \ + cc_bool selected; /* Whether this widget is last widget to be clicked on */ \ + cc_bool autoSelectable; /* Whether this widget can get auto selected (e.g. pressing tab) */ \ + cc_bool dirty; /* Whether this widget needs to be redrawn */ \ + cc_bool opaque; /* Whether this widget completely obscures background behind it */ \ + cc_uint8 type; /* Type of this widget */ \ + cc_bool skipsEnter; /* Whether clicking this widget DOESN'T trigger OnEnterWidget */ \ + LWidgetFunc OnClick; /* Called when widget is clicked */ \ + LWidgetFunc OnHover; /* Called when widget is hovered over */ \ + LWidgetFunc OnUnhover; /* Called when widget is no longer hovered over */ \ + Rect2D last; /* Widget's last drawn area */ \ + void* meta; /* Backend specific data */ \ const struct LLayout* layouts; +typedef void (*LWidgetFunc)(void* widget); /* Represents an individual 2D gui component in the launcher. */ struct LWidget { LWidget_Layout }; void LWidget_CalcOffsets(void); @@ -70,7 +73,7 @@ struct LButton { int _textWidth, _textHeight; }; CC_NOINLINE void LButton_Init(void* screen, struct LButton* w, int width, int height, const char* text, - const struct LLayout* layouts); + LWidgetFunc onClick, const struct LLayout* layouts); CC_NOINLINE void LButton_SetConst(struct LButton* w, const char* text); CC_NOINLINE void LButton_DrawBackground(struct Context2D* ctx, int x, int y, int width, int height, cc_bool active);