about summary refs log tree commit diff stats
path: root/edit.mu
diff options
context:
space:
mode:
Diffstat (limited to 'edit.mu')
-rw-r--r--edit.mu65
1 files changed, 49 insertions, 16 deletions
diff --git a/edit.mu b/edit.mu
index c210f4a1..a9c87114 100644
--- a/edit.mu
+++ b/edit.mu
@@ -2671,13 +2671,20 @@ recipe move-to-next-line [
   last-line:number <- subtract screen-height, 1
   already-at-bottom?:boolean <- greater-or-equal *cursor-row, last-line
   {
-    # if cursor not at top, move it
+    # if cursor not at bottom, move it
     break-if already-at-bottom?
     # scan to start of next line, then to right column or until end of line
     max:number <- subtract right, left
     next-line:address:duplex-list <- before-start-of-next-line *before-cursor, max
-    no-motion?:boolean <- equal next-line, *before-cursor
-    reply-if no-motion?, editor/same-as-ingredient:0, 0/no-more-render
+    {
+      # already at end of buffer? try to scroll up (so we can see more
+      # warnings or sandboxes below)
+      no-motion?:boolean <- equal next-line, *before-cursor
+      break-unless no-motion?
+      scroll?:boolean <- greater-than *cursor-row, 1
+      break-if scroll?, +try-to-scroll:label
+      reply editor/same-as-ingredient:0, 0/no-more-render
+    }
     *cursor-row <- add *cursor-row, 1
     *before-cursor <- copy next-line
     target-column:number <- copy *cursor-column
@@ -2697,12 +2704,9 @@ recipe move-to-next-line [
     }
     reply editor/same-as-ingredient:0, 0/no-more-render
   }
-  {
-    # if cursor already at top, scroll up
-    break-unless already-at-bottom?
-    +scroll-down
-    reply editor/same-as-ingredient:0, 1/go-render
-  }
+  +try-to-scroll
+  +scroll-down
+  reply editor/same-as-ingredient:0, 1/go-render
 ]
 
 scenario editor-adjusts-column-at-next-line [
@@ -2741,13 +2745,14 @@ de]
   ]
 ]
 
-scenario editor-stops-at-end-on-down-arrow [
+scenario editor-scrolls-at-end-on-down-arrow [
   assume-screen 10/width, 5/height
   1:address:array:character <- new [abc
 de]
   2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0/left, 10/right
   editor-render screen, 2:address:editor-data
   $clear-trace
+  # try to move down past end of text
   assume-console [
     left-click 2, 0
     press down-arrow
@@ -2757,11 +2762,11 @@ de]
     3:number <- get *2:address:editor-data, cursor-row:offset
     4:number <- get *2:address:editor-data, cursor-column:offset
   ]
+  # screen should scroll, moving cursor to end of text
   memory-should-contain [
-    3 <- 2
-    4 <- 0
+    3 <- 1
+    4 <- 2
   ]
-  check-trace-count-for-label 0, [print-character]
   assume-console [
     type [0]
   ]
@@ -2770,8 +2775,36 @@ de]
   ]
   screen-should-contain [
     .          .
-    .abc       .
-    .0de       .
+    .de0       .
+    .┈┈┈┈┈┈┈┈┈┈.
+    .          .
+  ]
+  # try to move down again
+  $clear-trace
+  assume-console [
+    left-click 2, 0
+    press down-arrow
+  ]
+  run [
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+    3:number <- get *2:address:editor-data, cursor-row:offset
+    4:number <- get *2:address:editor-data, cursor-column:offset
+  ]
+  # screen stops scrolling because cursor is already at top
+  memory-should-contain [
+    3 <- 1
+    4 <- 3
+  ]
+  check-trace-count-for-label 0, [print-character]
+  assume-console [
+    type [1]
+  ]
+  run [
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+  ]
+  screen-should-contain [
+    .          .
+    .de01      .
     .┈┈┈┈┈┈┈┈┈┈.
     .          .
   ]
@@ -3440,7 +3473,7 @@ after +scroll-down [
   *top-of-screen <- before-start-of-next-line *top-of-screen, max
   no-movement?:boolean <- equal old-top, *top-of-screen
   # Hack: this reply doesn't match one of the locations of +scroll-down, directly
-  # within insert-at-cursor. however, I'm unable to trigger the error..
+  # within insert-at-cursor. However, I'm unable to trigger the error..
   # If necessary create a duplicate copy of +scroll-down with the right
   # 'reply-if'.
   reply-if no-movement?, editor/same-as-ingredient:0, 0/no-more-render