about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--edit.mu110
1 files changed, 108 insertions, 2 deletions
diff --git a/edit.mu b/edit.mu
index 5264520a..466b7b42 100644
--- a/edit.mu
+++ b/edit.mu
@@ -476,7 +476,7 @@ recipe event-loop [
 ]
 
 recipe handle-event [
-  default-space:address:array:location <- new location:type, 40:literal
+  default-space:address:array:location <- new location:type, 50:literal
   screen:address <- next-ingredient
   console:address <- next-ingredient
   editor:address:editor-data <- next-ingredient
@@ -521,6 +521,8 @@ recipe handle-event [
   before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
   cursor-row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
   cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
+  screen-height:number <- screen-height screen:address
+  top:number <- get editor:address:editor-data/deref, top:offset
   # arrows; update cursor-row and cursor-column, leave before-cursor to 'render'.
   # right arrow
   {
@@ -563,7 +565,6 @@ recipe handle-event [
       cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1:literal
       cursor-column:address:number/deref <- copy 0:literal
       # todo: what happens when cursor is too far down?
-      screen-height:number <- screen-height screen:address
       above-screen-bottom?:boolean <- lesser-than cursor-row:address:number/deref, screen-height:number
       assert above-screen-bottom?:boolean, [unimplemented: moving past bottom of screen]
       reply
@@ -604,6 +605,30 @@ recipe handle-event [
     right:number <- get editor:address:editor-data/deref, right:offset
     cursor-column:address:number/deref <- subtract right:number, 1:literal  # leave room for wrap icon
   }
+  # down arrow
+  {
+    move-to-next-line?:boolean <- equal k:address:number/deref, 65516:literal/down-arrow
+    break-unless move-to-next-line?:boolean
+    # todo: support scrolling
+    already-at-bottom?:boolean <- greater-or-equal cursor-row:address:number/deref, screen-height:number
+    break-if already-at-bottom?:boolean
+#?     $print [moving down
+#? ] #? 1
+    cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1:literal
+    # that's it; render will adjust cursor-column as necessary
+  }
+  # up arrow
+  {
+    move-to-previous-line?:boolean <- equal k:address:number/deref, 65517:literal/up-arrow
+    break-unless move-to-previous-line?:boolean
+    # todo: support scrolling
+    already-at-top?:boolean <- lesser-or-equal cursor-row:address:number/deref, top:number
+    break-if already-at-top?:boolean
+#?     $print [moving up
+#? ] #? 1
+    cursor-row:address:number/deref <- subtract cursor-row:address:number/deref, 1:literal
+    # that's it; render will adjust cursor-column as necessary
+  }
 ]
 
 recipe move-cursor-in-editor [
@@ -1443,6 +1468,87 @@ scenario editor-moves-across-screen-lines-across-wrap-with-left-arrow [
   ]
 ]
 
+scenario editor-moves-to-previous-line-with-up-arrow [
+  assume-screen 10:literal/width, 5:literal/height
+  1:address:array:character <- new [abc
+def]
+  2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0:literal/top, 0:literal/left, 10:literal/right
+  assume-console [
+    left-click 1, 1
+    press 65517  # up arrow
+  ]
+  run [
+    event-loop screen:address, console:address, 2:address:editor-data
+    3:number <- get 2:address:editor-data/deref, cursor-row:offset
+    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+  ]
+  memory-should-contain [
+    3 <- 0
+    4 <- 1
+  ]
+]
+
+scenario editor-moves-to-next-line-with-down-arrow [
+  assume-screen 10:literal/width, 5:literal/height
+  1:address:array:character <- new [abc
+def]
+  2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0:literal/top, 0:literal/left, 10:literal/right
+  # cursor starts out at (0, 0)
+  assume-console [
+    press 65516  # down arrow
+  ]
+  run [
+    event-loop screen:address, console:address, 2:address:editor-data
+    3:number <- get 2:address:editor-data/deref, cursor-row:offset
+    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+  ]
+  # ..and ends at (1, 0)
+  memory-should-contain [
+    3 <- 1
+    4 <- 0
+  ]
+]
+
+scenario editor-adjusts-column-at-previous-line [
+  assume-screen 10:literal/width, 5:literal/height
+  1:address:array:character <- new [ab
+def]
+  2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0:literal/top, 0:literal/left, 10:literal/right
+  assume-console [
+    left-click 1, 3
+    press 65517  # up arrow
+  ]
+  run [
+    event-loop screen:address, console:address, 2:address:editor-data
+    3:number <- get 2:address:editor-data/deref, cursor-row:offset
+    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+  ]
+  memory-should-contain [
+    3 <- 0
+    4 <- 2
+  ]
+]
+
+scenario editor-adjusts-column-at-next-line [
+  assume-screen 10:literal/width, 5:literal/height
+  1:address:array:character <- new [abc
+de]
+  2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0:literal/top, 0:literal/left, 10:literal/right
+  assume-console [
+    left-click 0, 3
+    press 65516  # down arrow
+  ]
+  run [
+    event-loop screen:address, console:address, 2:address:editor-data
+    3:number <- get 2:address:editor-data/deref, cursor-row:offset
+    4:number <- get 2:address:editor-data/deref, cursor-column:offset
+  ]
+  memory-should-contain [
+    3 <- 1
+    4 <- 2
+  ]
+]
+
 scenario point-at-multiple-editors [
   assume-screen 10:literal/width, 5:literal/height
   # initialize an editor covering left half of screen