@@ -270,6 +270,43 @@ export default (el, storage) => {
270
270
const { keys } = state
271
271
keys [ e . key ] = true
272
272
273
+ if ( keys . Control ) {
274
+ if ( keys . s ) {
275
+ e . preventDefault ( )
276
+ e . stopPropagation ( )
277
+ if ( state . focus ) {
278
+ app . dispatchEvent ( new CustomEvent ( 'save' , { detail : state . focus } ) )
279
+ } else {
280
+ const fullState = JSON . stringify ( {
281
+ gridState : JSON . stringify ( grid ) ,
282
+ gridSquares : JSON . stringify ( [ ...grid . squares ] ) ,
283
+ ...Object . fromEntries ( [ ...editors ] . map ( ( [ id , instance ] ) => [ id , instance . value ] ) )
284
+ } , null , 2 )
285
+ app . dispatchEvent ( new CustomEvent ( 'export' , { detail : fullState } ) )
286
+ keys . Control = false
287
+ keys . s = false
288
+ }
289
+ }
290
+ if ( keys . o ) {
291
+ e . preventDefault ( )
292
+ e . stopPropagation ( )
293
+ app . dispatchEvent ( new CustomEvent ( 'import' ) )
294
+ keys . Control = false
295
+ keys . o = false
296
+ }
297
+ }
298
+ if ( ! state . focus || keys . Control ) {
299
+ if ( keys [ ' ' ] ) {
300
+ e . preventDefault ( )
301
+ e . stopPropagation ( )
302
+ app . dispatchEvent ( new CustomEvent ( 'play' ) )
303
+ }
304
+ if ( keys . Enter ) {
305
+ e . preventDefault ( )
306
+ e . stopPropagation ( )
307
+ app . dispatchEvent ( new CustomEvent ( 'pause' ) )
308
+ }
309
+ }
273
310
if ( keys . Escape ) {
274
311
if ( state . focus ) {
275
312
e . preventDefault ( )
@@ -320,9 +357,16 @@ export default (el, storage) => {
320
357
// the two events below prevent clicks to be handled when clicking into
321
358
// an out of focus window to bring it to focus, and therefore prevent
322
359
// unwanted paints
323
- window . addEventListener ( 'blur' , ( ) => state . background = true )
324
- window . addEventListener ( 'focus' , ( ) => setTimeout ( ( ) => state . background = false , 300 ) )
360
+ const handleWindowBlur = e => {
361
+ state . background = true
362
+ }
325
363
364
+ const handleWindowFocus = e => {
365
+ setTimeout ( ( ) => state . background = false , 300 )
366
+ }
367
+
368
+ window . addEventListener ( 'blur' , handleWindowBlur , { passive : false } )
369
+ window . addEventListener ( 'focus' , handleWindowFocus , { passive : false } )
326
370
window . addEventListener ( 'resize' , handleWindowResize , { passive : false } )
327
371
328
372
window . addEventListener ( 'wheel' , handleMouseWheel , { passive : false } )
@@ -339,6 +383,8 @@ export default (el, storage) => {
339
383
window . addEventListener ( 'keyup' , handleKeyUp , { passive : false } )
340
384
341
385
grid . load ( )
386
+ grid . saveState ( )
387
+ grid . saveSquares ( )
342
388
grid . render ( )
343
389
el . appendChild ( grid . canvas )
344
390
@@ -347,5 +393,25 @@ export default (el, storage) => {
347
393
grid . render ( )
348
394
}
349
395
396
+ app . destroy = ( ) => {
397
+ window . removeEventListener ( 'blur' , handleWindowBlur )
398
+ window . removeEventListener ( 'focus' , handleWindowFocus )
399
+ window . removeEventListener ( 'resize' , handleWindowResize )
400
+
401
+ window . removeEventListener ( 'wheel' , handleMouseWheel )
402
+ window . removeEventListener ( 'mousedown' , handleMouseDown )
403
+ window . removeEventListener ( 'mouseup' , handleMouseUp )
404
+ window . removeEventListener ( 'mouseover' , handleMouseOver )
405
+ window . removeEventListener ( 'mouseout' , handleMouseOut )
406
+ window . removeEventListener ( 'mousemove' , handleMouseMove )
407
+ window . removeEventListener ( 'touchmove' , handleMouseMove )
408
+ window . removeEventListener ( 'touchstart' , handleMouseDown )
409
+ window . removeEventListener ( 'contextmenu' , handleContextMenu )
410
+
411
+ window . removeEventListener ( 'keydown' , handleKeyDown )
412
+ window . removeEventListener ( 'keyup' , handleKeyUp )
413
+ el . removeChild ( grid . canvas )
414
+ }
415
+
350
416
return app
351
417
}
0 commit comments