about summary refs log tree commit diff stats
path: root/apps
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-12-05 21:01:30 -0800
committerKartik Agaram <vc@akkartik.com>2020-12-05 21:01:30 -0800
commit5c46d55532d1e0bfb3fd58e4684380feab509e7a (patch)
treea95fd2e38b69c2ffab18a663bc0872f8f74ef705 /apps
parent4ef29dc9d537402cd58c260638e0536d0967457e (diff)
downloadmu-5c46d55532d1e0bfb3fd58e4684380feab509e7a.tar.gz
7338 - tile: architecture starting to crystallize
In particular, I'm starting to have opinions about how to scalably position
the cursor at the end of each frame.

One advantage of text mode without a pointer device (mouse/trackpad): only
one cursor to track. UI can't be modified anywhere. That simplifies any
reactive UI framework.
Diffstat (limited to 'apps')
-rw-r--r--apps/tile/data.mu2
-rw-r--r--apps/tile/environment.mu73
2 files changed, 54 insertions, 21 deletions
diff --git a/apps/tile/data.mu b/apps/tile/data.mu
index dada0b5b..2e18908c 100644
--- a/apps/tile/data.mu
+++ b/apps/tile/data.mu
@@ -3,6 +3,8 @@ type sandbox {
   data: (handle line)
   # display data
   cursor-call-path: (handle call-path-element)
+  cursor-row: int
+  cursor-col: int
   expanded-words: (handle call-path)
   partial-name-for-cursor-word: (handle word)  # only when renaming word
   partial-name-for-function: (handle word)  # only when defining function
diff --git a/apps/tile/environment.mu b/apps/tile/environment.mu
index 6772c6c9..7fd01230 100644
--- a/apps/tile/environment.mu
+++ b/apps/tile/environment.mu
@@ -1,3 +1,18 @@
+# The architecture that seems to be crystallizing: the environment has two
+# areas: functions and sandbox.
+#
+# Rendering the environment requires rendering all areas.
+# Displaying the cursor requires displaying cursor for the area controlling the cursor.
+# Processing events for the environment requires processing events for the area controlling the cursor.
+#
+# Areas can have dialogs.
+# There can also be global dialogs (currently just one: goto function).
+# Areas are responsible for rendering their dialogs.
+# In practice this results in dialogs encapsulating the state they need to
+# decide whether to render.
+#
+# This will be useful if we add more areas in the future.
+
 type environment {
   screen: (handle screen)
   functions: (handle function)
@@ -1085,6 +1100,17 @@ fn render _env: (addr environment) {
 #?   print-string 0, "render-sandbox }\n"
   # dialogs
   render-goto-dialog screen, env
+  #
+  position-cursor screen, env
+}
+
+fn position-cursor screen: (addr screen), _env: (addr environment) {
+  var env/eax: (addr environment) <- copy _env
+  var cursor-sandbox-ah/eax: (addr handle sandbox) <- get env, cursor-sandbox
+  var cursor-sandbox/eax: (addr sandbox) <- lookup *cursor-sandbox-ah
+  var cursor-row/ecx: (addr int) <- get cursor-sandbox, cursor-row
+  var cursor-col/eax: (addr int) <- get cursor-sandbox, cursor-col
+  move-cursor screen, *cursor-row, *cursor-col
 }
 
 fn render-goto-dialog screen: (addr screen), _env: (addr environment) {
@@ -1135,13 +1161,11 @@ fn render-sandbox screen: (addr screen), functions: (addr handle function), bind
   #
   var curr-row/edx: int <- copy top-row
   # cursor row, col
-  var cursor-row: int
   var cursor-row-addr: (addr int)
-  var tmp/eax: (addr int) <- address cursor-row
+  var tmp/eax: (addr int) <- get sandbox, cursor-row
   copy-to cursor-row-addr, tmp
-  var cursor-col: int
   var cursor-col-addr: (addr int)
-  tmp <- address cursor-col
+  tmp <- get sandbox, cursor-col
   copy-to cursor-col-addr, tmp
   # render all but final line without stack
 #?   print-string 0, "render all but final line\n"
@@ -1165,9 +1189,8 @@ fn render-sandbox screen: (addr screen), functions: (addr handle function), bind
   #
   render-final-line-with-stack screen, functions, bindings, sandbox, curr-row, left-col, cursor-row-addr, cursor-col-addr
   # at most one of the following dialogs will be rendered
-  render-rename-dialog screen, sandbox, cursor-row, cursor-col
-  render-define-dialog screen, sandbox, cursor-row, cursor-col
-  move-cursor screen, cursor-row, cursor-col
+  render-rename-dialog screen, sandbox
+  render-define-dialog screen, sandbox
 }
 
 fn render-final-line-with-stack screen: (addr screen), functions: (addr handle function), bindings: (addr table), _sandbox: (addr sandbox), top-row: int, left-col: int, cursor-row-addr: (addr int), cursor-col-addr: (addr int) {
@@ -1222,20 +1245,22 @@ fn final-line _sandbox: (addr sandbox), out: (addr handle line) {
   copy-object curr-line-ah, out
 }
 
-fn render-rename-dialog screen: (addr screen), _sandbox: (addr sandbox), cursor-row: int, cursor-col: int {
+fn render-rename-dialog screen: (addr screen), _sandbox: (addr sandbox) {
   var sandbox/edi: (addr sandbox) <- copy _sandbox
   var rename-word-mode-ah?/ecx: (addr handle word) <- get sandbox, partial-name-for-cursor-word
   var rename-word-mode?/eax: (addr word) <- lookup *rename-word-mode-ah?
   compare rename-word-mode?, 0  # false
   break-if-=
   # clear a space for the dialog
-  var top-row/eax: int <- copy cursor-row
+  var cursor-row/ebx: (addr int) <- get sandbox, cursor-row
+  var top-row/eax: int <- copy *cursor-row
   top-row <- subtract 3
-  var bottom-row/ecx: int <- copy cursor-row
+  var bottom-row/ecx: int <- copy *cursor-row
   bottom-row <- add 3
-  var left-col/edx: int <- copy cursor-col
+  var cursor-col/ebx: (addr int) <- get sandbox, cursor-col
+  var left-col/edx: int <- copy *cursor-col
   left-col <- subtract 0x10
-  var right-col/ebx: int <- copy cursor-col
+  var right-col/ebx: int <- copy *cursor-col
   right-col <- add 0x10
   clear-rect screen, top-row, left-col, bottom-row, right-col
   draw-box screen, top-row, left-col, bottom-row, right-col
@@ -1254,30 +1279,34 @@ fn render-rename-dialog screen: (addr screen), _sandbox: (addr sandbox), cursor-
   reset-formatting screen
   print-string screen, " rename  "
   # draw the word, positioned appropriately around the cursor
-  var start-col/ecx: int <- copy cursor-col
+  var cursor-col/ebx: (addr int) <- get sandbox, cursor-col
+  var start-col/ecx: int <- copy *cursor-col
   var word-ah?/edx: (addr handle word) <- get sandbox, partial-name-for-cursor-word
   var word/eax: (addr word) <- lookup *word-ah?
   var cursor-index/eax: int <- cursor-index word
   start-col <- subtract cursor-index
-  move-cursor screen, cursor-row, start-col
+  var cursor-row/ebx: (addr int) <- get sandbox, cursor-row
+  move-cursor screen, *cursor-row, start-col
   var word/eax: (addr word) <- lookup *word-ah?
   print-word screen, word
 }
 
-fn render-define-dialog screen: (addr screen), _sandbox: (addr sandbox), cursor-row: int, cursor-col: int {
+fn render-define-dialog screen: (addr screen), _sandbox: (addr sandbox) {
   var sandbox/edi: (addr sandbox) <- copy _sandbox
   var define-function-mode-ah?/ecx: (addr handle word) <- get sandbox, partial-name-for-function
   var define-function-mode?/eax: (addr word) <- lookup *define-function-mode-ah?
   compare define-function-mode?, 0  # false
   break-if-=
   # clear a space for the dialog
-  var top-row/eax: int <- copy cursor-row
+  var cursor-row/ebx: (addr int) <- get sandbox, cursor-row
+  var top-row/eax: int <- copy *cursor-row
   top-row <- subtract 3
-  var bottom-row/ecx: int <- copy cursor-row
+  var bottom-row/ecx: int <- copy *cursor-row
   bottom-row <- add 3
-  var left-col/edx: int <- copy cursor-col
+  var cursor-col/ebx: (addr int) <- get sandbox, cursor-col
+  var left-col/edx: int <- copy *cursor-col
   left-col <- subtract 0x10
-  var right-col/ebx: int <- copy cursor-col
+  var right-col/ebx: int <- copy *cursor-col
   right-col <- add 0x10
   clear-rect screen, top-row, left-col, bottom-row, right-col
   draw-box screen, top-row, left-col, bottom-row, right-col
@@ -1296,12 +1325,14 @@ fn render-define-dialog screen: (addr screen), _sandbox: (addr sandbox), cursor-
   reset-formatting screen
   print-string screen, " define  "
   # draw the word, positioned appropriately around the cursor
-  var start-col/ecx: int <- copy cursor-col
+  var cursor-col/ebx: (addr int) <- get sandbox, cursor-col
+  var start-col/ecx: int <- copy *cursor-col
   var word-ah?/edx: (addr handle word) <- get sandbox, partial-name-for-function
   var word/eax: (addr word) <- lookup *word-ah?
   var cursor-index/eax: int <- cursor-index word
   start-col <- subtract cursor-index
-  move-cursor screen, cursor-row, start-col
+  var cursor-row/ebx: (addr int) <- get sandbox, cursor-row
+  move-cursor screen, *cursor-row, start-col
   var word/eax: (addr word) <- lookup *word-ah?
   print-word screen, word
 }