aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui.c')
-rw-r--r--src/ui.c69
1 files changed, 58 insertions, 11 deletions
diff --git a/src/ui.c b/src/ui.c
index 296f658..9f1ce74 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1,9 +1,9 @@
#include "ui.h"
-FloatingWindow createFloatingWindow(const char* title)
+FloatingWindow createFloatingWindow(const char* title, Rectangle rect)
{
FloatingWindow window = (FloatingWindow){
- .rect = (Rectangle){0.0, 0.0, 100.0, 100.0},
+ .rect = rect,
.minimized = false,
.moving = false,
.resizing = false,
@@ -187,15 +187,24 @@ void updateFloatingWindowNotMinimized(FloatingWindow* window)
window->rect.y + window->rect.height - 20, 1, GREEN);
}
-void updateFloatingWindow(FloatingWindow* window)
+bool updateFloatingWindow(FloatingWindow* window)
{
+ bool focusOnThisWindow = false;
+ bool isMouseLeftClick = IsMouseButtonPressed(MOUSE_LEFT_BUTTON);
+
// Window movement and resize input and collision check.
- if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && !window->moving
- && !window->resizing)
+ if (isMouseLeftClick && !window->moving && !window->resizing)
{
floatingWindowTransformCollisionCheck(window);
}
+ // Focus on window.
+ if (isMouseLeftClick && CheckCollisionPointRec(GetMousePosition(),
+ window->rect))
+ {
+ focusOnThisWindow = true;
+ }
+
// Window movement and resize update.
if (window->moving)
{
@@ -206,7 +215,7 @@ void updateFloatingWindow(FloatingWindow* window)
updateFloatingWindowResizing(window);
}
- // window and content drawing with scissor and scroll area
+ // Window and content drawing with scissor and scroll area.
if(window->minimized)
{
updateFloatingWindowMinimized(window);
@@ -215,17 +224,55 @@ void updateFloatingWindow(FloatingWindow* window)
{
updateFloatingWindowNotMinimized(window);
}
+
+ return focusOnThisWindow;
+}
+
+void initWindowManager(WindowManager* wm)
+{
+ memset(wm, 0, sizeof(WindowManager));
+}
+
+void updateWindowManager(WindowManager* wm)
+{
+ int focusOnto = -1;
+
+ for (int index = 0; index < wm->windowCount; ++index)
+ {
+ if (updateFloatingWindow(&wm->windows[index])
+ && index != wm->windowCount - 1)
+ {
+ focusOnto = index;
+ }
+ }
+
+ if (focusOnto != -1)
+ {
+ focusOnWindow(wm, focusOnto);
+ }
}
-void initWindowManager(WindowManager* windowManager)
+void addWindowToWindowManager(WindowManager* wm, FloatingWindow window)
{
- memset(windowManager, 0, sizeof(WindowManager));
+ if (wm->windowCount < UI_WINDOW_MAX)
+ {
+ wm->windows[wm->windowCount] = window;
+ ++wm->windowCount;
+ }
+ else
+ {
+ TraceLog(LOG_ERROR, "'wm->windowCount' went over the limit");
+ }
}
-void updateWindowManager(WindowManager* windowManager)
+void focusOnWindow(WindowManager* wm, int windowIndex)
{
- for (int index = 0; index < windowManager->windowCount; ++index)
+ FloatingWindow window = wm->windows[windowIndex];
+
+ for (int index = windowIndex + 1; index < wm->windowCount; ++index)
{
- updateFloatingWindow(&windowManager->windows[index]);
+ wm->windows[index - 1] = wm->windows[index];
}
+
+ wm->windows[wm->windowCount - 1] = window;
}