mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2025-11-04 13:31:13 +00:00
fix hiding
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
67
website/src/lib/logic/hidden.ts
Normal file
67
website/src/lib/logic/hidden.ts
Normal 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();
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|||||||
Reference in New Issue
Block a user