## deleting sandboxes scenario deleting-sandboxes [ trace-until 100/app # trace too long assume-screen 100/width, 15/height 1:address:shared:array:character <- new [] 2:address:shared:array:character <- new [] 3:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character, 2:address:shared:array:character # run a few commands assume-console [ left-click 1, 80 type [divide-with-remainder 11, 3] press F4 type [add 2, 2] press F4 ] event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data screen-should-contain [ . run (F4) . . ┊ . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊0 x. . ┊add 2, 2 . . ┊4 . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊1 x. . ┊divide-with-remainder 11, 3 . . ┊3 . . ┊2 . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] # delete second sandbox assume-console [ left-click 7, 99 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data ] screen-should-contain [ . run (F4) . . ┊ . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊0 x. . ┊add 2, 2 . . ┊4 . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . . ┊ . ] # delete first sandbox assume-console [ left-click 3, 99 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data ] screen-should-contain [ . run (F4) . . ┊ . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . . ┊ . ] ] after [ # on a sandbox delete icon? process delete { was-delete?:boolean <- delete-sandbox *t, env break-unless was-delete? hide-screen screen screen <- render-sandbox-side screen, env screen <- update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env show-screen screen loop +next-event:label } ] def delete-sandbox t:touch-event, env:address:shared:programming-environment-data -> was-delete?:boolean, env:address:shared:programming-environment-data [ local-scope load-ingredients click-column:number <- get t, column:offset current-sandbox:address:shared:editor-data <- get *env, current-sandbox:offset right:number <- get *current-sandbox, right:offset at-right?:boolean <- equal click-column, right return-unless at-right?, 0/false click-row:number <- get t, row:offset { first:address:shared:sandbox-data <- get *env, sandbox:offset reply-unless first, 0/false target-row:number <- get *first, starting-row-on-screen:offset delete-first?:boolean <- equal target-row, click-row break-unless delete-first? new-first:address:shared:sandbox-data <- get *first, next-sandbox:offset *env <- put *env, sandbox:offset, new-first env <- fixup-delete env, new-first return 1/true # force rerender } prev:address:shared:sandbox-data <- get *env, sandbox:offset assert prev, [failed to find any sandboxes!] curr:address:shared:sandbox-data <- get *prev, next-sandbox:offset { break-unless curr # more sandboxes to check { target-row:number <- get *curr, starting-row-on-screen:offset delete-curr?:boolean <- equal target-row, click-row break-unless delete-curr? # delete this sandbox next:address:shared:sandbox-data <- get *curr, next-sandbox:offset *prev <- put *prev, next-sandbox:offset, next env <- fixup-delete env, next return 1/true # force rerender } prev <- copy curr curr <- get *curr, next-sandbox:offset loop } return 0/false ] def fixup-delete env:address:shared:programming-environment-data, next:address:shared:sandbox-data -> env:address:shared:programming-environment-data [ local-scope load-ingredients # 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 { break-if next # deleted sandbox was last render-from:number <- get *env, render-from:offset reset-scroll?:boolean <- equal render-from, sandbox-count break-unless reset-scroll? # deleted sandbox was only sandbox rendered, so reset scroll *env <- put *env, render-from:offset, -1 } ] scenario deleting-sandbox-after-scroll [ trace-until 100/app # trace too long assume-screen 30/width, 10/height # initialize environment 1:address:shared:array:character <- new [] 2:address:shared:array:character <- new [] 3:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character, 2:address:shared:array:character render-all screen, 3:address:shared:programming-environment-data # create 2 sandboxes and scroll to second assume-console [ press ctrl-n type [add 2, 2] press F4 type [add 1, 1] press F4 press down-arrow ] event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data screen-should-contain [ . . . ┊━━━━━━━━━━━━━━. .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊0 x. . ┊add 1, 1 . . ┊2 . . ┊━━━━━━━━━━━━━━. . ┊1 x. ] # delete the second sandbox assume-console [ left-click 6, 29 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data ] # second sandbox shows in editor; scroll resets to display first sandbox screen-should-contain [ . . . ┊━━━━━━━━━━━━━━. .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊0 x. . ┊add 1, 1 . . ┊2 . . ┊━━━━━━━━━━━━━━. . ┊ . ] ] scenario deleting-top-sandbox-after-scroll [ trace-until 100/app # trace too long assume-screen 30/width, 10/height # initialize environment 1:address:shared:array:character <- new [] 2:address:shared:array:character <- new [] 3:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character, 2:address:shared:array:character render-all screen, 3:address:shared:programming-environment-data # create 2 sandboxes and scroll to second assume-console [ press ctrl-n type [add 2, 2] press F4 type [add 1, 1] press F4 press down-arrow ] event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data screen-should-contain [ . . . ┊━━━━━━━━━━━━━━. .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊0 x. . ┊add 1, 1 . . ┊2 . . ┊━━━━━━━━━━━━━━. . ┊1 x. ] # delete the second sandbox assume-console [ left-click 2, 29 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data ] # second sandbox shows in editor; scroll resets to display first sandbox screen-should-contain [ . . . ┊━━━━━━━━━━━━━━. .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊0 x. . ┊add 2, 2 . . ┊4 . . ┊━━━━━━━━━━━━━━. . ┊ . ] ] scenario deleting-final-sandbox-after-scroll [ trace-until 100/app # trace too long assume-screen 30/width, 10/height # initialize environment 1:address:shared:array:character <- new [] 2:address:shared:array:character <- new [] 3:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character, 2:address:shared:array:character render-all screen, 3:address:shared:programming-environment-data # create 2 sandboxes and scroll to second assume-console [ press ctrl-n type [add 2, 2] press F4 type [add 1, 1] press F4 press down-arrow press down-arrow ] event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data screen-should-contain [ . . . ┊━━━━━━━━━━━━━━. .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊1 x. . ┊add 2, 2 . . ┊4 . . ┊━━━━━━━━━━━━━━. . ┊ . ] # delete the second sandbox assume-console [ left-click 2, 29 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data ] # implicitly scroll up to first sandbox screen-should-contain [ . . . ┊ . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━. . ┊0 x. . ┊add 1, 1 . . ┊2 . . ┊━━━━━━━━━━━━━━. . ┊ . ] ] scenario deleting-updates-sandbox-count [ trace-until 100/app # trace too long assume-screen 30/width, 10/height # initialize environment 1:address:shared:array:character <- new [] 2:address:shared:array:character <- new [] 3:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character, 2:address:shared:array:character render-all screen, 3:address:shared:programming-environment-data # create 2 sandboxes assume-console [ press ctrl-n type [add 2, 2] press F4 type [add 1, 1] press F4 ] event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data screen-should-contain [ . . . ┊ . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━. . ┊0 x. . ┊add 1, 1 . . ┊2 . . ┊━━━━━━━━━━━━━━. . ┊1 x. . ┊add 2, 2 . . ┊4 . ] # delete the second sandbox, then try to scroll down twice assume-console [ left-click 3, 29 press down-arrow press down-arrow ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 3:address:shared:programming-environment-data ] # shouldn't go past last sandbox screen-should-contain [ . . . ┊━━━━━━━━━━━━━━. .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊0 x. . ┊add 2, 2 . . ┊4 . . ┊━━━━━━━━━━━━━━. . ┊ . ] ]