feat: add TUI screen state navigation
This commit is contained in:
parent
474831329d
commit
0168601e70
4 changed files with 99 additions and 50 deletions
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef 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
|
||||
|
|
|
|||
|
|
@ -3,6 +3,14 @@
|
|||
|
||||
#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_run(void);
|
||||
void lardon3d_tui_shutdown(void);
|
||||
|
|
|
|||
91
src/layout.c
91
src/layout.c
|
|
@ -1,5 +1,4 @@
|
|||
#include <ncurses.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <lardon3d/layout.h>
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
44
src/tui.c
44
src/tui.c
|
|
@ -4,6 +4,15 @@
|
|||
#include <lardon3d/layout.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
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue