1
2
3
4 scenario copy-a-sandbox-to-editor [
5 local-scope
6 trace-until 100/app
7 assume-screen 100/width, 10/height
8
9 assume-resources [
10 ]
11 env:&:environment <- new-programming-environment resources, screen, [add 1, 1]
12
13 assume-console [
14 press F4
15 ]
16 event-loop screen, console, env, resources
17 screen-should-contain [
18 . run (F4) .
19 . ╎ .
20 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
21 . ╎0 edit copy delete .
22 . ╎add 1, 1 .
23 . ╎2 .
24 . ╎─────────────────────────────────────────────────.
25 . ╎ .
26 ]
27
28 assume-console [
29 left-click 3, 69
30 ]
31 run [
32 event-loop screen, console, env, resources
33 ]
34
35 screen-should-contain [
36 . run (F4) .
37 . ╎add 1, 1 .
38 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
39 . ╎0 edit copy delete .
40 . ╎add 1, 1 .
41 . ╎2 .
42 . ╎─────────────────────────────────────────────────.
43 . ╎ .
44 ]
45
46 assume-console [
47 type [0]
48 ]
49 run [
50 event-loop screen, console, env, resources
51 ]
52 screen-should-contain [
53 . run (F4) .
54 . ╎0add 1, 1 .
55 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
56 . ╎0 edit copy delete .
57 . ╎add 1, 1 .
58 . ╎2 .
59 . ╎─────────────────────────────────────────────────.
60 . ╎ .
61 ]
62 ]
63
64 scenario copy-a-sandbox-to-editor-2 [
65 local-scope
66 trace-until 100/app
67 assume-screen 100/width, 10/height
68
69 assume-resources [
70 ]
71 env:&:environment <- new-programming-environment resources, screen, [add 1, 1]
72
73 assume-console [
74 press F4
75 ]
76 event-loop screen, console, env, resources
77 screen-should-contain [
78 . run (F4) .
79 . ╎ .
80 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
81 . ╎0 edit copy delete .
82 . ╎add 1, 1 .
83 . ╎2 .
84 . ╎─────────────────────────────────────────────────.
85 . ╎ .
86 ]
87
88 assume-console [
89 left-click 3, 84
90 ]
91 run [
92 event-loop screen, console, env, resources
93 ]
94
95 screen-should-contain [
96 . run (F4) .
97 . ╎add 1, 1 .
98 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
99 . ╎0 edit copy delete .
100 . ╎add 1, 1 .
101 . ╎2 .
102 . ╎─────────────────────────────────────────────────.
103 . ╎ .
104 ]
105
106 assume-console [
107 type [0]
108 ]
109 run [
110 event-loop screen, console, env, resources
111 ]
112 screen-should-contain [
113 . run (F4) .
114 . ╎0add 1, 1 .
115 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
116 . ╎0 edit copy delete .
117 . ╎add 1, 1 .
118 . ╎2 .
119 . ╎─────────────────────────────────────────────────.
120 . ╎ .
121 ]
122 ]
123
124 after <global-touch> [
125
126 {
127 copy?:bool <- should-attempt-copy? click-row, click-column, env
128 break-unless copy?
129 copy?, env <- try-copy-sandbox click-row, env
130 break-unless copy?
131 hide-screen screen
132 screen <- render-sandbox-side screen, env, render
133 screen <- update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env
134 show-screen screen
135 loop +next-event
136 }
137 ]
138
139
140 def should-attempt-copy? click-row:num, click-column:num, env:&:environment -> result:bool [
141 local-scope
142 load-ingredients
143
144 click-sandbox-area?:bool <- click-on-sandbox-area? click-row, click-column, env
145 return-unless click-sandbox-area?, 0/false
146
147 first-sandbox:&:editor <- get *env, current-sandbox:offset
148 assert first-sandbox, [!!]
149 sandbox-left-margin:num <- get *first-sandbox, left:offset
150 sandbox-right-margin:num <- get *first-sandbox, right:offset
151 _, _, copy-button-left:num, copy-button-right:num, _ <- sandbox-menu-columns sandbox-left-margin, sandbox-right-margin
152 copy-button-vertical-area?:bool <- within-range? click-column, copy-button-left, copy-button-right
153 return-unless copy-button-vertical-area?, 0/false
154
155 current-sandbox:&:editor <- get *env, current-sandbox:offset
156 result <- empty-editor? current-sandbox
157 ]
158
159 def try-copy-sandbox click-row:num, env:&:environment -> clicked-on-copy-button?:bool, env:&:environment [
160 local-scope
161 load-ingredients
162
163 sandbox:&:sandbox <- find-sandbox env, click-row
164 return-unless sandbox, 0/false
165 clicked-on-copy-button? <- copy 1/true
166 text:text <- get *sandbox, data:offset
167 current-sandbox:&:editor <- get *env, current-sandbox:offset
168 current-sandbox <- insert-text current-sandbox, text
169
170 *env <- put *env, render-from:offset, -1
171
172 *env <- put *env, sandbox-in-focus?:offset, 1/true
173 ]
174
175 def find-sandbox env:&:environment, click-row:num -> result:&:sandbox [
176 local-scope
177 load-ingredients
178 curr-sandbox:&:sandbox <- get *env, sandbox:offset
179 {
180 break-unless curr-sandbox
181 start:num <- get *curr-sandbox, starting-row-on-screen:offset
182 found?:bool <- equal click-row, start
183 return-if found?, curr-sandbox
184 curr-sandbox <- get *curr-sandbox, next-sandbox:offset
185 loop
186 }
187 return 0/not-found
188 ]
189
190 def click-on-sandbox-area? click-row:num, click-column:num, env:&:environment -> result:bool [
191 local-scope
192 load-ingredients
193 current-sandbox:&:editor <- get *env, current-sandbox:offset
194 sandbox-left-margin:num <- get *current-sandbox, left:offset
195 on-sandbox-side?:bool <- greater-or-equal click-column, sandbox-left-margin
196 return-unless on-sandbox-side?, 0/false
197 first-sandbox:&:sandbox <- get *env, sandbox:offset
198 return-unless first-sandbox, 0/false
199 first-sandbox-begins:num <- get *first-sandbox, starting-row-on-screen:offset
200 result <- greater-or-equal click-row, first-sandbox-begins
201 ]
202
203 def empty-editor? editor:&:editor -> result:bool [
204 local-scope
205 load-ingredients
206 head:&:duplex-list:char <- get *editor, data:offset
207 first:&:duplex-list:char <- next head
208 result <- not first
209 ]
210
211 def within-range? x:num, low:num, high:num -> result:bool [
212 local-scope
213 load-ingredients
214 not-too-far-left?:bool <- greater-or-equal x, low
215 not-too-far-right?:bool <- lesser-or-equal x, high
216 result <- and not-too-far-left? not-too-far-right?
217 ]
218
219 scenario copy-fails-if-sandbox-editor-not-empty [
220 local-scope
221 trace-until 100/app
222 assume-screen 100/width, 10/height
223
224 assume-resources [
225 ]
226 env:&:environment <- new-programming-environment resources, screen, [add 1, 1]
227
228 assume-console [
229 press F4
230 ]
231 event-loop screen, console, env, resources
232 screen-should-contain [
233 . run (F4) .
234 . ╎ .
235 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
236 . ╎0 edit copy delete .
237 . ╎add 1, 1 .
238 . ╎2 .
239 . ╎─────────────────────────────────────────────────.
240 . ╎ .
241 ]
242
243 assume-console [
244 left-click 2, 70
245 type [0]
246 left-click 3, 70
247 ]
248 run [
249 event-loop screen, console, env, resources
250 ]
251
252 screen-should-contain [
253 . run (F4) .
254 . ╎0 .
255 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
256 . ╎0 edit copy delete .
257 . ╎add 1, 1 .
258 . ╎2 .
259 . ╎─────────────────────────────────────────────────.
260 . ╎ .
261 ]
262
263 assume-console [
264 type [1]
265 ]
266 run [
267 event-loop screen, console, env, resources
268 ]
269 screen-should-contain [
270 . run (F4) .
271 . ╎01 .
272 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
273 . ╎0 edit copy delete .
274 . ╎add 1, 1 .
275 . ╎2 .
276 . ╎─────────────────────────────────────────────────.
277 . ╎ .
278 ]
279 ]