## deleting sandboxes scenario deleting-sandboxes [ trace-until 100/app # trace too long assume-screen 50/width, 15/height 1:address:shared:array:character <- new [] 2:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character # run a few commands assume-console [ left-click 1, 0 type [divide-with-remainder 11, 3] press F4 type [add 2, 2] press F4 ] event-loop screen:address:shared:screen, console:address:shared:console, 2: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, 49 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:programming-environment-data ] screen-should-contain [ . run (F4) . . . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .0 x. .add 2, 2 . .4 . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . . . . ] # delete first sandbox assume-console [ left-click 3, 49 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2: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, current-sandbox, env show-screen screen loop +next-event:label } ] recipe 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 reply-unless at-right?, 0/false click-row:number <- get t, row:offset prev:address:address:shared:sandbox-data <- get-address *env, sandbox:offset curr:address:shared:sandbox-data <- get *env, 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 *prev <- get *curr, next-sandbox:offset # update sandbox count sandbox-count:address:number <- get-address *env, number-of-sandboxes:offset *sandbox-count <- subtract *sandbox-count, 1 # if it's the last sandbox and if it was the only sandbox rendered, reset scroll { break-if *prev render-from:address:number <- get-address *env, render-from:offset reset-scroll?:boolean <- equal *render-from, *sandbox-count break-unless reset-scroll? *render-from <- copy -1 } reply 1/true # force rerender } prev <- get-address *curr, next-sandbox:offset curr <- get *curr, next-sandbox:offset loop } reply 0/false ] 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:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character render-all screen, 2: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 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:programming-environment-data ] screen-should-contain [ . . # menu .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .0 x. .add 1, 1 . .2 . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .1 x. .add 2, 2 . .4 . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. ] # delete the second sandbox assume-console [ left-click 6, 29 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2: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:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character render-all screen, 2: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 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:programming-environment-data ] screen-should-contain [ . . # menu .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .0 x. .add 1, 1 . .2 . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .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, 2: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:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character render-all screen, 2: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 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2: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, 2: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:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character render-all screen, 2: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 ] run [ event-loop screen:address:shared:screen, console:address:shared:console, 2: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, 2:address:shared:programming-environment-data ] # shouldn't go past last sandbox screen-should-contain [ . . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .0 x. .add 2, 2 . .4 . .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . . ] ]