Skip to content

Commit 1f3102a

Browse files
authored
Merge pull request #713 from PaulHax/delete-shortcut
Delete image shortcut
2 parents 55f993a + 66e16bc commit 1f3102a

File tree

6 files changed

+54
-4
lines changed

6 files changed

+54
-4
lines changed

docs/mouse_controls.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
## Data management
44

5-
| Shortcut | Action |
6-
| -------- | ------ |
5+
| Shortcut | Action |
6+
| -------- | --------------------- |
7+
| Ctrl + . | Delete Current Image |
8+
| Ctrl + / | Clear all data |
79

810
## Slice
911

src/components/App.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,15 @@ export default defineComponent({
123123
const { currentImageMetadata, isImageLoading } = useCurrentImage();
124124
const defaultImageMetadataName = defaultImageMetadata().name;
125125
watch(currentImageMetadata, (newMetadata) => {
126+
let prefix = '';
126127
if (
127128
newMetadata?.name &&
128129
// wait until we get a real name, but if we never do, show default name
129130
(newMetadata.name !== defaultImageMetadataName || !isImageLoading)
130131
) {
131-
document.title = `${newMetadata.name} - VolView`;
132+
prefix = `${newMetadata.name} -`;
132133
}
134+
document.title = `${prefix}VolView`;
133135
});
134136
135137
// --- parse URL -- //

src/composables/actions.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Action } from '../constants';
88
import { useKeyboardShortcutsStore } from '../store/keyboard-shortcuts';
99
import { useCurrentImage } from './useCurrentImage';
1010
import { useSliceConfig } from './useSliceConfig';
11+
import { useDatasetStore } from '../store/datasets';
1112

1213
const applyLabelOffset = (offset: number) => () => {
1314
const toolToStore = {
@@ -47,6 +48,19 @@ const changeSlice = (offset: number) => () => {
4748
currentSlice.value += offset;
4849
};
4950

51+
const clearScene = () => () => {
52+
const datasetStore = useDatasetStore();
53+
datasetStore.removeAll();
54+
};
55+
56+
const deleteCurrentImage = () => () => {
57+
const datasetStore = useDatasetStore();
58+
datasetStore.remove(datasetStore.primaryImageID);
59+
60+
// Automatically select next image
61+
datasetStore.setPrimarySelection(datasetStore.idsAsSelections[0]);
62+
};
63+
5064
export const ACTION_TO_FUNC = {
5165
windowLevel: setTool(Tools.WindowLevel),
5266
pan: setTool(Tools.Pan),
@@ -65,6 +79,9 @@ export const ACTION_TO_FUNC = {
6579
decrementLabel: applyLabelOffset(-1),
6680
incrementLabel: applyLabelOffset(1),
6781

82+
deleteCurrentImage: deleteCurrentImage(),
83+
clearScene: clearScene(),
84+
6885
mergeNewPolygon: () => {}, // acts as a modifier key rather than immediate effect, so no-op
6986

7087
showKeyboardShortcuts,

src/config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ export const ACTION_TO_KEY = {
287287
decrementLabel: 'q',
288288
incrementLabel: 'w',
289289

290+
deleteCurrentImage: 'ctrl+.',
291+
clearScene: 'ctrl+/',
292+
290293
showKeyboardShortcuts: '?',
291294
} satisfies Record<Action, string>;
292295

src/constants.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ export const ACTIONS = {
6767
readable: 'Activate next Label',
6868
},
6969

70+
deleteCurrentImage: {
71+
readable: 'Remove current active image',
72+
},
73+
74+
clearScene: {
75+
readable: 'Clear scene',
76+
},
77+
7078
mergeNewPolygon: {
7179
readable: 'Hold to merge new polygons with overlapping polygons',
7280
},

src/store/datasets.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { useFileStore } from './datasets-files';
1212
import { StateFile } from '../io/state-file/schema';
1313
import { useErrorMessage } from '../composables/useErrorMessage';
1414
import { useLayersStore } from './datasets-layers';
15+
import { useModelStore } from './datasets-models';
1516

1617
export const DataType = {
1718
Image: 'Image',
@@ -23,6 +24,7 @@ export const useDatasetStore = defineStore('dataset', () => {
2324
const dicomStore = useDICOMStore();
2425
const fileStore = useFileStore();
2526
const layersStore = useLayersStore();
27+
const modelStore = useModelStore();
2628

2729
// --- state --- //
2830

@@ -67,7 +69,9 @@ export const useDatasetStore = defineStore('dataset', () => {
6769
}
6870
}
6971

70-
const remove = (id: string) => {
72+
const remove = (id: string | null) => {
73+
if (!id) return;
74+
7175
if (id === primarySelection.value) {
7276
primarySelection.value = null;
7377
}
@@ -81,6 +85,19 @@ export const useDatasetStore = defineStore('dataset', () => {
8185
layersStore.remove(id);
8286
};
8387

88+
const removeAll = () => {
89+
// Create a copy to avoid iteration issue while removing data
90+
const imageIdCopy = [...imageStore.idList];
91+
imageIdCopy.forEach((id) => {
92+
remove(id);
93+
});
94+
95+
const modelIdCopy = [...modelStore.idList];
96+
modelIdCopy.forEach((id) => {
97+
remove(id);
98+
});
99+
};
100+
84101
return {
85102
primaryImageID,
86103
primarySelection,
@@ -89,5 +106,6 @@ export const useDatasetStore = defineStore('dataset', () => {
89106
setPrimarySelection,
90107
serialize,
91108
remove,
109+
removeAll,
92110
};
93111
});

0 commit comments

Comments
 (0)