Port most screens to new layout system

This commit is contained in:
UnknownShadow200 2022-05-07 12:19:32 +10:00
parent c812e72941
commit ab36dc1211
4 changed files with 184 additions and 212 deletions

View File

@ -400,6 +400,7 @@ static Rect2D caretRect, lastCaretRect;
void LBackend_InputInit(struct LInput* w, int width) {
w->width = Display_ScaleX(width);
w->height = Display_ScaleY(30);
w->minWidth = w->width;
}
void LBackend_InputUpdate(struct LInput* w) {

View File

@ -233,6 +233,23 @@ static struct LWidget* chooseMode_widgets[] = {
NULL
};
LAYOUTS mode_seps0[3] = { LLayout_X(ANCHOR_CENTRE, -5), LLayout_Y(ANCHOR_CENTRE, -85) };
LAYOUTS mode_seps1[3] = { LLayout_X(ANCHOR_CENTRE, -5), LLayout_Y(ANCHOR_CENTRE, -15) };
LAYOUTS mode_btnEnhanced[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -250), LLayout_Y(ANCHOR_CENTRE, -120 ) };
LAYOUTS mode_lblEnhanced0[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -85), LLayout_Y(ANCHOR_CENTRE, -120 - 12) };
LAYOUTS mode_lblEnhanced1[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -85), LLayout_Y(ANCHOR_CENTRE, -120 + 12) };
LAYOUTS mode_btnClassicHax[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -250), LLayout_Y(ANCHOR_CENTRE, -50 ) };
LAYOUTS mode_lblClassicHax0[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -85), LLayout_Y(ANCHOR_CENTRE, -50 - 12) };
LAYOUTS mode_lblClassicHax1[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -85), LLayout_Y(ANCHOR_CENTRE, -50 + 12) };
LAYOUTS mode_btnClassic[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -250), LLayout_Y(ANCHOR_CENTRE, 20 ) };
LAYOUTS mode_lblClassic0[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -85), LLayout_Y(ANCHOR_CENTRE, 20 - 12) };
LAYOUTS mode_lblClassic1[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -85), LLayout_Y(ANCHOR_CENTRE, 20 + 12) };
LAYOUTS mode_lblHelp[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 160) };
LAYOUTS mode_btnBack[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 170) };
CC_NOINLINE static void ChooseMode_Click(cc_bool classic, cc_bool classicHacks) {
Options_SetBool(OPT_CLASSIC_MODE, classic);
if (classic) Options_SetBool(OPT_CLASSIC_HACKS, classicHacks);
@ -258,23 +275,23 @@ static void ChooseModeScreen_Init(struct LScreen* s_) {
s->widgets = chooseMode_widgets;
s->numWidgets = Array_Elems(chooseMode_widgets);
LLine_Init( &s->seps[0], 490, NULL);
LLine_Init( &s->seps[1], 490, NULL);
LLine_Init( &s->seps[0], 490, mode_seps0);
LLine_Init( &s->seps[1], 490, mode_seps1);
LButton_Init(&s->btnEnhanced, 145, 35, "Enhanced", NULL);
LLabel_Init( &s->lblEnhanced[0], "&eEnables custom blocks, changing env", NULL);
LLabel_Init( &s->lblEnhanced[1], "&esettings, longer messages, and more", NULL);
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", NULL);
LLabel_Init( &s->lblClassicHax[0], "&eSame as Classic mode, except that", NULL);
LLabel_Init( &s->lblClassicHax[1], "&ehacks (noclip/fly/speed) are enabled", NULL);
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", NULL);
LLabel_Init( &s->lblClassic[0], "&eOnly uses blocks and features from", NULL);
LLabel_Init( &s->lblClassic[1], "&ethe original minecraft classic", NULL);
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], "&ethe original minecraft classic", mode_lblClassic1);
LLabel_Init( &s->lblHelp, "&eClick &fEnhanced &eif you're not sure which mode to choose.", NULL);
LButton_Init(&s->btnBack, 80, 35, "Back", NULL);
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->btnEnhanced.OnClick = UseModeEnhanced;
s->btnClassicHax.OnClick = UseModeClassicHax;
@ -290,33 +307,11 @@ static void ChooseModeScreen_Show(struct LScreen* s_) {
(struct LWidget*)&ChooseModeScreen.btnBack;
}
static void ChooseModeScreen_Layout(struct LScreen* s_) {
struct ChooseModeScreen* s = (struct ChooseModeScreen*)s_;
LWidget_SetLocation(&s->seps[0], ANCHOR_CENTRE, ANCHOR_CENTRE, -5, -85);
LWidget_SetLocation(&s->seps[1], ANCHOR_CENTRE, ANCHOR_CENTRE, -5, -15);
LWidget_SetLocation(&s->btnEnhanced, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -250, -120);
LWidget_SetLocation(&s->lblEnhanced[0], ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -85, -120 - 12);
LWidget_SetLocation(&s->lblEnhanced[1], ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -85, -120 + 12);
LWidget_SetLocation(&s->btnClassicHax, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -250, -50);
LWidget_SetLocation(&s->lblClassicHax[0], ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -85, -50 - 12);
LWidget_SetLocation(&s->lblClassicHax[1], ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -85, -50 + 12);
LWidget_SetLocation(&s->btnClassic, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -250, 20);
LWidget_SetLocation(&s->lblClassic[0], ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -85, 20 - 12);
LWidget_SetLocation(&s->lblClassic[1], ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -85, 20 + 12);
LWidget_SetLocation(&s->lblHelp, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 160);
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170);
}
void ChooseModeScreen_SetActive(cc_bool firstTime) {
struct ChooseModeScreen* s = &ChooseModeScreen;
LScreen_Reset((struct LScreen*)s);
s->Init = ChooseModeScreen_Init;
s->Show = ChooseModeScreen_Show;
s->Layout = ChooseModeScreen_Layout;
s->firstTime = firstTime;
s->title = "Choose mode";
@ -350,6 +345,27 @@ static struct LWidget* colours_widgets[] = {
(struct LWidget*)&ColoursScreen.btnBack, (struct LWidget*)&ColoursScreen.cbClassic
};
#define IptColor_Layout(xx, yy) { LLayout_X(ANCHOR_CENTRE, xx), LLayout_Y(ANCHOR_CENTRE, yy) }
LAYOUTS clr_iptColours[15][3] = {
IptColor_Layout(30, -100), IptColor_Layout(95, -100), IptColor_Layout(160, -100),
IptColor_Layout(30, -60), IptColor_Layout(95, -60), IptColor_Layout(160, -60),
IptColor_Layout(30, -20), IptColor_Layout(95, -20), IptColor_Layout(160, -20),
IptColor_Layout(30, 20), IptColor_Layout(95, 20), IptColor_Layout(160, 20),
IptColor_Layout(30, 60), IptColor_Layout(95, 60), IptColor_Layout(160, 60),
};
LAYOUTS clr_lblNames0[3] = { LLayout_X(ANCHOR_CENTRE_MAX, 10), LLayout_Y(ANCHOR_CENTRE, -100) };
LAYOUTS clr_lblNames1[3] = { LLayout_X(ANCHOR_CENTRE_MAX, 10), LLayout_Y(ANCHOR_CENTRE, -60) };
LAYOUTS clr_lblNames2[3] = { LLayout_X(ANCHOR_CENTRE_MAX, 10), LLayout_Y(ANCHOR_CENTRE, -20) };
LAYOUTS clr_lblNames3[3] = { LLayout_X(ANCHOR_CENTRE_MAX, 10), LLayout_Y(ANCHOR_CENTRE, 20) };
LAYOUTS clr_lblNames4[3] = { LLayout_X(ANCHOR_CENTRE_MAX, 10), LLayout_Y(ANCHOR_CENTRE, 60) };
LAYOUTS clr_lblRGB0[3] = { LLayout_X(ANCHOR_CENTRE, 30), LLayout_Y(ANCHOR_CENTRE, -130) };
LAYOUTS clr_lblRGB1[3] = { LLayout_X(ANCHOR_CENTRE, 95), LLayout_Y(ANCHOR_CENTRE, -130) };
LAYOUTS clr_lblRGB2[3] = { LLayout_X(ANCHOR_CENTRE, 160), LLayout_Y(ANCHOR_CENTRE, -130) };
LAYOUTS clr_cbClassic[3] = { LLayout_X(ANCHOR_CENTRE, -16), LLayout_Y(ANCHOR_CENTRE, 130) };
LAYOUTS clr_btnBack[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 170) };
CC_NOINLINE static void ColoursScreen_Set(struct LInput* w, cc_uint8 value) {
cc_string tmp; char tmpBuffer[STRING_SIZE];
String_InitArray(tmp, tmpBuffer);
@ -448,21 +464,21 @@ static void ColoursScreen_Init(struct LScreen* s_) {
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, NULL);
LInput_Init(&s->iptColours[i], 55, NULL, clr_iptColours[i]);
}
LLabel_Init( &s->lblNames[0], "Background", NULL);
LLabel_Init( &s->lblNames[1], "Button border", NULL);
LLabel_Init( &s->lblNames[2], "Button highlight", NULL);
LLabel_Init( &s->lblNames[3], "Button", NULL);
LLabel_Init( &s->lblNames[4], "Active button", NULL);
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->lblRGB[0], "Red", NULL);
LLabel_Init( &s->lblRGB[1], "Green", NULL);
LLabel_Init( &s->lblRGB[2], "Blue", NULL);
LButton_Init(&s->btnBack, 80, 35, "Back", NULL);
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);
LCheckbox_Init(&s->cbClassic, "Classic style", NULL);
LCheckbox_Init(&s->cbClassic, "Classic style", clr_cbClassic);
s->cbClassic.ValueChanged = ColoursScreen_ToggleBG;
s->btnBack.OnClick = SwitchToThemes;
}
@ -474,36 +490,11 @@ static void ColoursScreen_Show(struct LScreen* s_) {
ColoursScreen_UpdateAll(s);
}
static void ColoursScreen_Layout(struct LScreen* s_) {
struct ColoursScreen* s = (struct ColoursScreen*)s_;
int i, y;
for (i = 0; i < 5; i++) {
y = -100 + 40 * i;
LWidget_SetLocation(&s->iptColours[i*3 + 0], ANCHOR_CENTRE, ANCHOR_CENTRE, 30, y);
LWidget_SetLocation(&s->iptColours[i*3 + 1], ANCHOR_CENTRE, ANCHOR_CENTRE, 95, y);
LWidget_SetLocation(&s->iptColours[i*3 + 2], ANCHOR_CENTRE, ANCHOR_CENTRE, 160, y);
}
LWidget_SetLocation(&s->lblNames[0], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 10, -100);
LWidget_SetLocation(&s->lblNames[1], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 10, -60);
LWidget_SetLocation(&s->lblNames[2], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 10, -20);
LWidget_SetLocation(&s->lblNames[3], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 10, 20);
LWidget_SetLocation(&s->lblNames[4], ANCHOR_CENTRE_MAX, ANCHOR_CENTRE, 10, 60);
LWidget_SetLocation(&s->lblRGB[0], ANCHOR_CENTRE, ANCHOR_CENTRE, 30, -130);
LWidget_SetLocation(&s->lblRGB[1], ANCHOR_CENTRE, ANCHOR_CENTRE, 95, -130);
LWidget_SetLocation(&s->lblRGB[2], ANCHOR_CENTRE, ANCHOR_CENTRE, 160, -130);
LWidget_SetLocation(&s->cbClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, -16, 130);
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170);
}
void ColoursScreen_SetActive(void) {
struct ColoursScreen* s = &ColoursScreen;
LScreen_Reset((struct LScreen*)s);
s->Init = ColoursScreen_Init;
s->Show = ColoursScreen_Show;
s->Layout = ColoursScreen_Layout;
s->KeyDown = ColoursScreen_KeyDown;
s->MouseWheel = ColoursScreen_MouseWheel;
@ -528,6 +519,15 @@ static struct LWidget* directConnect_widgets[] = {
(struct LWidget*)&DirectConnectScreen.btnBack, (struct LWidget*)&DirectConnectScreen.lblStatus
};
LAYOUTS dc_iptUsername[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -165), LLayout_Y(ANCHOR_CENTRE, -120) };
LAYOUTS dc_iptAddress[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -165), LLayout_Y(ANCHOR_CENTRE, -75) };
LAYOUTS dc_iptMppass[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -165), LLayout_Y(ANCHOR_CENTRE, -30) };
LAYOUTS dc_btnConnect[3] = { LLayout_X(ANCHOR_CENTRE, -110), LLayout_Y(ANCHOR_CENTRE, 20) };
LAYOUTS dc_btnBack[3] = { LLayout_X(ANCHOR_CENTRE, 125), LLayout_Y(ANCHOR_CENTRE, 20) };
LAYOUTS dc_lblStatus[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 70) };
static void DirectConnectScreen_UrlFilter(cc_string* str) {
static const cc_string prefix = String_FromConst("mc://");
cc_string parts[6];
@ -614,13 +614,13 @@ static void DirectConnectScreen_Init(struct LScreen* s_) {
s->widgets = directConnect_widgets;
s->numWidgets = Array_Elems(directConnect_widgets);
LInput_Init(&s->iptUsername, 330, "Username..", NULL);
LInput_Init(&s->iptAddress, 330, "IP address:Port number..", NULL);
LInput_Init(&s->iptMppass, 330, "Mppass..", NULL);
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);
LButton_Init(&s->btnConnect, 110, 35, "Connect", NULL);
LButton_Init(&s->btnBack, 80, 35, "Back", NULL);
LLabel_Init( &s->lblStatus, "", NULL);
LButton_Init(&s->btnConnect, 110, 35, "Connect", dc_btnConnect);
LButton_Init(&s->btnBack, 80, 35, "Back", dc_btnBack);
LLabel_Init( &s->lblStatus, "", dc_lblStatus);
s->iptUsername.ClipboardFilter = DirectConnectScreen_UrlFilter;
s->iptAddress.ClipboardFilter = DirectConnectScreen_UrlFilter;
@ -632,22 +632,10 @@ static void DirectConnectScreen_Init(struct LScreen* s_) {
DirectConnectScreen_Load(s);
}
static void DirectConnectScreen_Layout(struct LScreen* s_) {
struct DirectConnectScreen* s = (struct DirectConnectScreen*)s_;
LWidget_SetLocation(&s->iptUsername, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -165, -120);
LWidget_SetLocation(&s->iptAddress, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -165, -75);
LWidget_SetLocation(&s->iptMppass, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -165, -30);
LWidget_SetLocation(&s->btnConnect, ANCHOR_CENTRE, ANCHOR_CENTRE, -110, 20);
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 125, 20);
LWidget_SetLocation(&s->lblStatus, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 70);
}
void DirectConnectScreen_SetActive(void) {
struct DirectConnectScreen* s = &DirectConnectScreen;
LScreen_Reset((struct LScreen*)s);
s->Init = DirectConnectScreen_Init;
s->Layout = DirectConnectScreen_Layout;
s->title = "Direct connect";
s->onEnterWidget = (struct LWidget*)&s->btnConnect;
@ -670,6 +658,12 @@ static struct LWidget* mfa_widgets[] = {
(struct LWidget*)&MFAScreen.btnSignIn, (struct LWidget*)&MFAScreen.btnCancel
};
LAYOUTS mfa_lblTitle[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -115) };
LAYOUTS mfa_iptCode[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -75) };
LAYOUTS mfa_btnSignIn[3] = { LLayout_X(ANCHOR_CENTRE, -90), LLayout_Y(ANCHOR_CENTRE, -25) };
LAYOUTS mfa_btnCancel[3] = { LLayout_X(ANCHOR_CENTRE, 90), LLayout_Y(ANCHOR_CENTRE, -25) };
static void MainScreen_DoLogin(void);
static void MFAScreen_SignIn(void* w) {
MainScreen_SetActive();
@ -685,10 +679,10 @@ static void MFAScreen_Init(struct LScreen* s_) {
s->widgets = mfa_widgets;
s->numWidgets = Array_Elems(mfa_widgets);
LLabel_Init( &s->lblTitle, "", NULL);
LInput_Init( &s->iptCode, 280, "Login code..", NULL);
LButton_Init(&s->btnSignIn, 100, 35, "Sign in", NULL);
LButton_Init(&s->btnCancel, 100, 35, "Cancel", NULL);
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);
s->btnSignIn.OnClick = MFAScreen_SignIn;
s->btnCancel.OnClick = MFAScreen_Cancel;
@ -702,20 +696,11 @@ static void MFAScreen_Show(struct LScreen* s_) {
"&cLogin code required (Check emails)");
}
static void MFAScreen_Layout(struct LScreen* s_) {
struct MFAScreen* s = (struct MFAScreen*)s_;
LWidget_SetLocation(&s->lblTitle, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -115);
LWidget_SetLocation(&s->iptCode, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -75);
LWidget_SetLocation(&s->btnSignIn, ANCHOR_CENTRE, ANCHOR_CENTRE, -90, -25);
LWidget_SetLocation(&s->btnCancel, ANCHOR_CENTRE, ANCHOR_CENTRE, 90, -25);
}
void MFAScreen_SetActive(void) {
struct MFAScreen* s = &MFAScreen;
LScreen_Reset((struct LScreen*)s);
s->Init = MFAScreen_Init;
s->Show = MFAScreen_Show;
s->Layout = MFAScreen_Layout;
s->title = "Enter login code";
s->onEnterWidget = (struct LWidget*)&s->btnSignIn;
@ -742,19 +727,20 @@ static struct LWidget* main_widgets[] = {
(struct LWidget*)&MainScreen.btnRegister, (struct LWidget*)&MainScreen.btnOptions
};
LAYOUTS main_iptUsername[] = { LLayout_X(ANCHOR_CENTRE_MIN, -140), LLayout_Y(ANCHOR_CENTRE, -120), LLayout_End };
LAYOUTS main_iptPassword[] = { LLayout_X(ANCHOR_CENTRE_MIN, -140), LLayout_Y(ANCHOR_CENTRE, -75), LLayout_End };
LAYOUTS main_iptUsername[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -140), LLayout_Y(ANCHOR_CENTRE, -120) };
LAYOUTS main_iptPassword[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -140), LLayout_Y(ANCHOR_CENTRE, -75) };
LAYOUTS main_btnLogin[] = { LLayout_X(ANCHOR_CENTRE, -90), LLayout_Y(ANCHOR_CENTRE, -25), LLayout_End };
LAYOUTS main_lblStatus[] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 20), LLayout_End };
LAYOUTS main_btnLogin[3] = { LLayout_X(ANCHOR_CENTRE, -90), LLayout_Y(ANCHOR_CENTRE, -25) };
LAYOUTS main_lblStatus[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 20) };
LAYOUTS main_btnResume[] = { LLayout_X(ANCHOR_CENTRE, 90), LLayout_Y(ANCHOR_CENTRE, -25), LLayout_End };
LAYOUTS main_btnDirect[] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 60), LLayout_End };
LAYOUTS main_btnSPlayer[] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 110), LLayout_End };
LAYOUTS main_btnResume[3] = { LLayout_X(ANCHOR_CENTRE, 90), LLayout_Y(ANCHOR_CENTRE, -25) };
LAYOUTS main_btnDirect[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 60) };
LAYOUTS main_btnSPlayer[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 110) };
LAYOUTS main_lblUpdate[3] = { LLayout_X(ANCHOR_MAX, 10), LLayout_Y(ANCHOR_MAX, 45) };
LAYOUTS main_btnOptions[3] = { LLayout_X(ANCHOR_MAX, 6), LLayout_Y(ANCHOR_MAX, 6) };
LAYOUTS main_btnRegister[3] = { LLayout_X(ANCHOR_MIN, 6), LLayout_Y(ANCHOR_MAX, 6) };
LAYOUTS main_lblUpdate[] = { LLayout_X(ANCHOR_MAX, 10), LLayout_Y(ANCHOR_MAX, 45), LLayout_End };
LAYOUTS main_btnOptions[] = { LLayout_X(ANCHOR_MAX, 6), LLayout_Y(ANCHOR_MAX, 6), LLayout_End };
LAYOUTS main_btnRegister[] = { LLayout_X(ANCHOR_MIN, 6), LLayout_Y(ANCHOR_MAX, 6), LLayout_End };
struct ResumeInfo {
cc_string user, ip, port, server, mppass;
@ -1048,6 +1034,14 @@ static struct LWidget* checkResources_widgets[] = {
(struct LWidget*)&CheckResourcesScreen.btnNo
};
LAYOUTS cres_lblLine1[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -50) };
LAYOUTS cres_lblLine2[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -30) };
LAYOUTS cres_lblStatus[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 10) };
LAYOUTS cres_btnYes[3] = { LLayout_X(ANCHOR_CENTRE, -70), LLayout_Y(ANCHOR_CENTRE, 45) };
LAYOUTS cres_btnNo[3] = { LLayout_X(ANCHOR_CENTRE, 70), LLayout_Y(ANCHOR_CENTRE, 45) };
static void CheckResourcesScreen_Yes(void* w) { FetchResourcesScreen_SetActive(); }
static void CheckResourcesScreen_Next(void* w) {
Http_ClearPending();
@ -1064,12 +1058,12 @@ static void CheckResourcesScreen_Init(struct LScreen* s_) {
s->numWidgets = Array_Elems(checkResources_widgets);
s->lblStatus.small = true;
LLabel_Init( &s->lblLine1, "Some required resources weren't found", NULL);
LLabel_Init( &s->lblLine2, "Okay to download?", NULL);
LLabel_Init( &s->lblStatus, "", NULL);
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);
LButton_Init(&s->btnYes, 70, 35, "Yes", NULL);
LButton_Init(&s->btnNo, 70, 35, "No", NULL);
LButton_Init(&s->btnYes, 70, 35, "Yes", cres_btnYes);
LButton_Init(&s->btnNo, 70, 35, "No", cres_btnNo);
s->btnYes.OnClick = CheckResourcesScreen_Yes;
s->btnNo.OnClick = CheckResourcesScreen_Next;
}
@ -1084,17 +1078,6 @@ static void CheckResourcesScreen_Show(struct LScreen* s_) {
LLabel_SetText(&s->lblStatus, &str);
}
static void CheckResourcesScreen_Layout(struct LScreen* s_) {
struct CheckResourcesScreen* s = (struct CheckResourcesScreen*)s_;
LWidget_SetLocation(&s->lblLine1, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -50);
LWidget_SetLocation(&s->lblLine2, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -30);
LWidget_SetLocation(&s->lblStatus, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 10);
LWidget_SetLocation(&s->btnYes, ANCHOR_CENTRE, ANCHOR_CENTRE, -70, 45);
LWidget_SetLocation(&s->btnNo, ANCHOR_CENTRE, ANCHOR_CENTRE, 70, 45);
}
#define RESOURCES_BACK_COLOR BitmapCol_Make( 12, 12, 12, 255)
#define RESOURCES_FORE_COLOR BitmapCol_Make(120, 85, 151, 255)
@ -1118,7 +1101,6 @@ void CheckResourcesScreen_SetActive(void) {
LScreen_Reset((struct LScreen*)s);
s->Init = CheckResourcesScreen_Init;
s->Show = CheckResourcesScreen_Show;
s->Layout = CheckResourcesScreen_Layout;
s->DrawBackground = CheckResourcesScreen_DrawBackground;
s->ResetArea = CheckResourcesScreen_ResetArea;
s->onEnterWidget = (struct LWidget*)&s->btnYes;
@ -1141,27 +1123,25 @@ static struct LWidget* fetchResources_widgets[] = {
(struct LWidget*)&FetchResourcesScreen.sdrProgress
};
LAYOUTS fres_lblStatus[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -10) };
LAYOUTS fres_btnCancel[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 45) };
LAYOUTS fres_sdrProgress[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(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->lblStatus.small = true;
LLabel_Init( &s->lblStatus, "", NULL);
LButton_Init(&s->btnCancel, 120, 35, "Cancel", NULL);
LSlider_Init(&s->sdrProgress, 200, 12, BitmapCol_Make(0, 220, 0, 255), NULL);
LLabel_Init( &s->lblStatus, "", fres_lblStatus);
LButton_Init(&s->btnCancel, 120, 35, "Cancel", fres_btnCancel);
LSlider_Init(&s->sdrProgress, 200, 12, BitmapCol_Make(0, 220, 0, 255), fres_sdrProgress);
s->btnCancel.OnClick = CheckResourcesScreen_Next;
}
static void FetchResourcesScreen_Show(struct LScreen* s_) { Fetcher_Run(); }
static void FetchResourcesScreen_Layout(struct LScreen* s_) {
struct FetchResourcesScreen* s = (struct FetchResourcesScreen*)s_;
LWidget_SetLocation(&s->lblStatus, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -10);
LWidget_SetLocation(&s->btnCancel, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 45);
LWidget_SetLocation(&s->sdrProgress, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 15);
}
static void FetchResourcesScreen_UpdateStatus(struct FetchResourcesScreen* s, int reqID) {
cc_string str; char strBuffer[STRING_SIZE];
const char* name;
@ -1217,7 +1197,6 @@ void FetchResourcesScreen_SetActive(void) {
s->Init = FetchResourcesScreen_Init;
s->Show = FetchResourcesScreen_Show;
s->Tick = FetchResourcesScreen_Tick;
s->Layout = FetchResourcesScreen_Layout;
s->DrawBackground = CheckResourcesScreen_DrawBackground;
s->ResetArea = CheckResourcesScreen_ResetArea;
Launcher_SetScreen((struct LScreen*)s);
@ -1242,6 +1221,15 @@ static struct LWidget* servers_widgets[] = {
(struct LWidget*)&ServersScreen.btnRefresh, (struct LWidget*)&ServersScreen.table
};
LAYOUTS srv_iptSearch[3] = { LLayout_X(ANCHOR_MIN, 10), LLayout_Y(ANCHOR_MIN, 10) };
LAYOUTS srv_iptHash[3] = { LLayout_X(ANCHOR_MIN, 10), LLayout_Y(ANCHOR_MAX, 10) };
LAYOUTS srv_table[3] = { LLayout_X(ANCHOR_MIN, 10), LLayout_Y(ANCHOR_MIN, 50) };
LAYOUTS srv_btnBack[3] = { LLayout_X(ANCHOR_MAX, 10), LLayout_Y(ANCHOR_MIN, 10) };
LAYOUTS srv_btnConnect[3] = { LLayout_X(ANCHOR_MAX, 10), LLayout_Y(ANCHOR_MAX, 10) };
LAYOUTS srv_btnRefresh[3] = { LLayout_X(ANCHOR_MAX, 135), LLayout_Y(ANCHOR_MIN, 10) };
static void ServersScreen_Connect(void* w) {
struct LTable* table = &ServersScreen.table;
cc_string* hash = &ServersScreen.iptHash.text;
@ -1307,12 +1295,12 @@ static void ServersScreen_Init(struct LScreen* s_) {
s->widgets = servers_widgets;
s->numWidgets = Array_Elems(servers_widgets);
LInput_Init( &s->iptSearch, 370, "Search servers..", NULL);
LInput_Init( &s->iptHash, 475, "classicube.net/server/play/...", NULL);
LInput_Init( &s->iptSearch, 370, "Search servers..", srv_iptSearch);
LInput_Init( &s->iptHash, 475, "classicube.net/server/play/...", srv_iptHash);
LButton_Init(&s->btnBack, 110, 30, "Back", NULL);
LButton_Init(&s->btnConnect, 130, 30, "Connect", NULL);
LButton_Init(&s->btnRefresh, 110, 30, "Refresh", NULL);
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);
s->btnBack.OnClick = SwitchToMain;
s->btnConnect.OnClick = ServersScreen_Connect;
@ -1322,7 +1310,7 @@ static void ServersScreen_Init(struct LScreen* s_) {
s->iptHash.TextChanged = ServersScreen_HashChanged;
s->iptHash.ClipboardFilter = ServersScreen_HashFilter;
LTable_Init(&s->table);
LTable_Init(&s->table, srv_table);
s->table.filter = &s->iptSearch.text;
s->table.selectedHash = &s->iptHash.text;
s->table.OnSelectedChanged = ServersScreen_OnSelectedChanged;
@ -1365,14 +1353,7 @@ static void ServersScreen_Tick(struct LScreen* s_) {
static void ServersScreen_Layout(struct LScreen* s_) {
struct ServersScreen* s = (struct ServersScreen*)s_;
LWidget_SetLocation(&s->iptSearch, ANCHOR_MIN, ANCHOR_MIN, 10, 10);
LWidget_SetLocation(&s->iptHash, ANCHOR_MIN, ANCHOR_MAX, 10, 10);
LWidget_SetLocation(&s->btnBack, ANCHOR_MAX, ANCHOR_MIN, 10, 10);
LWidget_SetLocation(&s->btnConnect, ANCHOR_MAX, ANCHOR_MAX, 10, 10);
LWidget_SetLocation(&s->btnRefresh, ANCHOR_MAX, ANCHOR_MIN, 135, 10);
LWidget_SetLocation(&s->table, ANCHOR_MIN, ANCHOR_MIN, 10, 50);
LScreen_DoLayout(s_);
s->table.width = WindowInfo.Width - s->table.x;
s->table.height = WindowInfo.Height - s->table.y * 2;
s->table.height = max(1, s->table.height);
@ -1444,6 +1425,19 @@ static struct LWidget* settings_classic[] = {
(struct LWidget*)&SettingsScreen.btnBack
};
LAYOUTS set_btnUpdates[3] = { LLayout_X(ANCHOR_CENTRE, -135), LLayout_Y(ANCHOR_CENTRE, -120) };
LAYOUTS set_lblUpdates[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -70), LLayout_Y(ANCHOR_CENTRE, -120) };
LAYOUTS set_btnMode[3] = { LLayout_X(ANCHOR_CENTRE, -135), LLayout_Y(ANCHOR_CENTRE, -70) };
LAYOUTS set_lblMode[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -70), LLayout_Y(ANCHOR_CENTRE, -70) };
LAYOUTS set_btnColours[3] = { LLayout_X(ANCHOR_CENTRE, -135), LLayout_Y(ANCHOR_CENTRE, -20) };
LAYOUTS set_lblColours[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -70), LLayout_Y(ANCHOR_CENTRE, -20) };
LAYOUTS set_sep[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 15) };
LAYOUTS set_cbExtra[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -190), LLayout_Y(ANCHOR_CENTRE, 44) };
LAYOUTS set_cbEmpty[3] = { LLayout_X(ANCHOR_CENTRE_MIN, -190), LLayout_Y(ANCHOR_CENTRE, 84) };
LAYOUTS set_btnBack[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 170) };
#if defined CC_BUILD_MOBILE
static void SettingsScreen_LockOrientation(struct LCheckbox* w) {
Options_SetBool(OPT_LANDSCAPE_MODE, w->value);
@ -1462,28 +1456,28 @@ static void SettingsScreen_ShowEmpty(struct LCheckbox* w) {
static void SettingsScreen_Init(struct LScreen* s_) {
struct SettingsScreen* s = (struct SettingsScreen*)s_;
LLine_Init( &s->sep, 380, NULL);
LLine_Init( &s->sep, 380, set_sep);
LButton_Init(&s->btnUpdates, 110, 35, "Updates", NULL);
LLabel_Init( &s->lblUpdates, "&eGet the latest stuff", NULL);
LButton_Init(&s->btnUpdates, 110, 35, "Updates", set_btnUpdates);
LLabel_Init( &s->lblUpdates, "&eGet the latest stuff", set_lblUpdates);
LButton_Init(&s->btnMode, 110, 35, "Mode", NULL);
LLabel_Init( &s->lblMode, "&eChange the enabled features", NULL);
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", NULL);
LLabel_Init( &s->lblColours, "&eChange how the launcher looks", NULL);
LButton_Init(&s->btnColours, 110, 35, "Theme", set_btnColours);
LLabel_Init( &s->lblColours, "&eChange how the launcher looks", set_lblColours);
#if defined CC_BUILD_MOBILE
LCheckbox_Init(&s->cbExtra, "Force landscape", NULL);
LCheckbox_Init(&s->cbExtra, "Force landscape", set_cbExtra);
s->cbExtra.ValueChanged = SettingsScreen_LockOrientation;
#else
LCheckbox_Init(&s->cbExtra, "Close this after game starts", NULL);
LCheckbox_Init(&s->cbExtra, "Close this after game starts", set_cbExtra);
s->cbExtra.ValueChanged = SettingsScreen_AutoClose;
#endif
LCheckbox_Init(&s->cbEmpty, "Show empty servers in list", NULL);
LCheckbox_Init(&s->cbEmpty, "Show empty servers in list", set_cbEmpty);
s->cbEmpty.ValueChanged = SettingsScreen_ShowEmpty;
LButton_Init( &s->btnBack, 80, 35, "Back", NULL);
LButton_Init( &s->btnBack, 80, 35, "Back", set_btnBack);
s->btnMode.OnClick = SwitchToChooseMode;
s->btnUpdates.OnClick = SwitchToUpdates;
@ -1510,30 +1504,11 @@ static void SettingsScreen_Show(struct LScreen* s_) {
s->cbEmpty.value = Launcher_ShowEmptyServers;
}
static void SettingsScreen_Layout(struct LScreen* s_) {
struct SettingsScreen* s = (struct SettingsScreen*)s_;
LWidget_SetLocation(&s->btnUpdates, ANCHOR_CENTRE, ANCHOR_CENTRE, -135, -120);
LWidget_SetLocation(&s->lblUpdates, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -70, -120);
LWidget_SetLocation(&s->btnMode, ANCHOR_CENTRE, ANCHOR_CENTRE, -135, -70);
LWidget_SetLocation(&s->lblMode, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -70, -70);
LWidget_SetLocation(&s->btnColours, ANCHOR_CENTRE, ANCHOR_CENTRE, -135, -20);
LWidget_SetLocation(&s->lblColours, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -70, -20);
LWidget_SetLocation(&s->sep, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 15);
LWidget_SetLocation(&s->cbExtra, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -190, 44);
LWidget_SetLocation(&s->cbEmpty, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -190, 84);
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170);
}
void SettingsScreen_SetActive(void) {
struct SettingsScreen* s = &SettingsScreen;
LScreen_Reset((struct LScreen*)s);
s->Init = SettingsScreen_Init;
s->Show = SettingsScreen_Show;
s->Layout = SettingsScreen_Layout;
s->title = "Options";
Launcher_SetScreen((struct LScreen*)s);
@ -1555,6 +1530,13 @@ static struct LWidget* themes_widgets[] = {
(struct LWidget*)&ThemesScreen.btnBack
};
LAYOUTS the_btnModern[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -120) };
LAYOUTS the_btnClassic[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -70) };
LAYOUTS the_btnNordic[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, -20) };
LAYOUTS the_btnCustom[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 120) };
LAYOUTS the_btnBack[3] = { LLayout_X(ANCHOR_CENTRE, 0), LLayout_Y(ANCHOR_CENTRE, 170) };
static void ThemesScreen_Set(const struct LauncherTheme* theme) {
Launcher_Theme = *theme;
Launcher_SaveTheme();
@ -1576,11 +1558,11 @@ static void ThemesScreen_Init(struct LScreen* s_) {
s->widgets = themes_widgets;
s->numWidgets = Array_Elems(themes_widgets);
LButton_Init(&s->btnModern, 200, 35, "Modern", NULL);
LButton_Init(&s->btnClassic, 200, 35, "Classic", NULL);
LButton_Init(&s->btnNordic, 200, 35, "Nordic", NULL);
LButton_Init(&s->btnCustom, 200, 35, "Custom", NULL);
LButton_Init(&s->btnBack, 80, 35, "Back", NULL);
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);
s->btnModern.OnClick = ThemesScreen_Modern;
s->btnClassic.OnClick = ThemesScreen_Classic;
@ -1589,20 +1571,10 @@ static void ThemesScreen_Init(struct LScreen* s_) {
s->btnBack.OnClick = SwitchToSettings;
}
static void ThemesScreen_Layout(struct LScreen* s_) {
struct ThemesScreen* s = (struct ThemesScreen*)s_;
LWidget_SetLocation(&s->btnModern, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -120);
LWidget_SetLocation(&s->btnClassic, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -70);
LWidget_SetLocation(&s->btnNordic, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -20);
LWidget_SetLocation(&s->btnCustom, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 120);
LWidget_SetLocation(&s->btnBack, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 170);
}
void ThemesScreen_SetActive(void) {
struct ThemesScreen* s = &ThemesScreen;
LScreen_Reset((struct LScreen*)s);
s->Init = ThemesScreen_Init;
s->Layout = ThemesScreen_Layout;
s->title = "Select theme";
Launcher_SetScreen((struct LScreen*)s);

View File

@ -361,7 +361,6 @@ void LInput_Init(struct LInput* w, int width, const char* hintText, const struct
w->hintText = hintText;
w->caretPos = -1;
LBackend_InputInit(w, width);
w->minWidth = w->width;
}
void LInput_SetText(struct LInput* w, const cc_string* text) {
@ -661,7 +660,7 @@ static const struct LWidgetVTABLE ltable_VTABLE = {
LTable_MouseDown, LTable_MouseUp, /* Select */
LTable_MouseWheel, /* Wheel */
};
void LTable_Init(struct LTable* w) {
void LTable_Init(struct LTable* w, const struct LLayout* layouts) {
int i;
w->VTABLE = &ltable_VTABLE;
w->type = LWIDGET_TABLE;
@ -669,6 +668,7 @@ void LTable_Init(struct LTable* w) {
w->numColumns = Array_Elems(tableColumns);
w->sortingCol = -1;
w->opaque = true;
w->layouts = layouts;
for (i = 0; i < w->numColumns; i++) {
w->columns[i].width = Display_ScaleX(w->columns[i].width);

View File

@ -13,7 +13,6 @@ enum LWIDGET_TYPE {
#define LLAYOUT_TYPE_X 0x0100
#define LLAYOUT_TYPE_Y 0x0200
#define LLayout_End { 0, 0 }
#define LLayout_X(anchor, offset) { LLAYOUT_TYPE_X | anchor, offset }
#define LLayout_Y(anchor, offset) { LLAYOUT_TYPE_Y | anchor, offset }
struct LLayout { short type, offset; };
@ -212,7 +211,7 @@ 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);
void LTable_Init(struct LTable* table, const struct LLayout* layouts);
/* Resets state of a table (reset sorter, filter, etc) */
void LTable_Reset(struct LTable* table);
/* Adjusts Y position of rows and number of visible rows. */