Skip to content

Commit 2ac3b4b

Browse files
committed
basic saving/loading of state
1 parent d16069a commit 2ac3b4b

File tree

1 file changed

+68
-2
lines changed

1 file changed

+68
-2
lines changed

js/sequencer.js

+68-2
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,43 @@ export default (el, storage) => {
270270
const { keys } = state
271271
keys[e.key] = true
272272

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+
}
273310
if (keys.Escape) {
274311
if (state.focus) {
275312
e.preventDefault()
@@ -320,9 +357,16 @@ export default (el, storage) => {
320357
// the two events below prevent clicks to be handled when clicking into
321358
// an out of focus window to bring it to focus, and therefore prevent
322359
// 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+
}
325363

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 })
326370
window.addEventListener('resize', handleWindowResize, { passive: false })
327371

328372
window.addEventListener('wheel', handleMouseWheel, { passive: false })
@@ -339,6 +383,8 @@ export default (el, storage) => {
339383
window.addEventListener('keyup', handleKeyUp, { passive: false })
340384

341385
grid.load()
386+
grid.saveState()
387+
grid.saveSquares()
342388
grid.render()
343389
el.appendChild(grid.canvas)
344390

@@ -347,5 +393,25 @@ export default (el, storage) => {
347393
grid.render()
348394
}
349395

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+
350416
return app
351417
}

0 commit comments

Comments
 (0)