From f4d3f461b242a1af31a320b59e32c921ae8610b2 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Mon, 6 Jan 2025 23:17:33 +0100 Subject: [PATCH] add menu --- display.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ display.h | 2 ++ fm.c | 12 ++++++++++++ 3 files changed, 60 insertions(+) diff --git a/display.c b/display.c index 348723f..bfab30b 100644 --- a/display.c +++ b/display.c @@ -16,6 +16,12 @@ typedef enum { cyan, magenta, yellow, + ired, + igreen, + iblue, + icyan, + imagenta, + iyellow, bred, bgreen, bblue, @@ -43,6 +49,12 @@ void set_color (color_t color) init_pair (magenta, COLOR_MAGENTA, COLOR_BLACK); init_pair (yellow, COLOR_YELLOW, COLOR_BLACK); init_pair (cyan, COLOR_CYAN, COLOR_BLACK); + init_pair (ired, COLOR_RED, COLOR_WHITE); + init_pair (igreen, COLOR_GREEN, COLOR_WHITE); + init_pair (iblue, COLOR_BLUE, COLOR_WHITE); + init_pair (imagenta, COLOR_MAGENTA, COLOR_WHITE); + init_pair (iyellow, COLOR_YELLOW, COLOR_WHITE); + init_pair (icyan, COLOR_CYAN, COLOR_WHITE); init_pair (bred, COLOR_BLACK, COLOR_RED); init_pair (bgreen, COLOR_BLACK, COLOR_GREEN); init_pair (bblue, COLOR_BLACK, COLOR_BLUE); @@ -131,6 +143,40 @@ int helpwindow (char *msg, int xoffset, int yoffset) return j; } +void menuwindow (window_t *win, char *menu, int *index) +{ + int i; + set_color (black); + for (i = 0; i < win->xsize; i++) { + mvaddch (win->yoffset, win->xoffset + i, ' '); + } + + if (*index < 0) { + *index = 0; + } + if ((int)strlen (menu) - *index < win->xsize) { + *index = strlen (menu) - win->xsize; + } + if (*index < 0) { + *index = 0; + } + + for (i = 0; (i < win->xsize) && (menu[*index + i] != 0); i++) { + set_color (((menu[*index + i] >= 'A') && (menu[*index + i] <= 'Z')) ? iblue : black); + mvaddch (win->yoffset, win->xoffset + i, menu[*index + i]); + } + set_color (white); + + set_color (blue); + if (*index > 0) { + mvaddch (win->yoffset, win->xoffset, ACS_LARROW); + } + if ((int)strlen (menu) - *index > win->xsize) { + mvaddch (win->yoffset, win->xoffset + win->xsize - 1, ACS_RARROW); + } + set_color (white); +} + void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y) { int i, j; diff --git a/display.h b/display.h index d113f3b..12831c5 100644 --- a/display.h +++ b/display.h @@ -8,6 +8,8 @@ int helpwindow (char *msg, int xoffset, int yoffset); +void menuwindow (window_t *win, char *status, int *index); + void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y); void elementwindow (window_t *win, char *status, int *index); diff --git a/fm.c b/fm.c index 9e213d2..cdcedea 100644 --- a/fm.c +++ b/fm.c @@ -45,6 +45,8 @@ char *help = " Status left\n" ; +char *menu = "Help View Edit Copy Move Rename Newdir Select Filter chmOd Quit"; + int usage (int ret) { FILE *fd = ret ? stderr : stdout; @@ -145,6 +147,13 @@ int main (int argc, char *argv[]) width = COLS; } + /* init menu window */ + window_t *winmenu = allocwindow (); + winmenu->xoffset = 0; + winmenu->xsize = width; + winmenu->yoffset = 0; + winmenu->ysize = 1; + /* init pane windows */ window_t *windir[MAXPANES] = {0}; for (i = 0; i < MAXPANES; i++) { @@ -166,6 +175,7 @@ int main (int argc, char *argv[]) winelem[i]->ysize = 1; } + int index_menu = 0; int index[MAXPANES] = {0}; int index_x[MAXPANES] = {0}; int index_y[MAXPANES] = {0}; @@ -176,6 +186,8 @@ int main (int argc, char *argv[]) int stop = 0; while (!stop) { + menuwindow (winmenu, menu, &index_menu); + /* display panes */ for (i = 0; i < MAXPANES; i++) { if (list[i] == NULL) { -- 2.30.2