diff options
Diffstat (limited to 'edit/008-sandbox-edit.mu')
-rw-r--r-- | edit/008-sandbox-edit.mu | 109 |
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 ] |