1+ import vtkInteractorStyle from '@kitware/vtk.js/Interaction/Style/InteractorStyle' ;
12import { FixedVTKRenderWindowInteractor } from '@kitware/vtk.js/type-patches' ;
23import { Bounds } from '@kitware/vtk.js/types' ;
34import {
@@ -21,6 +22,11 @@ import {
2122 OpenGLRenderWindowContext ,
2223 RenderWindowContext ,
2324} from './contexts' ;
25+ import {
26+ ManipulatorSettings ,
27+ useInteractorStyle ,
28+ useInteractorStyleManipulatorSettings ,
29+ } from './modules/useInteractorStyle' ;
2430import OpenGLRenderWindow , {
2531 Props as OpenGLRenderWindowProps ,
2632} from './OpenGLRenderWindow' ;
@@ -64,8 +70,51 @@ interface Props
6470 * Show/Hide orientation axes.
6571 */
6672 // showOrientationAxes?: boolean;
73+ /**
74+ * Configure the interactions
75+ */
76+ interactorSettings ?: ManipulatorSettings [ ] ;
6777}
6878
79+ const DefaultProps = {
80+ interactorSettings : [
81+ {
82+ button : 1 ,
83+ action : 'Rotate' ,
84+ } ,
85+ {
86+ button : 2 ,
87+ action : 'Pan' ,
88+ } ,
89+ {
90+ button : 3 ,
91+ action : 'Zoom' ,
92+ scrollEnabled : true ,
93+ } ,
94+ {
95+ button : 1 ,
96+ action : 'Pan' ,
97+ alt : true ,
98+ } ,
99+ {
100+ button : 1 ,
101+ action : 'Zoom' ,
102+ control : true ,
103+ } ,
104+ {
105+ button : 1 ,
106+ action : 'Select' ,
107+ shift : true ,
108+ } ,
109+ {
110+ button : 1 ,
111+ action : 'Roll' ,
112+ alt : true ,
113+ shift : true ,
114+ } ,
115+ ] as ManipulatorSettings [ ] ,
116+ } ;
117+
69118/**
70119 * A standalone View (not within a MultiViewRoot).
71120 */
@@ -75,7 +124,6 @@ const SingleView = forwardRef(function SingleView(props: Props, fwdRef) {
75124 const renderWindowRef = useRef < IRenderWindow | null > ( null ) ;
76125 const rendererRef = useRef < IRenderer | null > ( null ) ;
77126
78- const renderWindowProps = pick ( props , 'interactorSettings' ) ;
79127 const rendererProps = pick (
80128 props ,
81129 'background' ,
@@ -87,24 +135,38 @@ const SingleView = forwardRef(function SingleView(props: Props, fwdRef) {
87135
88136 const openGLRenderWindowProps = omit (
89137 props ,
90- ...( [
91- ...Object . keys ( renderWindowProps ) ,
92- ...Object . keys ( rendererProps ) ,
93- ] as ( keyof Props ) [ ] )
138+ ...( [ ...Object . keys ( rendererProps ) ] as ( keyof Props ) [ ] )
94139 ) ;
95140
141+ // --- interactor style --- //
142+
143+ const getInteractor = useCallback (
144+ ( ) => renderWindowRef . current ?. getInteractor ( ) ?? null ,
145+ [ ]
146+ ) ;
147+
148+ const [ getInteractorStyle , setInteractorStyle ] =
149+ useInteractorStyle ( getInteractor ) ;
150+
151+ const { interactorSettings = DefaultProps . interactorSettings } = props ;
152+ useInteractorStyleManipulatorSettings ( getInteractorStyle , interactorSettings ) ;
153+
154+ // --- api --- //
155+
96156 const api = useMemo < IView > (
97157 ( ) => ( {
98158 isInMultiViewRoot : ( ) => false ,
99159 getOpenGLRenderWindow : ( ) => openGLRenderWindowRef . current ,
100160 getRenderWindow : ( ) => renderWindowRef . current ,
101161 getRenderer : ( ) => rendererRef . current ,
162+ getInteractorStyle : ( ) => getInteractorStyle ( ) ,
163+ setInteractorStyle : ( style ) => setInteractorStyle ( style ) ,
102164 requestRender : ( ) => rendererRef . current ?. requestRender ( ) ,
103165 getCamera : ( ) => rendererRef . current ?. get ( ) . getActiveCamera ( ) ?? null ,
104166 resetCamera : ( boundsToUse ?: Bounds ) =>
105167 rendererRef . current ?. resetCamera ( boundsToUse ) ,
106168 } ) ,
107- [ ]
169+ [ getInteractorStyle , setInteractorStyle ]
108170 ) ;
109171
110172 useImperativeHandle ( fwdRef , ( ) => api ) ;
@@ -114,7 +176,7 @@ const SingleView = forwardRef(function SingleView(props: Props, fwdRef) {
114176 { ...openGLRenderWindowProps }
115177 ref = { openGLRenderWindowRef }
116178 >
117- < RenderWindow { ... renderWindowProps } ref = { renderWindowRef } >
179+ < RenderWindow ref = { renderWindowRef } >
118180 < Renderer { ...rendererProps } ref = { rendererRef } >
119181 { props . children }
120182 </ Renderer >
@@ -225,6 +287,12 @@ const ParentedView = forwardRef(function ParentedView(props: Props, fwdRef) {
225287 getOpenGLRenderWindow : ( ) => openGLRenderWindowAPI ,
226288 getRenderWindow : ( ) => renderWindowAPI ,
227289 getRenderer : ( ) => rendererRef . current ,
290+ // TODO
291+ getInteractorStyle : ( ) => ( { } as unknown as vtkInteractorStyle ) ,
292+ // TODO
293+ setInteractorStyle : ( style ) => {
294+ console . log ( style ) ;
295+ } ,
228296 requestRender : ( ) => rendererRef . current ?. requestRender ( ) ,
229297 getCamera : ( ) => rendererRef . current ?. get ( ) . getActiveCamera ( ) ?? null ,
230298 resetCamera : ( boundsToUse ?: Bounds ) =>
@@ -271,6 +339,8 @@ export default forwardRef(function View(props: Props, fwdRef) {
271339 getOpenGLRenderWindow : ( ) => getView ( ) ?. getOpenGLRenderWindow ( ) ?? null ,
272340 getRenderWindow : ( ) => getView ( ) ?. getRenderWindow ( ) ?? null ,
273341 getRenderer : ( ) => getView ( ) ?. getRenderer ( ) ?? null ,
342+ getInteractorStyle : ( ) => getView ( ) ?. getInteractorStyle ( ) ?? null ,
343+ setInteractorStyle : ( style ) => getView ( ) ?. setInteractorStyle ( style ) ,
274344 requestRender : ( ) => getView ( ) ?. requestRender ( ) ,
275345 getCamera : ( ) => getView ( ) ?. getCamera ( ) ?? null ,
276346 resetCamera : ( boundsToUse ?: Bounds ) =>
0 commit comments