duplicate any selection

This commit is contained in:
vcoppe
2024-05-23 14:44:07 +02:00
parent 8b5d1f1fbf
commit 6cbf9a3248
7 changed files with 153 additions and 40 deletions

View File

@@ -189,12 +189,16 @@ export class ListTrackItem extends ListItem {
return this.fileId;
}
extend(id: number): ListSegmentItem {
return new ListSegmentItem(this.fileId, this.trackIndex, id);
getTrackIndex(): number {
return this.trackIndex;
}
extend(id: number): ListTrackSegmentItem {
return new ListTrackSegmentItem(this.fileId, this.trackIndex, id);
}
}
export class ListSegmentItem extends ListItem {
export class ListTrackSegmentItem extends ListItem {
fileId: string;
trackIndex: number;
segmentIndex: number;
@@ -227,7 +231,15 @@ export class ListSegmentItem extends ListItem {
return this.fileId;
}
extend(): ListSegmentItem {
getTrackIndex(): number {
return this.trackIndex;
}
getSegmentIndex(): number {
return this.segmentIndex;
}
extend(): ListTrackSegmentItem {
return this;
}
}
@@ -295,6 +307,10 @@ export class ListWaypointItem extends ListItem {
return this.fileId;
}
getWaypointIndex(): number {
return this.waypointIndex;
}
extend(): ListWaypointItem {
return this;
}

View File

@@ -5,9 +5,10 @@
import { dbUtils } from '$lib/db';
import { Copy, Trash2 } from 'lucide-svelte';
import { type ListItem } from './FileList';
import { selection } from './Selection';
import { selectItem, selection } from './Selection';
import { _ } from 'svelte-i18n';
import { getContext } from 'svelte';
import { get } from 'svelte/store';
export let item: ListItem;
export let label: string | undefined;
@@ -17,7 +18,13 @@
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<ContextMenu.Root>
<ContextMenu.Root
onOpenChange={(open) => {
if (open && !get(selection).has(item)) {
selectItem(item);
}
}}
>
<ContextMenu.Trigger class="grow truncate">
<Button
variant="ghost"
@@ -45,12 +52,14 @@
</Button>
</ContextMenu.Trigger>
<ContextMenu.Content>
<ContextMenu.Item on:click={dbUtils.duplicateSelection}>
<Copy size="16" class="mr-1" />
{$_('menu.duplicate')}
<Shortcut key="D" ctrl={true} /></ContextMenu.Item
>
<ContextMenu.Separator />
{#if item.level !== 'waypoints'}
<ContextMenu.Item on:click={dbUtils.duplicateSelection}>
<Copy size="16" class="mr-1" />
{$_('menu.duplicate')}
<Shortcut key="D" ctrl={true} /></ContextMenu.Item
>
<ContextMenu.Separator />
{/if}
<ContextMenu.Item on:click={dbUtils.deleteSelection}
><Trash2 size="16" class="mr-1" />
{$_('menu.delete')}

View File

@@ -1,17 +1,21 @@
import { get, writable } from "svelte/store";
import { ListFileItem, ListRootItem, SelectionTreeType } from "./FileList";
import { ListFileItem, ListItem, ListRootItem, SelectionTreeType } from "./FileList";
import { fileObservers } from "$lib/db";
export const selection = writable<SelectionTreeType>(new SelectionTreeType(new ListRootItem()));
export function select(fileId: string) {
export function selectItem(item: ListItem) {
selection.update(($selection) => {
$selection.clear();
$selection.set(new ListFileItem(fileId), true);
$selection.set(item, true);
return $selection;
});
}
export function selectFile(fileId: string) {
selectItem(new ListFileItem(fileId));
}
export function addSelect(fileId: string) {
selection.update(($selection) => {
$selection.toggle(new ListFileItem(fileId));