Skip to content

Commit 1cc3b2c

Browse files
jcfrLucasGandel
andcommitted
ENH: Improve Event Delegation in qMRMLThreeDView and qMRMLSliceView
Refactor vtkMRMLThreeDViewInteractorStyle and vtkMRMLSliceViewInteractorStyle to derive from vtkObject and implement event delegation to MRML displayable managers and associated widgets by observing the interactor style. This will allows to associate specialized interactor styles like vtkOpenXRInteractorStyle or vtkOpenVRInteractorStyle with render window while maintaining the MRML specific event delegation. Co-authored-by: Lucas Gandel <lucas.gandel@kitware.com>
1 parent e9772b1 commit 1cc3b2c

16 files changed

+329
-170
lines changed

Docs/developer_guide/script_repository/gui.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,8 +1162,8 @@ w.SetEventTranslationClickAndDrag(w.WidgetStateIdle,
11621162
For example, disable slice browsing using mouse wheel and keyboard shortcuts in the red slice viewer:
11631163

11641164
```python
1165-
interactorStyle = slicer.app.layoutManager().sliceWidget("Red").sliceView().sliceViewInteractorStyle()
1166-
interactorStyle.SetActionEnabled(interactorStyle.BrowseSlice, False)
1165+
interactorObserver = slicer.app.layoutManager().sliceWidget("Red").sliceView().interactorObserver()
1166+
interactorObserver.SetActionEnabled(interactorStyle.BrowseSlice, False)
11671167
```
11681168

11691169
Hide all slice view controllers:

Libs/MRML/DisplayableManager/Testing/Cxx/vtkMRMLCameraDisplayableManagerTest1.cxx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
// VTK includes
3434
#include <vtkErrorCode.h>
3535
#include <vtkInteractorEventRecorder.h>
36+
#include <vtkInteractorStyle3D.h>
3637
#include <vtkNew.h>
3738
#include <vtkPNGWriter.h>
3839
#include <vtkRegressionTestImage.h>
@@ -504,7 +505,7 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
504505
rw->SetInteractor(ri.GetPointer());
505506

506507
// Set Interactor Style
507-
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
508+
vtkNew<vtkInteractorStyle3D> iStyle;
508509
ri->SetInteractorStyle(iStyle.GetPointer());
509510

510511
// MRML scene
@@ -581,6 +582,10 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
581582
return EXIT_FAILURE;
582583
}
583584

