Improve file browser thing

This commit is contained in:
kolaflash
2025-12-15 23:36:56 +01:00
parent 448d203c74
commit 897c414b44
2 changed files with 76 additions and 87 deletions
+22 -23
View File
@@ -2,32 +2,36 @@ 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<string, string | BrowserFolder>;
export type BrowserFolder = Map<string, BrowserFile | BrowserFolder>;
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,
}) => {
export const FileBrowser: Component<{
root: BrowserFolder;
handler: FileHandler;
}> = ({ root, handler }) => {
const FileEntry: Component<{
name: string;
path: string;
}> = ({ name, path }) => {
return (
<div class="file-label" onClick={[console.log, file]}>
<div class="file-label" onClick={[handler, path]}>
<FileIcon />
<span>{name}</span>
</div>
);
};
};
const FolderEntry: Component<{
const FolderEntry: Component<{
folder: BrowserFolder;
name: string;
index: number;
}> = ({ folder, name, index }) => {
const [isOpen, setIsOpen] = createSignal(index < 1);
open: boolean;
}> = ({ folder, name, open }) => {
const [isOpen, setIsOpen] = createSignal(open);
return (
<>
@@ -41,9 +45,9 @@ const FolderEntry: Component<{
</Show>
</>
);
};
};
const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => {
const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => {
return (
<ul class="file-list">
<Index each={[...folder.entries()]}>
@@ -53,13 +57,9 @@ const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => {
return (
<li class="file-item">
{isFolder(entry) ? (
<FolderEntry
folder={entry as BrowserFolder}
name={name}
index={index}
/>
<FolderEntry folder={entry} name={name} open={index < 1} />
) : (
<FileEntry name={name} file={entry as BrowserFile} />
<FileEntry name={name} path={entry} />
)}
</li>
);
@@ -67,9 +67,8 @@ const FileList: Component<{ folder: BrowserFolder }> = ({ folder }) => {
</Index>
</ul>
);
};
};
export const FileBrowser: Component<{ root: BrowserFolder }> = ({ root }) => {
return (
<div class="file-browser">
<FileList folder={root} />
+19 -29
View File
@@ -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<string, BrowserFile | BrowserFolder>([
const root = new Map<string, string | BrowserFolder>([
[
"foo",
{
path: "/foo.file",
},
"Brrr",
new Map<string, string | BrowserFolder>([
[
"folder",
new Map<string, string | BrowserFolder>([
["fuzz", "/fuzz.file"],
["buzz", "/buzz.file"],
]),
],
[
"bar",
{
path: "/bar.file",
},
["dnd:", "/dnd.file"],
["bla", "/bla.file"],
]),
],
[
"folder",
new Map([
[
"fuzz",
{
path: "/fuzz.file",
},
],
[
"buzz",
{
path: "/buzz.file",
},
],
new Map<string, string | BrowserFolder>([
["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 }> = ({
></InputField>
</div>
<FileBrowser root={root} />
<FileBrowser root={root} handler={console.log} />
</div>
<div class="tool-bar-resize" onMouseDown={startResizing}></div>
</div>