iOS: Move to new layout system, part 1

This commit is contained in:
UnknownShadow200 2022-05-07 16:43:43 +10:00
parent 00e56e9815
commit f70b6406d8
6 changed files with 71 additions and 74 deletions

View File

@ -99,7 +99,35 @@ void LBackend_DrawLogo(struct Bitmap* bmp, const char* title) {
void LBackend_SetScreen(struct LScreen* s) { } void LBackend_SetScreen(struct LScreen* s) { }
void LBackend_CloseScreen(struct LScreen* s) { } void LBackend_CloseScreen(struct LScreen* s) { }
void LBackend_WidgetRepositioned(struct LWidget* w) { static void LBackend_LayoutDimensions(struct LWidget* w) {
const struct LLayout* l = w->layouts + 2;
while (l->type)
{
switch (l->type)
{
case LLAYOUT_WIDTH:
w->width = WindowInfo.Width - w->x - Display_ScaleX(l->offset);
w->width = max(1, w->width);
break;
case LLAYOUT_HEIGHT:
w->height = WindowInfo.Height - w->y - Display_ScaleY(l->offset);
w->height = max(1, w->height);
break;
}
l++;
}
}
void LBackend_LayoutWidget(struct LWidget* w) {
const struct LLayout* l = w->layouts;
w->x = Gui_CalcPos(l[0].type & 0xFF, Display_ScaleX(l[0].offset), w->width, WindowInfo.Width);
w->y = Gui_CalcPos(l[1].type & 0xFF, Display_ScaleY(l[1].offset), w->height, WindowInfo.Height);
/* e.g. Table widget needs adjusts width/height based on window */
if (l[1].type & LLAYOUT_EXTRA)
LBackend_LayoutDimensions(w);
if (w->type != LWIDGET_TABLE) return; if (w->type != LWIDGET_TABLE) return;
LBackend_TableReposition((struct LTable*)w); LBackend_TableReposition((struct LTable*)w);
} }

View File

@ -27,7 +27,7 @@ void LBackend_DrawLogo(struct Bitmap* bmp, const char* title);
void LBackend_Redraw(void); void LBackend_Redraw(void);
void LBackend_ThemeChanged(void); void LBackend_ThemeChanged(void);
void LBackend_Tick(void); void LBackend_Tick(void);
void LBackend_WidgetRepositioned(struct LWidget* w); void LBackend_LayoutWidget(struct LWidget* w);
void LBackend_MarkDirty(void* widget); void LBackend_MarkDirty(void* widget);
void LBackend_InitFramebuffer(void); void LBackend_InitFramebuffer(void);

View File

@ -46,7 +46,7 @@ static void LScreen_DoLayout(struct LScreen* s) {
int i; int i;
for (i = 0; i < s->numWidgets; i++) for (i = 0; i < s->numWidgets; i++)
{ {
LWidget_CalcPosition(s->widgets[i]); LBackend_LayoutWidget(s->widgets[i]);
} }
} }

View File

@ -27,40 +27,6 @@ void LWidget_CalcOffsets(void) {
} }
static void LWidget_LayoutDimensions(struct LWidget* w) {
const struct LLayout* l = w->layouts + 2;
while (l->type)
{
switch (l->type)
{
case LLAYOUT_WIDTH:
w->width = WindowInfo.Width - w->x - Display_ScaleX(l->offset);
w->width = max(1, w->width);
break;
case LLAYOUT_HEIGHT:
w->height = WindowInfo.Height - w->y - Display_ScaleY(l->offset);
w->height = max(1, w->height);
break;
}
l++;
}
}
void LWidget_CalcPosition(void* widget) {
struct LWidget* w = (struct LWidget*)widget;
const struct LLayout* l = w->layouts;
w->x = Gui_CalcPos(l[0].type & 0xFF, Display_ScaleX(l[0].offset), w->width, WindowInfo.Width);
w->y = Gui_CalcPos(l[1].type & 0xFF, Display_ScaleY(l[1].offset), w->height, WindowInfo.Height);
/* e.g. Table widget needs adjusts width/height based on window */
if (l[1].type & LLAYOUT_EXTRA) {
LWidget_LayoutDimensions(w);
}
LBackend_WidgetRepositioned(w);
}
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------ButtonWidget-------------------------------------------------------* *------------------------------------------------------ButtonWidget-------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
@ -417,7 +383,7 @@ void LLabel_Init(struct LLabel* w, const char* text, const struct LLayout* layou
void LLabel_SetText(struct LLabel* w, const cc_string* text) { void LLabel_SetText(struct LLabel* w, const cc_string* text) {
String_Copy(&w->text, text); String_Copy(&w->text, text);
LBackend_LabelUpdate(w); LBackend_LabelUpdate(w);
LWidget_CalcPosition(w); LBackend_LayoutWidget((struct LWidget*)w);
} }
void LLabel_SetConst(struct LLabel* w, const char* text) { void LLabel_SetConst(struct LLabel* w, const char* text) {

View File

@ -59,7 +59,6 @@ struct LWidgetVTABLE {
/* 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 };
void LWidget_CalcPosition(void* widget);
void LWidget_CalcOffsets(void); void LWidget_CalcOffsets(void);
struct LButton { struct LButton {

View File

@ -10,6 +10,7 @@
#include "LBackend.h" #include "LBackend.h"
#include "LWidgets.h" #include "LWidgets.h"
#include "LScreens.h" #include "LScreens.h"
#include "Gui.h"
#include "LWeb.h" #include "LWeb.h"
#include "Funcs.h" #include "Funcs.h"
#include <mach-o/dyld.h> #include <mach-o/dyld.h>
@ -18,6 +19,7 @@
#include <UIKit/UIKit.h> #include <UIKit/UIKit.h>
#include <OpenGLES/ES2/gl.h> #include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h> #include <OpenGLES/ES2/glext.h>
#include <CoreText/CoreText.h>
@interface CCWindow : UIWindow @interface CCWindow : UIWindow
@end @end
@ -546,22 +548,37 @@ static UIImage* ToUIImage(struct Bitmap* bmp) {
return img; return img;
} }
static void UpdateWidgetDimensions(void* widget) { static void LBackend_LayoutDimensions(struct LWidget* w, CGRect* r) {
struct LWidget* w = widget; const struct LLayout* l = w->layouts + 2;
UIView* view = (__bridge UIView*)w->meta; while (l->type)
{
CGRect rect = [view frame]; switch (l->type)
w->width = (int)rect.size.width; {
w->height = (int)rect.size.height; case LLAYOUT_WIDTH:
r->size.width = WindowInfo.Width - (int)r->origin.x - Display_ScaleX(l->offset);
break;
case LLAYOUT_HEIGHT:
r->size.height = WindowInfo.Height - (int)r->origin.y - Display_ScaleY(l->offset);
break;
}
l++;
}
} }
void LBackend_WidgetRepositioned(struct LWidget* w) { void LBackend_LayoutWidget(struct LWidget* w) {
const struct LLayout* l = w->layouts;
UIView* view = (__bridge UIView*)w->meta; UIView* view = (__bridge UIView*)w->meta;
CGRect r = [view frame];
int width = (int)r.size.width;
int height = (int)r.size.height;
CGRect rect = [view frame]; r.origin.x = Gui_CalcPos(l[0].type & 0xFF, Display_ScaleX(l[0].offset), width, WindowInfo.Width);
rect.origin.x = w->x; r.origin.y = Gui_CalcPos(l[1].type & 0xFF, Display_ScaleY(l[1].offset), height, WindowInfo.Height);
rect.origin.y = w->y;
[view setFrame:rect]; /* e.g. Table widget needs adjusts width/height based on window */
if (l[1].type & LLAYOUT_EXTRA)
LBackend_LayoutDimensions(w, &r);
[view setFrame:r];
} }
void LBackend_SetScreen(struct LScreen* s) { void LBackend_SetScreen(struct LScreen* s) {
@ -698,7 +715,6 @@ void LBackend_Tick(void) { }
void LBackend_Free(void) { } void LBackend_Free(void) { }
void LBackend_UpdateLogoFont(void) { } void LBackend_UpdateLogoFont(void) { }
#include <CoreText/CoreText.h>
static void DrawText(NSAttributedString* str, struct Bitmap* bmp, int x, int y) { static void DrawText(NSAttributedString* str, struct Bitmap* bmp, int x, int y) {
CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)str); CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)str);
CGRect bounds = CTLineGetImageBounds(line, win_ctx); CGRect bounds = CTLineGetImageBounds(line, win_ctx);
@ -772,15 +788,18 @@ void LBackend_ThemeChanged(void) {
*#########################################################################################################################*/ *#########################################################################################################################*/
static void LButton_UpdateBackground(struct LButton* w) { static void LButton_UpdateBackground(struct LButton* w) {
UIButton* btn = (__bridge UIButton*)w->meta; UIButton* btn = (__bridge UIButton*)w->meta;
CGRect rect = [btn frame];
int width = (int)rect.size.width;
int height = (int)rect.size.height;
// memory freeing deferred until UIImage is freed (see FreeContents) // memory freeing deferred until UIImage is freed (see FreeContents)
struct Bitmap bmp1, bmp2; struct Bitmap bmp1, bmp2;
Bitmap_Allocate(&bmp1, w->width, w->height); Bitmap_Allocate(&bmp1, width, height);
LButton_DrawBackground(&bmp1, 0, 0, w->width, w->height, false); LButton_DrawBackground(&bmp1, 0, 0, width, height, false);
[btn setBackgroundImage:ToUIImage(&bmp1) forState:UIControlStateNormal]; [btn setBackgroundImage:ToUIImage(&bmp1) forState:UIControlStateNormal];
Bitmap_Allocate(&bmp2, w->width, w->height); Bitmap_Allocate(&bmp2, width, height);
LButton_DrawBackground(&bmp2, 0, 0, w->width, w->height, true); LButton_DrawBackground(&bmp2, 0, 0, width, height, true);
[btn setBackgroundImage:ToUIImage(&bmp2) forState:UIControlStateHighlighted]; [btn setBackgroundImage:ToUIImage(&bmp2) forState:UIControlStateHighlighted];
} }
@ -790,7 +809,6 @@ void LBackend_ButtonInit(struct LButton* w, int width, int height) {
[btn addTarget:ui_controller action:@selector(handleButtonPress:) forControlEvents:UIControlEventTouchUpInside]; [btn addTarget:ui_controller action:@selector(handleButtonPress:) forControlEvents:UIControlEventTouchUpInside];
AssignView(w, btn); AssignView(w, btn);
UpdateWidgetDimensions(w);
LButton_UpdateBackground(w); LButton_UpdateBackground(w);
} }
@ -799,7 +817,6 @@ void LBackend_ButtonUpdate(struct LButton* w) {
NSString* str = ToNSString(&w->text); NSString* str = ToNSString(&w->text);
[btn setTitle:str forState:UIControlStateNormal]; [btn setTitle:str forState:UIControlStateNormal];
UpdateWidgetDimensions(w);
} }
@ -815,7 +832,6 @@ void LBackend_CheckboxInit(struct LCheckbox* w) {
[swt addTarget:ui_controller action:@selector(handleValueChanged:) forControlEvents:UIControlEventValueChanged]; [swt addTarget:ui_controller action:@selector(handleValueChanged:) forControlEvents:UIControlEventValueChanged];
AssignView(w, swt); AssignView(w, swt);
UpdateWidgetDimensions(w);
} }
void LBackend_CheckboxDraw(struct LCheckbox* w) { void LBackend_CheckboxDraw(struct LCheckbox* w) {
@ -856,13 +872,11 @@ void LBackend_InputInit(struct LInput* w, int width) {
LInput_SetPlaceholder(fld, w->hintText); LInput_SetPlaceholder(fld, w->hintText);
AssignView(w, fld); AssignView(w, fld);
UpdateWidgetDimensions(w);
} }
void LBackend_InputUpdate(struct LInput* w) { void LBackend_InputUpdate(struct LInput* w) {
UITextField* fld = (__bridge UITextField*)w->meta; UITextField* fld = (__bridge UITextField*)w->meta;
fld.text = ToNSString(&w->text); fld.text = ToNSString(&w->text);
UpdateWidgetDimensions(w);
} }
void LBackend_InputDraw(struct LInput* w) { void LBackend_InputDraw(struct LInput* w) {
@ -881,7 +895,6 @@ void LBackend_LabelInit(struct LLabel* w) {
lbl.textColor = [UIColor whiteColor]; lbl.textColor = [UIColor whiteColor];
AssignView(w, lbl); AssignView(w, lbl);
UpdateWidgetDimensions(w);
} }
void LBackend_LabelUpdate(struct LLabel* w) { void LBackend_LabelUpdate(struct LLabel* w) {
@ -893,7 +906,6 @@ void LBackend_LabelUpdate(struct LLabel* w) {
lbl.text = str; lbl.text = str;
[lbl sizeToFit]; // adjust label to fit text [lbl sizeToFit]; // adjust label to fit text
UpdateWidgetDimensions(w);
} }
void LBackend_LabelDraw(struct LLabel* w) { void LBackend_LabelDraw(struct LLabel* w) {
@ -911,7 +923,6 @@ void LBackend_LineInit(struct LLine* w, int width) {
view.backgroundColor = ToUIColor(color, 0.5f); view.backgroundColor = ToUIColor(color, 0.5f);
AssignView(w, view); AssignView(w, view);
UpdateWidgetDimensions(w);
} }
void LBackend_LineDraw(struct LLine* w) { void LBackend_LineDraw(struct LLine* w) {
@ -927,13 +938,12 @@ void LBackend_SliderInit(struct LSlider* w, int width, int height) {
prg.progressTintColor = ToUIColor(w->color, 1.0f); prg.progressTintColor = ToUIColor(w->color, 1.0f);
AssignView(w, prg); AssignView(w, prg);
UpdateWidgetDimensions(w);
} }
void LBackend_SliderUpdate(struct LSlider* w) { void LBackend_SliderUpdate(struct LSlider* w) {
UIProgressView* lbl = (__bridge UIProgressView*)w->meta; UIProgressView* prg = (__bridge UIProgressView*)w->meta;
lbl.progress = w->value / 100.0f; prg.progress = w->value / 100.0f;
} }
void LBackend_SliderDraw(struct LSlider* w) { void LBackend_SliderDraw(struct LSlider* w) {
@ -945,17 +955,11 @@ void LBackend_SliderDraw(struct LSlider* w) {
*#########################################################################################################################*/ *#########################################################################################################################*/
void LBackend_TableInit(struct LTable* w) { void LBackend_TableInit(struct LTable* w) {
UITableView* tbl = [[UITableView alloc] init]; UITableView* tbl = [[UITableView alloc] init];
//tbl.frame = CGRectMake(0, 50, 350, 570);
tbl.delegate = ui_controller; tbl.delegate = ui_controller;
tbl.dataSource = ui_controller; tbl.dataSource = ui_controller;
//[tbl registerClass:UITableViewCell.class forCellReuseIdentifier:cellID]; //[tbl registerClass:UITableViewCell.class forCellReuseIdentifier:cellID];
CGRect total = [view_handle frame];
tbl.frame = CGRectMake(0, 0, total.size.width - 10, total.size.height - 50 - 50);
AssignView(w, tbl); AssignView(w, tbl);
UpdateWidgetDimensions(w);
} }
void LBackend_TableUpdate(struct LTable* w) { void LBackend_TableUpdate(struct LTable* w) {