From f6922dc12deb981cf95498afeb939f24171a5fc4 Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 16 Nov 2025 22:50:31 -0700 Subject: Testing widgets in the wm --- src/game.c | 23 +++++++++++++++++------ src/ui.c | 23 ++++++++++++++--------- src/ui.h | 18 +++++++++++------- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/game.c b/src/game.c index a8c4d4a..36b1d94 100644 --- a/src/game.c +++ b/src/game.c @@ -45,6 +45,21 @@ void resetScreenScale(Game* game) } } +FocusCommand testFloatingWindowCallback(FloatingWindow* window, Game* game) +{ + DrawText("test", window->rect.x + 10, + window->rect.y + 10 + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT, 15, BLUE); + + if (GuiButton((Rectangle){window->rect.x + 10.0, window->rect.y + 50.0, + 40.0, 20.0}, "A")) + { + puts("hi"); + return DEMAND_FOCUS; + } + + return NO_FOCUS_ACTION; +} + void initGame(Game* game) { game->sceneId = GAME_SCENE; @@ -91,6 +106,7 @@ void initGame(Game* game) window = createFloatingWindow("test2", (Rectangle){200.0, 200.0, 100.0, 100.0}); + window.callback = testFloatingWindowCallback; addWindowToWindowManager(&game->wm, window); window = createFloatingWindow("test3", @@ -142,11 +158,6 @@ void drawGameScreen(Game* game) } } -void updateGameUI(Game* game) -{ - updateWindowManager(&game->wm); -} - void updateGameScene(Game* game) { // Handle toggle cursor. @@ -183,7 +194,7 @@ void updateGameScene(Game* game) drawGameScreen(game); - updateGameUI(game); + updateWindowManager(&game->wm, game); } void handleGameResize(Game* game) diff --git a/src/ui.c b/src/ui.c index 9faabcd..6fbc250 100644 --- a/src/ui.c +++ b/src/ui.c @@ -10,7 +10,8 @@ FloatingWindow createFloatingWindow(const char* title, Rectangle rect) .callback = NULL, .contentSize = Vector2Zero(), .scroll = Vector2Zero(), - .hasFocus = false + .hasFocus = false, + .data = NULL }; memcpy(window.title, title, UI_WINDOW_TITLE_MAX * sizeof(char)); @@ -144,8 +145,11 @@ void updateFloatingWindowMinimized(FloatingWindow* window) } } -void updateFloatingWindowNotMinimized(FloatingWindow* window) +FocusCommand updateFloatingWindowNotMinimized(FloatingWindow* window, + Game* game) { + FocusCommand focus = NO_FOCUS_ACTION; + window->minimized = GuiWindowBox( (Rectangle){window->rect.x, window->rect.y, window->rect.width, window->rect.height}, window->title) & window->hasFocus; @@ -175,8 +179,7 @@ void updateFloatingWindowNotMinimized(FloatingWindow* window) BeginScissorMode(scissor.x, scissor.y, scissor.width, scissor.height); } - window->callback((Vector2){window->rect.x, window->rect.y}, - window->scroll); + focus = window->callback(window, game); if (requireScissor) { @@ -187,9 +190,11 @@ void updateFloatingWindowNotMinimized(FloatingWindow* window) // Draw the resize button/icon. GuiDrawIcon(71, window->rect.x + window->rect.width - 20, window->rect.y + window->rect.height - 20, 1, GREEN); + + return focus; } -FocusCommand updateFloatingWindow(FloatingWindow* window) +FocusCommand updateFloatingWindow(FloatingWindow* window, Game* game) { FocusCommand focus = NO_FOCUS_ACTION; bool isMouseLeftClick = IsMouseButtonPressed(MOUSE_LEFT_BUTTON); @@ -224,7 +229,8 @@ FocusCommand updateFloatingWindow(FloatingWindow* window) } else { - updateFloatingWindowNotMinimized(window); + FocusCommand result = updateFloatingWindowNotMinimized(window, game); + focus = result == NO_FOCUS_ACTION ? focus : result; } return focus; @@ -235,14 +241,14 @@ void initWindowManager(WindowManager* wm) memset(wm, 0, sizeof(WindowManager)); } -void updateWindowManager(WindowManager* wm) +void updateWindowManager(WindowManager* wm, Game* game) { Vector2 mousePosition = GetMousePosition(); int focusOnto = -1; for (int index = 0; index < wm->windowCount; ++index) { - FocusCommand focus = updateFloatingWindow(&wm->windows[index]); + FocusCommand focus = updateFloatingWindow(&wm->windows[index], game); if (focusOnto != -1) { @@ -255,7 +261,6 @@ void updateWindowManager(WindowManager* wm) break; case REQUEST_FOCUS: { - puts("hi"); bool canFocus = true; // Windows ontop of it prevent focus. diff --git a/src/ui.h b/src/ui.h index 76d9b1f..95e250a 100644 --- a/src/ui.h +++ b/src/ui.h @@ -14,15 +14,18 @@ #define UI_WINDOW_TITLE_MAX 32 #define UI_WINDOW_MAX 4 -typedef void (*DrawWindowContentCallback)(Vector2 position, Vector2 scroll); +typedef struct FloatingWindow FloatingWindow; +typedef enum FocusCommand FocusCommand; +typedef FocusCommand (*DrawWindowContentCallback)(FloatingWindow* window, + Game* game); -typedef enum { +enum FocusCommand { NO_FOCUS_ACTION, REQUEST_FOCUS, DEMAND_FOCUS -} FocusCommand; +}; -typedef struct { +struct FloatingWindow { char title[UI_WINDOW_TITLE_MAX]; Rectangle rect; bool minimized; @@ -32,7 +35,8 @@ typedef struct { Vector2 contentSize; Vector2 scroll; bool hasFocus; -} FloatingWindow; + void* data; +}; typedef struct { FloatingWindow windows[UI_WINDOW_MAX]; @@ -40,10 +44,10 @@ typedef struct { } WindowManager; FloatingWindow createFloatingWindow(const char* title, Rectangle rect); -FocusCommand updateFloatingWindow(FloatingWindow* window); +FocusCommand updateFloatingWindow(FloatingWindow* window, Game* game); void initWindowManager(WindowManager* wm); -void updateWindowManager(WindowManager* wm); +void updateWindowManager(WindowManager* wm, Game* game); void addWindowToWindowManager(WindowManager* wm, FloatingWindow window); void focusOnWindow(WindowManager* wm, int windowIndex); -- cgit v1.2.3