fix hiding

This commit is contained in:
vcoppe
2025-10-19 13:45:05 +02:00
parent 05df3ca064
commit 3f103323c7
7 changed files with 172 additions and 143 deletions

View File

@@ -72,6 +72,7 @@
import { fileStateCollection } from '$lib/logic/file-state'; import { fileStateCollection } from '$lib/logic/file-state';
import { fileActionManager } from '$lib/logic/file-action-manager'; import { fileActionManager } from '$lib/logic/file-action-manager';
import { copied, selection } from '$lib/logic/selection'; import { copied, selection } from '$lib/logic/selection';
import { allHidden } from '$lib/logic/hidden';
const { const {
distanceUnits, distanceUnits,
@@ -229,21 +230,21 @@
</Menubar.Item> </Menubar.Item>
<Menubar.Item <Menubar.Item
onclick={() => { onclick={() => {
// if ($allHidden) { if ($allHidden) {
// fileActions.setHiddenToSelection(false); fileActions.setHiddenToSelection(false);
// } else { } else {
// fileActions.setHiddenToSelection(true); fileActions.setHiddenToSelection(true);
// } }
}} }}
disabled={$selection.size == 0} disabled={$selection.size == 0}
> >
<!-- {#if $allHidden} {#if $allHidden}
<Eye size="16" /> <Eye size="16" />
{i18n._('menu.unhide')} {i18n._('menu.unhide')}
{:else} {:else}
<EyeOff size="16" /> <EyeOff size="16" />
{i18n._('menu.hide')} {i18n._('menu.hide')}
{/if} --> {/if}
<Shortcut key="H" ctrl={true} /> <Shortcut key="H" ctrl={true} />
</Menubar.Item> </Menubar.Item>
{#if $treeFileView} {#if $treeFileView}
@@ -621,11 +622,11 @@
$treeFileView = !$treeFileView; $treeFileView = !$treeFileView;
e.preventDefault(); e.preventDefault();
} else if (e.key === 'h' && (e.metaKey || e.ctrlKey)) { } else if (e.key === 'h' && (e.metaKey || e.ctrlKey)) {
// if ($allHidden) { if ($allHidden) {
// fileActions.setHiddenToSelection(false); fileActions.setHiddenToSelection(false);
// } else { } else {
// fileActions.setHiddenToSelection(true); fileActions.setHiddenToSelection(true);
// } }
e.preventDefault(); e.preventDefault();
} else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
// if ($selection.size > 0) { // if ($selection.size > 0) {

View File

@@ -40,6 +40,7 @@
import { selection, copied, cut } from '$lib/logic/selection'; import { selection, copied, cut } from '$lib/logic/selection';
import { map } from '$lib/components/map/map'; import { map } from '$lib/components/map/map';
import { fileActions, pasteSelection } from '$lib/logic/file-actions'; import { fileActions, pasteSelection } from '$lib/logic/file-actions';
import { allHidden } from '$lib/logic/hidden';
let { let {
node, node,
@@ -240,20 +241,20 @@
{/if} {/if}
<ContextMenu.Item <ContextMenu.Item
onclick={() => { onclick={() => {
// if ($allHidden) { if ($allHidden) {
// dbUtils.setHiddenToSelection(false); fileActions.setHiddenToSelection(false);
// } else { } else {
// dbUtils.setHiddenToSelection(true); fileActions.setHiddenToSelection(true);
// } }
}} }}
> >
<!-- {#if $allHidden} {#if $allHidden}
<Eye size="16" class="mr-1" /> <Eye size="16" class="mr-1" />
{i18n._('menu.unhide')} {i18n._('menu.unhide')}
{:else} {:else}
<EyeOff size="16" class="mr-1" /> <EyeOff size="16" class="mr-1" />
{i18n._('menu.hide')} {i18n._('menu.hide')}
{/if} --> {/if}
<Shortcut key="H" ctrl={true} /> <Shortcut key="H" ctrl={true} />
</ContextMenu.Item> </ContextMenu.Item>
<ContextMenu.Separator /> <ContextMenu.Separator />

View File

@@ -747,61 +747,61 @@ export const fileActions = {
); );
}, },
setStyleToSelection: (style: LineStyleExtension) => { setStyleToSelection: (style: LineStyleExtension) => {
// if (get(selection).size === 0) { if (get(selection).size === 0) {
// return; return;
// } }
// applyGlobal((draft) => { fileActionManager.applyGlobal((draft) => {
// applyToOrderedSelectedItemsFromFile((fileId, level, items) => { selection.applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
// let file = draft.get(fileId); let file = draft.get(fileId);
// if (file && (level === ListLevel.FILE || level === ListLevel.TRACK)) { if (file && (level === ListLevel.FILE || level === ListLevel.TRACK)) {
// if (level === ListLevel.FILE) { if (level === ListLevel.FILE) {
// file.setStyle(style); file.setStyle(style);
// } else if (level === ListLevel.TRACK) { } else if (level === ListLevel.TRACK) {
// if (items.length === file.trk.length) { if (items.length === file.trk.length) {
// file.setStyle(style); file.setStyle(style);
// } else { } else {
// for (let item of items) { for (let item of items) {
// let trackIndex = (item as ListTrackItem).getTrackIndex(); let trackIndex = (item as ListTrackItem).getTrackIndex();
// file.trk[trackIndex].setStyle(style); file.trk[trackIndex].setStyle(style);
// } }
// } }
// } }
// } }
// }); });
// }); });
}, },
setHiddenToSelection: (hidden: boolean) => { setHiddenToSelection: (hidden: boolean) => {
// if (get(selection).size === 0) { if (get(selection).size === 0) {
// return; return;
// } }
// applyGlobal((draft) => { fileActionManager.applyGlobal((draft) => {
// applyToOrderedSelectedItemsFromFile((fileId, level, items) => { selection.applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
// let file = draft.get(fileId); let file = draft.get(fileId);
// if (file) { if (file) {
// if (level === ListLevel.FILE) { if (level === ListLevel.FILE) {
// file.setHidden(hidden); file.setHidden(hidden);
// } else if (level === ListLevel.TRACK) { } else if (level === ListLevel.TRACK) {
// let trackIndices = items.map((item) => let trackIndices = items.map((item) =>
// (item as ListTrackItem).getTrackIndex() (item as ListTrackItem).getTrackIndex()
// ); );
// file.setHidden(hidden, trackIndices); file.setHidden(hidden, trackIndices);
// } else if (level === ListLevel.SEGMENT) { } else if (level === ListLevel.SEGMENT) {
// let trackIndices = [(items[0] as ListTrackSegmentItem).getTrackIndex()]; let trackIndices = [(items[0] as ListTrackSegmentItem).getTrackIndex()];
// let segmentIndices = items.map((item) => let segmentIndices = items.map((item) =>
// (item as ListTrackSegmentItem).getSegmentIndex() (item as ListTrackSegmentItem).getSegmentIndex()
// ); );
// file.setHidden(hidden, trackIndices, segmentIndices); file.setHidden(hidden, trackIndices, segmentIndices);
// } else if (level === ListLevel.WAYPOINTS) { } else if (level === ListLevel.WAYPOINTS) {
// file.setHiddenWaypoints(hidden); file.setHiddenWaypoints(hidden);
// } else if (level === ListLevel.WAYPOINT) { } else if (level === ListLevel.WAYPOINT) {
// let waypointIndices = items.map((item) => let waypointIndices = items.map((item) =>
// (item as ListWaypointItem).getWaypointIndex() (item as ListWaypointItem).getWaypointIndex()
// ); );
// file.setHiddenWaypoints(hidden, waypointIndices); file.setHiddenWaypoints(hidden, waypointIndices);
// } }
// } }
// }); });
// }); });
}, },
deleteSelection: () => { deleteSelection: () => {
if (get(selection).size === 0) { if (get(selection).size === 0) {

View File

@@ -31,10 +31,6 @@ export class GPXFileState {
} }
this._file.set({ file, statistics }); this._file.set({ file, statistics });
// if (get(selection).hasAnyChildren(new ListFileItem(id))) {
// updateAllHidden();
// }
} }
}); });
} }

