Skip to content

Commit 7663b33

Browse files
committed
feat: allow Ctrl/Cmd-click on folders to select all files within (#24)
Folders now participate in the unified file selection: Ctrl/Cmd-click a folder toggles every changed file under it and highlights the folder when all are selected. Plain click still expands/collapses.
1 parent e8560fc commit 7663b33

1 file changed

Lines changed: 33 additions & 1 deletion

File tree

‎webview-ui/src/components/commit/CommitDetails.svelte‎

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,17 @@
336336
return sortTree(root.children);
337337
}
338338
339+
// All changed-file paths under a tree node (the node itself if it's a file).
340+
function collectFilePaths(node: FileTreeNode): string[] {
341+
return node.isFile ? [node.path] : node.children.flatMap(collectFilePaths);
342+
}
343+
344+
// A folder counts as selected when every changed file under it is selected.
345+
function isFolderSelected(node: FileTreeNode): boolean {
346+
const filesUnder = collectFilePaths(node);
347+
return filesUnder.length > 0 && filesUnder.every(p => selectedPatchFiles.has(p));
348+
}
349+
339350
let fileTree = $derived(buildFileTree(files));
340351
341352
// Auto-expand all directories when files change
@@ -780,8 +791,28 @@
780791
{:else}
781792
<button
782793
class="dir-item"
794+
class:selected={isFolderSelected(node)}
783795
style="padding-left: {8 + depth * 16}px;"
784-
onclick={() => toggleDir(node.path)}
796+
onclick={(e) => {
797+
if ((e.ctrlKey || e.metaKey) && commit) {
798+
// Add/remove every changed file under this folder.
799+
const filesUnder = collectFilePaths(node);
800+
const next = new Set(selectedPatchFiles);
801+
const allSelected = filesUnder.length > 0 && filesUnder.every(p => next.has(p));
802+
if (allSelected) {
803+
for (const p of filesUnder) next.delete(p);
804+
if (selectedFile && filesUnder.includes(selectedFile)) {
805+
selectedFile = next.size > 0 ? [...next][next.size - 1] : null;
806+
}
807+
} else {
808+
for (const p of filesUnder) next.add(p);
809+
if (filesUnder.length > 0) selectedFile = filesUnder[filesUnder.length - 1];
810+
}
811+
selectedPatchFiles = next;
812+
return;
813+
}
814+
toggleDir(node.path);
815+
}}
785816
oncontextmenu={(e) => {
786817
e.preventDefault();
787818
if (!commit) return;
@@ -1229,6 +1260,7 @@
12291260
12301261
.file-item:hover, .dir-item:hover { background: var(--bg-hover); }
12311262
.file-item.selected { background: var(--bg-selected); color: var(--text-selected); }
1263+
.dir-item.selected { background: var(--bg-selected); color: var(--text-selected); }
12321264
12331265
.dir-item {
12341266
color: var(--text-secondary);

0 commit comments

Comments
 (0)