From 0168601e70e931a665ffa89dbc50d5330e3a3c0c Mon Sep 17 00:00:00 2001 From: fy59 Date: Thu, 6 Aug 2026 14:26:23 +0200 Subject: [PATCH] feat: add TUI screen state navigation --- include/lardon3d/layout.h | 4 +- include/lardon3d/tui.h | 8 ++++ src/layout.c | 93 +++++++++++++++++++++------------------ src/tui.c | 44 +++++++++++++++--- 4 files changed, 99 insertions(+), 50 deletions(-) diff --git a/include/lardon3d/layout.h b/include/lardon3d/layout.h index 4ef2026..930fd07 100644 --- a/include/lardon3d/layout.h +++ b/include/lardon3d/layout.h @@ -1,8 +1,8 @@ #ifndef LARDON3D_LAYOUT_H #define LARDON3D_LAYOUT_H -#include +#include -bool lardon3d_layout_draw(void); +void lardon3d_layout_draw(Lardon3DScreen screen, int rows, int cols); #endif diff --git a/include/lardon3d/tui.h b/include/lardon3d/tui.h index 88de4ce..a00a082 100644 --- a/include/lardon3d/tui.h +++ b/include/lardon3d/tui.h @@ -3,6 +3,14 @@ #include +typedef enum { + LARDON3D_SCREEN_HOME = 0, + LARDON3D_SCREEN_PROJECTS, + LARDON3D_SCREEN_IMPORT, + LARDON3D_SCREEN_VIEWER, + LARDON3D_SCREEN_HELP +} Lardon3DScreen; + bool lardon3d_tui_init(void); bool lardon3d_tui_run(void); void lardon3d_tui_shutdown(void); diff --git a/src/layout.c b/src/layout.c index 6e16485..292cb6d 100644 --- a/src/layout.c +++ b/src/layout.c @@ -1,5 +1,4 @@ #include -#include #include #include @@ -36,71 +35,79 @@ draw_too_small(int rows, int columns) static void draw_frame(int rows, int columns) { - int middle_column = columns / 2; - int journal_row = rows / 2; 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)mvvline(3, middle_column, ACS_VLINE, journal_row - 3); - (void)mvaddch(2, 0, ACS_LTEE); - (void)mvaddch(2, middle_column, ACS_TTEE); (void)mvaddch(2, columns - 1, ACS_RTEE); - (void)mvaddch(journal_row, 0, ACS_LTEE); - (void)mvaddch(journal_row, middle_column, ACS_BTEE); - (void)mvaddch(journal_row, columns - 1, ACS_RTEE); (void)mvaddch(footer_row, 0, ACS_LTEE); (void)mvaddch(footer_row, columns - 1, ACS_RTEE); } static void -draw_content(int rows, int columns) +screen_texts( + Lardon3DScreen screen, + const char **title, + const char **content, + const char **footer +) { - int middle_column = columns / 2; - int journal_row = rows / 2; + *footer = "ESC Accueil F1 Aide F2 Projets F3 Import F4 Viewer Q Quit"; - draw_text(1, 2, middle_column - 3, "Lardon3D"); - draw_text(1, columns - 7, 5, "Heure"); - - draw_text(3, 2, middle_column - 3, "Projet"); - draw_text(5, 4, middle_column - 5, "Aucun projet chargé."); - - draw_text(3, middle_column + 2, columns - middle_column - 3, "Informations"); - draw_text(5, middle_column + 4, columns - middle_column - 5, "Lardon3D"); - draw_text(6, middle_column + 4, columns - middle_column - 5, "Reconstruction 3D"); - draw_text(7, middle_column + 4, columns - middle_column - 5, "Version 0.1"); - - draw_text(journal_row + 1, 2, columns - 4, "Journal"); - draw_text(journal_row + 3, 4, columns - 6, "Bienvenue dans Lardon3D"); - - draw_text( - rows - 2, - 2, - columns - 4, - "F1 Aide F2 Projet F3 Import F4 Viewer Q Quit" - ); + switch (screen) { + case LARDON3D_SCREEN_PROJECTS: + *title = "Projets"; + *content = "Gestion des projets"; + break; + case LARDON3D_SCREEN_IMPORT: + *title = "Import"; + *content = "Import des images"; + break; + case LARDON3D_SCREEN_VIEWER: + *title = "Viewer"; + *content = "Le viewer Vulkan n'est pas encore disponible."; + break; + case LARDON3D_SCREEN_HELP: + *title = "Aide"; + *content = "Raccourcis clavier."; + break; + case LARDON3D_SCREEN_HOME: + default: + *title = "Accueil"; + *content = "Bienvenue dans Lardon3D"; + *footer = "F1 Aide F2 Projets F3 Import F4 Viewer Q Quit"; + break; + } } -bool -lardon3d_layout_draw(void) +static void +draw_content(Lardon3DScreen screen, int rows, int columns) { - int rows; - int columns; - getmaxyx(stdscr, rows, columns); + const char *title; + const char *content; + const char *footer; + screen_texts(screen, &title, &content, &footer); + int title_length = (int)strlen(title); + int content_length = (int)strlen(content); - if (erase() == ERR) { - return false; - } + draw_text(1, (columns - title_length) / 2, title_length, title); + draw_text(rows / 2, (columns - content_length) / 2, content_length, content); + draw_text(rows - 2, 2, columns - 4, footer); +} + +void +lardon3d_layout_draw(Lardon3DScreen screen, int rows, int columns) +{ + (void)erase(); if (rows < MINIMUM_ROWS || columns < MINIMUM_COLUMNS) { draw_too_small(rows, columns); } else { draw_frame(rows, columns); - draw_content(rows, columns); + draw_content(screen, rows, columns); } - return refresh() != ERR; + (void)refresh(); } diff --git a/src/tui.c b/src/tui.c index ed98e9e..7308464 100644 --- a/src/tui.c +++ b/src/tui.c @@ -4,6 +4,15 @@ #include #include +static void +redraw(Lardon3DScreen screen) +{ + int rows; + int columns; + getmaxyx(stdscr, rows, columns); + lardon3d_layout_draw(screen, rows, columns); +} + bool lardon3d_tui_init(void) { @@ -23,20 +32,45 @@ lardon3d_tui_init(void) bool lardon3d_tui_run(void) { - if (!lardon3d_layout_draw()) { - return false; - } + Lardon3DScreen screen = LARDON3D_SCREEN_HOME; + redraw(screen); for (;;) { int key = getch(); + if (key == 'q' || key == 'Q') { return true; } if (key == ERR) { return false; } - if (key == KEY_RESIZE && !lardon3d_layout_draw()) { - return false; + + bool should_redraw = true; + switch (key) { + case KEY_F(1): + screen = LARDON3D_SCREEN_HELP; + break; + case KEY_F(2): + screen = LARDON3D_SCREEN_PROJECTS; + break; + case KEY_F(3): + screen = LARDON3D_SCREEN_IMPORT; + break; + case KEY_F(4): + screen = LARDON3D_SCREEN_VIEWER; + break; + case 27: + screen = LARDON3D_SCREEN_HOME; + break; + case KEY_RESIZE: + break; + default: + should_redraw = false; + break; + } + + if (should_redraw) { + redraw(screen); } } }