View File

@@ -0,0 +1,67 @@
import { get, writable, type Writable } from 'svelte/store';
import { SelectedGPXFilesObserver, selection } from '$lib/logic/selection';
import { fileStateCollection } from '$lib/logic/file-state';
import {
ListFileItem,
ListTrackItem,
ListTrackSegmentItem,
ListWaypointItem,
ListWaypointsItem,
} from '$lib/components/file-list/file-list';
export class AllHidden {
private _value: Writable<boolean>;
constructor() {
this._value = writable(false);
new SelectedGPXFilesObserver(() => this.update());
}
subscribe(run: (value: boolean) => void, invalidate?: () => void) {
return this._value.subscribe(run, invalidate);
}
update() {
let hidden = true;
selection.applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
let file = fileStateCollection.getFile(fileId);
if (file) {
for (let item of items) {
if (!hidden) {
return;
}
if (item instanceof ListFileItem) {
hidden = hidden && file._data.hidden === true;
} else if (
item instanceof ListTrackItem &&
item.getTrackIndex() < file.trk.length
) {
hidden = hidden && file.trk[item.getTrackIndex()]._data.hidden === true;
} else if (
item instanceof ListTrackSegmentItem &&
item.getTrackIndex() < file.trk.length &&
item.getSegmentIndex() < file.trk[item.getTrackIndex()].trkseg.length
) {
hidden =
hidden &&
file.trk[item.getTrackIndex()].trkseg[item.getSegmentIndex()]._data
.hidden === true;
} else if (item instanceof ListWaypointsItem) {
hidden = hidden && file._data.hiddenWpt === true;
} else if (
item instanceof ListWaypointItem &&
item.getWaypointIndex() < file.wpt.length
) {
hidden = hidden && file.wpt[item.getWaypointIndex()]._data.hidden === true;
}
}
}
});
if (hidden != get(this._value)) {
this._value.set(hidden);
}
}
}
export const allHidden = new AllHidden();

