feat: add TUI screen state navigation

This commit is contained in:
fy59 2026-08-06 14:26:23 +02:00
parent 474831329d
commit 0168601e70
4 changed files with 99 additions and 50 deletions

View file

@ -1,8 +1,8 @@
#ifndef LARDON3D_LAYOUT_H #ifndef LARDON3D_LAYOUT_H
#define LARDON3D_LAYOUT_H #define LARDON3D_LAYOUT_H
#include <stdbool.h> #include <lardon3d/tui.h>
bool lardon3d_layout_draw(void); void lardon3d_layout_draw(Lardon3DScreen screen, int rows, int cols);
#endif #endif

View file

@ -3,6 +3,14 @@
#include <stdbool.h> #include <stdbool.h>
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_init(void);
bool lardon3d_tui_run(void); bool lardon3d_tui_run(void);
void lardon3d_tui_shutdown(void); void lardon3d_tui_shutdown(void);

View file

@ -1,5 +1,4 @@
#include <ncurses.h> #include <ncurses.h>
#include <stdbool.h>
#include <string.h> #include <string.h>
#include <lardon3d/layout.h> #include <lardon3d/layout.h>
@ -36,71 +35,79 @@ draw_too_small(int rows, int columns)
static void static void
draw_frame(int rows, int columns) draw_frame(int rows, int columns)
{ {
int middle_column = columns / 2;
int journal_row = rows / 2;
int footer_row = rows - 3; int footer_row = rows - 3;
(void)box(stdscr, 0, 0); (void)box(stdscr, 0, 0);
(void)mvhline(2, 1, ACS_HLINE, columns - 2); (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)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, 0, ACS_LTEE);
(void)mvaddch(2, middle_column, ACS_TTEE);
(void)mvaddch(2, columns - 1, ACS_RTEE); (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, 0, ACS_LTEE);
(void)mvaddch(footer_row, columns - 1, ACS_RTEE); (void)mvaddch(footer_row, columns - 1, ACS_RTEE);
} }
static void 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; *footer = "ESC Accueil F1 Aide F2 Projets F3 Import F4 Viewer Q Quit";
int journal_row = rows / 2;
draw_text(1, 2, middle_column - 3, "Lardon3D"); switch (screen) {
draw_text(1, columns - 7, 5, "Heure"); case LARDON3D_SCREEN_PROJECTS:
*title = "Projets";
draw_text(3, 2, middle_column - 3, "Projet"); *content = "Gestion des projets";
draw_text(5, 4, middle_column - 5, "Aucun projet chargé."); break;
case LARDON3D_SCREEN_IMPORT:
draw_text(3, middle_column + 2, columns - middle_column - 3, "Informations"); *title = "Import";
draw_text(5, middle_column + 4, columns - middle_column - 5, "Lardon3D"); *content = "Import des images";
draw_text(6, middle_column + 4, columns - middle_column - 5, "Reconstruction 3D"); break;
draw_text(7, middle_column + 4, columns - middle_column - 5, "Version 0.1"); case LARDON3D_SCREEN_VIEWER:
*title = "Viewer";
draw_text(journal_row + 1, 2, columns - 4, "Journal"); *content = "Le viewer Vulkan n'est pas encore disponible.";
draw_text(journal_row + 3, 4, columns - 6, "Bienvenue dans Lardon3D"); break;
case LARDON3D_SCREEN_HELP:
draw_text( *title = "Aide";
rows - 2, *content = "Raccourcis clavier.";
2, break;
columns - 4, case LARDON3D_SCREEN_HOME:
"F1 Aide F2 Projet F3 Import F4 Viewer Q Quit" default:
); *title = "Accueil";
*content = "Bienvenue dans Lardon3D";
*footer = "F1 Aide F2 Projets F3 Import F4 Viewer Q Quit";
break;
}
} }
bool static void
lardon3d_layout_draw(void) draw_content(Lardon3DScreen screen, int rows, int columns)
{ {
int rows; const char *title;
int columns; const char *content;
getmaxyx(stdscr, rows, columns); const char *footer;
screen_texts(screen, &title, &content, &footer);
int title_length = (int)strlen(title);
int content_length = (int)strlen(content);
if (erase() == ERR) { draw_text(1, (columns - title_length) / 2, title_length, title);
return false; 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) { if (rows < MINIMUM_ROWS || columns < MINIMUM_COLUMNS) {
draw_too_small(rows, columns); draw_too_small(rows, columns);
} else { } else {
draw_frame(rows, columns); draw_frame(rows, columns);
draw_content(rows, columns); draw_content(screen, rows, columns);
} }
return refresh() != ERR; (void)refresh();
} }

View file

@ -4,6 +4,15 @@
#include <lardon3d/layout.h> #include <lardon3d/layout.h>
#include <lardon3d/tui.h> #include <lardon3d/tui.h>
static void
redraw(Lardon3DScreen screen)
{
int rows;
int columns;
getmaxyx(stdscr, rows, columns);
lardon3d_layout_draw(screen, rows, columns);
}
bool bool
lardon3d_tui_init(void) lardon3d_tui_init(void)
{ {
@ -23,20 +32,45 @@ lardon3d_tui_init(void)
bool bool
lardon3d_tui_run(void) lardon3d_tui_run(void)
{ {
if (!lardon3d_layout_draw()) { Lardon3DScreen screen = LARDON3D_SCREEN_HOME;
return false; redraw(screen);
}
for (;;) { for (;;) {
int key = getch(); int key = getch();
if (key == 'q' || key == 'Q') { if (key == 'q' || key == 'Q') {
return true; return true;
} }
if (key == ERR) { if (key == ERR) {
return false; 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);
} }
} }
} }