Skip to content

Commit

Permalink
ENH: Improve Event Delegation in qMRMLThreeDView and qMRMLSliceView
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
jcfr and LucasGandel committed Nov 2, 2023
1 parent 39c5a08 commit 6b58b0e
Show file tree
Hide file tree
Showing 16 changed files with 329 additions and 170 deletions.
4 changes: 2 additions & 2 deletions Docs/developer_guide/script_repository/gui.md
Original file line number Diff line number Diff line change
Expand Up @@ -1162,8 +1162,8 @@ w.SetEventTranslationClickAndDrag(w.WidgetStateIdle,
For example, disable slice browsing using mouse wheel and keyboard shortcuts in the red slice viewer:

```python
interactorStyle = slicer.app.layoutManager().sliceWidget("Red").sliceView().sliceViewInteractorStyle()
interactorStyle.SetActionEnabled(interactorStyle.BrowseSlice, False)
interactorObserver = slicer.app.layoutManager().sliceWidget("Red").sliceView().interactorObserver()
interactorObserver.SetActionEnabled(interactorStyle.BrowseSlice, False)
```

Hide all slice view controllers:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
// VTK includes
#include <vtkErrorCode.h>
#include <vtkInteractorEventRecorder.h>
#include <vtkInteractorStyle3D.h>
#include <vtkNew.h>
#include <vtkPNGWriter.h>
#include <vtkRegressionTestImage.h>
Expand Down Expand Up @@ -504,7 +505,7 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
rw->SetInteractor(ri.GetPointer());

// Set Interactor Style
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
vtkNew<vtkInteractorStyle3D> iStyle;
ri->SetInteractorStyle(iStyle.GetPointer());

// MRML scene
Expand Down Expand Up @@ -581,6 +582,10 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
return EXIT_FAILURE;
}

vtkNew<vtkMRMLThreeDViewInteractorStyle> iObserver;
iObserver->SetDisplayableManagers(displayableManagerGroup);
iObserver->SetInteractor(ri);

// Check if GetDisplayableManagerCount returns 2
if (displayableManagerGroup->GetDisplayableManagerCount() != 2)
{
Expand Down Expand Up @@ -610,9 +615,9 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])

