From 4ca550539f2849b50a14d702d0524a03fa782d33 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 9 May 2022 20:38:13 +1000 Subject: [PATCH] Move more stuff to launcher backend --- src/LBackend.c | 100 +++++++++++++++++++++++++++++++++++++++++++++---- src/LScreens.c | 75 ++----------------------------------- src/LScreens.h | 7 ++-- src/LWidgets.h | 2 + src/Launcher.c | 15 -------- 5 files changed, 101 insertions(+), 98 deletions(-) diff --git a/src/LBackend.c b/src/LBackend.c index c75b40191..eac09cc2c 100644 --- a/src/LBackend.c +++ b/src/LBackend.c @@ -96,7 +96,15 @@ void LBackend_DrawLogo(struct Bitmap* bmp, const char* title) { Launcher_DrawLogo(&logoFont, title, bmp); } -void LBackend_SetScreen(struct LScreen* s) { } +static void OnPointerMove(void* obj, int idx); +void LBackend_SetScreen(struct LScreen* s) { + int i; + /* for hovering over active button etc */ + for (i = 0; i < Pointers_Count; i++) { + OnPointerMove(s, i); + } +} + void LBackend_CloseScreen(struct LScreen* s) { } static void LBackend_LayoutDimensions(struct LWidget* w) { @@ -261,17 +269,92 @@ void LBackend_Tick(void) { *#########################################################################################################################*/ static void ReqeustRedraw(void* obj) { LBackend_Redraw(); } +CC_NOINLINE static struct LWidget* GetWidgetAt(struct LScreen* s, int idx) { + struct LWidget* w; + int i, x = Pointers[idx].x, y = Pointers[idx].y; + + for (i = 0; i < s->numWidgets; i++) { + w = s->widgets[i]; + if (Gui_Contains(w->x, w->y, w->width, w->height, x, y)) return w; + } + return NULL; +} + static void OnPointerDown(void* obj, int idx) { - Launcher_Active->MouseDown(Launcher_Active, idx); + struct LScreen* s = Launcher_Active; + struct LWidget* over; + struct LWidget* prev; + + if (!s) return; + over = GetWidgetAt(s, idx); + prev = s->selectedWidget; + + if (prev && over != prev) LScreen_UnselectWidget(s, idx, prev); + if (over) LScreen_SelectWidget(s, idx, over, over == prev); } static void OnPointerUp(void* obj, int idx) { - Launcher_Active->MouseUp(Launcher_Active, idx); + struct LScreen* s = Launcher_Active; + struct LWidget* over; + struct LWidget* prev; + + if (!s) return; + over = GetWidgetAt(s, idx); + prev = s->selectedWidget; + + /* if user moves mouse away, it doesn't count */ + if (over != prev) { + LScreen_UnselectWidget(s, idx, prev); + } else if (over && over->OnClick) { + over->OnClick(over); + } + /* TODO eliminate this hack */ + s->MouseUp(s, idx); } static void OnPointerMove(void* obj, int idx) { - if (!Launcher_Active) return; - Launcher_Active->MouseMove(Launcher_Active, idx); + struct LScreen* s = Launcher_Active; + struct LWidget* over; + struct LWidget* prev; + cc_bool overSame; + + if (!s) return; + over = GetWidgetAt(s, idx); + prev = s->hoveredWidget; + overSame = prev == over; + + if (prev && !overSame) { + prev->hovered = false; + s->hoveredWidget = NULL; + + if (prev->OnUnhover) prev->OnUnhover(prev); + if (prev->VTABLE->MouseLeft) prev->VTABLE->MouseLeft(prev); + } + + if (over) { + over->hovered = true; + s->hoveredWidget = over; + + if (over->OnHover) over->OnHover(over); + if (!over->VTABLE->MouseMove) return; + over->VTABLE->MouseMove(over, idx, overSame); + } +} + +static void OnKeyPress(void* obj, int c) { + struct LWidget* selected = Launcher_Active->selectedWidget; + if (!selected) return; + + if (!selected->VTABLE->KeyPress) return; + selected->VTABLE->KeyPress(selected, c); +} + +static void OnTextChanged(void* obj, const cc_string* str) { + struct LWidget* selected = Launcher_Active->selectedWidget; + if (!selected) return; + + if (!selected->VTABLE->TextChanged) return; + selected->VTABLE->TextChanged(selected, str); } static void HookEvents(void) { @@ -279,6 +362,9 @@ static void HookEvents(void) { Event_Register_(&PointerEvents.Down, NULL, OnPointerDown); Event_Register_(&PointerEvents.Up, NULL, OnPointerUp); Event_Register_(&PointerEvents.Moved, NULL, OnPointerMove); + + Event_Register_(&InputEvents.Press, NULL, OnKeyPress); + Event_Register_(&InputEvents.TextChanged, NULL, OnTextChanged); } @@ -429,7 +515,7 @@ static Rect2D caretRect, lastCaretRect; void LBackend_InputInit(struct LInput* w, int width) { w->width = Display_ScaleX(width); - w->height = Display_ScaleY(30); + w->height = Display_ScaleY(LINPUT_HEIGHT); w->minWidth = w->width; } @@ -669,7 +755,7 @@ void LBackend_LabelDraw(struct LLabel* w) { *#########################################################################################################################*/ void LBackend_LineInit(struct LLine* w, int width) { w->width = Display_ScaleX(width); - w->height = Display_ScaleY(2); + w->height = Display_ScaleY(LLINE_HEIGHT); } void LBackend_LineDraw(struct LLine* w) { diff --git a/src/LScreens.c b/src/LScreens.c index 18dee3c0e..a669212f1 100644 --- a/src/LScreens.c +++ b/src/LScreens.c @@ -31,17 +31,6 @@ CC_NOINLINE static int LScreen_IndexOf(struct LScreen* s, void* w) { return -1; } -CC_NOINLINE static struct LWidget* LScreen_WidgetAt(struct LScreen* s, int idx) { - struct LWidget* w; - int i = 0, x = Pointers[idx].x, y = Pointers[idx].y; - - for (i = 0; i < s->numWidgets; i++) { - w = s->widgets[i]; - if (Gui_Contains(w->x, w->y, w->width, w->height, x, y)) return w; - } - return NULL; -} - static void LScreen_DoLayout(struct LScreen* s) { int i; for (i = 0; i < s->numWidgets; i++) @@ -55,14 +44,14 @@ static void LScreen_Tick(struct LScreen* s) { if (w && w->VTABLE->Tick) w->VTABLE->Tick(w); } -CC_NOINLINE static void LScreen_SelectWidget(struct LScreen* s, int idx, struct LWidget* w, cc_bool was) { +void LScreen_SelectWidget(struct LScreen* s, int idx, struct LWidget* w, cc_bool was) { if (!w) return; w->selected = true; s->selectedWidget = w; if (w->VTABLE->OnSelect) w->VTABLE->OnSelect(w, idx, was); } -CC_NOINLINE static void LScreen_UnselectWidget(struct LScreen* s, int idx, struct LWidget* w) { +void LScreen_UnselectWidget(struct LScreen* s, int idx, struct LWidget* w) { if (!w) return; w->selected = false; s->selectedWidget = NULL; @@ -111,60 +100,7 @@ static void LScreen_KeyDown(struct LScreen* s, int key, cc_bool was) { } } -static void LScreen_KeyPress(struct LScreen* s, char key) { - if (!s->selectedWidget) return; - if (!s->selectedWidget->VTABLE->KeyPress) return; - s->selectedWidget->VTABLE->KeyPress(s->selectedWidget, key); -} - -static void LScreen_TextChanged(struct LScreen* s, const cc_string* str) { - if (!s->selectedWidget) return; - if (!s->selectedWidget->VTABLE->TextChanged) return; - s->selectedWidget->VTABLE->TextChanged(s->selectedWidget, str); -} - -static void LScreen_MouseDown(struct LScreen* s, int idx) { - struct LWidget* over = LScreen_WidgetAt(s, idx); - struct LWidget* prev = s->selectedWidget; - - if (prev && over != prev) LScreen_UnselectWidget(s, idx, prev); - if (over) LScreen_SelectWidget(s, idx, over, over == prev); -} - -static void LScreen_MouseUp(struct LScreen* s, int idx) { - struct LWidget* over = LScreen_WidgetAt(s, idx); - struct LWidget* prev = s->selectedWidget; - - /* if user moves mouse away, it doesn't count */ - if (over != prev) { - LScreen_UnselectWidget(s, idx, prev); - } else if (over && over->OnClick) { - over->OnClick(over); - } -} - -static void LScreen_MouseMove(struct LScreen* s, int idx) { - struct LWidget* over = LScreen_WidgetAt(s, idx); - struct LWidget* prev = s->hoveredWidget; - cc_bool overSame = prev == over; - - if (prev && !overSame) { - prev->hovered = false; - s->hoveredWidget = NULL; - - if (prev->OnUnhover) prev->OnUnhover(prev); - if (prev->VTABLE->MouseLeft) prev->VTABLE->MouseLeft(prev); - } - - if (over) { - over->hovered = true; - s->hoveredWidget = over; - - if (over->OnHover) over->OnHover(over); - if (!over->VTABLE->MouseMove) return; - over->VTABLE->MouseMove(over, idx, overSame); - } -} +static void LScreen_MouseUp(struct LScreen* s, int idx) { } static void LScreen_MouseWheel(struct LScreen* s, float delta) { } static void LScreen_DrawBackground(struct LScreen* s, struct Bitmap* bmp) { @@ -185,12 +121,8 @@ CC_NOINLINE static void LScreen_Reset(struct LScreen* s) { s->Layout = LScreen_DoLayout; s->Tick = LScreen_Tick; s->KeyDown = LScreen_KeyDown; - s->KeyPress = LScreen_KeyPress; - s->MouseDown = LScreen_MouseDown; s->MouseUp = LScreen_MouseUp; - s->MouseMove = LScreen_MouseMove; s->MouseWheel = LScreen_MouseWheel; - s->TextChanged = LScreen_TextChanged; s->DrawBackground = LScreen_DrawBackground; s->ResetArea = Launcher_DrawBackground; @@ -1368,7 +1300,6 @@ static void ServersScreen_KeyDown(struct LScreen* s_, int key, cc_bool was) { static void ServersScreen_MouseUp(struct LScreen* s_, int idx) { struct ServersScreen* s = (struct ServersScreen*)s_; s->table.VTABLE->OnUnselect(&s->table, idx); - LScreen_MouseUp(s_, idx); } void ServersScreen_SetActive(void) { diff --git a/src/LScreens.h b/src/LScreens.h index 40ede7737..a59e7df46 100644 --- a/src/LScreens.h +++ b/src/LScreens.h @@ -18,12 +18,8 @@ typedef void (*LScreen_Func)(struct LScreen* s); LScreen_Func Tick; /* Repeatedly called multiple times every second. */ \ void (*DrawBackground)(struct LScreen* s, struct Bitmap* bmp); \ void (*KeyDown)(struct LScreen* s, int key, cc_bool wasDown); \ - void (*KeyPress)(struct LScreen* s, char c); \ - void (*MouseDown)(struct LScreen* s, int idx); \ void (*MouseUp)(struct LScreen* s, int idx); \ - void (*MouseMove)(struct LScreen* s, int idx); \ void (*MouseWheel)(struct LScreen* s, float delta); \ - void (*TextChanged)(struct LScreen* s, const cc_string* str); \ void (*ResetArea)(struct Bitmap* bmp, int x, int y, int width, int height); \ struct LWidget* onEnterWidget; /* Default widget to auto-click when Enter is pressed. Can be NULL. */ \ struct LWidget* hoveredWidget; /* Widget the mouse is currently hovering over. */ \ @@ -34,6 +30,9 @@ typedef void (*LScreen_Func)(struct LScreen* s); const char* title; /* Titlebar text */ 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 ChooseModeScreen_SetActive(cc_bool firstTime); void ColoursScreen_SetActive(void); diff --git a/src/LWidgets.h b/src/LWidgets.h index c2002d25c..09c8c36af 100644 --- a/src/LWidgets.h +++ b/src/LWidgets.h @@ -110,6 +110,7 @@ CC_NOINLINE void LInput_ClearText(struct LInput* w); CC_NOINLINE void LInput_AppendString(struct LInput* w, const cc_string* str); /* Sets the currently entered text to the given string */ CC_NOINLINE void LInput_SetString(struct LInput* w, const cc_string* str); +#define LINPUT_HEIGHT 30 /* Represents non-interactable text. */ struct LLabel { @@ -129,6 +130,7 @@ struct LLine { }; CC_NOINLINE void LLine_Init(struct LLine* w, int width, const struct LLayout* layouts); CC_NOINLINE BitmapCol LLine_GetColor(void); +#define LLINE_HEIGHT 2 /* Represents a slider bar that may or may not be modifiable by the user. */ struct LSlider { diff --git a/src/Launcher.c b/src/Launcher.c index fbbeb0ed6..64e1bcaf5 100644 --- a/src/Launcher.c +++ b/src/Launcher.c @@ -42,17 +42,12 @@ static void CloseActiveScreen(void) { } void Launcher_SetScreen(struct LScreen* screen) { - int i; CloseActiveScreen(); Launcher_Active = screen; if (!screen->numWidgets) screen->Init(screen); screen->Show(screen); screen->Layout(screen); - /* for hovering over active button etc */ - for (i = 0; i < Pointers_Count; i++) { - screen->MouseMove(screen, i); - } LBackend_SetScreen(screen); LBackend_Redraw(); @@ -187,14 +182,6 @@ static void OnInputDown(void* obj, int key, cc_bool was) { Launcher_Active->KeyDown(Launcher_Active, key, was); } -static void OnKeyPress(void* obj, int c) { - Launcher_Active->KeyPress(Launcher_Active, c); -} - -static void OnTextChanged(void* obj, const cc_string* str) { - Launcher_Active->TextChanged(Launcher_Active, str); -} - static void OnMouseWheel(void* obj, float delta) { Launcher_Active->MouseWheel(Launcher_Active, delta); } @@ -208,9 +195,7 @@ static void Launcher_Init(void) { Event_Register_(&WindowEvents.StateChanged, NULL, OnResize); Event_Register_(&InputEvents.Down, NULL, OnInputDown); - Event_Register_(&InputEvents.Press, NULL, OnKeyPress); Event_Register_(&InputEvents.Wheel, NULL, OnMouseWheel); - Event_Register_(&InputEvents.TextChanged, NULL, OnTextChanged); Utils_EnsureDirectory("texpacks"); Utils_EnsureDirectory("audio");