add arrows and percentage in view mode
authorLaurent Mazet <mazet@softndesign.org>
Sun, 19 Jan 2025 15:15:16 +0000 (16:15 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 19 Jan 2025 15:15:16 +0000 (16:15 +0100)
display.c
fm.c

index d4d4d471a78f924ab335f1c3475f464ed1e5bc06..1d374bff6498b5cc7911cd3a38cefb93dffc2eb2 100644 (file)
--- a/display.c
+++ b/display.c
@@ -515,16 +515,39 @@ char *filewindow (char *name, window_t *win)
     }
     char **lines = splitlines (buffer, win->xsize);
     free (buffer);
+    int len = 0;
+    while (lines[len] != NULL) {
+        len++;
+    }
+    char *basename = strrchr (name, *SEPARATOR);
+    basename = (basename) ? basename + 1 : name;
 
-    char *title = strdupcat ("File: ", name, NULL);
     set_color (black);
-    _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
-    _displaytitle (title, win->xoffset, win->yoffset, win->xsize);
-
     int skip  = 0;
     int stop = 0;
     while (!stop) {
         int i, j;
+
+        _dobound (win->xsize, win->ysize, win->xoffset, win->yoffset);
+
+        char percent[4] = {' ', ' ', ' ', 0};
+        int ratio = (skip + win->ysize > len) ? 100 : 100 * (skip + win->ysize) / len;
+        for (i = 2; (i >= 0) && (ratio > 0); i--, ratio /= 10) {
+            percent[i] = '0' + (ratio % 10);
+        }
+        char *title = strdupcat (" File: ", name, " ", percent, "% ", NULL);
+        mvaddstr (win->yoffset - 1, win->xoffset + (win->xsize - strlen (title)) / 2, title);
+        free (title);
+
+        if (skip > 0) {
+            mvaddch (win->yoffset - 1, win->xoffset - 1, ACS_UARROW);
+            mvaddch (win->yoffset - 1, win->xsize + win->xoffset, ACS_UARROW);
+        }
+        if (skip + win->ysize < len) {
+            mvaddch (win->ysize + win->yoffset, win->xoffset - 1, ACS_DARROW);
+            mvaddch (win->ysize + win->yoffset, win->xsize + win->xoffset, ACS_DARROW);
+        }
+
         int eol = 0;
         for (i = 0; i < win->ysize; i++) {
             for (j = 0; j < win->xsize; j++) {
@@ -555,7 +578,7 @@ char *filewindow (char *name, window_t *win)
             break;
         case 'k':
         case KEY_DOWN:
-            if (lines[skip + 1] != NULL) {
+            if (skip + win->ysize < len) {
                 skip++;
             }
             break;
@@ -564,7 +587,6 @@ char *filewindow (char *name, window_t *win)
     set_color (white);
 
     freelines (lines);
-    free (title);
 
     return NULL;
 }
diff --git a/fm.c b/fm.c
index 2c9776fe1f0109c482482e61ca5930aea30af594..7ed231034f00eb37bd50f9dcdb890a8b338cbd21 100644 (file)
--- a/fm.c
+++ b/fm.c
@@ -432,21 +432,23 @@ int main (int argc, char *argv[])
                 break;
             case ALT_V: /* view */
                 current = list[panel]->tab + windir[panel]->index;
-                for (i = 0; i < MAXPANELS; i++) {
-                    elementwindow (winelem[i], "", NULL);
-                }
-                menuwindow (winmenu, "Help up(I) down(J) Quit", NULL);
-                elementwindow (winelem[0], current->name, NULL);
-                {
+                if (strcmp (current->name, "..") != 0) {
+                    for (i = 0; i < MAXPANELS; i++) {
+                        elementwindow (winelem[i], "", NULL);
+                    }
+                    menuwindow (winmenu, "Help up(I) down(J) Quit", NULL);
                     char *src = newfilename (dirname[panel], current->name);
+                    char *status = strdupcat ("Viewing file '", src, "'", NULL);
+                    elementwindow (winelem[0], status, NULL);
+                    free (status);
                     char *msg = filewindow (src, winscreen);
                     if (msg) {
                         errorwindow (msg, winscreen);
                         free (msg);
                     }
                     free (src);
+                    menuwindow (winmenu, menu, &index_menu);
                 }
-                menuwindow (winmenu, menu, &index_menu);
                 break;
             case ALT_X: /* chmod */
                 string = getwindow ("Change selected file(s) to mode", winscreen, 4, 4, "0644");