From 12c841da89d5f9dd7a4a081874193c6bcd2ab3fc Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Tue, 7 Jan 2025 17:20:13 +0100 Subject: [PATCH] wip select/filter --- display.c | 5 +++++ fm.c | 49 +++++++++++++++++++++++++++++++++++++------------ function.c | 24 ++++++++++++++++++++++++ function.h | 2 ++ type.h | 1 + 5 files changed, 69 insertions(+), 12 deletions(-) diff --git a/display.c b/display.c index bfab30b..efee5a0 100644 --- a/display.c +++ b/display.c @@ -239,8 +239,13 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in set_color ((j == index) ? bred : red); break; } + if (elem->selected) { + attron (A_BOLD); + attron (A_UNDERLINE); + } mvaddstr (win->yoffset + (j % n) - page, win->xoffset + (j / n) * win->width, elem->name); set_color (white); + attron (0); if (j == index) { win->index = i; } diff --git a/fm.c b/fm.c index cdcedea..aab2046 100644 --- a/fm.c +++ b/fm.c @@ -1,8 +1,8 @@ /* depend: */ /* cflags: */ -/* linker: debug.o display.o function.o -lcurses */ -/* doslnk: debug.o display.o function.o -lpdc~1 */ -/* winlnk: debug.o display.o function.o -lpdcurses */ +/* linker: debug.o display.o function.o -lcurses -lregex */ +/* doslnk: debug.o display.o function.o -lpdc~1 -lreg~1 */ +/* winlnk: debug.o display.o function.o -lpdcurses -lregex */ #include #include @@ -31,11 +31,11 @@ int yoffset = 2; int width = 0; char *help = + "alt Menu functions\n" "ret Enter directory\n" "tab Change pane\n" " Page up\n" " Page down\n" - " Show help\n" " Move up\n" " Move left\n" " Move down\n" @@ -45,7 +45,7 @@ char *help = " Status left\n" ; -char *menu = "Help View Edit Copy Move Rename Newdir Select Filter chmOd Quit"; +char *menu = "Help View Edit Copy Move Rename Delete Newdir Select Filter Xmod Quit"; int usage (int ret) { @@ -185,6 +185,7 @@ int main (int argc, char *argv[]) /* event loop */ int stop = 0; while (!stop) { + elem_t *current = NULL; menuwindow (winmenu, menu, &index_menu); @@ -209,7 +210,7 @@ int main (int argc, char *argv[]) displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i]); /* display info */ - elem_t *current = list[i]->tab + windir[i]->index; + current = list[i]->tab + windir[i]->index; if (current->uid == NULL) { getinfo (dirname[i], current); } @@ -253,12 +254,6 @@ int main (int argc, char *argv[]) page[pane]++; } break; - case 'h': - helpwindow (help, (width - strmaxlen (help, '\n')) / 2, 3 * yoffset); - while (getch () == ERR) { - usleep (200 * 1000); - } - break; case KEY_UP: case 'i': if (index_y[pane]> 0) { @@ -299,6 +294,36 @@ int main (int argc, char *argv[]) case 'u': index[pane]--; break; + case ALT_C: /* copy */ + break; + case ALT_D: /* delete */ + break; + case ALT_E: /* edit */ + break; + case ALT_F: /* filter */ + filterlist (list[pane], ".*\\.c"); + break; + case ALT_H: /* help */ + helpwindow (help, (width - strmaxlen (help, '\n')) / 2, 3 * yoffset); + while (getch () == ERR) { + usleep (200 * 1000); + } + break; + case ALT_M: /* move */ + break; + case ALT_N: /* new dir */ + break; + case ALT_Q: /* quit */ + break; + case ALT_R: /* rename */ + break; + case ALT_S: /* select */ + case ' ': + current = list[pane]->tab + windir[pane]->index; + current->selected = (current->selected) ? 0 : 1; + break; + case ALT_V: /* view */ + break; } } diff --git a/function.c b/function.c index daf59db..f18804d 100644 --- a/function.c +++ b/function.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -318,4 +319,27 @@ void freewindow (window_t *win) free (win); } + +int filterlist (list_t *list, char *regex) +{ + regex_t reegex; + int rc = regcomp (&reegex, regex, 0); + + int i; + for (i = 0; (i < list->nb) && (rc == 0); i++) { + elem_t *elem = list->tab + i; + switch (regexec (&reegex, elem->name, 0, NULL, 0)) { + case 0: + elem->selected = 1; + break; + case REG_NOMATCH: + elem->selected = 0; + break; + default: + rc = 1; + } + } + return rc; +} + /* vim: set ts=4 sw=4 et: */ diff --git a/function.h b/function.h index d118fdd..99be0a8 100644 --- a/function.h +++ b/function.h @@ -33,6 +33,8 @@ window_t *allocwindow (void); void freewindow (window_t *win); +int filterlist (list_t *list, char *regex); + #endif /* __FUNCTION_H__ */ /* vim: set ts=4 sw=4 et: */ diff --git a/type.h b/type.h index d4167be..41bb2d3 100644 --- a/type.h +++ b/type.h @@ -17,6 +17,7 @@ typedef struct { unsigned short mode; char *name; int nlk; + int selected; size_t size; type_t type; char *uid; -- 2.30.2