Launcher: Simplify button initialisation code

This commit is contained in:
UnknownShadow200 2023-10-14 12:49:06 +11:00
parent 656497b0ea
commit 09bfca5217
3 changed files with 116 additions and 119 deletions

View File

@ -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], "&ethe 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], "&ethe 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);
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,32 +801,31 @@ 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);
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) {
@ -1697,25 +1692,23 @@ 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->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);
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_) {

View File

@ -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;

View File

@ -43,6 +43,8 @@ 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 */ \
@ -53,13 +55,14 @@ struct LWidgetVTABLE {
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 */ \
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);