diff --git a/src/components/ImageDataBrowser.vue b/src/components/ImageDataBrowser.vue index 14d5ce14..2fe67e5a 100644 --- a/src/components/ImageDataBrowser.vue +++ b/src/components/ImageDataBrowser.vue @@ -15,6 +15,8 @@ import { useDatasetStore } from '../store/datasets'; import { useMultiSelection } from '../composables/useMultiSelection'; import { useLayersStore } from '../store/datasets-layers'; +import { useViewSliceStore } from '../store/view-configs/slicing'; +import { useViewCameraStore } from '../store/view-configs/camera'; function imageCacheKey(dataID: string) { return `image-${dataID}`; @@ -31,6 +33,8 @@ export default defineComponent({ const dataStore = useDatasetStore(); const layersStore = useLayersStore(); const segmentGroupStore = useSegmentGroupStore(); + const viewSliceStore = useViewSliceStore(); + const viewCameraStore = useViewCameraStore(); const primarySelection = computed(() => dataStore.primarySelection); @@ -116,6 +120,23 @@ export default defineComponent({ { immediate: true, deep: true } ); + // --- sync --- // + const sameSpaceImages = computed(() => { + return imageStore.checkAllImagesSameSpace(); + }); + const isSync = computed(() => { + return viewSliceStore.isSync() && viewCameraStore.isSync(); + }); + function toggleSyncImages() { + viewSliceStore.toggleSyncImages(); + viewCameraStore.toggleSyncCameras(); + viewCameraStore.disableCameraAutoReset = isSync.value; + } + watch(isSync, () => { + viewSliceStore.updateSyncConfigs(); + viewCameraStore.updateSyncConfigs(); + }); + // --- selection --- // const { selected, selectedAll, selectedSome, toggleSelectAll } = @@ -151,6 +172,9 @@ export default defineComponent({ setPrimarySelection: (sel: DataSelection) => { dataStore.setPrimarySelection(sel); }, + sameSpaceImages, + toggleSyncImages, + isSync, }; }, }); @@ -173,6 +197,22 @@ export default defineComponent({ /> + + mdi-lock + mdi-lock-open-variant + + Sync Images + + + + import { defineComponent, ref, watch } from 'vue'; +import { storeToRefs } from 'pinia'; import { useTheme } from 'vuetify'; import { useLocalStorage } from '@vueuse/core'; @@ -50,6 +59,7 @@ import { useErrorReporting, errorReportingConfigured, } from '../utils/errorReporting'; +import { useViewCameraStore } from '@/src/store/view-configs/camera'; export default defineComponent({ setup() { @@ -68,6 +78,8 @@ export default defineComponent({ errorReportingStore.disableReporting = !enabled; }); + const { disableCameraAutoReset } = storeToRefs(useViewCameraStore()); + const keyboardStore = useKeyboardShortcutsStore(); const openKeyboardShortcuts = () => { keyboardStore.settingsOpen = true; @@ -78,6 +90,7 @@ export default defineComponent({ reportingEnabled, errorReportingConfigured, openKeyboardShortcuts, + disableCameraAutoReset, }; }, components: { diff --git a/src/components/SliceViewer.vue b/src/components/SliceViewer.vue index d7066bdd..2c6c228c 100644 --- a/src/components/SliceViewer.vue +++ b/src/components/SliceViewer.vue @@ -33,6 +33,7 @@ class="vtk-view" ref="vtkView" data-testid="vtk-view vtk-two-view" + :disable-auto-reset-camera="disableCameraAutoReset" :view-id="id" :image-id="currentImageID" :view-direction="viewDirection" @@ -172,6 +173,7 @@ import SliceSlider from '@/src/components/SliceSlider.vue'; import SliceViewerOverlay from '@/src/components/SliceViewerOverlay.vue'; import { useToolSelectionStore } from '@/src/store/tools/toolSelection'; import { useAnnotationToolStore, useToolStore } from '@/src/store/tools'; +import { useViewCameraStore } from '@/src/store/view-configs/camera'; import { doesToolFrameMatchViewAxis } from '@/src/composables/annotationTool'; import { useWebGLWatchdog } from '@/src/composables/useWebGLWatchdog'; import { useSliceConfig } from '@/src/composables/useSliceConfig'; @@ -192,6 +194,8 @@ const vtkView = ref(); const props = defineProps(); +const { disableCameraAutoReset } = storeToRefs(useViewCameraStore()); + const { id: viewId, type: viewType, viewDirection, viewUp } = toRefs(props); const viewAxis = computed(() => getLPSAxisFromDir(viewDirection.value)); diff --git a/src/components/vtk/VtkSliceView.vue b/src/components/vtk/VtkSliceView.vue index 2a0a2f54..4a0393ce 100644 --- a/src/components/vtk/VtkSliceView.vue +++ b/src/components/vtk/VtkSliceView.vue @@ -1,5 +1,6 @@