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 { fileActionManager } from '$lib/logic/file-action-manager';
|
||||
import { copied, selection } from '$lib/logic/selection';
|
||||
import { allHidden } from '$lib/logic/hidden';
|
||||
|
||||
const {
|
||||
distanceUnits,
|
||||
@@ -229,21 +230,21 @@
|
||||
</Menubar.Item>
|
||||
<Menubar.Item
|
||||
onclick={() => {
|
||||
// if ($allHidden) {
|
||||
// fileActions.setHiddenToSelection(false);
|
||||
// } else {
|
||||
// fileActions.setHiddenToSelection(true);
|
||||
// }
|
||||
if ($allHidden) {
|
||||
fileActions.setHiddenToSelection(false);
|
||||
} else {
|
||||
fileActions.setHiddenToSelection(true);
|
||||
}
|
||||
}}
|
||||
disabled={$selection.size == 0}
|
||||
>
|
||||
<!-- {#if $allHidden}
|
||||
{#if $allHidden}
|
||||
<Eye size="16" />
|
||||
{i18n._('menu.unhide')}
|
||||
{:else}
|
||||
<EyeOff size="16" />
|
||||
{i18n._('menu.hide')}
|
||||
{/if} -->
|
||||
{/if}
|
||||
<Shortcut key="H" ctrl={true} />
|
||||
</Menubar.Item>
|
||||
{#if $treeFileView}
|
||||
@@ -621,11 +622,11 @@
|
||||
$treeFileView = !$treeFileView;
|
||||
e.preventDefault();
|
||||
} else if (e.key === 'h' && (e.metaKey || e.ctrlKey)) {
|
||||
// if ($allHidden) {
|
||||
// fileActions.setHiddenToSelection(false);
|
||||
// } else {
|
||||
// fileActions.setHiddenToSelection(true);
|
||||
// }
|
||||
if ($allHidden) {
|
||||
fileActions.setHiddenToSelection(false);
|
||||
} else {
|
||||
fileActions.setHiddenToSelection(true);
|
||||
}
|
||||
e.preventDefault();
|
||||
} else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
|
||||
// if ($selection.size > 0) {
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
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';
|
||||
|
||||
let {
|
||||
node,
|
||||
@@ -240,20 +241,20 @@
|
||||
{/if}
|
||||
<ContextMenu.Item
|
||||
onclick={() => {
|
||||
// if ($allHidden) {
|
||||
// dbUtils.setHiddenToSelection(false);
|
||||
// } else {
|
||||
// dbUtils.setHiddenToSelection(true);
|
||||
// }
|
||||
if ($allHidden) {
|
||||
fileActions.setHiddenToSelection(false);
|
||||
} else {
|
||||
fileActions.setHiddenToSelection(true);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<!-- {#if $allHidden}
|
||||
{#if $allHidden}
|
||||
<Eye size="16" class="mr-1" />
|
||||
{i18n._('menu.unhide')}
|
||||
{:else}
|
||||
<EyeOff size="16" class="mr-1" />
|
||||
{i18n._('menu.hide')}
|
||||
{/if} -->
|
||||
{/if}
|
||||
<Shortcut key="H" ctrl={true} />
|
||||
</ContextMenu.Item>
|
||||
<ContextMenu.Separator />
|
||||
|
||||
@@ -747,61 +747,61 @@ export const fileActions = {
|
||||
);
|
||||
},
|
||||
setStyleToSelection: (style: LineStyleExtension) => {
|
||||
// if (get(selection).size === 0) {
|
||||
// return;
|
||||
// }
|
||||
// applyGlobal((draft) => {
|
||||
// applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
|
||||
// let file = draft.get(fileId);
|
||||
// if (file && (level === ListLevel.FILE || level === ListLevel.TRACK)) {
|
||||
// if (level === ListLevel.FILE) {
|
||||
// file.setStyle(style);
|
||||
// } else if (level === ListLevel.TRACK) {
|
||||
// if (items.length === file.trk.length) {
|
||||
// file.setStyle(style);
|
||||
// } else {
|
||||
// for (let item of items) {
|
||||
// let trackIndex = (item as ListTrackItem).getTrackIndex();
|
||||
// file.trk[trackIndex].setStyle(style);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
if (get(selection).size === 0) {
|
||||
return;
|
||||
}
|
||||
fileActionManager.applyGlobal((draft) => {
|
||||
selection.applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
|
||||
let file = draft.get(fileId);
|
||||
if (file && (level === ListLevel.FILE || level === ListLevel.TRACK)) {
|
||||
if (level === ListLevel.FILE) {
|
||||
file.setStyle(style);
|
||||
} else if (level === ListLevel.TRACK) {
|
||||
if (items.length === file.trk.length) {
|
||||
file.setStyle(style);
|
||||
} else {
|
||||
for (let item of items) {
|
||||
let trackIndex = (item as ListTrackItem).getTrackIndex();
|
||||
file.trk[trackIndex].setStyle(style);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
setHiddenToSelection: (hidden: boolean) => {
|
||||
// if (get(selection).size === 0) {
|
||||
// return;
|
||||
// }
|
||||
// applyGlobal((draft) => {
|
||||
// applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
|
||||
// let file = draft.get(fileId);
|
||||
// if (file) {
|
||||
// if (level === ListLevel.FILE) {
|
||||
// file.setHidden(hidden);
|
||||
// } else if (level === ListLevel.TRACK) {
|
||||
// let trackIndices = items.map((item) =>
|
||||
// (item as ListTrackItem).getTrackIndex()
|
||||
// );
|
||||
// file.setHidden(hidden, trackIndices);
|
||||
// } else if (level === ListLevel.SEGMENT) {
|
||||
// let trackIndices = [(items[0] as ListTrackSegmentItem).getTrackIndex()];
|
||||
// let segmentIndices = items.map((item) =>
|
||||
// (item as ListTrackSegmentItem).getSegmentIndex()
|
||||
// );
|
||||
// file.setHidden(hidden, trackIndices, segmentIndices);
|
||||
// } else if (level === ListLevel.WAYPOINTS) {
|
||||
// file.setHiddenWaypoints(hidden);
|
||||
// } else if (level === ListLevel.WAYPOINT) {
|
||||
// let waypointIndices = items.map((item) =>
|
||||
// (item as ListWaypointItem).getWaypointIndex()
|
||||
// );
|
||||
// file.setHiddenWaypoints(hidden, waypointIndices);
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
if (get(selection).size === 0) {
|
||||
return;
|
||||
}
|
||||
fileActionManager.applyGlobal((draft) => {
|
||||
selection.applyToOrderedSelectedItemsFromFile((fileId, level, items) => {
|
||||
let file = draft.get(fileId);
|
||||
if (file) {
|
||||
if (level === ListLevel.FILE) {
|
||||
file.setHidden(hidden);
|
||||
} else if (level === ListLevel.TRACK) {
|
||||
let trackIndices = items.map((item) =>
|
||||
(item as ListTrackItem).getTrackIndex()
|
||||
);
|
||||
file.setHidden(hidden, trackIndices);
|
||||
} else if (level === ListLevel.SEGMENT) {
|
||||
let trackIndices = [(items[0] as ListTrackSegmentItem).getTrackIndex()];
|
||||
let segmentIndices = items.map((item) =>
|
||||
(item as ListTrackSegmentItem).getSegmentIndex()
|
||||
);
|
||||
file.setHidden(hidden, trackIndices, segmentIndices);
|
||||
} else if (level === ListLevel.WAYPOINTS) {
|
||||
file.setHiddenWaypoints(hidden);
|
||||
} else if (level === ListLevel.WAYPOINT) {
|
||||
let waypointIndices = items.map((item) =>
|
||||
(item as ListWaypointItem).getWaypointIndex()
|
||||
);
|
||||
file.setHiddenWaypoints(hidden, waypointIndices);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
deleteSelection: () => {
|
||||
if (get(selection).size === 0) {
|
||||
|
||||
@@ -31,10 +31,6 @@ export class GPXFileState {
|
||||
}
|
||||
|
||||
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 { get, writable, type Readable, type Writable } from 'svelte/store';
|
||||
import { SelectionTreeType } from '$lib/logic/selection-tree';
|
||||
import { tick } from 'svelte';
|
||||
|
||||
export class Selection {
|
||||
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 { 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';
|
||||
// import { writable } from 'svelte/store';
|
||||
|
||||
// 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