Port MainScreen to use new layout system

This commit is contained in:
UnknownShadow200 2022-05-07 09:32:02 +10:00
parent 7324458b75
commit c812e72941
3 changed files with 85 additions and 81 deletions

View File

@ -17,6 +17,7 @@
#include "Options.h" #include "Options.h"
#include "Utils.h" #include "Utils.h"
#include "LBackend.h" #include "LBackend.h"
#define LAYOUTS static const struct LLayout
/*########################################################################################################################* /*########################################################################################################################*
*---------------------------------------------------------Screen base-----------------------------------------------------* *---------------------------------------------------------Screen base-----------------------------------------------------*
@ -41,6 +42,14 @@ CC_NOINLINE static struct LWidget* LScreen_WidgetAt(struct LScreen* s, int idx)
return NULL; return NULL;
} }
static void LScreen_DoLayout(struct LScreen* s) {
int i;
for (i = 0; i < s->numWidgets; i++)
{
LWidget_CalcPosition(s->widgets[i]);
}
}
static void LScreen_Tick(struct LScreen* s) { static void LScreen_Tick(struct LScreen* s) {
struct LWidget* w = s->selectedWidget; struct LWidget* w = s->selectedWidget;
if (w && w->VTABLE->Tick) w->VTABLE->Tick(w); if (w && w->VTABLE->Tick) w->VTABLE->Tick(w);
@ -173,6 +182,7 @@ CC_NOINLINE static void LScreen_Reset(struct LScreen* s) {
s->Init = NULL; /* screens should always override this */ s->Init = NULL; /* screens should always override this */
s->Show = LScreen_NullFunc; s->Show = LScreen_NullFunc;
s->Free = LScreen_NullFunc; s->Free = LScreen_NullFunc;
s->Layout = LScreen_DoLayout;
s->Tick = LScreen_Tick; s->Tick = LScreen_Tick;
s->KeyDown = LScreen_KeyDown; s->KeyDown = LScreen_KeyDown;
s->KeyPress = LScreen_KeyPress; s->KeyPress = LScreen_KeyPress;
@ -732,7 +742,19 @@ static struct LWidget* main_widgets[] = {
(struct LWidget*)&MainScreen.btnRegister, (struct LWidget*)&MainScreen.btnOptions (struct LWidget*)&MainScreen.btnRegister, (struct LWidget*)&MainScreen.btnOptions
}; };
static const struct LConstraint main_login[] = { LConstraint_X(ANCHOR_CENTRE, -90), LConstraint_Y(ANCHOR_CENTRE, -25), LConstraint_None }; 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_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_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_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 { struct ResumeInfo {
cc_string user, ip, port, server, mppass; cc_string user, ip, port, server, mppass;
@ -851,18 +873,18 @@ static void MainScreen_Init(struct LScreen* s_) {
s->iptPassword.inputType = KEYBOARD_TYPE_PASSWORD; s->iptPassword.inputType = KEYBOARD_TYPE_PASSWORD;
s->lblUpdate.small = true; s->lblUpdate.small = true;
LInput_Init( &s->iptUsername, 280, "Username..", NULL); LInput_Init( &s->iptUsername, 280, "Username..", main_iptUsername);
LInput_Init( &s->iptPassword, 280, "Password..", NULL); LInput_Init( &s->iptPassword, 280, "Password..", main_iptPassword);
LButton_Init(&s->btnLogin, 100, 35, "Sign in", main_login); LButton_Init(&s->btnLogin, 100, 35, "Sign in", main_btnLogin);
LButton_Init(&s->btnResume, 100, 35, "Resume", NULL); LButton_Init(&s->btnResume, 100, 35, "Resume", main_btnResume);
LLabel_Init( &s->lblStatus, "", NULL); LLabel_Init( &s->lblStatus, "", main_lblStatus);
LButton_Init(&s->btnDirect, 200, 35, "Direct connect", NULL); LButton_Init(&s->btnDirect, 200, 35, "Direct connect", main_btnDirect);
LButton_Init(&s->btnSPlayer, 200, 35, "Singleplayer", NULL); LButton_Init(&s->btnSPlayer, 200, 35, "Singleplayer", main_btnSPlayer);
LLabel_Init( &s->lblUpdate, "&eChecking..", NULL); LLabel_Init( &s->lblUpdate, "&eChecking..", main_lblUpdate);
LButton_Init(&s->btnRegister, 100, 35, "Register", NULL); LButton_Init(&s->btnRegister, 100, 35, "Register", main_btnRegister);
LButton_Init(&s->btnOptions, 100, 35, "Options", NULL); LButton_Init(&s->btnOptions, 100, 35, "Options", main_btnOptions);
s->btnLogin.OnClick = MainScreen_Login; s->btnLogin.OnClick = MainScreen_Login;
s->btnResume.OnClick = MainScreen_Resume; s->btnResume.OnClick = MainScreen_Resume;
@ -893,23 +915,6 @@ static void MainScreen_Free(struct LScreen* s_) {
LLabel_SetConst(&s->lblStatus, ""); LLabel_SetConst(&s->lblStatus, "");
} }
static void MainScreen_Layout(struct LScreen* s_) {
struct MainScreen* s = (struct MainScreen*)s_;
LWidget_SetLocation(&s->iptUsername, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -140, -120);
LWidget_SetLocation(&s->iptPassword, ANCHOR_CENTRE_MIN, ANCHOR_CENTRE, -140, -75);
LWidget_SetLocation(&s->btnLogin, ANCHOR_CENTRE, ANCHOR_CENTRE, -90, -25);
LWidget_SetLocation(&s->lblStatus, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 20);
LWidget_SetLocation(&s->btnResume, ANCHOR_CENTRE, ANCHOR_CENTRE, 90, -25);
LWidget_SetLocation(&s->btnDirect, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 60);
LWidget_SetLocation(&s->btnSPlayer, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 110);
LWidget_SetLocation(&s->lblUpdate, ANCHOR_MAX, ANCHOR_MAX, 10, 45);
LWidget_SetLocation(&s->btnOptions, ANCHOR_MAX, ANCHOR_MAX, 6, 6);
LWidget_SetLocation(&s->btnRegister, ANCHOR_MIN, ANCHOR_MAX, 6, 6);
}
CC_NOINLINE static cc_uint32 MainScreen_GetVersion(const cc_string* version) { CC_NOINLINE static cc_uint32 MainScreen_GetVersion(const cc_string* version) {
cc_uint8 raw[4] = { 0, 0, 0, 0 }; cc_uint8 raw[4] = { 0, 0, 0, 0 };
cc_string parts[4]; cc_string parts[4];
@ -1020,8 +1025,7 @@ void MainScreen_SetActive(void) {
LScreen_Reset((struct LScreen*)s); LScreen_Reset((struct LScreen*)s);
s->Init = MainScreen_Init; s->Init = MainScreen_Init;
s->Free = MainScreen_Free; s->Free = MainScreen_Free;
s->Tick = MainScreen_Tick; s->Tick = MainScreen_Tick;\
s->Layout = MainScreen_Layout;
s->title = "ClassiCube"; s->title = "ClassiCube";
s->onEnterWidget = (struct LWidget*)&s->btnLogin; s->onEnterWidget = (struct LWidget*)&s->btnLogin;

View File

@ -35,23 +35,23 @@ void LWidget_SetLocation(void* widget, cc_uint8 horAnchor, cc_uint8 verAnchor, i
void LWidget_CalcPosition(void* widget) { void LWidget_CalcPosition(void* widget) {
struct LWidget* w = (struct LWidget*)widget; struct LWidget* w = (struct LWidget*)widget;
const struct LConstraint* c = w->constraints; const struct LLayout* l = w->layouts;
int type, anchor; int type, anchor;
if (c) { if (l) {
while ((type = c->type & 0xFF00)) while ((type = l->type & 0xFF00))
{ {
anchor = c->type & 0xFF; anchor = l->type & 0xFF;
switch (type) switch (type)
{ {
case LCONSTRAINT_TYPE_X: case LLAYOUT_TYPE_X:
w->x = Gui_CalcPos(anchor, Display_ScaleX(c->offset), w->width, WindowInfo.Width); w->x = Gui_CalcPos(anchor, Display_ScaleX(l->offset), w->width, WindowInfo.Width);
break; break;
case LCONSTRAINT_TYPE_Y: case LLAYOUT_TYPE_Y:
w->y = Gui_CalcPos(anchor, Display_ScaleY(c->offset), w->height, WindowInfo.Height); w->y = Gui_CalcPos(anchor, Display_ScaleY(l->offset), w->height, WindowInfo.Height);
break; break;
} }
c++; l++;
} }
} else { } else {
w->x = Gui_CalcPos(w->horAnchor, Display_ScaleX(w->xOffset), w->width, WindowInfo.Width); w->x = Gui_CalcPos(w->horAnchor, Display_ScaleX(w->xOffset), w->width, WindowInfo.Width);
@ -156,10 +156,10 @@ static const struct LWidgetVTABLE lbutton_VTABLE = {
LButton_Hover, LButton_Unhover, /* Hover */ LButton_Hover, LButton_Unhover, /* Hover */
NULL, NULL /* Select */ NULL, NULL /* Select */
}; };
void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LConstraint* constraints) { void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LLayout* layouts) {
w->VTABLE = &lbutton_VTABLE; w->VTABLE = &lbutton_VTABLE;
w->type = LWIDGET_BUTTON; w->type = LWIDGET_BUTTON;
w->constraints = constraints; w->layouts = layouts;
w->tabSelectable = true; w->tabSelectable = true;
LBackend_ButtonInit(w, width, height); LBackend_ButtonInit(w, width, height);
LButton_SetConst(w, text); LButton_SetConst(w, text);
@ -185,10 +185,10 @@ static const struct LWidgetVTABLE lcheckbox_VTABLE = {
NULL, NULL, /* Hover */ NULL, NULL, /* Hover */
NULL, NULL /* Select */ NULL, NULL /* Select */
}; };
void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LConstraint* constraints) { void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* layouts) {
w->VTABLE = &lcheckbox_VTABLE; w->VTABLE = &lcheckbox_VTABLE;
w->type = LWIDGET_CHECKBOX; w->type = LWIDGET_CHECKBOX;
w->constraints = constraints; w->layouts = layouts;
w->tabSelectable = true; w->tabSelectable = true;
w->text = String_FromReadonly(text); w->text = String_FromReadonly(text);
@ -350,12 +350,12 @@ static const struct LWidgetVTABLE linput_VTABLE = {
LInput_Select, LInput_Unselect, /* Select */ LInput_Select, LInput_Unselect, /* Select */
NULL, LInput_TextChanged /* TextChanged */ NULL, LInput_TextChanged /* TextChanged */
}; };
void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LConstraint* constraints) { void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LLayout* layouts) {
w->VTABLE = &linput_VTABLE; w->VTABLE = &linput_VTABLE;
w->type = LWIDGET_INPUT; w->type = LWIDGET_INPUT;
w->tabSelectable = true; w->tabSelectable = true;
w->opaque = true; w->opaque = true;
w->constraints = constraints; w->layouts = layouts;
String_InitArray(w->text, w->_textBuffer); String_InitArray(w->text, w->_textBuffer);
w->hintText = hintText; w->hintText = hintText;
@ -406,10 +406,10 @@ static const struct LWidgetVTABLE llabel_VTABLE = {
NULL, NULL, /* Hover */ NULL, NULL, /* Hover */
NULL, NULL /* Select */ NULL, NULL /* Select */
}; };
void LLabel_Init(struct LLabel* w, const char* text, const struct LConstraint* constraints) { void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layouts) {
w->VTABLE = &llabel_VTABLE; w->VTABLE = &llabel_VTABLE;
w->type = LWIDGET_LABEL; w->type = LWIDGET_LABEL;
w->constraints = constraints; w->layouts = layouts;
String_InitArray(w->text, w->_textBuffer); String_InitArray(w->text, w->_textBuffer);
LBackend_LabelInit(w); LBackend_LabelInit(w);
@ -442,10 +442,10 @@ static const struct LWidgetVTABLE lline_VTABLE = {
NULL, NULL, /* Hover */ NULL, NULL, /* Hover */
NULL, NULL /* Select */ NULL, NULL /* Select */
}; };
void LLine_Init(struct LLine* w, int width, const struct LConstraint* constraints) { void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts) {
w->VTABLE = &lline_VTABLE; w->VTABLE = &lline_VTABLE;
w->type = LWIDGET_LINE; w->type = LWIDGET_LINE;
w->constraints = constraints; w->layouts = layouts;
LBackend_LineInit(w, width); LBackend_LineInit(w, width);
} }
@ -469,12 +469,12 @@ static const struct LWidgetVTABLE lslider_VTABLE = {
NULL, NULL, /* Hover */ NULL, NULL, /* Hover */
NULL, NULL /* Select */ NULL, NULL /* Select */
}; };
void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LConstraint* constraints) { void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LLayout* layouts) {
w->VTABLE = &lslider_VTABLE; w->VTABLE = &lslider_VTABLE;
w->type = LWIDGET_SLIDER; w->type = LWIDGET_SLIDER;
w->color = color; w->color = color;
w->opaque = true; w->opaque = true;
w->constraints = constraints; w->layouts = layouts;
LBackend_SliderInit(w, width, height); LBackend_SliderInit(w, width, height);
} }

View File

@ -11,12 +11,12 @@ enum LWIDGET_TYPE {
LWIDGET_LABEL, LWIDGET_LINE, LWIDGET_SLIDER, LWIDGET_TABLE LWIDGET_LABEL, LWIDGET_LINE, LWIDGET_SLIDER, LWIDGET_TABLE
}; };
#define LCONSTRAINT_TYPE_X 0x0100 #define LLAYOUT_TYPE_X 0x0100
#define LCONSTRAINT_TYPE_Y 0x0200 #define LLAYOUT_TYPE_Y 0x0200
#define LConstraint_None { 0, 0 } #define LLayout_End { 0, 0 }
#define LConstraint_X(anchor, offset) { LCONSTRAINT_TYPE_X | anchor, offset } #define LLayout_X(anchor, offset) { LLAYOUT_TYPE_X | anchor, offset }
#define LConstraint_Y(anchor, offset) { LCONSTRAINT_TYPE_Y | anchor, offset } #define LLayout_Y(anchor, offset) { LLAYOUT_TYPE_Y | anchor, offset }
struct LConstraint { short type, offset; }; struct LLayout { short type, offset; };
struct LWidgetVTABLE { struct LWidgetVTABLE {
/* Called to draw contents of this widget */ /* Called to draw contents of this widget */
@ -59,7 +59,7 @@ struct LWidgetVTABLE {
void (*OnUnhover)(void* widget);/*Called when widget is no longer hovered over */ \ void (*OnUnhover)(void* widget);/*Called when widget is no longer hovered over */ \
Rect2D last; /* Widget's last drawn area */ \ Rect2D last; /* Widget's last drawn area */ \
void* meta; /* Backend specific data */ \ void* meta; /* Backend specific data */ \
const struct LConstraint* constraints; const struct LLayout* layouts;
/* Represents an individual 2D gui component in the launcher. */ /* Represents an individual 2D gui component in the launcher. */
struct LWidget { LWidget_Layout }; struct LWidget { LWidget_Layout };
@ -72,7 +72,7 @@ struct LButton {
cc_string text; cc_string text;
int _textWidth, _textHeight; int _textWidth, _textHeight;
}; };
CC_NOINLINE void LButton_Init(struct LButton* w, int width, int height, const char* text, const struct LConstraint* constraints); CC_NOINLINE void LButton_Init(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_SetConst(struct LButton* w, const char* text);
CC_NOINLINE void LButton_DrawBackground(struct LButton* w, struct Bitmap* bmp, int x, int y); CC_NOINLINE void LButton_DrawBackground(struct LButton* w, struct Bitmap* bmp, int x, int y);
@ -83,7 +83,7 @@ struct LCheckbox {
cc_string text; cc_string text;
void (*ValueChanged)(struct LCheckbox* w); void (*ValueChanged)(struct LCheckbox* w);
}; };
CC_NOINLINE void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LConstraint* constraints); CC_NOINLINE void LCheckbox_Init(struct LCheckbox* w, const char* text, const struct LLayout* layouts);
struct LInput; struct LInput;
struct LInput { struct LInput {
@ -107,7 +107,7 @@ struct LInput {
int _textHeight; int _textHeight;
char _textBuffer[STRING_SIZE]; char _textBuffer[STRING_SIZE];
}; };
CC_NOINLINE void LInput_Init(struct LInput* w, int width, const char* hintText, const struct LConstraint* constraints); CC_NOINLINE void LInput_Init(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_UNSAFE_GetText(struct LInput* w, cc_string* text);
CC_NOINLINE void LInput_SetText(struct LInput* w, const cc_string* text); CC_NOINLINE void LInput_SetText(struct LInput* w, const cc_string* text);
CC_NOINLINE void LInput_ClearText(struct LInput* w); CC_NOINLINE void LInput_ClearText(struct LInput* w);
@ -124,7 +124,7 @@ struct LLabel {
cc_string text; cc_string text;
char _textBuffer[STRING_SIZE]; char _textBuffer[STRING_SIZE];
}; };
CC_NOINLINE void LLabel_Init(struct LLabel* w, const char* text, const struct LConstraint* constraints); CC_NOINLINE void LLabel_Init(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_SetText(struct LLabel* w, const cc_string* text);
CC_NOINLINE void LLabel_SetConst(struct LLabel* w, const char* text); CC_NOINLINE void LLabel_SetConst(struct LLabel* w, const char* text);
@ -133,7 +133,7 @@ struct LLine {
LWidget_Layout LWidget_Layout
int _width; int _width;
}; };
CC_NOINLINE void LLine_Init(struct LLine* w, int width, const struct LConstraint* constraints); CC_NOINLINE void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts);
CC_NOINLINE BitmapCol LLine_GetColor(void); CC_NOINLINE BitmapCol LLine_GetColor(void);
/* Represents a slider bar that may or may not be modifiable by the user. */ /* Represents a slider bar that may or may not be modifiable by the user. */
@ -142,7 +142,7 @@ struct LSlider {
int value, _width, _height; int value, _width, _height;
BitmapCol color; BitmapCol color;
}; };
CC_NOINLINE void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LConstraint* constraints); CC_NOINLINE void LSlider_Init(struct LSlider* w, int width, int height, BitmapCol color, const struct LLayout* layouts);
CC_NOINLINE void LSlider_SetProgress(struct LSlider* w, int progress); CC_NOINLINE void LSlider_SetProgress(struct LSlider* w, int progress);
struct ServerInfo; struct ServerInfo;