// Interactor style should be vtkMRMLThreeDViewInteractorStyle
vtkInteractorObserver * currentInteractoryStyle = ri->GetInteractorStyle();
if (!vtkMRMLThreeDViewInteractorStyle::SafeDownCast(currentInteractoryStyle))
if (!vtkInteractorStyle3D::SafeDownCast(currentInteractoryStyle))
{
std::cerr << "Expected interactorStyle: vtkMRMLThreeDViewInteractorStyle" << std::endl;
std::cerr << "Expected interactorStyle: vtkInteractorStyle3D" << std::endl;
std::cerr << "Current RenderWindowInteractor: "
<< (currentInteractoryStyle ? currentInteractoryStyle->GetClassName() : "Null") << std::endl;
return EXIT_FAILURE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
// VTK includes
#include <vtkErrorCode.h>
#include <vtkInteractorEventRecorder.h>
#include <vtkInteractorStyle3D.h>
#include <vtkNew.h>
#include <vtkPNGWriter.h>
#include <vtkRegressionTestImage.h>
Expand Down Expand Up @@ -87,7 +88,7 @@ int vtkMRMLCameraWidgetTest1(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
rw->SetInteractor(ri.GetPointer());

// Set Interactor Style
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
vtkNew<vtkInteractorStyle3D> iStyle;
ri->SetInteractorStyle(iStyle.GetPointer());

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

vtkNew<vtkMRMLThreeDViewInteractorStyle> iObserver;
iObserver->SetDisplayableManagers(group);
iObserver->SetInteractor(ri);

vtkMRMLCameraDisplayableManager * cameraDisplayableManager =vtkMRMLCameraDisplayableManager::SafeDownCast(
group->GetDisplayableManagerByClassName("vtkMRMLCameraDisplayableManager"));
CHECK_NOT_NULL(cameraDisplayableManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

// VTK includes
#include <vtkNew.h>
#include <vtkInteractorStyle3D.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
Expand Down Expand Up @@ -100,7 +101,7 @@ int vtkMRMLDisplayableManagerFactoriesTest1(int argc, char* argv[])
rw->SetInteractor(ri.GetPointer());

// Set Interactor Style
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
vtkNew<vtkInteractorStyle3D> iStyle;
ri->SetInteractorStyle(iStyle.GetPointer());

// ThreeD - Instantiate displayable managers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <vtkCamera.h>
#include <vtkErrorCode.h>
#include <vtkInteractorEventRecorder.h>
#include <vtkInteractorStyle3D.h>
#include <vtkNew.h>
#include <vtkPNGWriter.h>
#include <vtkRegressionTestImage.h>
Expand Down Expand Up @@ -916,7 +917,7 @@ int vtkMRMLThreeDReformatDisplayableManagerTest1(int argc, char* argv[])
renderWindow->SetInteractor(renderWindowInteractor.GetPointer());

// Set Interactor Style
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
vtkNew<vtkInteractorStyle3D> iStyle;
renderWindowInteractor->SetInteractorStyle(iStyle.GetPointer());

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

iStyle->SetDisplayableManagers(displayableManagerGroup);
vtkNew<vtkMRMLThreeDViewInteractorStyle> iObserver;
iObserver->SetDisplayableManagers(displayableManagerGroup);
iObserver->SetInteractor(renderWindowInteractor);

vtkNew<vtkMRMLThreeDReformatDisplayableManager> reformatDisplayableManager;
reformatDisplayableManager->SetMRMLApplicationLogic(applicationLogic);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

// VTK includes
#include <vtkNew.h>
#include <vtkInteractorStyle3D.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
Expand Down Expand Up @@ -193,7 +194,7 @@ int vtkMRMLThreeDViewDisplayableManagerFactoryTest1(int vtkNotUsed(argc), char*
rw->SetInteractor(ri.GetPointer());

// Set Interactor Style
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
vtkNew<vtkInteractorStyle3D> iStyle;
ri->SetInteractorStyle(iStyle.GetPointer());

// MRML scene and ViewNode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <vtkCamera.h>
#include <vtkCellPicker.h>
#include <vtkEvent.h>
#include <vtkInteractorStyle.h>
#include <vtkMath.h>
#include <vtkObjectFactory.h>
#include <vtkPoints.h>
Expand Down Expand Up @@ -110,7 +111,8 @@ bool vtkMRMLThreeDViewInteractorStyle::DelegateInteractionEventToDisplayableMana
// Get display and world position
int* displayPositionInt = this->GetInteractor()->GetEventPosition();
vtkRenderer* pokedRenderer = this->GetInteractor()->FindPokedRenderer(displayPositionInt[0], displayPositionInt[1]);
this->SetCurrentRenderer(pokedRenderer);
vtkInteractorStyle* interactorStyle = vtkInteractorStyle::SafeDownCast(this->GetInteractor()->GetInteractorStyle());
interactorStyle->SetCurrentRenderer(pokedRenderer);
if (!pokedRenderer || !inputEventData)
{
// can happen during application shutdown
Expand Down Expand Up @@ -165,7 +167,8 @@ void vtkMRMLThreeDViewInteractorStyle::SetInteractor(vtkRenderWindowInteractor *
bool vtkMRMLThreeDViewInteractorStyle::QuickPick(int x, int y, double pickPoint[3])
{
vtkRenderer* pokedRenderer = this->GetInteractor()->FindPokedRenderer(x, y);
this->SetCurrentRenderer(pokedRenderer);
vtkInteractorStyle* interactorStyle = vtkInteractorStyle::SafeDownCast(this->GetInteractor()->GetInteractorStyle());
interactorStyle->SetCurrentRenderer(pokedRenderer);
if (pokedRenderer == nullptr)
{
vtkDebugMacro("Pick: couldn't find the poked renderer at event position " << x << ", " << y);
Expand Down

0 comments on commit 6b58b0e

Please sign in to comment.