about summary refs log tree commit diff stats
path: root/edit/008-sandbox-edit.mu
diff options
context:
space:
mode:
Diffstat (limited to 'edit/008-sandbox-edit.mu')
-rw-r--r--edit/008-sandbox-edit.mu109
1 files changed, 34 insertions, 75 deletions
diff --git a/edit/008-sandbox-edit.mu b/edit/008-sandbox-edit.mu
index edea112d..df897a6e 100644
--- a/edit/008-sandbox-edit.mu
+++ b/edit/008-sandbox-edit.mu
@@ -25,7 +25,7 @@ recipe foo [
     .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
-  # click at left edge of edit button
+  # click at left edge of 'edit' button
   assume-console [
     left-click 3, 55
   ]
@@ -85,7 +85,7 @@ recipe foo [
     .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
-  # click at right edge of edit button (just before 'copy')
+  # click at right edge of 'edit' button (just before 'copy')
   assume-console [
     left-click 3, 68
   ]
@@ -121,10 +121,12 @@ recipe foo [
 ]
 
 after <global-touch> [
-  # below sandbox editor? pop appropriate sandbox contents back into sandbox editor
+  # support 'edit' button
   {
-    was-edit?:boolean <- try-edit-sandbox t, env
-    break-unless was-edit?
+    edit?:boolean <- should-attempt-edit? click-row, click-column, env
+    break-unless edit?
+    edit?, env <- try-edit-sandbox click-row, env
+    break-unless edit?
     hide-screen screen
     screen <- render-sandbox-side screen, env
     screen <- update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
@@ -133,83 +135,40 @@ after <global-touch> [
   }
 ]
 
-def try-edit-sandbox t:touch-event, env:address:programming-environment-data -> was-edit?:boolean, env:address:programming-environment-data [
+# some preconditions for attempting to edit a sandbox
+def should-attempt-edit? click-row:number, click-column:number, env:address:programming-environment-data -> result:boolean [
   local-scope
   load-ingredients
-  click-column:number <- get t, column:offset
-  current-sandbox:address:editor-data <- get *env, current-sandbox:offset
-  sandbox-left-margin:number <- get *current-sandbox, left:offset
-  on-sandbox-side?:boolean <- greater-or-equal click-column, sandbox-left-margin
-  return-unless on-sandbox-side?, 0/false
-  first-sandbox:address:sandbox-data <- get *env, sandbox:offset
-  return-unless first-sandbox, 0/false
-  first-sandbox-begins:number <- get *first-sandbox, starting-row-on-screen:offset
-  click-row:number <- get t, row:offset
-  below-sandbox-editor?:boolean <- greater-or-equal click-row, first-sandbox-begins
-  return-unless below-sandbox-editor?, 0/false
-  empty-sandbox-editor?:boolean <- empty-editor? current-sandbox
-  return-unless empty-sandbox-editor?, 0/false  # don't clobber existing contents
-  sandbox-right-margin:number <- get *current-sandbox, right:offset
+  # are we below the sandbox editor?
+  click-sandbox-area?:boolean <- click-on-sandbox-area? click-row, click-column, env
+  reply-unless click-sandbox-area?, 0/false
+  # narrower, is the click in the columns spanning the 'edit' button?
+  first-sandbox:address:editor-data <- get *env, current-sandbox:offset
+  assert first-sandbox, [!!]
+  sandbox-left-margin:number <- get *first-sandbox, left:offset
+  sandbox-right-margin:number <- get *first-sandbox, right:offset
   edit-button-left:number, edit-button-right:number, _ <- sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
-  left-of-edit-button?:boolean <- lesser-than click-column, edit-button-left
-  return-if left-of-edit-button?, 0/false
-  right-of-edit-button?:boolean <- greater-than click-column, edit-button-right
-  return-if right-of-edit-button?, 0/false
-  # identify the sandbox to edit and remove it from the sandbox list
-  sandbox:address:sandbox-data <- extract-sandbox env, click-row
-  return-unless sandbox, 0/false
-  text:address:array:character <- get *sandbox, data:offset
-  current-sandbox <- insert-text current-sandbox, text
-  *env <- put *env, render-from:offset, -1
-  return 1/true
-]
-
-def empty-editor? editor:address:editor-data -> result:boolean [
-  local-scope
-  load-ingredients
-  head:address:duplex-list:character <- get *editor, data:offset
-  first:address:duplex-list:character <- next head
-  result <- not first
+  edit-button-vertical-area?:boolean <- within-range? click-column, edit-button-left, edit-button-right
+  reply-unless edit-button-vertical-area?, 0/false
+  # finally, is sandbox editor empty?
+  current-sandbox:address:editor-data <- get *env, current-sandbox:offset
+  result <- empty-editor? current-sandbox
 ]
 
-def extract-sandbox env:address:programming-environment-data, click-row:number -> result:address:sandbox-data, env:address:programming-environment-data [
+def try-edit-sandbox click-row:number, env:address:programming-environment-data -> clicked-on-edit-button?:boolean, env:address:programming-environment-data [
   local-scope
   load-ingredients
-  curr-sandbox:address:sandbox-data <- get *env, sandbox:offset
-  start:number <- get *curr-sandbox, starting-row-on-screen:offset
-  in-editor?:boolean <- lesser-than click-row, start
-  return-if in-editor?, 0
-  first-sandbox?:boolean <- equal click-row, start
-  {
-    # first sandbox? pop
-    break-unless first-sandbox?
-    next-sandbox:address:sandbox-data <- get *curr-sandbox, next-sandbox:offset
-    *env <- put *env, sandbox:offset, next-sandbox
-  }
-  {
-    # not first sandbox?
-    break-if first-sandbox?
-    prev-sandbox:address:sandbox-data <- copy curr-sandbox
-    curr-sandbox <- get *curr-sandbox, next-sandbox:offset
-    {
-      next-sandbox:address:sandbox-data <- get *curr-sandbox, next-sandbox:offset
-      break-unless next-sandbox
-      # if click-row < sandbox.next-sandbox.starting-row-on-screen, break
-      next-start:number <- get *next-sandbox, starting-row-on-screen:offset
-      found?:boolean <- lesser-than click-row, next-start
-      break-if found?
-      prev-sandbox <- copy curr-sandbox
-      curr-sandbox <- copy next-sandbox
-      loop
-    }
-    # snip sandbox out of its list
-    *prev-sandbox <- put *prev-sandbox, next-sandbox:offset, next-sandbox
-  }
-  result <- copy curr-sandbox
-  # update sandbox count
-  sandbox-count:number <- get *env, number-of-sandboxes:offset
-  sandbox-count <- subtract sandbox-count, 1
-  *env <- put *env, number-of-sandboxes:offset, sandbox-count
+  # identify the sandbox to edit, if the click was actually on the 'edit' button
+  sandbox:address:sandbox-data <- find-sandbox env, click-row
+  return-unless sandbox, 0/false
+  clicked-on-edit-button? <- copy 1/true
+  # 'edit' button = 'copy' button + 'delete' button
+  text:address:array:character <- get *sandbox, data:offset
+  current-sandbox:address:editor-data <- get *env, current-sandbox:offset
+  current-sandbox <- insert-text current-sandbox, text
+  env <- delete-sandbox env, sandbox
+  # reset scroll
+  *env <- put *env, render-from:offset, -1
   # position cursor in sandbox editor
   *env <- put *env, sandbox-in-focus?:offset, 1/true
 ]