Shift + 드래그시 포함되는 카드들의 선택 상태가 토글되도록 수정

This commit is contained in:
2026-05-15 18:47:43 +09:00
parent a1a5672d97
commit 34e2cd9775
+13 -2
View File
@@ -8,6 +8,7 @@ let _rafPending = false;
let _lastMoveEvent = null; let _lastMoveEvent = null;
let lastSelectedIdx = null; let lastSelectedIdx = null;
let _rbStartSelection = new Set(); // 러버밴드 시작 시점의 선택 스냅샷
export function resetAnchor() { export function resetAnchor() {
lastSelectedIdx = null; lastSelectedIdx = null;
@@ -95,8 +96,10 @@ function _onStart(e) {
}); });
const preserve = e.shiftKey || e.ctrlKey || e.metaKey; const preserve = e.shiftKey || e.ctrlKey || e.metaKey;
_rbStartSelection = new Set(_state.selectedIdxs); // 토글 기준점 스냅샷
if (!preserve) { if (!preserve) {
_state.selectedIdxs.clear(); _state.selectedIdxs.clear();
_rbStartSelection.clear();
lastSelectedIdx = null; lastSelectedIdx = null;
_cb.refreshCardSelection(); _cb.refreshCardSelection();
} }
@@ -127,12 +130,20 @@ function _processMove() {
}); });
const sel = { left, top, right: left + width, bottom: top + height }; const sel = { left, top, right: left + width, bottom: top + height };
const preserve = e.shiftKey || e.ctrlKey || e.metaKey; const shiftToggle = e.shiftKey && !e.ctrlKey && !e.metaKey;
const preserve = e.ctrlKey || e.metaKey;
Array.from(_grid.children).forEach((card, i) => { Array.from(_grid.children).forEach((card, i) => {
const r = card.getBoundingClientRect(); const r = card.getBoundingClientRect();
const overlaps = !(r.right < sel.left || r.left > sel.right || const overlaps = !(r.right < sel.left || r.left > sel.right ||
r.bottom < sel.top || r.top > sel.bottom); r.bottom < sel.top || r.top > sel.bottom);
if (overlaps) { if (shiftToggle) {
// 러버밴드 안: 시작 시점 기준으로 토글 (밖: 시작 시점 상태 복원)
if (overlaps ? !_rbStartSelection.has(i) : _rbStartSelection.has(i)) {
_state.selectedIdxs.add(i);
} else {
_state.selectedIdxs.delete(i);
}
} else if (overlaps) {
_state.selectedIdxs.add(i); _state.selectedIdxs.add(i);
} else if (!preserve) { } else if (!preserve) {
_state.selectedIdxs.delete(i); _state.selectedIdxs.delete(i);