wip select/filter
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 7 Jan 2025 16:20:13 +0000 (17:20 +0100)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Tue, 7 Jan 2025 16:20:13 +0000 (17:20 +0100)
display.c
fm.c
function.c
function.h
type.h

index bfab30bb9cad551c905c33656c1c010bff691fbc..efee5a0b6eec5e6722d625b988035d2ecec8961d 100644 (file)
--- 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 cdcedea806fc98d433ad29e77b178a39c3b9512b..aab2046445ff4e2e4ab58de4f1dd02e087cb82c5 100644 (file)
--- 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 <curses.h>
 #include <stdio.h>
@@ -31,11 +31,11 @@ int yoffset = 2;
 int width = 0;
 
 char *help =
+    "alt Menu functions\n"
     "ret Enter directory\n"
     "tab Change pane\n"
     "<I> Page up\n"
     "<K> Page down\n"
-    "<h> Show help\n"
     "<i> Move up\n"
     "<j> Move left\n"
     "<k> Move down\n"
@@ -45,7 +45,7 @@ char *help =
     "<u> 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;
         }
     }
 
index daf59db6ddf3c38dd974b88e689084769ee0b616..f18804d8f3d519a69e86ee8e7a7822ab9aab2634 100644 (file)
@@ -1,4 +1,5 @@
 #include <dirent.h>
+#include <regex.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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: */
index d118fdd5328588c3020fd34a9a0e47d31977fcab..99be0a88d6bf5e6ecf29afaefc0bc74eef8bbcb3 100644 (file)
@@ -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 d4167bed7ac6eac37d072490c837ec88fcc61c7e..41bb2d3a581bda37290b1c46d15807ce79279022 100644 (file)
--- 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;