about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-02-26 15:15:24 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-26 15:15:24 -0800
commitc93ff8ffb3811a690c8aafed55e7a6eb2d8a3544 (patch)
tree8c624eadc52a254966d9774ab47957cac2ee37ae
parent4e64c5418b64d53163346939664a8e5ef9145130 (diff)
downloadmu-c93ff8ffb3811a690c8aafed55e7a6eb2d8a3544.tar.gz
837 - pagination in the trace browser
Still not finished; we're maybe halfway through the necessary tests.
-rw-r--r--trace.arc.t81
-rw-r--r--trace.mu67
2 files changed, 123 insertions, 25 deletions
diff --git a/trace.arc.t b/trace.arc.t
index 53e14da6..5df9f533 100644
--- a/trace.arc.t
+++ b/trace.arc.t
@@ -537,5 +537,86 @@ schedule:  done with routine")
             "+ main/ 2 : 4 => ((3 integer))                                        "))
   (prn "F - process-key: navigation moves between top-level lines only"))
 
+;; manage screen height
+
+(reset)
+(new-trace "trace-paginate")
+(add-code:readfile "trace.mu")
+(add-code
+  '((function! main [
+      (default-space:space-address <- new space:literal 30:literal/capacity)
+      (x:string-address <- new
+"run: main 0: a b c
+mem: 0 a
+run: main 1: d e f
+mem: 1 a
+mem: 1 b
+mem: 1 c
+run: main 2: g hi
+run: main 3: j
+mem: 3 a
+run: main 4: k
+run: main 5: l
+run: main 6: m
+run: main 7: n
+run: main 8: o")
+      (s:stream-address <- init-stream x:string-address)
+      (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
+      (len:integer <- length traces:instruction-trace-address-array-address/deref)
+      (2:terminal-address/raw <- init-fake-terminal 17:literal 15:literal)
+      (3:space-address/raw/screen-state <- screen-state traces:instruction-trace-address-array-address 3:literal/screen-height)
+      (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw)
+      (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
+    ])))
+(run 'main)
+(each routine completed-routines*
+  (awhen rep.routine!error
+    (prn "error - " it)))
+; screen shows a subset of collapsed trace lines
+(when (~screen-contains memory*.4 17
+         (+ "+ main/ 0 : a b c"
+            "+ main/ 1 : d e f"
+            "+ main/ 2 : g hi "))
+  (prn "F - print-traces-collapsed can show just one 'page' of a larger trace"))
+; expand top line
+(run-code main2
+  (default-space:space-address <- new space:literal 30:literal/capacity)
+  (s:string-address <- new "kkk\n")
+  (k:keyboard-address <- init-keyboard s:string-address)
+  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+  )
+; screen shows just first trace line fully expanded
+(when (~screen-contains memory*.4 17
+         (+ "- main/ 0 : a b c"
+            "   mem : 0 a     "
+            "+ main/ 1 : d e f"
+            "                 "))
+  (prn "F - expanding doesn't print past end of page"))
+; expand line below without first collapsing previously expanded line
+(run-code main3
+  (default-space:space-address <- new space:literal 30:literal/capacity)
+  (s:string-address <- new "j\n")
+  (k:keyboard-address <- init-keyboard s:string-address)
+  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+  )
+; screen shows part of the second trace line expanded
+(when (~screen-contains memory*.4 17
+         (+ "+ main/ 0 : a b c"
+            "- main/ 1 : d e f"
+            "   mem : 1 a     "
+            "                 "
+            "                 "))
+  (prn "F - expanding below expanded line respects screen/page height"))
+
+; todo
+;   respect screen height expanding and collapsing below
+;   pgup/pgdn to navigate pages (minimize up/down responsibilities for performance)
+;   expanded trace straddles page boundary
+;   what if entire page is within an expanded trace?
+
 (reset)
 ;? (print-times) ;? 2
diff --git a/trace.mu b/trace.mu
index eb25395d..ba68a484 100644
--- a/trace.mu
+++ b/trace.mu
@@ -124,7 +124,7 @@
   (default-space:space-address <- new space:literal 30:literal)
   (screen:terminal-address <- next-input)
   (x:instruction-trace-address <- next-input)
-  (screen-state:space-address <- next-input)
+  (0:space-address/names:screen-state <- next-input)
   (clear-line screen:terminal-address)
   (print-character screen:terminal-address ((#\- literal)))
   (print-character screen:terminal-address ((#\space literal)))
@@ -151,7 +151,7 @@
   (print-character screen:terminal-address ((#\space literal)))
   (i:string-address <- get x:instruction-trace-address/deref instruction:offset)
   (print-string screen:terminal-address i:string-address)
-  (add-line screen-state:space-address screen:terminal-address)
+  (add-line 0:space-address/screen-state screen:terminal-address)
   ; print children
   (ch:trace-address-array-address <- get x:instruction-trace-address/deref children:offset)
   (i:integer <- copy 0:literal)
@@ -162,14 +162,18 @@
   }
   (len:integer <- length ch:trace-address-array-address/deref)
   { begin
+    ; until done with trace
     (done?:boolean <- greater-or-equal i:integer len:integer)
     (break-if done?:boolean)
+    ; or screen ends
+    (screen-done?:boolean <- greater-or-equal cursor-row:integer/space:1 screen-height:integer/space:1)
+    (break-if screen-done?:boolean)
     (t:trace-address <- index ch:trace-address-array-address/deref i:integer)
     (print-character screen:terminal-address ((#\space literal)))
     (print-character screen:terminal-address ((#\space literal)))
     (print-character screen:terminal-address ((#\space literal)))
     (print-trace screen:terminal-address t:trace-address)
-    (add-line screen-state:space-address screen:terminal-address)
+    (add-line 0:space-address/screen-state screen:terminal-address)
     (i:integer <- add i:integer 1:literal)
     (loop)
   }
@@ -336,6 +340,13 @@
   { begin
     (at-bottom?:boolean <- greater-or-equal cursor-row:integer/space:1 printed-height:integer/space:1)
     (break-unless at-bottom?:boolean)
+    { begin
+      (screen-full?:boolean <- greater-or-equal app-height:integer/space:1 screen-height:integer/space:1)
+      (break-unless screen-full?:boolean)
+      (cursor-to-next-line screen:terminal-address)
+      (cursor-up screen:terminal-address)
+      (reply)
+    }
     (printed-height:integer/space:1 <- add printed-height:integer/space:1 1:literal)
     ; update app-height if necessary
     { begin
@@ -360,27 +371,32 @@
   (default-space:space-address <- new space:literal 30:literal/capacity)
   (0:space-address/names:screen-state <- next-input)
   (screen:terminal-address <- next-input)
-  (i:integer <- next-input)
+  (trace-index:integer <- next-input)
   (len:integer <- length traces:instruction-trace-address-array-address/space:1/deref)
+  (height:integer <- min len:integer screen-height:integer/space:1)
   ; print remaining traces collapsed
   { begin
-    (done?:boolean <- greater-or-equal i:integer len:integer)
-    (break-if done?:boolean)
-    (tr:instruction-trace-address <- index traces:instruction-trace-address-array-address/space:1/deref i:integer)
+    ; until trace ends
+    (trace-done?:boolean <- greater-or-equal trace-index:integer len:integer)
+    (break-if trace-done?:boolean)
+    ; or screen ends
+    (screen-done?:boolean <- greater-or-equal cursor-row:integer/space:1 screen-height:integer/space:1)
+    (break-if screen-done?:boolean)
+    ; continue printing trace lines
+    (tr:instruction-trace-address <- index traces:instruction-trace-address-array-address/space:1/deref trace-index:integer)
     (print-instruction-trace-collapsed screen:terminal-address tr:instruction-trace-address 0:space-address/screen-state)
-    (i:integer <- add i:integer 1:literal)
+    (trace-index:integer <- add trace-index:integer 1:literal)
     (loop)
   }
   ; empty any remaining lines
-;?   ($print i:integer) ;? 1
+;?   ($print trace-index:integer) ;? 1
 ;?   ($print ((#\space literal))) ;? 1
 ;?   ($print app-height:integer/space:1) ;? 1
   { begin
-    (done?:boolean <- greater-or-equal i:integer app-height:integer/space:1)
+    (done?:boolean <- greater-or-equal cursor-row:integer/space:1 app-height:integer/space:1)
     (break-if done?:boolean)
     (clear-line screen:terminal-address)
     (down 0:space-address/screen-state screen:terminal-address)
-    (i:integer <- add i:integer 1:literal)
     (loop)
   }
 ])
@@ -540,18 +556,19 @@
 (function main [
   (default-space:space-address <- new space:literal 30:literal/capacity)
   (x:string-address <- new
-"schedule: main
-run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
-run: main 0: 1 => ((1 integer))
-mem: ((1 integer)): 1 <= 1
-run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
-run: main 1: 3 => ((2 integer))
-mem: ((2 integer)): 2 <= 3
-run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
-mem: ((1 integer)) => 1
-mem: ((2 integer)) => 3
-run: main 2: 4 => ((3 integer))
-mem: ((3 integer)): 3 <= 4
-schedule:  done with routine")
-  (browse-trace x:string-address)
+"run: main 0: a b c
+mem: 0
+run: main 1: d e f
+mem: 1
+mem: 1
+mem: 1
+run: main 2: g hi
+run: main 3: j
+mem: 3
+run: main 4: k
+run: main 5: l
+run: main 6: m
+run: main 7: n
+run: main 8: o")
+  (browse-trace x:string-address 5:literal/screen-height)
 ])