diff --git a/tools/FileBrowser.css b/tools/FileBrowser.css new file mode 100644 index 0000000..b94cbdb --- /dev/null +++ b/tools/FileBrowser.css @@ -0,0 +1,33 @@ +.file-browser { + background: var(--c-bg-0); + margin-left: calc(var(--sp-2) * -1); +} + +.file-list { + margin: 0; + list-style: none; + padding: 0 0 0 var(--sp-2); +} + +.file-item { + display: flex; + flex-flow: column nowrap; +} + +.file-label { + display: flex; + justify-content: flex-start; + align-items: center; + padding: var(--sp-1); + border-radius: var(--sp-1); + cursor: pointer; + + svg { + margin-right: var(--sp-1); + } + + &.active, + &:hover { + background: var(--c-bg-2); + } +} diff --git a/tools/FileBrowser.tsx b/tools/FileBrowser.tsx new file mode 100644 index 0000000..4e71904 --- /dev/null +++ b/tools/FileBrowser.tsx @@ -0,0 +1,78 @@ +import "./FileBrowser.css"; +import { type Component, createSignal, Index, Show } from "solid-js"; +import { FileIcon, FolderIcon, FolderOpenIcon } from "./icons/index.ts"; + +export type BrowserFile = { path: string }; + +export type BrowserFolder = Map; + +function isFolder(entry: BrowserFile | BrowserFolder): entry is BrowserFolder { + return typeof (entry as BrowserFolder).size === "number"; +} + +const FileEntry: Component<{ name: string; file: BrowserFile }> = ({ + name, + file, +}) => { + return ( +
+ + {name} +
+ ); +}; + +const FolderEntry: Component<{ + folder: BrowserFolder; + name: string; + index: number; +}> = ({ folder, name, index }) => { + const [isOpen, setIsOpen] = createSignal(index < 1); + + return ( + <> +
setIsOpen(!isOpen())}> + {isOpen() ? : } + {name} +
+ + + + + + ); +}; + +const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => { + return ( + + ); +}; + +export const FileBrowser: Component<{ root: BrowserFolder }> = ({ root }) => { + return ( +
+ +
+ ); +}; diff --git a/tools/main.tsx b/tools/main.tsx index db377bc..865eec4 100644 --- a/tools/main.tsx +++ b/tools/main.tsx @@ -5,6 +5,11 @@ import { currentScene } from "#/engine/Scene.ts"; import { setScale, viewport } from "#/engine/Viewport.ts"; import { InputField } from "#/tools/controls/InputField.tsx"; import { RangeSlider } from "#/tools/controls/RangeSlider.tsx"; +import { + type BrowserFile, + type BrowserFolder, + FileBrowser, +} from "./FileBrowser.tsx"; import { ArrowAutofitHeightIcon, ArrowAutofitWidthIcon, @@ -12,6 +17,38 @@ import { ZoomScanIcon, } from "./icons/index.ts"; +const root = new Map([ + [ + "foo", + { + path: "/foo.file", + }, + ], + [ + "bar", + { + path: "/bar.file", + }, + ], + [ + "folder", + new Map([ + [ + "fuzz", + { + path: "/fuzz.file", + }, + ], + [ + "buzz", + { + path: "/buzz.file", + }, + ], + ]), + ], +]); + function adjustGameContainer(gameContainer: HTMLElement, width: number): void { gameContainer.style = `position: relative; top: 0; left: ${width}px; width: ${document.body.offsetWidth - width}px;`; } @@ -90,6 +127,8 @@ const DevTools: Component<{ gameContainer: HTMLElement }> = ({ }} > + +