From dcf9f09c88c9fe8c834b693402eba7bd3186f170 Mon Sep 17 00:00:00 2001 From: fy59 Date: Thu, 6 Aug 2026 14:31:17 +0200 Subject: [PATCH] feat: add central application state --- include/lardon3d/app_state.h | 24 ++++++++++++++++++++++++ include/lardon3d/layout.h | 8 ++++++-- include/lardon3d/tui.h | 10 ++-------- meson.build | 1 + src/app.c | 6 +++++- src/app_state.c | 17 +++++++++++++++++ src/layout.c | 31 ++++++++++++++++++++++++++----- src/tui.c | 32 +++++++++++++++++++------------- 8 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 include/lardon3d/app_state.h create mode 100644 src/app_state.c diff --git a/include/lardon3d/app_state.h b/include/lardon3d/app_state.h new file mode 100644 index 0000000..219d3df --- /dev/null +++ b/include/lardon3d/app_state.h @@ -0,0 +1,24 @@ +#ifndef LARDON3D_APP_STATE_H +#define LARDON3D_APP_STATE_H + +#include + +typedef enum { + LARDON3D_SCREEN_HOME = 0, + LARDON3D_SCREEN_PROJECTS, + LARDON3D_SCREEN_IMPORT, + LARDON3D_SCREEN_VIEWER, + LARDON3D_SCREEN_HELP +} Lardon3DScreen; + +typedef struct { + Lardon3DScreen screen; + bool running; + bool project_loaded; + char project_name[128]; + char status_message[256]; +} Lardon3DAppState; + +void lardon3d_app_state_init(Lardon3DAppState *state); + +#endif diff --git a/include/lardon3d/layout.h b/include/lardon3d/layout.h index 930fd07..b97e3e5 100644 --- a/include/lardon3d/layout.h +++ b/include/lardon3d/layout.h @@ -1,8 +1,12 @@ #ifndef LARDON3D_LAYOUT_H #define LARDON3D_LAYOUT_H -#include +#include -void lardon3d_layout_draw(Lardon3DScreen screen, int rows, int cols); +void lardon3d_layout_draw( + const Lardon3DAppState *state, + int rows, + int cols +); #endif diff --git a/include/lardon3d/tui.h b/include/lardon3d/tui.h index a00a082..1324552 100644 --- a/include/lardon3d/tui.h +++ b/include/lardon3d/tui.h @@ -3,16 +3,10 @@ #include -typedef enum { - LARDON3D_SCREEN_HOME = 0, - LARDON3D_SCREEN_PROJECTS, - LARDON3D_SCREEN_IMPORT, - LARDON3D_SCREEN_VIEWER, - LARDON3D_SCREEN_HELP -} Lardon3DScreen; +#include bool lardon3d_tui_init(void); -bool lardon3d_tui_run(void); +bool lardon3d_tui_run(Lardon3DAppState *state); void lardon3d_tui_shutdown(void); #endif diff --git a/meson.build b/meson.build index 416f934..e811e94 100644 --- a/meson.build +++ b/meson.build @@ -24,6 +24,7 @@ executable( sources: [ 'src/main.c', 'src/app.c', + 'src/app_state.c', 'src/tui.c', 'src/layout.c', ], diff --git a/src/app.c b/src/app.c index 4791ece..e4ee278 100644 --- a/src/app.c +++ b/src/app.c @@ -2,11 +2,15 @@ #include #include +#include #include int lardon3d_app_run(void) { + Lardon3DAppState state; + lardon3d_app_state_init(&state); + if (!setlocale(LC_ALL, "")) { return EXIT_FAILURE; } @@ -15,7 +19,7 @@ lardon3d_app_run(void) return EXIT_FAILURE; } - bool success = lardon3d_tui_run(); + bool success = lardon3d_tui_run(&state); lardon3d_tui_shutdown(); return success ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/src/app_state.c b/src/app_state.c new file mode 100644 index 0000000..39d804c --- /dev/null +++ b/src/app_state.c @@ -0,0 +1,17 @@ +#include + +void +lardon3d_app_state_init(Lardon3DAppState *state) +{ + if (!state) { + return; + } + + *state = (Lardon3DAppState) { + .screen = LARDON3D_SCREEN_HOME, + .running = true, + .project_loaded = false, + .project_name = "", + .status_message = "Bienvenue dans Lardon3D", + }; +} diff --git a/src/layout.c b/src/layout.c index 292cb6d..b925b32 100644 --- a/src/layout.c +++ b/src/layout.c @@ -35,13 +35,17 @@ draw_too_small(int rows, int columns) static void draw_frame(int rows, int columns) { + int journal_row = rows - 7; int footer_row = rows - 3; (void)box(stdscr, 0, 0); (void)mvhline(2, 1, ACS_HLINE, columns - 2); + (void)mvhline(journal_row, 1, ACS_HLINE, columns - 2); (void)mvhline(footer_row, 1, ACS_HLINE, columns - 2); (void)mvaddch(2, 0, ACS_LTEE); (void)mvaddch(2, columns - 1, ACS_RTEE); + (void)mvaddch(journal_row, 0, ACS_LTEE); + (void)mvaddch(journal_row, columns - 1, ACS_RTEE); (void)mvaddch(footer_row, 0, ACS_LTEE); (void)mvaddch(footer_row, columns - 1, ACS_RTEE); } @@ -83,22 +87,39 @@ screen_texts( } static void -draw_content(Lardon3DScreen screen, int rows, int columns) +draw_content(const Lardon3DAppState *state, int rows, int columns) { const char *title; const char *content; const char *footer; - screen_texts(screen, &title, &content, &footer); + screen_texts(state->screen, &title, &content, &footer); int title_length = (int)strlen(title); int content_length = (int)strlen(content); + int journal_row = rows - 7; + const char *project = state->project_loaded + ? state->project_name + : "Aucun projet chargé."; draw_text(1, (columns - title_length) / 2, title_length, title); - draw_text(rows / 2, (columns - content_length) / 2, content_length, content); + draw_text(3, 2, columns - 4, "Projet"); + draw_text(4, 4, columns - 6, project); + draw_text( + (3 + journal_row) / 2, + (columns - content_length) / 2, + content_length, + content + ); + draw_text(journal_row + 1, 2, columns - 4, "Journal"); + draw_text(journal_row + 2, 4, columns - 6, state->status_message); draw_text(rows - 2, 2, columns - 4, footer); } void -lardon3d_layout_draw(Lardon3DScreen screen, int rows, int columns) +lardon3d_layout_draw( + const Lardon3DAppState *state, + int rows, + int columns +) { (void)erase(); @@ -106,7 +127,7 @@ lardon3d_layout_draw(Lardon3DScreen screen, int rows, int columns) draw_too_small(rows, columns); } else { draw_frame(rows, columns); - draw_content(screen, rows, columns); + draw_content(state, rows, columns); } (void)refresh(); diff --git a/src/tui.c b/src/tui.c index 7308464..b57ffbe 100644 --- a/src/tui.c +++ b/src/tui.c @@ -5,12 +5,12 @@ #include static void -redraw(Lardon3DScreen screen) +redraw(const Lardon3DAppState *state) { int rows; int columns; getmaxyx(stdscr, rows, columns); - lardon3d_layout_draw(screen, rows, columns); + lardon3d_layout_draw(state, rows, columns); } bool @@ -30,16 +30,20 @@ lardon3d_tui_init(void) } bool -lardon3d_tui_run(void) +lardon3d_tui_run(Lardon3DAppState *state) { - Lardon3DScreen screen = LARDON3D_SCREEN_HOME; - redraw(screen); + if (!state) { + return false; + } - for (;;) { + redraw(state); + + while (state->running) { int key = getch(); if (key == 'q' || key == 'Q') { - return true; + state->running = false; + continue; } if (key == ERR) { return false; @@ -48,19 +52,19 @@ lardon3d_tui_run(void) bool should_redraw = true; switch (key) { case KEY_F(1): - screen = LARDON3D_SCREEN_HELP; + state->screen = LARDON3D_SCREEN_HELP; break; case KEY_F(2): - screen = LARDON3D_SCREEN_PROJECTS; + state->screen = LARDON3D_SCREEN_PROJECTS; break; case KEY_F(3): - screen = LARDON3D_SCREEN_IMPORT; + state->screen = LARDON3D_SCREEN_IMPORT; break; case KEY_F(4): - screen = LARDON3D_SCREEN_VIEWER; + state->screen = LARDON3D_SCREEN_VIEWER; break; case 27: - screen = LARDON3D_SCREEN_HOME; + state->screen = LARDON3D_SCREEN_HOME; break; case KEY_RESIZE: break; @@ -70,9 +74,11 @@ lardon3d_tui_run(void) } if (should_redraw) { - redraw(screen); + redraw(state); } } + + return true; } void