about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-08-28 16:36:00 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-08-28 16:36:00 -0700
commit2bd4238cc3ff4801094a0ced67f5297a28a3879b (patch)
treeb9dcdaf5794ce7ebb8ed83e1ee0fdab3a37a6dc9
parenta632ccef233a45db9b40df3e0ad711912d9ad5df (diff)
downloadmu-2bd4238cc3ff4801094a0ced67f5297a28a3879b.tar.gz
2089 - undo support for mouse clicks
-rw-r--r--edit.mu77
1 files changed, 75 insertions, 2 deletions
diff --git a/edit.mu b/edit.mu
index 43d7b864..2362e7d8 100644
--- a/edit.mu
+++ b/edit.mu
@@ -592,7 +592,9 @@ recipe editor-event-loop [
     t:address:touch-event <- maybe-convert e, touch:variant
     {
       break-unless t
+      +move-cursor-start
       move-cursor-in-editor screen, editor, *t
+      +move-cursor-end
       loop +next-event:label
     }
     # keyboard events
@@ -6846,18 +6848,89 @@ after +handle-redo [
   }
 ]
 
+# undo cursor movement and scroll
+
+scenario editor-undo-touch [
+  # create an editor with some text
+  assume-screen 10/width, 5/height
+  1:address:array:character <- new [abc
+def
+ghi]
+  2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0/left, 10/right
+  editor-render screen, 2:address:editor-data
+  assume-console [
+    left-click 3, 1
+  ]
+  editor-event-loop screen:address, console:address, 2:address:editor-data
+  # now undo
+  assume-console [
+    type [z]  # ctrl-z
+  ]
+  3:event/ctrl-z <- merge 0/text, 26/ctrl-z, 0/dummy, 0/dummy
+  replace-in-console 122/z, 3:event/ctrl-z
+  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
+  ]
+  # click undone
+  memory-should-contain [
+    3 <- 1
+    4 <- 0
+  ]
+  # cursor should be in the right place
+  assume-console [
+    type [1]
+  ]
+  run [
+    editor-event-loop screen:address, console:address, 2:address:editor-data
+  ]
+  screen-should-contain [
+    .          .
+    .1abc      .
+    .def       .
+    .ghi       .
+    .┈┈┈┈┈┈┈┈┈┈.
+  ]
+]
+
+after +move-cursor-start [
+  before-row:number <- get *editor, cursor-row:offset
+  before-column:number <- get *editor, cursor-column:offset
+]
+before +move-cursor-end [
+  top-of-screen:address:duplex-list <- get *editor, top-of-screen:offset
+  op:address:operation <- new operation:type
+  cursor-row:number <- get *editor, cursor-row:offset
+  cursor-column:number <- get *editor, cursor-column:offset
+  *op <- merge 1/move-operation, before-row, before-column, top-of-screen, cursor-row, cursor-column, top-of-screen, 0/empty, 0/empty
+  undo:address:address:list <- get-address *editor, undo:offset
+  *undo <- push op, *undo
+]
+
+after +handle-undo [
+  {
+    move:address:move-operation <- maybe-convert *op, move:variant
+    break-unless move
+    # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen
+    *cursor-row <- get *move, before-row:offset
+    *cursor-column <- get *move, before-column:offset
+    top:address:address:duplex-list <- get *editor, top-of-screen:offset
+    *top <- get *move, before-top-of-screen:offset
+  }
+]
+
 # todo:
 # operations for recipe side and each sandbox-data
 # undo delete sandbox as a separate primitive on the status bar
 # types of operations:
 #   typing
-#   cursor movement and scrolling (click, arrow keys, ctrl-a, ctrl-e, page up/down)
+#   cursor movement and scrolling (click, arrow keys, ctrl-a, ctrl-e, page up/down, resize)
 #   delete (backspace, delete, ctrl-k, ctrl-u)
 # collapse runs
 #   of the same event (arrow keys, etc.)
 #   of typing that's not newline or backspace or tab
 # render entire screen blindly on undo/redo operations for now
-# support resize (will invalidate row/column)
 
 ## helpers for drawing editor borders