Skip to content

Commit 364ff7b

Browse files
committed
ENH: Use common interactor style for slice and 3D views
Common interactor class is responsible for delegating interaction events to displayable managers (and if none of the displayable managers can process an event then emit an interaction event). Translation from interaction event to camera manipulation events is not hardcoded anymore in the interactor style but it is moved to vtkMRMLCameraWidget. Added support for double-click events in the interactor. Added menu (right-click) and action (double-click) events to widgets. They are not handled yet in Slicer core. svn-url: http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=28095 git-svn-id: http://svn.slicer.org/Slicer4/trunk@28095 3bd1e089-480b-0410-8dfb-8563597acbee
1 parent a63fd4c commit 364ff7b

File tree

57 files changed

+2657
-2374
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2657
-2374
lines changed

Libs/MRML/Core/vtkMRMLCameraNode.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@ class VTK_MRML_EXPORT vtkMRMLCameraNode : public vtkMRMLTransformableNode
184184
};
185185

186186
enum ScreenAxis{
187-
X = 0,
188-
Y = 1,
189-
Z = 2
187+
X = 0, // left
188+
Y = 1, // up
189+
Z = 2 // forward
190190
};
191191

192192
/// Moves the camera toward a position.

Libs/MRML/DisplayableManager/CMakeLists.txt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ set(KIT_SRCS
9595
vtkMRMLDisplayableManagerGroup.cxx
9696
vtkMRMLDisplayableManagerFactory.cxx
9797

98+
vtkMRMLInteractionEventData.cxx
99+
98100
# ThreeDView factory and DisplayableManager
99101
vtkMRMLAbstractThreeDViewDisplayableManager.cxx
100102
vtkMRMLThreeDViewDisplayableManagerFactory.cxx
@@ -103,14 +105,16 @@ set(KIT_SRCS
103105
vtkMRMLAbstractSliceViewDisplayableManager.cxx
104106
vtkMRMLSliceViewDisplayableManagerFactory.cxx
105107

106-
vtkSliceViewInteractorStyle.cxx
107-
vtkThreeDViewInteractorStyle.cxx
108+
vtkMRMLViewInteractorStyle.cxx
109+
vtkMRMLSliceViewInteractorStyle.cxx
110+
vtkMRMLThreeDViewInteractorStyle.cxx
108111

109112
# Widgets
110113
vtkMRMLAbstractWidget.cxx
111114
vtkMRMLAbstractWidgetRepresentation.cxx
112-
vtkSliceIntersectionWidget.cxx
113-
vtkSliceIntersectionRepresentation2D.cxx
115+
vtkMRMLCameraWidget.cxx
116+
vtkMRMLSliceIntersectionWidget.cxx
117+
vtkMRMLSliceIntersectionRepresentation2D.cxx
114118
vtkMRMLRubberBandWidgetRepresentation.cxx
115119
vtkMRMLWindowLevelWidget.cxx
116120

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
==============================================================================*/
2020

2121
// MRMLDisplayableManager includes
22-
#include <vtkMRMLThreeDViewDisplayableManagerFactory.h>
2322
#include <vtkMRMLDisplayableManagerGroup.h>
24-
#include <vtkThreeDViewInteractorStyle.h>
23+
#include <vtkMRMLThreeDViewDisplayableManagerFactory.h>
24+
#include <vtkMRMLThreeDViewInteractorStyle.h>
2525

2626
// MRMLLogic includes
2727
#include <vtkMRMLApplicationLogic.h>
@@ -504,7 +504,7 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
504504
rw->SetInteractor(ri.GetPointer());
505505

506506
// Set Interactor Style
507-
vtkNew<vtkThreeDViewInteractorStyle> iStyle;
507+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
508508
ri->SetInteractorStyle(iStyle.GetPointer());
509509

510510
// MRML scene
@@ -606,11 +606,11 @@ int vtkMRMLCameraDisplayableManagerTest1(int argc, char* argv[])
606606
return EXIT_FAILURE;
607607
}
608608

609-
// Interactor style should be vtkThreeDViewInteractorStyle
609+
// Interactor style should be vtkMRMLThreeDViewInteractorStyle
610610
vtkInteractorObserver * currentInteractoryStyle = ri->GetInteractorStyle();
611-
if (!vtkThreeDViewInteractorStyle::SafeDownCast(currentInteractoryStyle))
611+
if (!vtkMRMLThreeDViewInteractorStyle::SafeDownCast(currentInteractoryStyle))
612612
{
613-
std::cerr << "Expected interactorStyle: vtkThreeDViewInteractorStyle" << std::endl;
613+
std::cerr << "Expected interactorStyle: vtkMRMLThreeDViewInteractorStyle" << std::endl;
614614
std::cerr << "Current RenderWindowInteractor: "
615615
<< (currentInteractoryStyle ? currentInteractoryStyle->GetClassName() : "Null") << std::endl;
616616
return EXIT_FAILURE;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

22
// MRMLDisplayableManager includes
3-
#include <vtkMRMLThreeDViewDisplayableManagerFactory.h>
4-
#include <vtkMRMLSliceViewDisplayableManagerFactory.h>
53
#include <vtkMRMLDisplayableManagerGroup.h>
6-
#include <vtkThreeDViewInteractorStyle.h>
4+
#include <vtkMRMLSliceViewDisplayableManagerFactory.h>
5+
#include <vtkMRMLThreeDViewDisplayableManagerFactory.h>
6+
#include <vtkMRMLThreeDViewInteractorStyle.h>
77
#include <vtkMRMLScene.h>
88
#include <vtkMRMLTestThreeDViewDisplayableManager.h>
99
#include <vtkMRMLTestSliceViewDisplayableManager.h>
@@ -100,7 +100,7 @@ int vtkMRMLDisplayableManagerFactoriesTest1(int argc, char* argv[])
100100
rw->SetInteractor(ri.GetPointer());
101101

102102
// Set Interactor Style
103-
vtkNew<vtkThreeDViewInteractorStyle> iStyle;
103+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
104104
ri->SetInteractorStyle(iStyle.GetPointer());
105105

106106
// ThreeD - Instantiate displayable managers

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
// MRMLDisplayableManager includes
2222
#include <vtkMRMLDisplayableManagerGroup.h>
23-
#include <vtkThreeDViewInteractorStyle.h>
23+
#include <vtkMRMLThreeDViewInteractorStyle.h>
2424

2525
// MRMLLogic includes
2626
#include <vtkMRMLApplicationLogic.h>
@@ -65,7 +65,7 @@ int vtkMRMLModelDisplayableManagerTest(int argc, char* argv[])
6565
renderWindow->SetInteractor(renderWindowInteractor.GetPointer());
6666

6767
// Set Interactor Style
68-
//vtkNew<vtkThreeDViewInteractorStyle> iStyle;
68+
//vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
6969
//renderWindowInteractor->SetInteractorStyle(iStyle.GetPointer());
7070

7171
// move back far enough to see the reformat widgets

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
// MRMLDisplayableManager includes
2222
#include <vtkMRMLDisplayableManagerGroup.h>
23-
#include <vtkThreeDViewInteractorStyle.h>
23+
#include <vtkMRMLThreeDViewInteractorStyle.h>
2424

2525
// MRMLLogic includes
2626
#include <vtkMRMLApplicationLogic.h>

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

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
==============================================================================*/
2020

2121
// MRMLDisplayableManager includes
22+
#include <vtkMRMLCameraDisplayableManager.h>
2223
#include <vtkMRMLDisplayableManagerGroup.h>
2324
#include <vtkMRMLThreeDReformatDisplayableManager.h>
24-
#include <vtkThreeDViewInteractorStyle.h>
25+
#include <vtkMRMLThreeDViewInteractorStyle.h>
2526

2627
// MRMLLogic includes
2728
#include <vtkMRMLApplicationLogic.h>
@@ -869,6 +870,7 @@ char vtkMRMLThreeDReformatDisplayableManagerTest1EventLog[] =
869870

870871
namespace
871872
{
873+
872874
//----------------------------------------------------------------------------
873875
class vtkAbortCommand: public vtkCommand
874876
{
@@ -881,6 +883,22 @@ class vtkAbortCommand: public vtkCommand
881883
this->SetAbortFlag(1);
882884
}
883885
};
886+
887+
class vtkRenderCallback : public vtkCommand
888+
{
889+
public:
890+
static vtkRenderCallback *New()
891+
{
892+
return new vtkRenderCallback;
893+
}
894+
void Execute(vtkObject *caller, unsigned long, void*) override
895+
{
896+
this->RenderWindow->Render();
897+
}
898+
vtkRenderCallback() :RenderWindow(nullptr) {}
899+
vtkRenderWindow *RenderWindow;
900+
};
901+
884902
};
885903

886904
//----------------------------------------------------------------------------
@@ -897,12 +915,9 @@ int vtkMRMLThreeDReformatDisplayableManagerTest1(int argc, char* argv[])
897915
renderWindow->SetInteractor(renderWindowInteractor.GetPointer());
898916

899917
// Set Interactor Style
900-
vtkNew<vtkThreeDViewInteractorStyle> iStyle;
918+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
901919
renderWindowInteractor->SetInteractorStyle(iStyle.GetPointer());
902920

903-
// move back far enough to see the reformat widgets
904-
renderer->GetActiveCamera()->SetPosition(0,0,-500.);
905-
906921
renderWindow->Render();
907922

908923
// MRML scene
@@ -919,10 +934,26 @@ int vtkMRMLThreeDReformatDisplayableManagerTest1(int argc, char* argv[])
919934
displayableManagerGroup->SetRenderer(renderer.GetPointer());
920935
displayableManagerGroup->SetMRMLDisplayableNode(viewNode.GetPointer());
921936

937+
vtkNew<vtkRenderCallback> renderCallback;
938+
renderCallback->RenderWindow = renderWindow;
939+
displayableManagerGroup->AddObserver(vtkCommand::UpdateEvent, renderCallback);
940+
941+
iStyle->SetDisplayableManagers(displayableManagerGroup);
942+
922943
vtkNew<vtkMRMLThreeDReformatDisplayableManager> reformatDisplayableManager;
923944
reformatDisplayableManager->SetMRMLApplicationLogic(applicationLogic);
924945
displayableManagerGroup->AddDisplayableManager(reformatDisplayableManager.GetPointer());
925946

947+
// Need to add vtkMRMLCameraDisplayableManager, as this processes camera manipulation events
948+
vtkNew<vtkMRMLCameraDisplayableManager> cameraDisplayableManager;
949+
cameraDisplayableManager->SetMRMLApplicationLogic(applicationLogic);
950+
displayableManagerGroup->AddDisplayableManager(cameraDisplayableManager.GetPointer());
951+
952+
// Camera displayable manager sets default camera position/orientation.
953+
// Move camera back far enough to see the reformat widgets.
954+
renderer->GetActiveCamera()->SetPosition(0, 0, -500.);
955+
renderer->GetActiveCamera()->SetViewUp(0, 1., 0);
956+
926957
// Visible when added
927958
vtkNew<vtkMRMLSliceNode> sliceNodeRed;
928959
// TODO: This color should be taken into account, not the layout name

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
==============================================================================*/
2020

2121
// MRMLDisplayableManager includes
22-
#include <vtkMRMLThreeDViewDisplayableManagerFactory.h>
23-
#include <vtkMRMLDisplayableManagerGroup.h>
24-
#include <vtkThreeDViewInteractorStyle.h>
2522
#include <vtkMRMLAbstractThreeDViewDisplayableManager.h>
23+
#include <vtkMRMLDisplayableManagerGroup.h>
24+
#include <vtkMRMLThreeDViewDisplayableManagerFactory.h>
25+
#include <vtkMRMLThreeDViewInteractorStyle.h>
2626

2727
// MRML includes
2828
#include <vtkMRMLScene.h>
@@ -193,7 +193,7 @@ int vtkMRMLThreeDViewDisplayableManagerFactoryTest1(int vtkNotUsed(argc), char*
193193
rw->SetInteractor(ri.GetPointer());
194194

195195
// Set Interactor Style
196-
vtkNew<vtkThreeDViewInteractorStyle> iStyle;
196+
vtkNew<vtkMRMLThreeDViewInteractorStyle> iStyle;
197197
ri->SetInteractorStyle(iStyle.GetPointer());
198198

199199
// MRML scene and ViewNode

Libs/MRML/DisplayableManager/vtkMRMLAbstractThreeDViewDisplayableManager.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include "vtkMRMLAbstractThreeDViewDisplayableManager.h"
2323

2424
// MRML includes
25+
#include "vtkMRMLThreeDViewInteractorStyle.h"
2526
#include <vtkMRMLViewNode.h>
26-
#include "vtkThreeDViewInteractorStyle.h"
2727

2828
// VTK includes
2929
#include <vtkObjectFactory.h>
@@ -72,7 +72,7 @@ vtkMRMLViewNode * vtkMRMLAbstractThreeDViewDisplayableManager::GetMRMLViewNode()
7272
//---------------------------------------------------------------------------
7373
void vtkMRMLAbstractThreeDViewDisplayableManager::PassThroughInteractorStyleEvent(int eventid)
7474
{
75-
vtkThreeDViewInteractorStyle* interactorStyle = vtkThreeDViewInteractorStyle::SafeDownCast(
75+
vtkMRMLThreeDViewInteractorStyle* interactorStyle = vtkMRMLThreeDViewInteractorStyle::SafeDownCast(
7676
this->GetInteractor()->GetInteractorStyle());
7777

7878
if (interactorStyle)

Libs/MRML/DisplayableManager/vtkMRMLAbstractWidget.cxx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "vtkMRMLAbstractWidgetRepresentation.h"
2929

3030
// VTK includes
31+
#include "vtkEvent.h"
3132
#include "vtkRenderer.h"
3233
#include "vtkRenderWindow.h"
3334
#include "vtkWidgetEventTranslator.h"
@@ -40,6 +41,8 @@ vtkMRMLAbstractWidget::vtkMRMLAbstractWidget()
4041

4142
this->WidgetRep = nullptr;
4243
this->WidgetState = vtkMRMLAbstractWidget::WidgetStateIdle;
44+
45+
// this->NeedToRender = false;
4346
}
4447

4548
//----------------------------------------------------------------------
@@ -312,6 +315,16 @@ bool vtkMRMLAbstractWidget::GetNeedToRender()
312315
return false;
313316
}
314317
return this->WidgetRep->GetNeedToRender();
318+
/*
319+
if (this->NeedToRender)
320+
{
321+
return true;
322+
}
323+
if (this->WidgetRep && this->WidgetRep->GetNeedToRender())
324+
{
325+
return true;
326+
}
327+
return false;*/
315328
}
316329

317330
//-------------------------------------------------------------------------
@@ -322,6 +335,13 @@ void vtkMRMLAbstractWidget::NeedToRenderOff()
322335
return;
323336
}
324337
this->WidgetRep->NeedToRenderOff();
338+
/*
339+
this->NeedToRender = false;
340+
if (this->WidgetRep)
341+
{
342+
this->WidgetRep->NeedToRenderOff();
343+
}
344+
*/
325345
}
326346

327347
//----------------------------------------------------------------------

0 commit comments

Comments
 (0)