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
|
#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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
91
src/layout.c
91
src/layout.c
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
44
src/tui.c
44
src/tui.c
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue