1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170## editing sandboxes after they've been created
scenario clicking-on-sandbox-edit-button-moves-it-to-editor [
local-scope
trace-until 100/app # trace too long
assume-screen 100/width, 10/height
# empty recipes
assume-resources [
]
env:&:environment <- new-programming-environment resources, screen, [add 2, 2]
render-all screen, env, render
# run it
assume-console [
press F4
]
event-loop screen, console, env, resources
screen-should-contain [
. run (F4) .
. ┊ .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊0 edit copy to recipe delete .
. ┊add 2, 2 .
. ┊4 .
. ┊─────────────────────────────────────────────────.
. ┊ .
]
# click at left edge of 'edit' button
assume-console [
left-click 3, 55
]
run [
event-loop screen, console, env, resources
]
# it pops back into editor
screen-should-contain [
. run (F4) .
. ┊add 2, 2 .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊ .
]
# cursor should be in the right place
assume-console [
type [0]
]
run [
event-loop screen, console, env, resources
]
screen-should-contain [
. run (F4) .
. ┊0add 2, 2 .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊ .
]
]
scenario clicking-on-sandbox-edit-button-moves-it-to-editor-2 [
local-scope
trace-until 100/app # trace too long
assume-screen 100/width, 10/height
# empty recipes
assume-resources [
]
env:&:environment <- new-programming-environment resources, screen, [add 2, 2]
render-all screen, env, render
# run it
assume-console [
press F4
]
event-loop screen, console, env, resources
screen-should-contain [
. run (F4) .
. ┊ .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊0 edit copy to recipe delete .
. ┊add 2, 2 .
. ┊4 .
. ┊─────────────────────────────────────────────────.
. ┊ .
]
# click at right edge of 'edit' button (just before 'copy')
assume-console [
left-click 3, 65
]
run [
event-loop screen, console, env, resources
]
# it pops back into editor
screen-should-contain [
. run (F4) .
. ┊add 2, 2 .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊ .
]
# cursor should be in the right place
assume-console [
type [0]
]
run [
event-loop screen, console, env, resources
]
screen-should-contain [
. run (F4) .
. ┊0add 2, 2 .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊ .
]
]
after <global-touch> [
# support 'edit' button
{
edit?:bool <- should-attempt-edit? click-row, click-column, env
break-unless edit?
edit?, env <- try-edit-sandbox click-row, env
break-unless edit?
screen <- render-sandbox-side screen, env, render
screen <- update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
loop +next-event
}
]
# some preconditions for attempting to edit a sandbox
def should-attempt-edit? click-row:num, click-column:num, env:&:environment -> result:bool [
local-scope
load-ingredients
# are we below the sandbox editor?
click-sandbox-area?:bool <- click-on-sandbox-area? click-row, click-column, env
return-unless click-sandbox-area?, 0/false
# narrower, is the click in the columns spanning the 'edit' button?
first-sandbox:&:editor <- get *env, current-sandbox:offset
assert first-sandbox, [!!]
sandbox-left-margin:num <- get *first-sandbox, left:offset
sandbox-right-margin:num <- get *first-sandbox, right:offset
edit-button-left:num, edit-button-right:num, _ <- sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
edit-button-vertical-area?:bool <- within-range? click-column, edit-button-left, edit-button-right
return-unless edit-button-vertical-area?, 0/false
# finally, is sandbox editor empty?
current-sandbox:&:editor <- get *env, current-sandbox:offset
result <- empty-editor? current-sandbox
]
def try-edit-sandbox click-row:num, env:&:environment -> clicked-on-edit-button?:bool, env:&:environment [
local-scope
load-ingredients
# identify the sandbox to edit, if the click was actually on the 'edit' button
sandbox:&:sandbox <- find-sandbox env, click-row
return-unless sandbox, 0/false
clicked-on-edit-button? <- copy 1/true
# 'edit' button = 'copy' button + 'delete' button
text:text <- get *sandbox, data:offset
current-sandbox:&:editor <- 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
]
scenario sandbox-with-print-can-be-edited [
local-scope
trace-until 100/app # trace too long
assume-screen 100/width, 20/height
# left editor is empty
assume-resources [
]
# right editor contains a print instruction
env:&:environment <- new-programming-environment resources, screen, [print screen, 4]
render-all screen, env, render
# run the sandbox
assume-console [
press F4
]
event-loop screen, console, env, resources
screen-should-contain [
. run (F4) .
. ┊ .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊0 edit copy to recipe delete .
. ┊print screen, 4 .
. ┊screen: .
. ┊ .4 . .
. ┊ . . .
. ┊ . . .
. ┊ . . .
. ┊ . . .
. ┊─────────────────────────────────────────────────.
. ┊ .
]
# edit the sandbox
assume-console [
left-click 3, 65
]
run [
event-loop screen, console, env, resources
]
screen-should-contain [
. run (F4) .
. ┊print screen, 4 .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊ .
. ┊ .
]
]
scenario editing-sandbox-after-scrolling-resets-scroll [
local-scope
trace-until 100/app # trace too long
assume-screen 100/width, 10/height
# initialize environment
assume-resources [
]
env:&:environment <- new-programming-environment resources, screen, []
render-all screen, env, render
# 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 page-down
press page-down
]
event-loop screen, console, env, resources
screen-should-contain [
. run (F4) .
. ┊─────────────────────────────────────────────────.
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊1 edit copy to recipe delete .
. ┊add 2, 2 .
. ┊4 .
. ┊─────────────────────────────────────────────────.
. ┊ .
]
# edit the second sandbox
assume-console [
left-click 2, 55
]
run [
event-loop screen, console, env, resources
]
# second sandbox shows in editor; scroll resets to display first sandbox
screen-should-contain [
. run (F4) .
. ┊add 2, 2 .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊0 edit copy to recipe delete .
. ┊add 1, 1 .
. ┊2 .
. ┊─────────────────────────────────────────────────.
. ┊ .
]
]
scenario editing-sandbox-updates-sandbox-count [
local-scope
trace-until 100/app # trace too long
assume-screen 100/width, 10/height
# initialize environment
assume-resources [
]
env:&:environment <- new-programming-environment resources, screen, []
render-all screen, env, render
# create 2 sandboxes
assume-console [
press ctrl-n
type [add 2, 2]
press F4
type [add 1, 1]
press F4
]
event-loop screen, console, env, resources
screen-should-contain [
. run (F4) .
. ┊ .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊0 edit copy to recipe delete .
. ┊add 1, 1 .
. ┊2 .
. ┊─────────────────────────────────────────────────.
. ┊1 edit copy to recipe delete .
. ┊add 2, 2 .
. ┊4 .
]
# edit the second sandbox, then resave
assume-console [
left-click 3, 60
press F4
]
run [
event-loop screen, console, env, resources
]
# no change in contents
screen-should-contain [
. run (F4) .
. ┊ .
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊─────────────────────────────────────────────────.
. ┊0 edit copy to recipe delete .
. ┊add 1, 1 .
. ┊2 .
. ┊─────────────────────────────────────────────────.
. ┊1 edit copy to recipe delete .
. ┊add 2, 2 .
. ┊4 .
]
# now try to scroll past end
assume-console [
press page-down
press page-down
press page-down
]
run [
event-loop screen, console, env, resources
]
# screen should show just final sandbox with the right index (1)
screen-should-contain [
. run (F4) .
. ┊─────────────────────────────────────────────────.
.┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊1 edit copy to recipe delete .
. ┊add 2, 2 .
. ┊4 .
. ┊─────────────────────────────────────────────────.
. ┊ .
]
]
|