View File

@@ -14,7 +14,6 @@ import { settings } from '$lib/logic/settings';
import type { GPXFile } from 'gpx'; import type { GPXFile } from 'gpx';
import { get, writable, type Readable, type Writable } from 'svelte/store'; import { get, writable, type Readable, type Writable } from 'svelte/store';
import { SelectionTreeType } from '$lib/logic/selection-tree'; import { SelectionTreeType } from '$lib/logic/selection-tree';
import { tick } from 'svelte';
export class Selection { export class Selection {
private _selection: Writable<SelectionTreeType>; private _selection: Writable<SelectionTreeType>;
@@ -254,3 +253,33 @@ export function applyToOrderedItemsFromFile(
} }
}); });
} }
export class SelectedGPXFilesObserver {
private _fileStateCollectionObserver: GPXFileStateCollectionObserver;
private _unsubscribes: Map<string, () => void> = new Map();
constructor(onSelectedFileChange: () => void) {
this._unsubscribes = new Map();
this._fileStateCollectionObserver = new GPXFileStateCollectionObserver(
(fileId, fileState) => {
this._unsubscribes.set(
fileId,
fileState.subscribe(() => {
if (get(selection).hasAnyChildren(new ListFileItem(fileId))) {
onSelectedFileChange();
}
})
);
},
(fileId) => {
this._unsubscribes.get(fileId)?.();
this._unsubscribes.delete(fileId);
},
() => {
this._unsubscribes.forEach((unsubscribe) => unsubscribe());
this._unsubscribes.clear();
}
);
selection.subscribe(() => onSelectedFileChange());
}
}

View File

@@ -1,68 +1,3 @@
// import { writable, get, type Writable } from 'svelte/store'; // import { writable } from 'svelte/store';
// import { GPXFile, parseGPX, GPXStatistics } from 'gpx';
// import { tick } from 'svelte';
// import { i18n } from '$lib/i18n.svelte';
// import type { GPXLayer } from '$lib/components/map/gpx-layer/GPXLayer';
// import { dbUtils, fileObservers, getFile, getStatistics } from '$lib/db';
// import {
// applyToOrderedSelectedItemsFromFile,
// selectFile,
// selection,
// } from '$lib/components/file-list/Selection';
// import {
// ListFileItem,
// ListTrackItem,
// ListTrackSegmentItem,
// ListWaypointItem,
// ListWaypointsItem,
// } from '$lib/components/file-list/FileList';
// import type { RoutingControls } from '$lib/components/toolbar/tools/routing/RoutingControls';
// export const embedding = writable(false); // export const embedding = writable(false);
// export const selectFiles = writable<{ [key: string]: (fileId?: string) => void }>({});
// export const routingControls: Map<string, RoutingControls> = new Map();
// export const allHidden = writable(false);
// export function updateAllHidden() {
// let hidden = true;
// applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
// let file = getFile(fileId);
// if (file) {
// for (let item of items) {
// if (!hidden) {
// return;
// }
// if (item instanceof ListFileItem) {
// hidden = hidden && file._data.hidden === true;
// } else if (
// item instanceof ListTrackItem &&
// item.getTrackIndex() < file.trk.length
// ) {
// hidden = hidden && file.trk[item.getTrackIndex()]._data.hidden === true;
// } else if (
// item instanceof ListTrackSegmentItem &&
// item.getTrackIndex() < file.trk.length &&
// item.getSegmentIndex() < file.trk[item.getTrackIndex()].trkseg.length
// ) {
// hidden =
// hidden &&
// file.trk[item.getTrackIndex()].trkseg[item.getSegmentIndex()]._data
// .hidden === true;
// } else if (item instanceof ListWaypointsItem) {
// hidden = hidden && file._data.hiddenWpt === true;
// } else if (
// item instanceof ListWaypointItem &&
// item.getWaypointIndex() < file.wpt.length
// ) {
// hidden = hidden && file.wpt[item.getWaypointIndex()]._data.hidden === true;
// }
// }
// }
// });
// allHidden.set(hidden);
// }
// selection.subscribe(updateAllHidden);