login

<     >

2020-12-29 18:45:49 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

ui: add header and basic scrolling

diff --git a/seqt.c b/seqt.c
index 2e0e6f9..beb54ad 100644
--- a/seqt.c
+++ b/seqt.c
@@ -3,11 +3,35 @@
 #include <stdlib.h>
 #include <stdio.h>
 
+#define TRACK_WIDTH 19
+
 int ntracks;
 char map[MAPSIZE][RECSIZE];
 Matrix matrix;
 
 void
+print_header(int hscroll, int tracks)
+{
+    char track_key[2] = " ";
+    char *track_name;
+    int t;
+    int min_track, max_track;
+    min_track = hscroll + 1;            /* inclusive */
+    max_track = hscroll + tracks + 1;   /* exclusive */
+    if (max_track > MAXTRACK)
+        max_track = MAXTRACK;
+    for (t = min_track; t < max_track; t++) {
+        *track_key = t < 10 ? '0' + t : 'A' + t - 10;
+        track_name = map_get('@', track_key);
+        if (track_name)
+            printf("|  %-*s", TRACK_WIDTH - 3, track_name);
+        else
+            printf("|%-*s", TRACK_WIDTH - 1, "");
+    }
+    printf("\n");
+}
+
+void
 print_blank()
 {
     int voice;
@@ -95,6 +119,9 @@ print_tracks(int vscroll, int lines, int hscroll, int tracks)
     }
 }
 
+#define PTRACKS     (term_size.ws_col / TRACK_WIDTH)
+#define PLINES      (term_size.ws_row - 2)
+
 int
 main(int argc, char *argv[])
 {
@@ -102,7 +129,9 @@ main(int argc, char *argv[])
     char *fname;
     struct termios term_prev;
     struct winsize term_size;
-    int running;
+    int hscroll, vscroll;
+    int curx, cury;
+    int running, redraw;
     char key;
     if (argc < 2) {
         fprintf(stderr, "usage:\n  %s file\n", argv[0]);
@@ -119,16 +148,47 @@ main(int argc, char *argv[])
     undo(matrix);
     redo(matrix);
     setup_terminal(&term_prev);
-    print_tracks(0, 10, 0, 3);
+    hscroll = vscroll = curx = cury = 0;
+    get_terminal_size(&term_size);
+    print_header(hscroll, PTRACKS);
+    print_tracks(vscroll, PLINES, hscroll, PTRACKS);
     running = 1;
     while (running) {
-        get_terminal_size(&term_size);
-        printf("%hux%hu      \r", term_size.ws_col, term_size.ws_row);
         key = getchar();
+        redraw = 0;
         switch (key) {
         case 'q':
             running = 0;
             break;
+        case 'H':
+            if (hscroll > 0) {
+                hscroll--;
+                redraw = 1;
+            }
+            break;
+        case 'J':
+            if (vscroll < MAXINDEX - PLINES - 1) {
+                vscroll++;
+                redraw = 1;
+            }
+            break;
+        case 'K':
+            if (vscroll > 0) {
+                vscroll--;
+                redraw = 1;
+            }
+            break;
+        case 'L':
+            if (hscroll < MAXTRACK - PTRACKS - 1) {
+                hscroll++;
+                redraw = 1;
+            }
+            break;
+        }
+        if (redraw) {
+            printf("\x1B[2J\x1B[H");
+            print_header(hscroll, PTRACKS);
+            print_tracks(vscroll, PLINES, hscroll, PTRACKS);
         }
     }
     restore_terminal(&term_prev);