From 5c0a292a1518976d653d9a917669a2edc0c685eb Mon Sep 17 00:00:00 2001 From: Hsieh Chin Fan Date: Sat, 21 Sep 2024 10:50:03 +0800 Subject: refactor: apply Layout Class * Use {name, enterHandler, leaverHandler} for layout switch * Move "overlay" to another module --- src/OverlayLayout.mjs | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/OverlayLayout.mjs (limited to 'src/OverlayLayout.mjs') diff --git a/src/OverlayLayout.mjs b/src/OverlayLayout.mjs new file mode 100644 index 0000000..c87033b --- /dev/null +++ b/src/OverlayLayout.mjs @@ -0,0 +1,80 @@ +import PlainDraggable from 'plain-draggable' +import { onRemove } from './utils' + +export class OverlayLayout { + name = "overlay" + + enterHandler = (dumbymap) => { + const container = dumbymap.htmlHolder + const moveIntoDraggable = (block) => { + // Create draggable block + const draggableBlock = document.createElement('div') + draggableBlock.classList.add('draggable-block') + + // Add draggable part + const draggablePart = document.createElement('div'); + draggablePart.classList.add('draggable') + draggablePart.textContent = '☰' + draggablePart.title = 'Use middle-click to remove block' + draggablePart.onmouseup = (e) => { + if (e.button === 1) { + // Hide block with middle click + draggableBlock.style.display = "none"; + } + } + + // Set elements + draggableBlock.appendChild(draggablePart) + draggableBlock.appendChild(block) + container.appendChild(draggableBlock) + + // Add draggable instance + const draggableInstance = new PlainDraggable(draggableBlock, { + handle: draggablePart, + snap: { x: { step: 20 }, y: { step: 20 } }, + }) + + // Reposition draggable instance when resized + new ResizeObserver(() => { + try { + draggableInstance.position(); + } catch (_) { + null + } + }).observe(draggableBlock); + + // Callback for remove + onRemove(draggableBlock, () => { + draggableInstance.remove() + }) + + return draggableInstance + } + + // Create draggable blocks and set each position by previous one + let [x, y] = [0, 0] + dumbymap.blocks.map(moveIntoDraggable) + .forEach(draggable => { + draggable.left = x + draggable.top = y + const rect = draggable.element.getBoundingClientRect() + x += rect.width + 30 + if (x > window.innerWidth) { + y += 200 + x = x % window.innerWidth + } + }) + } + leaveHandler = (dumbymap) => { + const container = dumbymap.htmlHolder + const resumeFromDraggable = (block) => { + const draggableContainer = block.closest('.draggable-block') + if (!draggableContainer) return + container.appendChild(block) + block.removeAttribute('style') + draggableContainer.remove() + } + dumbymap.blocks.forEach(resumeFromDraggable) + } +} + -- cgit v1.2.3-70-g09d2