From 801eb5d2cb868d0a14c056439e3898b110f4cc21 Mon Sep 17 00:00:00 2001 From: adamelmore <2363879+adamdottv@users.noreply.github.com> Date: Mon, 26 Jan 2026 09:39:25 -0600 Subject: wip(app): file tree mode --- packages/app/src/components/file-tree.tsx | 85 +++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 27 deletions(-) (limited to 'packages/app/src/components') diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx index ac435095d..a48f0039f 100644 --- a/packages/app/src/components/file-tree.tsx +++ b/packages/app/src/components/file-tree.tsx @@ -9,6 +9,7 @@ import { Match, splitProps, Switch, + untrack, type ComponentProps, type ParentProps, } from "solid-js" @@ -21,10 +22,14 @@ export default function FileTree(props: { nodeClass?: string level?: number allowed?: readonly string[] + draggable?: boolean + tooltip?: boolean onFileClick?: (file: FileNode) => void }) { const file = useFile() const level = props.level ?? 0 + const draggable = () => props.draggable ?? true + const tooltip = () => props.tooltip ?? true const filter = createMemo(() => { const allowed = props.allowed @@ -45,6 +50,18 @@ export default function FileTree(props: { return { files, dirs } }) + createEffect(() => { + const current = filter() + if (!current) return + if (level !== 0) return + + for (const dir of current.dirs) { + const expanded = untrack(() => file.tree.state(dir)?.expanded) ?? false + if (expanded) continue + file.tree.expand(dir) + } + }) + createEffect(() => { void file.tree.list(props.path) }) @@ -78,8 +95,9 @@ export default function FileTree(props: { [props.nodeClass ?? ""]: !!props.nodeClass, }} style={`padding-left: ${8 + level * 12}px`} - draggable={true} + draggable={draggable()} onDragStart={(e: DragEvent) => { + if (!draggable()) return e.dataTransfer?.setData("text/plain", `file:${local.node.path}`) e.dataTransfer?.setData("text/uri-list", `file://${local.node.path}`) if (e.dataTransfer) e.dataTransfer.effectAllowed = "copy" @@ -123,41 +141,54 @@ export default function FileTree(props: { {(node) => { const expanded = () => file.tree.state(node.path)?.expanded ?? false + const Wrapper = (p: ParentProps) => { + if (!tooltip()) return p.children + return ( + + {p.children} + + ) + } + return ( - - - - (open ? file.tree.expand(node.path) : file.tree.collapse(node.path))} - > - + + + (open ? file.tree.expand(node.path) : file.tree.collapse(node.path))} + > + + - - - - - - - + + + + + + + + + props.onFileClick?.(node)}>
- - - + + + ) }} -- cgit v1.2.3