Skip to content

Commit 0b14111

Browse files
committed
refactor(GatedMouseRangeManipulator): simplify initialization
1 parent 2671ca9 commit 0b14111

File tree

2 files changed

+20
-50
lines changed

2 files changed

+20
-50
lines changed

src/components/vtk/VtkSliceViewSlicingKeyManipulator.vue

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import vtkGatedMouseRangeManipulator from '@/src/vtk/GatedMouseRangeManipulator'
1010
import { IMouseRangeManipulatorInitialValues } from '@kitware/vtk.js/Interaction/Manipulators/MouseRangeManipulator';
1111
import vtkInteractorStyleManipulator from '@kitware/vtk.js/Interaction/Style/InteractorStyleManipulator';
1212
import { syncRef, useMagicKeys } from '@vueuse/core';
13-
import { inject, toRefs, unref, watch, computed, watchPostEffect } from 'vue';
13+
import { inject, toRefs, unref, watch, computed } from 'vue';
1414
import { useViewStore } from '@/src/store/views';
1515
import { actionToKey } from '@/src/composables/useKeyboardShortcuts';
1616
@@ -48,15 +48,7 @@ const { instance: rangeManipulator } = useVtkInteractionManipulator(
4848
config
4949
);
5050
51-
// run after useWebGLRenderWindow assigns the container
52-
watchPostEffect(() => {
53-
const container = view.renderWindowView.getContainer();
54-
rangeManipulator.value.initializeGlobalMouseMove(
55-
view.renderWindow.getInteractor(),
56-
view.renderer,
57-
container
58-
);
59-
});
51+
rangeManipulator.value.setupMouseMove(view.interactor);
6052
6153
const keys = useMagicKeys();
6254
const enableGrabSlice = computed(() => keys[actionToKey.value.grabSlice].value);
@@ -79,14 +71,15 @@ const scroll = useMouseRangeManipulatorListener(
7971
sliceConfig.slice.value
8072
);
8173
74+
syncRef(scroll, sliceConfig.slice, { immediate: true });
75+
76+
// set just scrolled view as active view
8277
watch(scroll, () => {
8378
const viewStore = useViewStore();
8479
if (unref(viewId) !== viewStore.activeViewID) {
8580
viewStore.setActiveViewID(unref(viewId));
8681
}
8782
});
88-
89-
syncRef(scroll, sliceConfig.slice, { immediate: true });
9083
</script>
9184

9285
<template><slot></slot></template>

src/vtk/GatedMouseRangeManipulator/index.js

Lines changed: 15 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,50 +25,27 @@ function vtkGatedMouseRangeManipulator(publicAPI, model) {
2525
publicAPI.modified();
2626
};
2727

28-
// Define the mouse move listener function outside initializeGlobalMouseMove
29-
const createMouseMoveListener = (interactor, renderer) => {
30-
return (event) => {
31-
// Proceed if the mouse is inside the container.
32-
if (!model.viewContainer.contains(event.target)) {
33-
return;
34-
}
35-
// Map the event client coordinates to the container's coordinate system.
36-
const rect = model.viewContainer.getBoundingClientRect();
37-
const position = {
38-
x: event.clientX - rect.left,
39-
y: event.clientY - rect.top,
40-
};
28+
const cleanupListener = () => {
29+
model.mouseMoveListenerSubscription?.unsubscribe();
30+
model.mouseMoveListenerSubscription = null;
31+
};
4132

33+
publicAPI.setupMouseMove = (interactor) => {
34+
cleanupListener();
35+
model.mouseMoveListenerSubscription = interactor.onMouseMove((event) => {
36+
const invertY = {
37+
...event.position,
38+
y: interactor.getView().getSize()[1] - event.position.y,
39+
};
4240
if (model.newInteraction) {
4341
model.newInteraction = false;
44-
publicAPI.onButtonDown(interactor, renderer, position);
42+
publicAPI.onButtonDown(interactor, event.pokedRenderer, invertY);
4543
}
46-
publicAPI.onMouseMove(interactor, renderer, position);
47-
};
44+
publicAPI.onMouseMove(interactor, event.pokedRenderer, invertY);
45+
});
4846
};
4947

50-
// Initializes a global mousemove listener on the view container.
51-
// Only events occurring over the container will trigger onMouseMove.
52-
publicAPI.initializeGlobalMouseMove = (interactor, renderer, container) => {
53-
model.viewContainer = container;
54-
if (!model.mouseMoveListener) {
55-
model.mouseMoveListener = createMouseMoveListener(interactor, renderer);
56-
model.viewContainer.addEventListener(
57-
'mousemove',
58-
model.mouseMoveListener
59-
);
60-
}
61-
};
62-
63-
publicAPI.delete = macro.chain(publicAPI.delete, () => {
64-
if (model.mouseMoveListener && model.viewContainer) {
65-
model.viewContainer.removeEventListener(
66-
'mousemove',
67-
model.mouseMoveListener
68-
);
69-
model.mouseMoveListener = null;
70-
}
71-
});
48+
publicAPI.delete = macro.chain(publicAPI.delete, cleanupListener);
7249
}
7350

7451
function extend(publicAPI, model, initialValues = {}) {

0 commit comments

Comments
 (0)