From 722cf5848675e6c3d574a8082fc69bf3e251ae73 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Sun, 26 Oct 2025 12:12:23 +0100 Subject: [PATCH] progress --- website/src/lib/components/Menu.svelte | 7 +- .../CollapsibleTreeNode.svelte | 11 +- .../lib/components/file-list/FileList.svelte | 58 ++-- .../components/file-list/FileListNode.svelte | 18 +- .../file-list/FileListNodeContent.svelte | 276 ++--------------- .../file-list/FileListNodeLabel.svelte | 95 +++--- .../src/lib/components/file-list/file-list.ts | 18 -- .../file-list/metadata/MetadataDialog.svelte | 2 +- .../file-list/sortable-file-list.ts | 289 ++++++++++++++++++ .../file-list/style/StyleDialog.svelte | 2 +- .../map/gpx-layer/WaypointPopup.svelte | 4 +- .../src/routes/[[language]]/app/+page.svelte | 6 +- 12 files changed, 401 insertions(+), 385 deletions(-) create mode 100644 website/src/lib/components/file-list/sortable-file-list.ts diff --git a/website/src/lib/components/Menu.svelte b/website/src/lib/components/Menu.svelte index 201aabfc..976e1cc5 100644 --- a/website/src/lib/components/Menu.svelte +++ b/website/src/lib/components/Menu.svelte @@ -51,11 +51,7 @@ import { anySelectedLayer } from '$lib/components/map/layer-control/utils'; import { defaultOverlays } from '$lib/assets/layers'; import LayerControlSettings from '$lib/components/map/layer-control/LayerControlSettings.svelte'; - import { - allowedPastes, - ListFileItem, - ListTrackItem, - } from '$lib/components/file-list/file-list'; + import { ListFileItem, ListTrackItem } from '$lib/components/file-list/file-list'; import Export from '$lib/components/export/Export.svelte'; import { mode, setMode } from 'mode-watcher'; import { i18n } from '$lib/i18n.svelte'; @@ -75,6 +71,7 @@ import { allHidden } from '$lib/logic/hidden'; import { boundsManager } from '$lib/logic/bounds'; import { tick } from 'svelte'; + import { allowedPastes } from '$lib/components/file-list/sortable-file-list'; const { distanceUnits, diff --git a/website/src/lib/components/collapsible-tree/CollapsibleTreeNode.svelte b/website/src/lib/components/collapsible-tree/CollapsibleTreeNode.svelte index 25debcfb..f9ade45d 100644 --- a/website/src/lib/components/collapsible-tree/CollapsibleTreeNode.svelte +++ b/website/src/lib/components/collapsible-tree/CollapsibleTreeNode.svelte @@ -34,9 +34,10 @@ {/if} - {@render props.content()} diff --git a/website/src/lib/components/file-list/FileList.svelte b/website/src/lib/components/file-list/FileList.svelte index 3b8afa2f..ad2b48e5 100644 --- a/website/src/lib/components/file-list/FileList.svelte +++ b/website/src/lib/components/file-list/FileList.svelte @@ -2,15 +2,15 @@ import { ScrollArea } from '$lib/components/ui/scroll-area/index'; import * as ContextMenu from '$lib/components/ui/context-menu'; import FileListNode from './FileListNode.svelte'; - import { setContext } from 'svelte'; - import { ListFileItem, ListLevel, ListRootItem, allowedPastes } from './file-list'; + import { onMount, setContext } from 'svelte'; + import { ListFileItem, ListLevel, ListRootItem } from './file-list'; import { ClipboardPaste, FileStack, Plus } from '@lucide/svelte'; import Shortcut from '$lib/components/Shortcut.svelte'; import { i18n } from '$lib/i18n.svelte'; - import { settings } from '$lib/logic/settings'; import { fileStateCollection } from '$lib/logic/file-state'; import { createFile, pasteSelection } from '$lib/logic/file-actions'; import { selection, copied } from '$lib/logic/selection'; + import { allowedPastes } from './sortable-file-list'; let { orientation, @@ -27,30 +27,28 @@ setContext('orientation', orientation); setContext('recursive', recursive); - const { treeFileView } = settings; - - // treeFileView.subscribe(($vertical) => { - // if ($vertical) { - // selection.update(($selection) => { - // $selection.forEach((item) => { - // if ($selection.hasAnyChildren(item, false)) { - // $selection.toggle(item); - // } - // }); - // return $selection; - // }); - // } else { - // selection.update(($selection) => { - // $selection.forEach((item) => { - // if (!(item instanceof ListFileItem)) { - // $selection.toggle(item); - // $selection.set(new ListFileItem(item.getFileId()), true); - // } - // }); - // return $selection; - // }); - // } - // }); + onMount(() => { + if (orientation === 'vertical') { + selection.update(($selection) => { + $selection.forEach((item) => { + if ($selection.hasAnyChildren(item, false)) { + $selection.toggle(item); + } + }); + return $selection; + }); + } else { + selection.update(($selection) => { + $selection.forEach((item) => { + if (!(item instanceof ListFileItem)) { + $selection.toggle(item); + $selection.set(new ListFileItem(item.getFileId()), true); + } + }); + return $selection; + }); + } + }); - + {i18n._('menu.new_file')} @@ -80,7 +78,7 @@ onclick={() => selection.selectAll()} disabled={$fileStateCollection.size === 0} > - + {i18n._('menu.select_all')} @@ -91,7 +89,7 @@ !allowedPastes[$copied[0].level].includes(ListLevel.ROOT)} onclick={pasteSelection} > - + {i18n._('menu.paste')} diff --git a/website/src/lib/components/file-list/FileListNode.svelte b/website/src/lib/components/file-list/FileListNode.svelte index 20e5b83a..42bda04c 100644 --- a/website/src/lib/components/file-list/FileListNode.svelte +++ b/website/src/lib/components/file-list/FileListNode.svelte @@ -58,15 +58,15 @@ const { treeFileView } = settings; - function openIfSelectedChild() { - if (collapsible && treeFileView.value && $selection.hasAnyChildren(item, false)) { - collapsible.openNode(); - } - } + // function openIfSelectedChild() { + // if (collapsible && $treeFileView && $selection.hasAnyChildren(item, false)) { + // collapsible.openNode(); + // } + // } - if ($selection) { - openIfSelectedChild(); - } + // if ($selection) { + // openIfSelectedChild(); + // } // afterUpdate(openIfSelectedChild); @@ -83,7 +83,7 @@ {/snippet} {#snippet content()} -
+
{#key node} {/key} diff --git a/website/src/lib/components/file-list/FileListNodeContent.svelte b/website/src/lib/components/file-list/FileListNodeContent.svelte index 7c472528..d4f34036 100644 --- a/website/src/lib/components/file-list/FileListNodeContent.svelte +++ b/website/src/lib/components/file-list/FileListNodeContent.svelte @@ -1,28 +1,13 @@ - -
+ {/if} {/if} diff --git a/website/src/lib/components/file-list/FileListNodeLabel.svelte b/website/src/lib/components/file-list/FileListNodeLabel.svelte index 672ca713..3f5b34b6 100644 --- a/website/src/lib/components/file-list/FileListNodeLabel.svelte +++ b/website/src/lib/components/file-list/FileListNodeLabel.svelte @@ -17,31 +17,31 @@ Maximize, Scissors, FileStack, - FileX, } from '@lucide/svelte'; import { ListFileItem, ListLevel, ListTrackItem, ListWaypointItem, - allowedPastes, type ListItem, } from './file-list'; import { getContext } from 'svelte'; - import { get } from 'svelte/store'; import { GPXTreeElement, Track, type AnyGPXTreeElement, Waypoint, GPXFile } from 'gpx'; import { i18n } from '$lib/i18n.svelte'; import MetadataDialog from '$lib/components/file-list/metadata/MetadataDialog.svelte'; import { editMetadata } from '$lib/components/file-list/metadata/utils.svelte'; - import StyleDialog from './style/StyleDialog.svelte'; + import StyleDialog from '$lib/components/file-list/style/StyleDialog.svelte'; import { editStyle } from '$lib/components/file-list/style/utils.svelte'; - import { waypointPopup } from '$lib/components/map/gpx-layer/GPXLayerPopup'; import { getSymbolKey, symbols } from '$lib/assets/symbols'; import { selection, copied, cut } from '$lib/logic/selection'; import { map } from '$lib/components/map/map'; import { fileActions, pasteSelection } from '$lib/logic/file-actions'; import { allHidden } from '$lib/logic/hidden'; import { boundsManager } from '$lib/logic/bounds'; + import { gpxLayers } from '$lib/components/map/gpx-layer/gpx-layers'; + import { fileStateCollection } from '$lib/logic/file-state'; + import { waypointPopup } from '$lib/components/map/gpx-layer/gpx-layer-popup'; + import { allowedPastes } from './sortable-file-list'; let { node, @@ -58,13 +58,15 @@ let singleSelection = $derived($selection.size === 1); - let nodeColors: string[] = []; /* $derived.by(() => { + let nodeColors: string[] = $state([]); + + $effect.pre(() => { let colors: string[] = []; - if (node && map.value) { + if (node && $map) { if (node instanceof GPXFile) { let defaultColor = undefined; - let layer = gpxLayers.get(item.getFileId()); + let layer = gpxLayers.getLayer(item.getFileId()); if (layer) { defaultColor = layer.layerColor; } @@ -78,23 +80,20 @@ } else if (node instanceof Track) { let style = node.getStyle(); if (style) { - if ( - style['gpx_style:color'] && - !nodeColors.includes(style['gpx_style:color']) - ) { - nodeColors.push(style['gpx_style:color']); + if (style['gpx_style:color'] && !colors.includes(style['gpx_style:color'])) { + colors.push(style['gpx_style:color']); } } if (colors.length === 0) { - let layer = gpxLayers.get(item.getFileId()); + let layer = gpxLayers.getLayer(item.getFileId()); if (layer) { colors.push(layer.layerColor); } } } } - return colors; - });*/ + nodeColors = colors; + }); let symbolKey = $derived(node instanceof Waypoint ? getSymbolKey(node.sym) : undefined); @@ -117,8 +116,8 @@ { if (open) { - if (!get(selection).has(item)) { - selectItem(item); + if (!$selection.has(item)) { + selection.selectItem(item); } } }} @@ -126,7 +125,7 @@