From 897c414b44c1a81a86c1d27b834f24bb9ad9391f Mon Sep 17 00:00:00 2001 From: kolaflash Date: Mon, 15 Dec 2025 23:36:56 +0100 Subject: [PATCH] Improve file browser thing --- tools/FileBrowser.tsx | 113 +++++++++++++++++++++--------------------- tools/main.tsx | 50 ++++++++----------- 2 files changed, 76 insertions(+), 87 deletions(-) diff --git a/tools/FileBrowser.tsx b/tools/FileBrowser.tsx index 4e71904..210bc8a 100644 --- a/tools/FileBrowser.tsx +++ b/tools/FileBrowser.tsx @@ -2,74 +2,73 @@ 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; -export type BrowserFolder = Map; +export type FileHandler = (path: string) => void; -function isFolder(entry: BrowserFile | BrowserFolder): entry is BrowserFolder { +function isFolder(entry: string | 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() ? : } +export const FileBrowser: Component<{ + root: BrowserFolder; + handler: FileHandler; +}> = ({ root, handler }) => { + const FileEntry: Component<{ + name: string; + path: string; + }> = ({ name, path }) => { + return ( +
+ {name}
+ ); + }; - - - - - ); -}; + const FolderEntry: Component<{ + folder: BrowserFolder; + name: string; + open: boolean; + }> = ({ folder, name, open }) => { + const [isOpen, setIsOpen] = createSignal(open); -const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => { - return ( -
    - - {(item, index) => { - const [name, entry] = item(); + return ( + <> +
    setIsOpen(!isOpen())}> + {isOpen() ? : } + {name} +
    - return ( -
  • - {isFolder(entry) ? ( - - ) : ( - - )} -
  • - ); - }} -
    -
- ); -}; + + + + + ); + }; + + const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => { + return ( +
    + + {(item, index) => { + const [name, entry] = item(); + + return ( +
  • + {isFolder(entry) ? ( + + ) : ( + + )} +
  • + ); + }} +
    +
+ ); + }; -export const FileBrowser: Component<{ root: BrowserFolder }> = ({ root }) => { return (
diff --git a/tools/main.tsx b/tools/main.tsx index 865eec4..91b9f0f 100644 --- a/tools/main.tsx +++ b/tools/main.tsx @@ -5,11 +5,7 @@ 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 { type BrowserFolder, FileBrowser } from "./FileBrowser.tsx"; import { ArrowAutofitHeightIcon, ArrowAutofitWidthIcon, @@ -17,36 +13,30 @@ import { ZoomScanIcon, } from "./icons/index.ts"; -const root = new Map([ +const root = new Map([ [ - "foo", - { - path: "/foo.file", - }, - ], - [ - "bar", - { - path: "/bar.file", - }, + "Brrr", + new Map([ + [ + "folder", + new Map([ + ["fuzz", "/fuzz.file"], + ["buzz", "/buzz.file"], + ]), + ], + ["dnd:", "/dnd.file"], + ["bla", "/bla.file"], + ]), ], [ "folder", - new Map([ - [ - "fuzz", - { - path: "/fuzz.file", - }, - ], - [ - "buzz", - { - path: "/buzz.file", - }, - ], + new Map([ + ["fuzz", "/fuzz.file"], + ["buzz", "/buzz.file"], ]), ], + ["foo", "/foo.file"], + ["bar", "/bar.file"], ]); function adjustGameContainer(gameContainer: HTMLElement, width: number): void { @@ -128,7 +118,7 @@ const DevTools: Component<{ gameContainer: HTMLElement }> = ({ >
- +