585+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iObserver;
586+
iObserver->SetDisplayableManagers(displayableManagerGroup);
587+
iObserver->SetInteractor(ri);
588+
584589
// Check if GetDisplayableManagerCount returns 2
585590
if (displayableManagerGroup->GetDisplayableManagerCount() != 2)
586591
{
@@ -610,9 +615,9 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
610615

611616
// Interactor style should be vtkMRMLThreeDViewInteractorStyle
612617
vtkInteractorObserver * currentInteractoryStyle = ri->GetInteractorStyle();
613-
if (!vtkMRMLThreeDViewInteractorStyle::SafeDownCast(currentInteractoryStyle))
618+
if (!vtkInteractorStyle3D::SafeDownCast(currentInteractoryStyle))
614619
{
615-
std::cerr << "Expected interactorStyle: vtkMRMLThreeDViewInteractorStyle" << std::endl;
620+
std::cerr << "Expected interactorStyle: vtkInteractorStyle3D" << std::endl;
616621
std::cerr << "Current RenderWindowInteractor: "
617622
<< (currentInteractoryStyle ? currentInteractoryStyle->GetClassName() : "Null") << std::endl;
618623
return EXIT_FAILURE;

Libs/MRML/DisplayableManager/Testing/Cxx/vtkMRMLCameraWidgetTest1.cxx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// VTK includes
1616
#include <vtkErrorCode.h>
1717
#include <vtkInteractorEventRecorder.h>
18+
#include <vtkInteractorStyle3D.h>
1819
#include <vtkNew.h>
1920
#include <vtkPNGWriter.h>
2021
#include <vtkRegressionTestImage.h>
@@ -87,7 +88,7 @@ int vtkMRMLCameraWidgetTest1(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
8788
rw->SetInteractor(ri.GetPointer());
8889

8990
// Set Interactor Style
90-
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
91+
vtkNew<vtkInteractorStyle3D> iStyle;
9192
ri->SetInteractorStyle(iStyle.GetPointer());
9293

9394
// MRML scene
@@ -117,6 +118,10 @@ int vtkMRMLCameraWidgetTest1(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
117118
factory->InstantiateDisplayableManagers(rr.GetPointer()));
118119
CHECK_NOT_NULL(group);
119120

121+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iObserver;
122+
iObserver->SetDisplayableManagers(group);
123+
iObserver->SetInteractor(ri);
124+
120125
vtkMRMLCameraDisplayableManager * cameraDisplayableManager =vtkMRMLCameraDisplayableManager::SafeDownCast(
121126
group->GetDisplayableManagerByClassName("vtkMRMLCameraDisplayableManager"));
122127
CHECK_NOT_NULL(cameraDisplayableManager);

Libs/MRML/DisplayableManager/Testing/Cxx/vtkMRMLDisplayableManagerFactoriesTest1.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
// VTK includes
2020
#include <vtkNew.h>
21+
#include <vtkInteractorStyle3D.h>
2122
#include <vtkRenderWindow.h>
2223
#include <vtkRenderWindowInteractor.h>
2324
#include <vtkRenderer.h>
@@ -100,7 +101,7 @@ int vtkMRMLDisplayableManagerFactoriesTest1(int argc, char* argv[])
100101
rw->SetInteractor(ri.GetPointer());
101102

102103
// Set Interactor Style
103-
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
104+
vtkNew<vtkInteractorStyle3D> iStyle;
104105
ri->SetInteractorStyle(iStyle.GetPointer());
105106

106107
// ThreeD - Instantiate displayable managers

Libs/MRML/DisplayableManager/Testing/Cxx/vtkMRMLThreeDReformatDisplayableManagerTest1.cxx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <vtkCamera.h>
3838
#include <vtkErrorCode.h>
3939
#include <vtkInteractorEventRecorder.h>
40+
#include <vtkInteractorStyle3D.h>
4041
#include <vtkNew.h>
4142
#include <vtkPNGWriter.h>
4243
#include <vtkRegressionTestImage.h>
@@ -916,7 +917,7 @@ int vtkMRMLThreeDReformatDisplayableManagerTest1(int argc, char* argv[])
916917
renderWindow->SetInteractor(renderWindowInteractor.GetPointer());
917918

918919
// Set Interactor Style
919-
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
920+
vtkNew<vtkInteractorStyle3D> iStyle;
920921
renderWindowInteractor->SetInteractorStyle(iStyle.GetPointer());
921922

922923
renderWindow->Render();
@@ -940,7 +941,9 @@ int vtkMRMLThreeDReformatDisplayableManagerTest1(int argc, char* argv[])
940941
renderCallback->RenderWindow = renderWindow;
941942
displayableManagerGroup->AddObserver(vtkCommand::UpdateEvent, renderCallback);
942943

943-
iStyle->SetDisplayableManagers(displayableManagerGroup);
944+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iObserver;
945+
iObserver->SetDisplayableManagers(displayableManagerGroup);
946+
iObserver->SetInteractor(renderWindowInteractor);
944947

945948
vtkNew<vtkMRMLThreeDReformatDisplayableManager> reformatDisplayableManager;
946949
reformatDisplayableManager->SetMRMLApplicationLogic(applicationLogic);

Libs/MRML/DisplayableManager/Testing/Cxx/vtkMRMLThreeDViewDisplayableManagerFactoryTest1.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
// VTK includes
3232
#include <vtkNew.h>
33+
#include <vtkInteractorStyle3D.h>
3334
#include <vtkRenderWindow.h>
3435
#include <vtkRenderWindowInteractor.h>
3536
#include <vtkRenderer.h>
@@ -193,7 +194,7 @@ int vtkMRMLThreeDViewDisplayableManagerFactoryTest1(int vtkNotUsed(argc), char*
193194
rw->SetInteractor(ri.GetPointer());
194195

195196
// Set Interactor Style
196-
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
197+
vtkNew<vtkInteractorStyle3D> iStyle;
197198
ri->SetInteractorStyle(iStyle.GetPointer());
198199

199200
// MRML scene and ViewNode

Libs/MRML/DisplayableManager/vtkMRMLThreeDViewInteractorStyle.cxx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <vtkCamera.h>
2828
#include <vtkCellPicker.h>
2929
#include <vtkEvent.h>
30+
#include <vtkInteractorStyle.h>
3031
#include <vtkMath.h>
3132
#include <vtkObjectFactory.h>
3233
#include <vtkPoints.h>
@@ -110,7 +111,8 @@ bool vtkMRMLThreeDViewInteractorStyle::DelegateInteractionEventToDisplayableMana
110111
// Get display and world position
111112
int* displayPositionInt = this->GetInteractor()->GetEventPosition();
112113
vtkRenderer* pokedRenderer = this->GetInteractor()->FindPokedRenderer(displayPositionInt[0], displayPositionInt[1]);
113-
this->SetCurrentRenderer(pokedRenderer);
114+
vtkInteractorStyle* interactorStyle = vtkInteractorStyle::SafeDownCast(this->GetInteractor()->GetInteractorStyle());
115+
interactorStyle->SetCurrentRenderer(pokedRenderer);
114116
if (!pokedRenderer || !inputEventData)
115117
{
116118
// can happen during application shutdown
@@ -165,7 +167,8 @@ void vtkMRMLThreeDViewInteractorStyle::SetInteractor(vtkRenderWindowInteractor *
165167
bool vtkMRMLThreeDViewInteractorStyle::QuickPick(int x, int y, double pickPoint[3])
166168
{
167169
vtkRenderer* pokedRenderer = this->GetInteractor()->FindPokedRenderer(x, y);
168-
this->SetCurrentRenderer(pokedRenderer);
170+
vtkInteractorStyle* interactorStyle = vtkInteractorStyle::SafeDownCast(this->GetInteractor()->GetInteractorStyle());
171+
interactorStyle->SetCurrentRenderer(pokedRenderer);
169172
if (pokedRenderer == nullptr)
170173
{
171174
vtkDebugMacro("Pick: couldn't find the poked renderer at event position " << x << ", " << y);

0 commit comments

Comments
 (0)