diff --git a/src/renderer/handlers/drag-drop.js b/src/renderer/handlers/drag-drop.js index bdcc36f..7e57ec9 100644 --- a/src/renderer/handlers/drag-drop.js +++ b/src/renderer/handlers/drag-drop.js @@ -266,6 +266,7 @@ function _moveSingle(srcIdx, targetIdx) { Array.from(_grid.children).forEach((c, i) => { c.dataset.idx = i; }); _cb.updateNumberBadges(); _cb.updateNewNameLabels(); + _cb.pushHistory?.([moved.path]); } function _moveMulti(targetIdx) { @@ -301,6 +302,7 @@ function _moveMulti(targetIdx) { _cb.updateNewNameLabels(); _cb.refreshCardSelection(); _cb.updateSelCount(); + _cb.pushHistory?.(movedFiles.map(f => f.path)); } // ── 자동 스크롤 ─────────────────────────────────── diff --git a/src/renderer/history.js b/src/renderer/history.js new file mode 100644 index 0000000..6787f1f --- /dev/null +++ b/src/renderer/history.js @@ -0,0 +1,33 @@ +const MAX = 50; +let _stack = []; // each entry: { files: [], affectedPaths: Set | null } +let _cursor = -1; + +export function push(files, affectedPaths = null) { + _stack = _stack.slice(0, _cursor + 1); + _stack.push({ files: [...files], affectedPaths: affectedPaths ? new Set(affectedPaths) : null }); + if (_stack.length > MAX) _stack.shift(); + _cursor = _stack.length - 1; +} + +// Returns { files, affectedPaths } where affectedPaths are from the entry being undone +export function undo() { + if (!canUndo()) return null; + const affectedPaths = _stack[_cursor].affectedPaths; + --_cursor; + return { files: [..._stack[_cursor].files], affectedPaths }; +} + +// Returns { files, affectedPaths } from the entry being redone +export function redo() { + if (!canRedo()) return null; + ++_cursor; + return { files: [..._stack[_cursor].files], affectedPaths: _stack[_cursor].affectedPaths }; +} + +export function canUndo() { return _cursor > 0; } +export function canRedo() { return _cursor < _stack.length - 1; } + +export function reset() { + _stack = []; + _cursor = -1; +} diff --git a/src/renderer/index.html b/src/renderer/index.html index 71aefaf..8dcdd94 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -32,6 +32,9 @@
+ + +