From b0403c18880395f9ce451f72ac4d33ef955f2ad1 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Thu, 5 Nov 2015 14:17:31 -0800 Subject: 2374 - now edit works until layer 8 --- edit/011-editor-undo.mu | 118 ++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 59 deletions(-) (limited to 'edit/011-editor-undo.mu') diff --git a/edit/011-editor-undo.mu b/edit/011-editor-undo.mu index 17d97213..9f0d83de 100644 --- a/edit/011-editor-undo.mu +++ b/edit/011-editor-undo.mu @@ -11,13 +11,13 @@ exclusive-container operation [ container insert-operation [ before-row:number before-column:number - before-top-of-screen:address:duplex-list:character + before-top-of-screen:address:duplex-list:character:character after-row:number after-column:number - after-top-of-screen:address:duplex-list:character + after-top-of-screen:address:duplex-list:character:character # inserted text is from 'insert-from' until 'insert-until'; list doesn't have to terminate - insert-from:address:duplex-list:character - insert-until:address:duplex-list:character + insert-from:address:duplex-list:character:character + insert-until:address:duplex-list:character:character tag:number # event causing this operation; might be used to coalesce runs of similar events # 0: no coalesce (enter+indent) # 1: regular alphanumeric characters @@ -26,10 +26,10 @@ container insert-operation [ container move-operation [ before-row:number before-column:number - before-top-of-screen:address:duplex-list:character + before-top-of-screen:address:duplex-list:character:character after-row:number after-column:number - after-top-of-screen:address:duplex-list:character + after-top-of-screen:address:duplex-list:character:character tag:number # event causing this operation; might be used to coalesce runs of similar events # 0: no coalesce (touch events, etc) # 1: left arrow @@ -41,13 +41,13 @@ container move-operation [ container delete-operation [ before-row:number before-column:number - before-top-of-screen:address:duplex-list:character + before-top-of-screen:address:duplex-list:character:character after-row:number after-column:number - after-top-of-screen:address:duplex-list:character - deleted-text:address:duplex-list:character - delete-from:address:duplex-list:character - delete-until:address:duplex-list:character + after-top-of-screen:address:duplex-list:character:character + deleted-text:address:duplex-list:character:character + delete-from:address:duplex-list:character:character + delete-until:address:duplex-list:character:character tag:number # event causing this operation; might be used to coalesce runs of similar events # 0: no coalesce (ctrl-k, ctrl-u) # 1: backspace @@ -135,11 +135,11 @@ scenario editor-can-undo-typing [ # save operation to undo after [ - top-before:address:duplex-list <- get *editor, top-of-screen:offset - cursor-before:address:duplex-list <- copy *before-cursor + top-before:address:duplex-list:character <- get *editor, top-of-screen:offset + cursor-before:address:duplex-list:character <- copy *before-cursor ] before [ - top-after:address:duplex-list <- get *editor, top-of-screen:offset + top-after:address:duplex-list:character <- get *editor, top-of-screen:offset undo:address:address:list <- get-address *editor, undo:offset { # if previous operation was an insert, coalesce this operation with it @@ -149,19 +149,19 @@ before [ break-unless typing previous-coalesce-tag:number <- get *typing, tag:offset break-unless previous-coalesce-tag - insert-until:address:address:duplex-list <- get-address *typing, insert-until:offset + insert-until:address:address:duplex-list:character <- get-address *typing, insert-until:offset *insert-until <- next-duplex *before-cursor after-row:address:number <- get-address *typing, after-row:offset *after-row <- copy *cursor-row after-column:address:number <- get-address *typing, after-column:offset *after-column <- copy *cursor-column - after-top:address:address:duplex-list:character <- get-address *typing, after-top-of-screen:offset + after-top:address:address:duplex-list:character:character <- get-address *typing, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-insert-operation:label } # if not, create a new operation - insert-from:address:duplex-list <- next-duplex cursor-before - insert-to:address:duplex-list <- next-duplex insert-from + insert-from:address:duplex-list:character <- next-duplex cursor-before + insert-to:address:duplex-list:character <- next-duplex insert-from op:address:operation <- new operation:type *op <- merge 0/insert-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, insert-from, insert-to, 1/coalesce editor <- add-operation editor, op @@ -172,14 +172,14 @@ before [ after [ cursor-row-before:number <- copy *cursor-row cursor-column-before:number <- copy *cursor-column - top-before:address:duplex-list <- get *editor, top-of-screen:offset - cursor-before:address:duplex-list <- copy *before-cursor + top-before:address:duplex-list:character <- get *editor, top-of-screen:offset + cursor-before:address:duplex-list:character <- copy *before-cursor ] before [ - top-after:address:duplex-list <- get *editor, top-of-screen:offset + top-after:address:duplex-list:character <- get *editor, top-of-screen:offset # never coalesce - insert-from:address:duplex-list <- next-duplex cursor-before - insert-to:address:duplex-list <- next-duplex *before-cursor + insert-from:address:duplex-list:character <- next-duplex cursor-before + insert-to:address:duplex-list:character <- next-duplex *before-cursor op:address:operation <- new operation:type *op <- merge 0/insert-operation, cursor-row-before, cursor-column-before, top-before, *cursor-row/after, *cursor-column/after, top-after, insert-from, insert-to, 0/never-coalesce editor <- add-operation editor, op @@ -204,14 +204,14 @@ after [ { typing:address:insert-operation <- maybe-convert *op, typing:variant break-unless typing - start:address:duplex-list <- get *typing, insert-from:offset - end:address:duplex-list <- get *typing, insert-until:offset + start:address:duplex-list:character <- get *typing, insert-from:offset + end:address:duplex-list:character <- get *typing, insert-until:offset # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *before-cursor <- prev-duplex start remove-duplex-between *before-cursor, end *cursor-row <- get *typing, before-row:offset *cursor-column <- get *typing, before-column:offset - top:address:address:duplex-list <- get-address *editor, top-of-screen:offset + top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *typing, before-top-of-screen:offset } ] @@ -401,13 +401,13 @@ after [ { typing:address:insert-operation <- maybe-convert *op, typing:variant break-unless typing - insert-from:address:duplex-list <- get *typing, insert-from:offset # ignore insert-to because it's already been spliced away + insert-from:address:duplex-list:character <- get *typing, insert-from:offset # ignore insert-to because it's already been spliced away # assert insert-to matches next-duplex(*before-cursor) insert-duplex-range *before-cursor, insert-from # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *cursor-row <- get *typing, after-row:offset *cursor-column <- get *typing, after-column:offset - top:address:address:duplex-list <- get-address *editor, top-of-screen:offset + top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *typing, after-top-of-screen:offset } ] @@ -703,12 +703,12 @@ ghi] after [ before-cursor-row:number <- get *editor, cursor-row:offset before-cursor-column:number <- get *editor, cursor-column:offset - before-top-of-screen:address:duplex-list <- get *editor, top-of-screen:offset + before-top-of-screen:address:duplex-list:character <- get *editor, top-of-screen:offset ] before [ after-cursor-row:number <- get *editor, cursor-row:offset after-cursor-column:number <- get *editor, cursor-column:offset - after-top-of-screen:address:duplex-list <- get *editor, top-of-screen:offset + after-top-of-screen:address:duplex-list:character <- get *editor, top-of-screen:offset { break-unless undo-coalesce-tag # if previous operation was also a move, and also had the same coalesce @@ -725,7 +725,7 @@ before [ *after-row <- copy after-cursor-row after-column:address:number <- get-address *move, after-column:offset *after-column <- copy after-cursor-column - after-top:address:address:duplex-list:character <- get-address *move, after-top-of-screen:offset + after-top:address:address:duplex-list:character:character <- get-address *move, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-move-operation:label } @@ -740,7 +740,7 @@ after [ 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 - top:address:address:duplex-list <- get-address *editor, top-of-screen:offset + top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset *cursor-row <- get *move, before-row:offset *cursor-column <- get *move, before-column:offset *top <- get *move, before-top-of-screen:offset @@ -1516,7 +1516,7 @@ after [ # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *cursor-row <- get *move, after-row:offset *cursor-column <- get *move, after-column:offset - top:address:address:duplex-list <- get-address *editor, top-of-screen:offset + top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *move, after-top-of-screen:offset } ] @@ -1590,12 +1590,12 @@ scenario editor-can-undo-and-redo-backspace [ # save operation to undo after [ - top-before:address:duplex-list <- get *editor, top-of-screen:offset + top-before:address:duplex-list:character <- get *editor, top-of-screen:offset ] before [ { break-unless backspaced-cell # backspace failed; don't add an undo operation - top-after:address:duplex-list <- get *editor, top-of-screen:offset + top-after:address:duplex-list:character <- get *editor, top-of-screen:offset undo:address:address:list <- get-address *editor, undo:offset { # if previous operation was an insert, coalesce this operation with it @@ -1606,22 +1606,22 @@ before [ previous-coalesce-tag:number <- get *deletion, tag:offset coalesce?:boolean <- equal previous-coalesce-tag, 1/coalesce-backspace break-unless coalesce? - delete-from:address:address:duplex-list <- get-address *deletion, delete-from:offset + delete-from:address:address:duplex-list:character <- get-address *deletion, delete-from:offset *delete-from <- copy *before-cursor - backspaced-so-far:address:address:duplex-list <- get-address *deletion, deleted-text:offset + backspaced-so-far:address:address:duplex-list:character <- get-address *deletion, deleted-text:offset insert-duplex-range backspaced-cell, *backspaced-so-far *backspaced-so-far <- copy backspaced-cell after-row:address:number <- get-address *deletion, after-row:offset *after-row <- copy *cursor-row after-column:address:number <- get-address *deletion, after-column:offset *after-column <- copy *cursor-column - after-top:address:address:duplex-list:character <- get-address *deletion, after-top-of-screen:offset + after-top:address:address:duplex-list:character:character <- get-address *deletion, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-backspace-operation:label } # if not, create a new operation op:address:operation <- new operation:type - deleted-until:address:duplex-list <- next-duplex *before-cursor + deleted-until:address:duplex-list:character <- next-duplex *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, backspaced-cell/deleted, *before-cursor/delete-from, deleted-until, 1/coalesce-backspace editor <- add-operation editor, op +done-adding-backspace-operation @@ -1632,17 +1632,17 @@ after [ { deletion:address:delete-operation <- maybe-convert *op, delete:variant break-unless deletion - start2:address:address:duplex-list <- get-address *editor, data:offset - anchor:address:duplex-list <- get *deletion, delete-from:offset + start2:address:address:duplex-list:character <- get-address *editor, data:offset + anchor:address:duplex-list:character <- get *deletion, delete-from:offset break-unless anchor - deleted:address:duplex-list <- get *deletion, deleted-text:offset - old-cursor:address:duplex-list <- last-duplex deleted + deleted:address:duplex-list:character <- get *deletion, deleted-text:offset + old-cursor:address:duplex-list:character <- last-duplex deleted insert-duplex-range anchor, deleted # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *before-cursor <- copy old-cursor *cursor-row <- get *deletion, before-row:offset *cursor-column <- get *deletion, before-column:offset - top:address:address:duplex-list <- get-address *editor, top-of-screen:offset + top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *deletion, before-top-of-screen:offset } ] @@ -1651,13 +1651,13 @@ after [ { deletion:address:delete-operation <- maybe-convert *op, delete:variant break-unless deletion - start:address:duplex-list <- get *deletion, delete-from:offset - end:address:duplex-list <- get *deletion, delete-until:offset + start:address:duplex-list:character <- get *deletion, delete-from:offset + end:address:duplex-list:character <- get *deletion, delete-until:offset remove-duplex-between start, end # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *cursor-row <- get *deletion, after-row:offset *cursor-column <- get *deletion, after-column:offset - top:address:address:duplex-list <- get-address *editor, top-of-screen:offset + top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *deletion, after-top-of-screen:offset } ] @@ -1812,12 +1812,12 @@ scenario editor-can-undo-and-redo-delete [ ] after [ - top-before:address:duplex-list <- get *editor, top-of-screen:offset + top-before:address:duplex-list:character <- get *editor, top-of-screen:offset ] before [ { break-unless deleted-cell # delete failed; don't add an undo operation - top-after:address:duplex-list <- get *editor, top-of-screen:offset + top-after:address:duplex-list:character <- get *editor, top-of-screen:offset undo:address:address:list <- get-address *editor, undo:offset { # if previous operation was an insert, coalesce this operation with it @@ -1828,21 +1828,21 @@ before [ previous-coalesce-tag:number <- get *deletion, tag:offset coalesce?:boolean <- equal previous-coalesce-tag, 2/coalesce-delete break-unless coalesce? - delete-until:address:address:duplex-list <- get-address *deletion, delete-until:offset + delete-until:address:address:duplex-list:character <- get-address *deletion, delete-until:offset *delete-until <- next-duplex *before-cursor - deleted-so-far:address:address:duplex-list <- get-address *deletion, deleted-text:offset + deleted-so-far:address:address:duplex-list:character <- get-address *deletion, deleted-text:offset *deleted-so-far <- append-duplex *deleted-so-far, deleted-cell after-row:address:number <- get-address *deletion, after-row:offset *after-row <- copy *cursor-row after-column:address:number <- get-address *deletion, after-column:offset *after-column <- copy *cursor-column - after-top:address:address:duplex-list:character <- get-address *deletion, after-top-of-screen:offset + after-top:address:address:duplex-list:character:character <- get-address *deletion, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-delete-operation:label } # if not, create a new operation op:address:operation <- new operation:type - deleted-until:address:duplex-list <- next-duplex *before-cursor + deleted-until:address:duplex-list:character <- next-duplex *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, deleted-cell/deleted, *before-cursor/delete-from, deleted-until, 2/coalesce-delete editor <- add-operation editor, op +done-adding-delete-operation @@ -1935,15 +1935,15 @@ def] ] after [ - top-before:address:duplex-list <- get *editor, top-of-screen:offset + top-before:address:duplex-list:character <- get *editor, top-of-screen:offset ] before [ { break-unless deleted-cells # delete failed; don't add an undo operation - top-after:address:duplex-list <- get *editor, top-of-screen:offset + top-after:address:duplex-list:character <- get *editor, top-of-screen:offset undo:address:address:list <- get-address *editor, undo:offset op:address:operation <- new operation:type - deleted-until:address:duplex-list <- next-duplex *before-cursor + deleted-until:address:duplex-list:character <- next-duplex *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, deleted-cells/deleted, *before-cursor/delete-from, deleted-until, 0/never-coalesce editor <- add-operation editor, op +done-adding-delete-operation @@ -2036,15 +2036,15 @@ def] ] after [ - top-before:address:duplex-list <- get *editor, top-of-screen:offset + top-before:address:duplex-list:character <- get *editor, top-of-screen:offset ] before [ { break-unless deleted-cells # delete failed; don't add an undo operation - top-after:address:duplex-list <- get *editor, top-of-screen:offset + top-after:address:duplex-list:character <- get *editor, top-of-screen:offset undo:address:address:list <- get-address *editor, undo:offset op:address:operation <- new operation:type - deleted-until:address:duplex-list <- next-duplex *before-cursor + deleted-until:address:duplex-list:character <- next-duplex *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, deleted-cells/deleted, *before-cursor/delete-from, deleted-until, 0/never-coalesce editor <- add-operation editor, op +done-adding-delete-operation -- cgit 1.4.1-2-gfad0