diff --git a/client/dive-common/components/AnnotationVisibilityMenu.vue b/client/dive-common/components/AnnotationVisibilityMenu.vue new file mode 100644 index 000000000..f4e1a4857 --- /dev/null +++ b/client/dive-common/components/AnnotationVisibilityMenu.vue @@ -0,0 +1,326 @@ + + + + + + + + + mdi-eye + + mdi-chevron-right + + + + + + + + {{ button.icon }} + + + + {{ button.description }} + + + + + + mdi-navigation + + + + Track Trails + + + + + + + Frames before: {{ tailSettings.before }} + + + Frames after: {{ tailSettings.after }} + + + + + + + + + + + + mdi-eye + + + Visibility + + + mdi-chevron-left + + + + {{ button.icon }} + + + + + mdi-navigation + + + + Frames before: {{ tailSettings.before }} + + + Frames after: {{ tailSettings.after }} + + + + + + + + diff --git a/client/dive-common/components/EditorMenu.vue b/client/dive-common/components/EditorMenu.vue index 748f9db8d..13b74443a 100644 --- a/client/dive-common/components/EditorMenu.vue +++ b/client/dive-common/components/EditorMenu.vue @@ -1,22 +1,34 @@ @@ -222,96 +223,111 @@ export default Vue.extend({ Multi-select in progress. Editing is disabled. Select additional tracks to merge or group. - - {{ modeToolTips[editingDetails][editingMode] }} + + {{ editingTooltip }} Right click on an annotation to edit - + - {{ button.mousetrap[0].bind }}: - {{ button.icon }} - - - - + + + {{ activeEditButton.mousetrap[0].bind }}: + {{ activeEditButton?.icon }} + + + mdi-chevron-right + + + + + + + + + {{ button.mousetrap[0].bind }}: + {{ button.icon }} + + + + {{ button.id }} + + + + + + + - mdi-eye + mdi-pencil - Visibility + Edit Types + + mdi-chevron-left + + {{ button.mousetrap[0].bind }}: {{ button.icon }} - - - - mdi-navigation - - - - Frames before: {{ tailSettings.before }} - - - Frames after: {{ tailSettings.after }} - - - - + + + + + + @@ -330,7 +346,11 @@ export default Vue.extend({ .mode-button{ border: 1px solid grey; } -.tail-slider-width { - width: 240px; +.expand-toggle { + opacity: 0.5; + transition: opacity 0.2s; +} +.expand-toggle:hover { + opacity: 1; } diff --git a/client/dive-common/components/MultiCamToolbar.vue b/client/dive-common/components/MultiCamToolbar.vue new file mode 100644 index 000000000..b3f2a2abf --- /dev/null +++ b/client/dive-common/components/MultiCamToolbar.vue @@ -0,0 +1,490 @@ + + + + + + + + + mdi-image-multiple + + mdi-chevron-right + + + + + + + + {{ button.icon }} + + + + + {{ button.icon }} + + + + + + {{ item.label }} + + + + + + + {{ button.tooltip }} + + + + + + + + + + mdi-image-multiple + + + Multi-Cam Tools + + + mdi-chevron-left + + + + + + + mdi-pencil-plus + + + Edit detection on {{ oppositeCamera }} (e) + + + + + + + + + + mdi-link-variant-plus + + + Link track to camera + + + + + + Link to {{ camera }} + + + + + + + + + mdi-link-variant-minus + + + Unlink track from current camera + + + + + + + mdi-star-minus + + + Delete detection from current camera + + + + + + + mdi-delete + + + Delete track from current camera + + + + + + diff --git a/client/dive-common/components/TrackSettingsPanel.vue b/client/dive-common/components/TrackSettingsPanel.vue index 90ed67ed9..71b1ec1b2 100644 --- a/client/dive-common/components/TrackSettingsPanel.vue +++ b/client/dive-common/components/TrackSettingsPanel.vue @@ -32,6 +32,7 @@ export default defineComponent({ prompt: 'Prompt user before deleting a track?', filterTracksByFrame: 'Filter the track list by those with detections in the current frame', autoZoom: 'Automatically zoom to the track when selected', + showMultiCamToolbar: 'Show multi-camera tools in the top toolbar when a track is selected', }); const modes = ref(['Track', 'Detection']); // Add unknown as the default type to the typeList @@ -322,6 +323,45 @@ export default defineComponent({ + + + Multi-Camera Settings + + + + + + + + + + mdi-help + + + {{ help.showMultiCamToolbar }} + + + diff --git a/client/dive-common/components/Viewer.vue b/client/dive-common/components/Viewer.vue index b05d9bf78..b3da641be 100644 --- a/client/dive-common/components/Viewer.vue +++ b/client/dive-common/components/Viewer.vue @@ -49,6 +49,7 @@ import context from 'dive-common/store/context'; import { MarkChangesPendingFilter } from 'vue-media-annotator/BaseFilterControls'; import GroupSidebarVue from './GroupSidebar.vue'; import MultiCamToolsVue from './MultiCamTools.vue'; +import MultiCamToolbar from './MultiCamToolbar.vue'; import PrimaryAttributeTrackFilter from './PrimaryAttributeTrackFilter.vue'; export interface ImageDataItem { @@ -68,6 +69,7 @@ export default defineComponent({ ConfidenceFilter, UserGuideButton, EditorMenu, + MultiCamToolbar, PrimaryAttributeTrackFilter, }, @@ -1010,6 +1012,12 @@ export default defineComponent({ @delete-annotation="handler.removeAnnotation" /> + + + !readonlyState && handler.trackAdd() }, { bind: 'r', handler: () => aggregateController.resetZoom() }, { bind: 'esc', handler: () => handler.trackAbort() }, + { bind: 'e', handler: () => multiCamList.length === 1 && selectedTrackId !== null && handler.trackEdit(selectedTrackId) }, ]" class="d-flex flex-column grow" > diff --git a/client/dive-common/store/settings.ts b/client/dive-common/store/settings.ts index 61f390872..adab2e24f 100644 --- a/client/dive-common/store/settings.ts +++ b/client/dive-common/store/settings.ts @@ -44,7 +44,10 @@ interface AnnotationSettings { timelineCountSettings: { totalCount: boolean; defaultView: 'tracks' | 'detections'; - } + }; + multiCamSettings: { + showToolbar: boolean; + }; } const defaultSettings: AnnotationSettings = { @@ -99,7 +102,9 @@ const defaultSettings: AnnotationSettings = { totalCount: true, defaultView: 'tracks', }, - + multiCamSettings: { + showToolbar: true, + }, }; // Utility to safely load from localStorage diff --git a/client/platform/desktop/frontend/components/Settings.vue b/client/platform/desktop/frontend/components/Settings.vue index 7a9ea7721..93ce64c5e 100644 --- a/client/platform/desktop/frontend/components/Settings.vue +++ b/client/platform/desktop/frontend/components/Settings.vue @@ -9,6 +9,7 @@ import { useRequest } from 'dive-common/use'; import { NvidiaSmiReply } from 'platform/desktop/constants'; import { cloneDeep, isEqual } from 'lodash'; +import { clientSettings } from 'dive-common/store/settings'; import { autoDiscover } from '../store/dataset'; import { settings, updateSettings, validateSettings } from '../store/settings'; import { nvidiaSmi } from '../api'; @@ -73,6 +74,7 @@ export default defineComponent({ appversion, arch, autoDiscoverState, + clientSettings, gitHash, platform, settings, @@ -96,7 +98,7 @@ export default defineComponent({ - Settings + Folder Settings @@ -180,6 +182,22 @@ export default defineComponent({ + Annotation Settings + + + + + + + + Platform support Not all checks must pass in order to use this application.
{{ button.mousetrap[0].bind }}:
{{ activeEditButton.mousetrap[0].bind }}: