mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-12 09:06:55 -04:00
Launcher: Simplify creating screens with non-fixed number of widgets
This commit is contained in:
parent
2d8067ea2d
commit
4042e3e742
383
src/LScreens.c
383
src/LScreens.c
@ -129,7 +129,7 @@ static void LScreen_DrawBackground(struct LScreen* s, struct Context2D* ctx) {
|
||||
CC_NOINLINE static void LScreen_Reset(struct LScreen* s) {
|
||||
int i;
|
||||
|
||||
s->Init = NULL; /* screens should always override this */
|
||||
s->Init = LScreen_NullFunc;
|
||||
s->Show = LScreen_NullFunc;
|
||||
s->Free = LScreen_NullFunc;
|
||||
s->Layout = LScreen_DoLayout;
|
||||
@ -150,6 +150,17 @@ CC_NOINLINE static void LScreen_Reset(struct LScreen* s) {
|
||||
s->selectedWidget = NULL;
|
||||
}
|
||||
|
||||
|
||||
void LScreen_AddWidget(void* screen, void* widget) {
|
||||
struct LScreen* s = (struct LScreen*)screen;
|
||||
struct LWidget* w = (struct LWidget*)widget;
|
||||
|
||||
if (s->numWidgets >= s->maxWidgets)
|
||||
Logger_Abort("Can't add anymore widgets to this LScreen");
|
||||
s->widgets[s->numWidgets++] = w;
|
||||
}
|
||||
|
||||
|
||||
static void SwitchToChooseMode(void* w) { ChooseModeScreen_SetActive(false); }
|
||||
static void SwitchToColours(void* w) { ColoursScreen_SetActive(); }
|
||||
static void SwitchToDirectConnect(void* w) { DirectConnectScreen_SetActive(); }
|
||||
@ -170,13 +181,8 @@ static struct ChooseModeScreen {
|
||||
cc_bool firstTime;
|
||||
} ChooseModeScreen;
|
||||
|
||||
static struct LWidget* chooseMode_widgets[] = {
|
||||
(struct LWidget*)&ChooseModeScreen.seps[0], (struct LWidget*)&ChooseModeScreen.seps[1],
|
||||
(struct LWidget*)&ChooseModeScreen.btnEnhanced, (struct LWidget*)&ChooseModeScreen.lblEnhanced[0], (struct LWidget*)&ChooseModeScreen.lblEnhanced[1],
|
||||
(struct LWidget*)&ChooseModeScreen.btnClassicHax,(struct LWidget*)&ChooseModeScreen.lblClassicHax[0],(struct LWidget*)&ChooseModeScreen.lblClassicHax[1],
|
||||
(struct LWidget*)&ChooseModeScreen.btnClassic, (struct LWidget*)&ChooseModeScreen.lblClassic[0], (struct LWidget*)&ChooseModeScreen.lblClassic[1],
|
||||
NULL
|
||||
};
|
||||
#define CHOOSEMODE_SCREEN_MAX_WIDGETS 12
|
||||
static struct LWidget* chooseMode_widgets[CHOOSEMODE_SCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS mode_seps0[] = { { ANCHOR_CENTRE, -5 }, { ANCHOR_CENTRE, -85 } };
|
||||
LAYOUTS mode_seps1[] = { { ANCHOR_CENTRE, -5 }, { ANCHOR_CENTRE, -15 } };
|
||||
@ -215,28 +221,36 @@ 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_Init(struct LScreen* s_) {
|
||||
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->numWidgets = Array_Elems(chooseMode_widgets);
|
||||
|
||||
LLine_Init( &s->seps[0], 490, mode_seps0);
|
||||
LLine_Init( &s->seps[1], 490, mode_seps1);
|
||||
|
||||
LButton_Init(&s->btnEnhanced, 145, 35, "Enhanced", mode_btnEnhanced);
|
||||
LLabel_Init( &s->lblEnhanced[0], "&eEnables custom blocks, changing env", mode_lblEnhanced0);
|
||||
LLabel_Init( &s->lblEnhanced[1], "&esettings, longer messages, and more", mode_lblEnhanced1);
|
||||
|
||||
LButton_Init(&s->btnClassicHax, 145, 35, "Classic +hax", mode_btnClassicHax);
|
||||
LLabel_Init( &s->lblClassicHax[0], "&eSame as Classic mode, except that", mode_lblClassicHax0);
|
||||
LLabel_Init( &s->lblClassicHax[1], "&ehacks (noclip/fly/speed) are enabled", mode_lblClassicHax1);
|
||||
|
||||
LButton_Init(&s->btnClassic, 145, 35, "Classic", mode_btnClassic);
|
||||
LLabel_Init( &s->lblClassic[0], "&eOnly uses blocks and features from", mode_lblClassic0);
|
||||
LLabel_Init( &s->lblClassic[1], "ðe original minecraft classic", mode_lblClassic1);
|
||||
|
||||
LLabel_Init( &s->lblHelp, "&eClick &fEnhanced &eif you're not sure which mode to choose.", mode_lblHelp);
|
||||
LButton_Init(&s->btnBack, 80, 35, "Back", mode_btnBack);
|
||||
s->widgets = chooseMode_widgets;
|
||||
s->maxWidgets = Array_Elems(chooseMode_widgets);
|
||||
s->numWidgets = 0;
|
||||
ChooseModeScreen_AddWidgets(s);
|
||||
|
||||
s->btnEnhanced.OnClick = UseModeEnhanced;
|
||||
s->btnClassicHax.OnClick = UseModeClassicHax;
|
||||
@ -244,18 +258,9 @@ static void ChooseModeScreen_Init(struct LScreen* s_) {
|
||||
s->btnBack.OnClick = SwitchToSettings;
|
||||
}
|
||||
|
||||
static void ChooseModeScreen_Show(struct LScreen* s_) {
|
||||
struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_;
|
||||
|
||||
s->widgets[11] = s->firstTime ?
|
||||
(struct LWidget*)&ChooseModeScreen.lblHelp :
|
||||
(struct LWidget*)&ChooseModeScreen.btnBack;
|
||||
}
|
||||
|
||||
void ChooseModeScreen_SetActive(cc_bool firstTime) {
|
||||
struct ChooseModeScreen* s = &ChooseModeScreen;
|
||||
LScreen_Reset((struct LScreen*)s);
|
||||
s->Init = ChooseModeScreen_Init;
|
||||
s->Show = ChooseModeScreen_Show;
|
||||
s->firstTime = firstTime;
|
||||
|
||||
@ -278,18 +283,8 @@ static struct ColoursScreen {
|
||||
float colourAcc;
|
||||
} ColoursScreen;
|
||||
|
||||
static struct LWidget* colours_widgets[] = {
|
||||
(struct LWidget*)&ColoursScreen.iptColours[ 0], (struct LWidget*)&ColoursScreen.iptColours[ 1], (struct LWidget*)&ColoursScreen.iptColours[ 2],
|
||||
(struct LWidget*)&ColoursScreen.iptColours[ 3], (struct LWidget*)&ColoursScreen.iptColours[ 4], (struct LWidget*)&ColoursScreen.iptColours[ 5],
|
||||
(struct LWidget*)&ColoursScreen.iptColours[ 6], (struct LWidget*)&ColoursScreen.iptColours[ 7], (struct LWidget*)&ColoursScreen.iptColours[ 8],
|
||||
(struct LWidget*)&ColoursScreen.iptColours[ 9], (struct LWidget*)&ColoursScreen.iptColours[10], (struct LWidget*)&ColoursScreen.iptColours[11],
|
||||
(struct LWidget*)&ColoursScreen.iptColours[12], (struct LWidget*)&ColoursScreen.iptColours[13], (struct LWidget*)&ColoursScreen.iptColours[14],
|
||||
(struct LWidget*)&ColoursScreen.lblNames[0], (struct LWidget*)&ColoursScreen.lblNames[1],
|
||||
(struct LWidget*)&ColoursScreen.lblNames[2], (struct LWidget*)&ColoursScreen.lblNames[3],
|
||||
(struct LWidget*)&ColoursScreen.lblNames[4],
|
||||
(struct LWidget*)&ColoursScreen.lblRGB[0], (struct LWidget*)&ColoursScreen.lblRGB[1], (struct LWidget*)&ColoursScreen.lblRGB[2],
|
||||
(struct LWidget*)&ColoursScreen.btnBack, (struct LWidget*)&ColoursScreen.cbClassic
|
||||
};
|
||||
#define COLOURSSCREEN_MAX_WIDGETS 25
|
||||
static struct LWidget* colours_widgets[COLOURSSCREEN_MAX_WIDGETS];
|
||||
|
||||
#define IptColor_Layout(xx, yy) { { ANCHOR_CENTRE, xx }, { ANCHOR_CENTRE, yy } }
|
||||
LAYOUTS clr_iptColours[15][2] = {
|
||||
@ -405,26 +400,26 @@ static void ColoursScreen_Init(struct LScreen* s_) {
|
||||
struct ColoursScreen* s = (struct ColoursScreen*)s_;
|
||||
int i;
|
||||
s->widgets = colours_widgets;
|
||||
s->numWidgets = Array_Elems(colours_widgets);
|
||||
s->maxWidgets = Array_Elems(colours_widgets);
|
||||
|
||||
for (i = 0; i < 5 * 3; i++) {
|
||||
s->iptColours[i].inputType = KEYBOARD_TYPE_INTEGER;
|
||||
s->iptColours[i].TextChanged = ColoursScreen_TextChanged;
|
||||
LInput_Init(&s->iptColours[i], 55, NULL, clr_iptColours[i]);
|
||||
LInput_Init(s, &s->iptColours[i], 55, NULL, clr_iptColours[i]);
|
||||
}
|
||||
|
||||
LLabel_Init( &s->lblNames[0], "Background", clr_lblNames0);
|
||||
LLabel_Init( &s->lblNames[1], "Button border", clr_lblNames1);
|
||||
LLabel_Init( &s->lblNames[2], "Button highlight", clr_lblNames2);
|
||||
LLabel_Init( &s->lblNames[3], "Button", clr_lblNames3);
|
||||
LLabel_Init( &s->lblNames[4], "Active button", clr_lblNames4);
|
||||
LLabel_Init(s, &s->lblNames[0], "Background", clr_lblNames0);
|
||||
LLabel_Init(s, &s->lblNames[1], "Button border", clr_lblNames1);
|
||||
LLabel_Init(s, &s->lblNames[2], "Button highlight", clr_lblNames2);
|
||||
LLabel_Init(s, &s->lblNames[3], "Button", clr_lblNames3);
|
||||
LLabel_Init(s, &s->lblNames[4], "Active button", clr_lblNames4);
|
||||
|
||||
LLabel_Init( &s->lblRGB[0], "Red", clr_lblRGB0);
|
||||
LLabel_Init( &s->lblRGB[1], "Green", clr_lblRGB1);
|
||||
LLabel_Init( &s->lblRGB[2], "Blue", clr_lblRGB2);
|
||||
LButton_Init(&s->btnBack, 80, 35, "Back", clr_btnBack);
|
||||
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);
|
||||
|
||||
LCheckbox_Init(&s->cbClassic, "Classic style", clr_cbClassic);
|
||||
LCheckbox_Init(s, &s->cbClassic, "Classic style", clr_cbClassic);
|
||||
s->cbClassic.ValueChanged = ColoursScreen_ToggleBG;
|
||||
s->btnBack.OnClick = SwitchToThemes;
|
||||
}
|
||||
@ -461,11 +456,8 @@ static struct DirectConnectScreen {
|
||||
struct LLabel lblStatus;
|
||||
} DirectConnectScreen;
|
||||
|
||||
static struct LWidget* directConnect_widgets[] = {
|
||||
(struct LWidget*)&DirectConnectScreen.iptUsername, (struct LWidget*)&DirectConnectScreen.iptAddress,
|
||||
(struct LWidget*)&DirectConnectScreen.iptMppass, (struct LWidget*)&DirectConnectScreen.btnConnect,
|
||||
(struct LWidget*)&DirectConnectScreen.btnBack, (struct LWidget*)&DirectConnectScreen.lblStatus
|
||||
};
|
||||
#define DIRECTCONNECT_SCREEN_MAXWIDGETS 6
|
||||
static struct LWidget* directConnect_widgets[DIRECTCONNECT_SCREEN_MAXWIDGETS];
|
||||
|
||||
LAYOUTS dc_iptUsername[] = { { ANCHOR_CENTRE_MIN, -165 }, { ANCHOR_CENTRE, -120 } };
|
||||
LAYOUTS dc_iptAddress[] = { { ANCHOR_CENTRE_MIN, -165 }, { ANCHOR_CENTRE, -75 } };
|
||||
@ -561,15 +553,15 @@ static void DirectConnectScreen_StartClient(void* w) {
|
||||
static void DirectConnectScreen_Init(struct LScreen* s_) {
|
||||
struct DirectConnectScreen* s = (struct DirectConnectScreen*)s_;
|
||||
s->widgets = directConnect_widgets;
|
||||
s->numWidgets = Array_Elems(directConnect_widgets);
|
||||
s->maxWidgets = Array_Elems(directConnect_widgets);
|
||||
|
||||
LInput_Init(&s->iptUsername, 330, "Username..", dc_iptUsername);
|
||||
LInput_Init(&s->iptAddress, 330, "IP address:Port number..", dc_iptAddress);
|
||||
LInput_Init(&s->iptMppass, 330, "Mppass..", dc_iptMppass);
|
||||
LInput_Init(s, &s->iptUsername, 330, "Username..", dc_iptUsername);
|
||||
LInput_Init(s, &s->iptAddress, 330, "IP address:Port number..", dc_iptAddress);
|
||||
LInput_Init(s, &s->iptMppass, 330, "Mppass..", dc_iptMppass);
|
||||
|
||||
LButton_Init(&s->btnConnect, 110, 35, "Connect", dc_btnConnect);
|
||||
LButton_Init(&s->btnBack, 80, 35, "Back", dc_btnBack);
|
||||
LLabel_Init( &s->lblStatus, "", dc_lblStatus);
|
||||
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);
|
||||
|
||||
s->iptUsername.ClipboardFilter = DirectConnectScreen_UrlFilter;
|
||||
s->iptAddress.ClipboardFilter = DirectConnectScreen_UrlFilter;
|
||||
@ -603,10 +595,8 @@ static struct MFAScreen {
|
||||
struct LLabel lblTitle;
|
||||
} MFAScreen;
|
||||
|
||||
static struct LWidget* mfa_widgets[] = {
|
||||
(struct LWidget*)&MFAScreen.lblTitle, (struct LWidget*)&MFAScreen.iptCode,
|
||||
(struct LWidget*)&MFAScreen.btnSignIn, (struct LWidget*)&MFAScreen.btnCancel
|
||||
};
|
||||
#define MFA_SCREEN_MAX_WIDGETS 4
|
||||
static struct LWidget* mfa_widgets[MFA_SCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS mfa_lblTitle[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -115 } };
|
||||
LAYOUTS mfa_iptCode[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -75 } };
|
||||
@ -627,12 +617,12 @@ static void MFAScreen_Cancel(void* w) {
|
||||
static void MFAScreen_Init(struct LScreen* s_) {
|
||||
struct MFAScreen* s = (struct MFAScreen*)s_;
|
||||
s->widgets = mfa_widgets;
|
||||
s->numWidgets = Array_Elems(mfa_widgets);
|
||||
s->maxWidgets = Array_Elems(mfa_widgets);
|
||||
|
||||
LLabel_Init( &s->lblTitle, "", mfa_lblTitle);
|
||||
LInput_Init( &s->iptCode, 280, "Login code..", mfa_iptCode);
|
||||
LButton_Init(&s->btnSignIn, 100, 35, "Sign in", mfa_btnSignIn);
|
||||
LButton_Init(&s->btnCancel, 100, 35, "Cancel", mfa_btnCancel);
|
||||
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);
|
||||
|
||||
s->btnSignIn.OnClick = MFAScreen_SignIn;
|
||||
s->btnCancel.OnClick = MFAScreen_Cancel;
|
||||
@ -669,14 +659,8 @@ static struct MainScreen {
|
||||
cc_bool signingIn;
|
||||
} MainScreen;
|
||||
|
||||
static struct LWidget* main_widgets[] = {
|
||||
(struct LWidget*)&MainScreen.iptUsername, (struct LWidget*)&MainScreen.iptPassword,
|
||||
(struct LWidget*)&MainScreen.btnLogin, (struct LWidget*)&MainScreen.btnResume,
|
||||
(struct LWidget*)&MainScreen.lblStatus, (struct LWidget*)&MainScreen.btnDirect,
|
||||
(struct LWidget*)&MainScreen.btnSPlayer, (struct LWidget*)&MainScreen.btnRegister,
|
||||
(struct LWidget*)&MainScreen.btnOptions, (struct LWidget*)&MainScreen.lblUpdate,
|
||||
(struct LWidget*)&MainScreen.btnUpdates
|
||||
};
|
||||
#define MAINSCREEN_MAX_WIDGETS 11
|
||||
static struct LWidget* main_widgets[MAINSCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS main_iptUsername[] = { { ANCHOR_CENTRE_MIN, -140 }, { ANCHOR_CENTRE, -120 } };
|
||||
LAYOUTS main_iptPassword[] = { { ANCHOR_CENTRE_MIN, -140 }, { ANCHOR_CENTRE, -75 } };
|
||||
@ -808,7 +792,7 @@ static void MainScreen_Init(struct LScreen* s_) {
|
||||
cc_string user, pass; char passBuffer[STRING_SIZE];
|
||||
struct MainScreen* s = (struct MainScreen*)s_;
|
||||
s->widgets = main_widgets;
|
||||
s->numWidgets = Array_Elems(main_widgets);
|
||||
s->maxWidgets = Array_Elems(main_widgets);
|
||||
|
||||
s->iptPassword.inputType = KEYBOARD_TYPE_PASSWORD;
|
||||
s->lblUpdate.small = true;
|
||||
@ -817,22 +801,24 @@ static void MainScreen_Init(struct LScreen* s_) {
|
||||
#ifdef CC_BUILD_FLATPAK
|
||||
Updater_Supported = false;
|
||||
#endif
|
||||
if (!Updater_Supported) s->numWidgets--;
|
||||
|
||||
LInput_Init( &s->iptUsername, 280, "Username..", main_iptUsername);
|
||||
LInput_Init( &s->iptPassword, 280, "Password..", main_iptPassword);
|
||||
LButton_Init(&s->btnLogin, 100, 35, "Sign in", main_btnLogin);
|
||||
LButton_Init(&s->btnResume, 100, 35, "Resume", main_btnResume);
|
||||
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);
|
||||
|
||||
LLabel_Init( &s->lblStatus, "", main_lblStatus);
|
||||
LButton_Init(&s->btnDirect, 200, 35, "Direct connect", main_btnDirect);
|
||||
LButton_Init(&s->btnSPlayer, 200, 35, "Singleplayer", main_btnSPlayer);
|
||||
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->lblUpdate, "&eChecking..",
|
||||
LLabel_Init(s, &s->lblUpdate, "&eChecking..",
|
||||
Updater_Supported ? main_lblUpdate_N : main_lblUpdate_H);
|
||||
LButton_Init(&s->btnRegister, 100, 35, "Register", main_btnRegister);
|
||||
LButton_Init(&s->btnOptions, 100, 35, "Options", main_btnOptions);
|
||||
LButton_Init(&s->btnUpdates, 100, 35, "Updates", main_btnUpdates);
|
||||
LButton_Init(s, &s->btnRegister, 100, 35, "Register", main_btnRegister);
|
||||
LButton_Init(s, &s->btnOptions, 100, 35, "Options", main_btnOptions);
|
||||
|
||||
if (Updater_Supported) {
|
||||
LButton_Init(s, &s->btnUpdates, 100, 35, "Updates", main_btnUpdates);
|
||||
}
|
||||
|
||||
s->btnLogin.OnClick = MainScreen_Login;
|
||||
s->btnResume.OnClick = MainScreen_Resume;
|
||||
@ -996,11 +982,8 @@ static struct CheckResourcesScreen {
|
||||
struct LButton btnYes, btnNo;
|
||||
} CheckResourcesScreen;
|
||||
|
||||
static struct LWidget* checkResources_widgets[] = {
|
||||
(struct LWidget*)&CheckResourcesScreen.lblLine1, (struct LWidget*)&CheckResourcesScreen.lblLine2,
|
||||
(struct LWidget*)&CheckResourcesScreen.lblStatus, (struct LWidget*)&CheckResourcesScreen.btnYes,
|
||||
(struct LWidget*)&CheckResourcesScreen.btnNo
|
||||
};
|
||||
#define CHECKRESOURCES_SCREEN_MAX_WIDGET 5
|
||||
static struct LWidget* checkResources_widgets[CHECKRESOURCES_SCREEN_MAX_WIDGET];
|
||||
|
||||
LAYOUTS cres_lblLine1[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -50 } };
|
||||
LAYOUTS cres_lblLine2[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -30 } };
|
||||
@ -1023,15 +1006,15 @@ static void CheckResourcesScreen_Next(void* w) {
|
||||
static void CheckResourcesScreen_Init(struct LScreen* s_) {
|
||||
struct CheckResourcesScreen* s = (struct CheckResourcesScreen*)s_;
|
||||
s->widgets = checkResources_widgets;
|
||||
s->numWidgets = Array_Elems(checkResources_widgets);
|
||||
s->maxWidgets = Array_Elems(checkResources_widgets);
|
||||
s->lblStatus.small = true;
|
||||
|
||||
LLabel_Init( &s->lblLine1, "Some required resources weren't found", cres_lblLine1);
|
||||
LLabel_Init( &s->lblLine2, "Okay to download?", cres_lblLine2);
|
||||
LLabel_Init( &s->lblStatus, "", cres_lblStatus);
|
||||
LLabel_Init(s, &s->lblLine1, "Some required resources weren't found", cres_lblLine1);
|
||||
LLabel_Init(s, &s->lblLine2, "Okay to download?", cres_lblLine2);
|
||||
LLabel_Init(s, &s->lblStatus, "", cres_lblStatus);
|
||||
|
||||
LButton_Init(&s->btnYes, 70, 35, "Yes", cres_btnYes);
|
||||
LButton_Init(&s->btnNo, 70, 35, "No", cres_btnNo);
|
||||
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;
|
||||
}
|
||||
@ -1086,10 +1069,8 @@ static struct FetchResourcesScreen {
|
||||
struct LSlider sdrProgress;
|
||||
} FetchResourcesScreen;
|
||||
|
||||
static struct LWidget* fetchResources_widgets[] = {
|
||||
(struct LWidget*)&FetchResourcesScreen.lblStatus, (struct LWidget*)&FetchResourcesScreen.btnCancel,
|
||||
(struct LWidget*)&FetchResourcesScreen.sdrProgress
|
||||
};
|
||||
#define FETCHRESOURCES_SCREEN_MAX_WIDGETS 3
|
||||
static struct LWidget* fetchResources_widgets[FETCHRESOURCES_SCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS fres_lblStatus[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -10 } };
|
||||
LAYOUTS fres_btnCancel[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 45 } };
|
||||
@ -1099,12 +1080,12 @@ LAYOUTS fres_sdrProgress[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 15 } };
|
||||
static void FetchResourcesScreen_Init(struct LScreen* s_) {
|
||||
struct FetchResourcesScreen* s = (struct FetchResourcesScreen*)s_;
|
||||
s->widgets = fetchResources_widgets;
|
||||
s->numWidgets = Array_Elems(fetchResources_widgets);
|
||||
s->maxWidgets = Array_Elems(fetchResources_widgets);
|
||||
s->lblStatus.small = true;
|
||||
|
||||
LLabel_Init( &s->lblStatus, "", fres_lblStatus);
|
||||
LButton_Init(&s->btnCancel, 120, 35, "Cancel", fres_btnCancel);
|
||||
LSlider_Init(&s->sdrProgress, 200, 12, BitmapColor_RGB(0, 220, 0), fres_sdrProgress);
|
||||
LLabel_Init(s, &s->lblStatus, "", fres_lblStatus);
|
||||
LButton_Init(s, &s->btnCancel, 120, 35, "Cancel", fres_btnCancel);
|
||||
LSlider_Init(s, &s->sdrProgress, 200, 12, BitmapColor_RGB(0, 220, 0), fres_sdrProgress);
|
||||
|
||||
s->btnCancel.OnClick = CheckResourcesScreen_Next;
|
||||
}
|
||||
@ -1188,11 +1169,7 @@ static struct ServersScreen {
|
||||
float tableAcc;
|
||||
} ServersScreen;
|
||||
|
||||
static struct LWidget* servers_widgets[] = {
|
||||
(struct LWidget*)&ServersScreen.iptSearch, (struct LWidget*)&ServersScreen.iptHash,
|
||||
(struct LWidget*)&ServersScreen.btnBack, (struct LWidget*)&ServersScreen.btnConnect,
|
||||
(struct LWidget*)&ServersScreen.btnRefresh, (struct LWidget*)&ServersScreen.table
|
||||
};
|
||||
static struct LWidget* servers_widgets[6];
|
||||
|
||||
LAYOUTS srv_iptSearch[] = { { ANCHOR_MIN, 10 }, { ANCHOR_MIN, 10 } };
|
||||
LAYOUTS srv_iptHash[] = { { ANCHOR_MIN, 10 }, { ANCHOR_MAX, 10 } };
|
||||
@ -1266,14 +1243,14 @@ static void ServersScreen_ReloadServers(struct ServersScreen* s) {
|
||||
static void ServersScreen_Init(struct LScreen* s_) {
|
||||
struct ServersScreen* s = (struct ServersScreen*)s_;
|
||||
s->widgets = servers_widgets;
|
||||
s->numWidgets = Array_Elems(servers_widgets);
|
||||
s->maxWidgets = Array_Elems(servers_widgets);
|
||||
|
||||
LInput_Init( &s->iptSearch, 370, "Search servers..", srv_iptSearch);
|
||||
LInput_Init( &s->iptHash, 475, "classicube.net/server/play/...", srv_iptHash);
|
||||
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->btnBack, 110, 30, "Back", srv_btnBack);
|
||||
LButton_Init(&s->btnConnect, 130, 30, "Connect", srv_btnConnect);
|
||||
LButton_Init(&s->btnRefresh, 110, 30, "Refresh", srv_btnRefresh);
|
||||
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;
|
||||
@ -1284,7 +1261,7 @@ static void ServersScreen_Init(struct LScreen* s_) {
|
||||
s->iptHash.TextChanged = ServersScreen_HashChanged;
|
||||
s->iptHash.ClipboardFilter = ServersScreen_HashFilter;
|
||||
|
||||
LTable_Init(&s->table, srv_table);
|
||||
LTable_Init(s, &s->table, srv_table);
|
||||
s->table.filter = &s->iptSearch.text;
|
||||
s->table.selectedHash = &s->iptHash.text;
|
||||
s->table.OnSelectedChanged = ServersScreen_OnSelectedChanged;
|
||||
@ -1373,19 +1350,8 @@ static struct SettingsScreen {
|
||||
struct LLine sep;
|
||||
} SettingsScreen;
|
||||
|
||||
static struct LWidget* settings_widgets[] = {
|
||||
(struct LWidget*)&SettingsScreen.sep,
|
||||
(struct LWidget*)&SettingsScreen.btnMode, (struct LWidget*)&SettingsScreen.lblMode,
|
||||
(struct LWidget*)&SettingsScreen.btnColours, (struct LWidget*)&SettingsScreen.lblColours,
|
||||
(struct LWidget*)&SettingsScreen.cbExtra, (struct LWidget*)&SettingsScreen.cbEmpty,
|
||||
(struct LWidget*)&SettingsScreen.cbScale, (struct LWidget*)&SettingsScreen.btnBack
|
||||
};
|
||||
static struct LWidget* settings_classic[] = {
|
||||
(struct LWidget*)&SettingsScreen.sep,
|
||||
(struct LWidget*)&SettingsScreen.btnMode, (struct LWidget*)&SettingsScreen.lblMode,
|
||||
(struct LWidget*)&SettingsScreen.cbExtra, (struct LWidget*)&SettingsScreen.cbEmpty,
|
||||
(struct LWidget*)&SettingsScreen.cbScale, (struct LWidget*)&SettingsScreen.btnBack
|
||||
};
|
||||
#define SETTINGS_SCREEN_MAX_WIDGETS 9
|
||||
static struct LWidget* settings_widgets[SETTINGS_SCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS set_btnMode[] = { { ANCHOR_CENTRE, -135 }, { ANCHOR_CENTRE, -70 } };
|
||||
LAYOUTS set_lblMode[] = { { ANCHOR_CENTRE_MIN, -70 }, { ANCHOR_CENTRE, -70 } };
|
||||
@ -1425,62 +1391,58 @@ static void SettingsScreen_DPIScaling(struct LCheckbox* w) {
|
||||
#endif
|
||||
}
|
||||
|
||||
static void SettingsScreen_Init(struct LScreen* s_) {
|
||||
struct SettingsScreen* s = (struct SettingsScreen*)s_;
|
||||
LLine_Init( &s->sep, 380, set_sep);
|
||||
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);
|
||||
LLabel_Init(s, &s->lblMode, "&eChange the enabled features", set_lblMode);
|
||||
|
||||
LButton_Init(&s->btnMode, 110, 35, "Mode", set_btnMode);
|
||||
LLabel_Init( &s->lblMode, "&eChange the enabled features", set_lblMode);
|
||||
|
||||
LButton_Init(&s->btnColours, 110, 35, "Theme", set_btnColours);
|
||||
LLabel_Init( &s->lblColours, "&eChange how the launcher looks", set_lblColours);
|
||||
if (!Options_GetBool(OPT_CLASSIC_MODE, false)) {
|
||||
LButton_Init(s, &s->btnColours, 110, 35, "Theme", set_btnColours);
|
||||
LLabel_Init(s, &s->lblColours, "&eChange how the launcher looks", set_lblColours);
|
||||
}
|
||||
|
||||
#if defined CC_BUILD_MOBILE
|
||||
LCheckbox_Init(&s->cbExtra, "Force landscape", set_cbExtra);
|
||||
s->cbExtra.ValueChanged = SettingsScreen_LockOrientation;
|
||||
LCheckbox_Init(s, &s->cbExtra, "Force landscape", set_cbExtra);
|
||||
#else
|
||||
LCheckbox_Init(&s->cbExtra, "Close this after game starts", set_cbExtra);
|
||||
s->cbExtra.ValueChanged = SettingsScreen_AutoClose;
|
||||
LCheckbox_Init(s, &s->cbExtra, "Close this after game starts", set_cbExtra);
|
||||
#endif
|
||||
|
||||
LCheckbox_Init(&s->cbEmpty, "Show empty servers in list", set_cbEmpty);
|
||||
s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty;
|
||||
LButton_Init( &s->btnBack, 80, 35, "Back", set_btnBack);
|
||||
|
||||
|
||||
LCheckbox_Init(&s->cbScale, "Use display scaling", set_cbScale);
|
||||
s->cbScale.ValueChanged = SettingsScreen_DPIScaling;
|
||||
|
||||
s->btnMode.OnClick = SwitchToChooseMode;
|
||||
s->btnColours.OnClick = SwitchToThemes;
|
||||
s->btnBack.OnClick = SwitchToMain;
|
||||
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);
|
||||
}
|
||||
|
||||
static void SettingsScreen_Show(struct LScreen* s_) {
|
||||
struct SettingsScreen* s = (struct SettingsScreen*)s_;
|
||||
|
||||
if (Options_GetBool(OPT_CLASSIC_MODE, false)) {
|
||||
s->widgets = settings_classic;
|
||||
s->numWidgets = Array_Elems(settings_classic);
|
||||
} else {
|
||||
s->widgets = settings_widgets;
|
||||
s->numWidgets = Array_Elems(settings_widgets);
|
||||
}
|
||||
s->widgets = settings_widgets;
|
||||
s->maxWidgets = Array_Elems(settings_widgets);
|
||||
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));
|
||||
#else
|
||||
s->cbExtra.ValueChanged = SettingsScreen_AutoClose;
|
||||
LCheckbox_Set(&s->cbExtra, Options_GetBool(LOPT_AUTO_CLOSE, false));
|
||||
#endif
|
||||
|
||||
s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty;
|
||||
LCheckbox_Set(&s->cbEmpty, Launcher_ShowEmptyServers);
|
||||
|
||||
s->cbScale.ValueChanged = SettingsScreen_DPIScaling;
|
||||
LCheckbox_Set(&s->cbScale, DisplayInfo.DPIScaling);
|
||||
}
|
||||
|
||||
void SettingsScreen_SetActive(void) {
|
||||
struct SettingsScreen* s = &SettingsScreen;
|
||||
LScreen_Reset((struct LScreen*)s);
|
||||
s->Init = SettingsScreen_Init;
|
||||
s->Show = SettingsScreen_Show;
|
||||
s->Show = SettingsScreen_Show;
|
||||
|
||||
s->title = "Options";
|
||||
s->onEscapeWidget = (struct LWidget*)&s->btnBack;
|
||||
@ -1497,11 +1459,8 @@ static struct ThemesScreen {
|
||||
struct LButton btnCustom, btnBack;
|
||||
} ThemesScreen;
|
||||
|
||||
static struct LWidget* themes_widgets[] = {
|
||||
(struct LWidget*)&ThemesScreen.btnModern, (struct LWidget*)&ThemesScreen.btnClassic,
|
||||
(struct LWidget*)&ThemesScreen.btnNordic, (struct LWidget*)&ThemesScreen.btnCustom,
|
||||
(struct LWidget*)&ThemesScreen.btnBack
|
||||
};
|
||||
#define THEME_SCREEN_MAX_WIDGETS 5
|
||||
static struct LWidget* themes_widgets[THEME_SCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS the_btnModern[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -120 } };
|
||||
LAYOUTS the_btnClassic[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -70 } };
|
||||
@ -1526,16 +1485,16 @@ static void ThemesScreen_Nordic(void* w) {
|
||||
ThemesScreen_Set(&Launcher_NordicTheme);
|
||||
}
|
||||
|
||||
static void ThemesScreen_Init(struct LScreen* s_) {
|
||||
static void ThemesScreen_Show(struct LScreen* s_) {
|
||||
struct ThemesScreen* s = (struct ThemesScreen*)s_;
|
||||
s->widgets = themes_widgets;
|
||||
s->numWidgets = Array_Elems(themes_widgets);
|
||||
s->maxWidgets = Array_Elems(themes_widgets);
|
||||
|
||||
LButton_Init(&s->btnModern, 200, 35, "Modern", the_btnModern);
|
||||
LButton_Init(&s->btnClassic, 200, 35, "Classic", the_btnClassic);
|
||||
LButton_Init(&s->btnNordic, 200, 35, "Nordic", the_btnNordic);
|
||||
LButton_Init(&s->btnCustom, 200, 35, "Custom", the_btnCustom);
|
||||
LButton_Init(&s->btnBack, 80, 35, "Back", the_btnBack);
|
||||
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;
|
||||
@ -1547,7 +1506,7 @@ static void ThemesScreen_Init(struct LScreen* s_) {
|
||||
void ThemesScreen_SetActive(void) {
|
||||
struct ThemesScreen* s = &ThemesScreen;
|
||||
LScreen_Reset((struct LScreen*)s);
|
||||
s->Init = ThemesScreen_Init;
|
||||
s->Show = ThemesScreen_Show;
|
||||
|
||||
s->title = "Select theme";
|
||||
s->onEscapeWidget = (struct LWidget*)&s->btnBack;
|
||||
@ -1567,15 +1526,8 @@ static struct UpdatesScreen {
|
||||
cc_bool pendingFetch, release;
|
||||
} UpdatesScreen;
|
||||
|
||||
static struct LWidget* updates_widgets[] = {
|
||||
(struct LWidget*)&UpdatesScreen.seps[0], (struct LWidget*)&UpdatesScreen.seps[1],
|
||||
(struct LWidget*)&UpdatesScreen.lblYour,
|
||||
(struct LWidget*)&UpdatesScreen.lblRel, (struct LWidget*)&UpdatesScreen.lblDev,
|
||||
(struct LWidget*)&UpdatesScreen.lblStatus, (struct LWidget*)&UpdatesScreen.btnBack,
|
||||
(struct LWidget*)&UpdatesScreen.lblInfo,
|
||||
(struct LWidget*)&UpdatesScreen.btnRel[0], (struct LWidget*)&UpdatesScreen.btnDev[0],
|
||||
(struct LWidget*)&UpdatesScreen.btnRel[1], (struct LWidget*)&UpdatesScreen.btnDev[1],
|
||||
};
|
||||
#define UPDATESSCREEN_MAX_WIDGETS 12
|
||||
static struct LWidget* updates_widgets[UPDATESSCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS upd_lblYour[] = { { ANCHOR_CENTRE, -5 }, { ANCHOR_CENTRE, -120 } };
|
||||
LAYOUTS upd_seps0[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -100 } };
|
||||
@ -1734,31 +1686,28 @@ static void UpdatesScreen_Init(struct LScreen* s_) {
|
||||
struct UpdatesScreen* s = (struct UpdatesScreen*)s_;
|
||||
int builds = Updater_Info.numBuilds;
|
||||
s->widgets = updates_widgets;
|
||||
s->numWidgets = Array_Elems(updates_widgets);
|
||||
s->maxWidgets = Array_Elems(updates_widgets);
|
||||
|
||||
if (Updater_Info.numBuilds < 2) s->numWidgets -= 2;
|
||||
if (Updater_Info.numBuilds < 1) s->numWidgets -= 2;
|
||||
LLine_Init(s, &s->seps[0], 320, upd_seps0);
|
||||
LLine_Init(s, &s->seps[1], 320, upd_seps1);
|
||||
LLabel_Init(s, &s->lblYour, "Your build: (unknown)", upd_lblYour);
|
||||
|
||||
LLabel_Init(&s->lblYour, "Your build: (unknown)", upd_lblYour);
|
||||
LLine_Init( &s->seps[0], 320, upd_seps0);
|
||||
LLine_Init( &s->seps[1], 320, upd_seps1);
|
||||
|
||||
LLabel_Init( &s->lblRel, "Latest release: Checking..", upd_lblRel);
|
||||
LLabel_Init( &s->lblDev, "Latest dev build: Checking..", upd_lblDev);
|
||||
LLabel_Init( &s->lblStatus, "", upd_lblStatus);
|
||||
LButton_Init(&s->btnBack, 80, 35, "Back", upd_btnBack);
|
||||
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);
|
||||
|
||||
if (builds >= 1) {
|
||||
LButton_Init(&s->btnRel[0], 130, 35, Updater_Info.builds[0].name,
|
||||
LButton_Init(s, &s->btnRel[0], 130, 35, Updater_Info.builds[0].name,
|
||||
builds == 1 ? upd_btnRel0_1 : upd_btnRel0_2);
|
||||
LButton_Init(&s->btnDev[0], 130, 35, Updater_Info.builds[0].name,
|
||||
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->btnRel[1], 130, 35, Updater_Info.builds[1].name, upd_btnRel1_2);
|
||||
LButton_Init(&s->btnDev[1], 130, 35, Updater_Info.builds[1].name, upd_btnDev1_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);
|
||||
}
|
||||
LLabel_Init(&s->lblInfo, Updater_Info.info, upd_lblInfo);
|
||||
|
||||
s->btnRel[0].OnClick = UpdatesScreen_Rel_0;
|
||||
s->btnRel[1].OnClick = UpdatesScreen_Rel_1;
|
||||
|
@ -27,6 +27,7 @@ typedef void (*LScreen_Func)(struct LScreen* s);
|
||||
struct LWidget* hoveredWidget; /* Widget the mouse is currently hovering over. */ \
|
||||
struct LWidget* selectedWidget; /* Widget mouse last clicked on. */ \
|
||||
int numWidgets; /* Number of widgets actually used */ \
|
||||
int maxWidgets; /* Maximum number of widgets that can be added to the screen */ \
|
||||
struct LWidget** widgets; /* Array of pointers to all the widgets in the screen */ \
|
||||
const char* title; /* Titlebar text */
|
||||
|
||||
@ -34,6 +35,7 @@ struct LScreen { LScreen_Layout };
|
||||
|
||||
void LScreen_SelectWidget(struct LScreen* s, int idx, struct LWidget* w, cc_bool was);
|
||||
void LScreen_UnselectWidget(struct LScreen* s, int idx, struct LWidget* w);
|
||||
void LScreen_AddWidget(void* screen, void* widget);
|
||||
|
||||
void ChooseModeScreen_SetActive(cc_bool firstTime);
|
||||
void ColoursScreen_SetActive(void);
|
||||
|
@ -113,13 +113,16 @@ static const struct LWidgetVTABLE lbutton_VTABLE = {
|
||||
LButton_Hover, LButton_Unhover, /* Hover */
|
||||
LButton_OnSelect, LButton_OnUnselect /* Select */
|
||||
};
|
||||
void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LLayout* layouts) {
|
||||
void LButton_Init(void* screen, struct LButton* w, int width, int height, const char* text,
|
||||
const struct LLayout* layouts) {
|
||||
w->VTABLE = &lbutton_VTABLE;
|
||||
w->type = LWIDGET_BUTTON;
|
||||
w->layouts = layouts;
|
||||
w->autoSelectable = true;
|
||||
|
||||
LBackend_ButtonInit(w, width, height);
|
||||
LButton_SetConst(w, text);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
void LButton_SetConst(struct LButton* w, const char* text) {
|
||||
@ -142,7 +145,8 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = {
|
||||
NULL, NULL, /* Hover */
|
||||
NULL, NULL /* Select */
|
||||
};
|
||||
void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* layouts) {
|
||||
void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text,
|
||||
const struct LLayout* layouts) {
|
||||
w->VTABLE = &lcheckbox_VTABLE;
|
||||
w->type = LWIDGET_CHECKBOX;
|
||||
w->layouts = layouts;
|
||||
@ -150,6 +154,7 @@ void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout*
|
||||
|
||||
w->text = String_FromReadonly(text);
|
||||
LBackend_CheckboxInit(w);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
void LCheckbox_Set(struct LCheckbox* w, cc_bool value) {
|
||||
@ -314,7 +319,8 @@ static const struct LWidgetVTABLE linput_VTABLE = {
|
||||
LInput_Select, LInput_Unselect, /* Select */
|
||||
NULL, LInput_TextChanged /* TextChanged */
|
||||
};
|
||||
void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LLayout* layouts) {
|
||||
void LInput_Init(void* screen, struct LInput* w, int width, const char* hintText,
|
||||
const struct LLayout* layouts) {
|
||||
w->VTABLE = &linput_VTABLE;
|
||||
w->type = LWIDGET_INPUT;
|
||||
w->autoSelectable = true;
|
||||
@ -325,6 +331,7 @@ void LInput_Init(struct LInput* w, int width, const char* hintText, const struct
|
||||
w->hintText = hintText;
|
||||
w->caretPos = -1;
|
||||
LBackend_InputInit(w, width);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
void LInput_SetText(struct LInput* w, const cc_string* text) {
|
||||
@ -369,7 +376,8 @@ static const struct LWidgetVTABLE llabel_VTABLE = {
|
||||
NULL, NULL, /* Hover */
|
||||
NULL, NULL /* Select */
|
||||
};
|
||||
void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layouts) {
|
||||
void LLabel_Init(void* screen, struct LLabel* w, const char* text,
|
||||
const struct LLayout* layouts) {
|
||||
w->VTABLE = &llabel_VTABLE;
|
||||
w->type = LWIDGET_LABEL;
|
||||
w->layouts = layouts;
|
||||
@ -377,6 +385,7 @@ void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layou
|
||||
String_InitArray(w->text, w->_textBuffer);
|
||||
LBackend_LabelInit(w);
|
||||
LLabel_SetConst(w, text);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
void LLabel_SetText(struct LLabel* w, const cc_string* text) {
|
||||
@ -405,11 +414,14 @@ static const struct LWidgetVTABLE lline_VTABLE = {
|
||||
NULL, NULL, /* Hover */
|
||||
NULL, NULL /* Select */
|
||||
};
|
||||
void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts) {
|
||||
void LLine_Init(void* screen, struct LLine* w, int width,
|
||||
const struct LLayout* layouts) {
|
||||
w->VTABLE = &lline_VTABLE;
|
||||
w->type = LWIDGET_LINE;
|
||||
w->layouts = layouts;
|
||||
|
||||
LBackend_LineInit(w, width);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
#define CLASSIC_LINE_COLOR BitmapColor_RGB(128, 128, 128)
|
||||
@ -432,13 +444,16 @@ static const struct LWidgetVTABLE lslider_VTABLE = {
|
||||
NULL, NULL, /* Hover */
|
||||
NULL, NULL /* Select */
|
||||
};
|
||||
void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LLayout* layouts) {
|
||||
void LSlider_Init(void* screen, struct LSlider* w, int width, int height, BitmapCol color,
|
||||
const struct LLayout* layouts) {
|
||||
w->VTABLE = &lslider_VTABLE;
|
||||
w->type = LWIDGET_SLIDER;
|
||||
w->color = color;
|
||||
w->opaque = true;
|
||||
w->layouts = layouts;
|
||||
|
||||
LBackend_SliderInit(w, width, height);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
void LSlider_SetProgress(struct LSlider* w, int progress) {
|
||||
@ -621,7 +636,8 @@ static const struct LWidgetVTABLE ltable_VTABLE = {
|
||||
LTable_MouseDown, LTable_MouseUp, /* Select */
|
||||
LTable_MouseWheel, /* Wheel */
|
||||
};
|
||||
void LTable_Init(struct LTable* w, const struct LLayout* layouts) {
|
||||
void LTable_Init(void* screen, struct LTable* w,
|
||||
const struct LLayout* layouts) {
|
||||
int i;
|
||||
w->VTABLE = <able_VTABLE;
|
||||
w->type = LWIDGET_TABLE;
|
||||
@ -635,6 +651,7 @@ void LTable_Init(struct LTable* w, const struct LLayout* layouts) {
|
||||
w->columns[i].width = Display_ScaleX(w->columns[i].width);
|
||||
}
|
||||
LBackend_TableInit(w);
|
||||
LScreen_AddWidget(screen, w);
|
||||
}
|
||||
|
||||
void LTable_Reset(struct LTable* w) {
|
||||
|
@ -69,7 +69,8 @@ struct LButton {
|
||||
cc_string text;
|
||||
int _textWidth, _textHeight;
|
||||
};
|
||||
CC_NOINLINE void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LLayout* layouts);
|
||||
CC_NOINLINE void LButton_Init(void* screen, struct LButton* w, int width, int height, const char* text,
|
||||
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);
|
||||
|
||||
@ -80,7 +81,8 @@ struct LCheckbox {
|
||||
cc_string text;
|
||||
void (*ValueChanged)(struct LCheckbox* w);
|
||||
};
|
||||
CC_NOINLINE void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* layouts);
|
||||
CC_NOINLINE void LCheckbox_Init(void* screen, struct LCheckbox* w, const char* text,
|
||||
const struct LLayout* layouts);
|
||||
CC_NOINLINE void LCheckbox_Set(struct LCheckbox* w, cc_bool value);
|
||||
|
||||
struct LInput;
|
||||
@ -105,7 +107,8 @@ struct LInput {
|
||||
int _textHeight;
|
||||
char _textBuffer[STRING_SIZE];
|
||||
};
|
||||
CC_NOINLINE void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LLayout* layouts);
|
||||
CC_NOINLINE void LInput_Init(void* screen, struct LInput* w, int width, const char* hintText,
|
||||
const struct LLayout* layouts);
|
||||
CC_NOINLINE void LInput_UNSAFE_GetText(struct LInput* w, cc_string* text);
|
||||
CC_NOINLINE void LInput_SetText(struct LInput* w, const cc_string* text);
|
||||
CC_NOINLINE void LInput_ClearText(struct LInput* w);
|
||||
@ -123,7 +126,8 @@ struct LLabel {
|
||||
cc_string text;
|
||||
char _textBuffer[STRING_SIZE];
|
||||
};
|
||||
CC_NOINLINE void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layouts);
|
||||
CC_NOINLINE void LLabel_Init(void* screen, struct LLabel* w, const char* text,
|
||||
const struct LLayout* layouts);
|
||||
CC_NOINLINE void LLabel_SetText(struct LLabel* w, const cc_string* text);
|
||||
CC_NOINLINE void LLabel_SetConst(struct LLabel* w, const char* text);
|
||||
|
||||
@ -132,7 +136,8 @@ struct LLine {
|
||||
LWidget_Layout
|
||||
int _width;
|
||||
};
|
||||
CC_NOINLINE void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts);
|
||||
CC_NOINLINE void LLine_Init(void* screen, struct LLine* w, int width,
|
||||
const struct LLayout* layouts);
|
||||
CC_NOINLINE BitmapCol LLine_GetColor(void);
|
||||
#define LLINE_HEIGHT 2
|
||||
|
||||
@ -142,7 +147,8 @@ struct LSlider {
|
||||
int value, _width, _height;
|
||||
BitmapCol color;
|
||||
};
|
||||
CC_NOINLINE void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LLayout* layouts);
|
||||
CC_NOINLINE void LSlider_Init(void* screen, struct LSlider* w, int width, int height, BitmapCol color,
|
||||
const struct LLayout* layouts);
|
||||
CC_NOINLINE void LSlider_SetProgress(struct LSlider* w, int progress);
|
||||
|
||||
struct ServerInfo;
|
||||
@ -213,7 +219,8 @@ struct LTableCell { struct LTable* table; int x, y, width; };
|
||||
|
||||
/* Initialises a table. */
|
||||
/* NOTE: Must also call LTable_Reset to make a table actually useful. */
|
||||
void LTable_Init(struct LTable* table, const struct LLayout* layouts);
|
||||
void LTable_Init(void* screen, struct LTable* table,
|
||||
const struct LLayout* layouts);
|
||||
/* Resets state of a table (reset sorter, filter, etc) */
|
||||
void LTable_Reset(struct LTable* table);
|
||||
/* Whether this table would handle the given key being pressed. */
|
||||
|
@ -236,7 +236,7 @@ void Gfx_RestoreAlphaState(cc_uint8 draw) {
|
||||
}
|
||||
|
||||
|
||||
static float Reversed_CalcZNear(float fov, int depthbufferBits) {
|
||||
static CC_INLINE float Reversed_CalcZNear(float fov, int depthbufferBits) {
|
||||
/* With reversed z depth, near Z plane can be much closer (with sufficient depth buffer precision) */
|
||||
/* This reduces clipping with high FOV without sacrificing depth precision for faraway objects */
|
||||
/* However for low FOV, don't reduce near Z in order to gain a bit more depth precision */
|
||||
@ -266,7 +266,7 @@ static void CopyTextureData(void* dst, int dstStride, const struct Bitmap* src,
|
||||
/* Quoted from http://www.realtimerendering.com/blog/gpus-prefer-premultiplication/ */
|
||||
/* The short version: if you want your renderer to properly handle textures with alphas when using */
|
||||
/* bilinear interpolation or mipmapping, you need to premultiply your PNG color data by their (unassociated) alphas. */
|
||||
static BitmapCol AverageCol(BitmapCol p1, BitmapCol p2) {
|
||||
static BitmapCol AverageColor(BitmapCol p1, BitmapCol p2) {
|
||||
cc_uint32 a1, a2, aSum;
|
||||
cc_uint32 b1, g1, r1;
|
||||
cc_uint32 b2, g2, r2;
|
||||
@ -298,7 +298,7 @@ static void GenMipmaps(int width, int height, BitmapCol* dst, BitmapCol* src, in
|
||||
if (srcWidth == 1) {
|
||||
for (y = 0; y < height; y++) {
|
||||
/* 1x2 bilinear filter */
|
||||
dst[0] = AverageCol(*src, *(src + srcWidth));
|
||||
dst[0] = AverageColor(*src, *(src + srcWidth));
|
||||
|
||||
dst += width;
|
||||
src += (srcWidth << 1);
|
||||
@ -313,9 +313,9 @@ static void GenMipmaps(int width, int height, BitmapCol* dst, BitmapCol* src, in
|
||||
for (x = 0; x < width; x++) {
|
||||
int srcX = (x << 1);
|
||||
/* 2x2 bilinear filter */
|
||||
BitmapCol ave0 = AverageCol(src0[srcX], src0[srcX + 1]);
|
||||
BitmapCol ave1 = AverageCol(src1[srcX], src1[srcX + 1]);
|
||||
dst[x] = AverageCol(ave0, ave1);
|
||||
BitmapCol ave0 = AverageColor(src0[srcX], src0[srcX + 1]);
|
||||
BitmapCol ave1 = AverageColor(src1[srcX], src1[srcX + 1]);
|
||||
dst[x] = AverageColor(ave0, ave1);
|
||||
}
|
||||
src += (srcWidth << 1);
|
||||
dst += width;
|
||||
|
Loading…
x
Reference in New Issue
Block a user