Mercurial > hg > orthanc-stone
annotate Framework/Widgets/WorldSceneWidget.cpp @ 356:885f0a5eaa49 am-2
mouse tracker to set windowing
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 29 Oct 2018 17:21:40 +0100 |
parents | 08683537a227 |
children | 99e31898910e |
rev | line source |
---|---|
0 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
134
4cff7b1ed31d
upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
47 | 8 * modify it under the terms of the GNU Affero General Public License |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
0 | 11 * |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
47 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Affero General Public License for more details. | |
281 | 16 * |
47 | 17 * You should have received a copy of the GNU Affero General Public License |
0 | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | |
20 | |
21 | |
22 #include "WorldSceneWidget.h" | |
23 | |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
24 #include "PanMouseTracker.h" |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
25 #include "ZoomMouseTracker.h" |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
26 |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
27 #include <Core/Logging.h> |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
28 |
110
53025eecbc95
renamed SliceGeometry as CoordinateSystem3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
109
diff
changeset
|
29 #include <math.h> |
53025eecbc95
renamed SliceGeometry as CoordinateSystem3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
109
diff
changeset
|
30 #include <memory> |
53025eecbc95
renamed SliceGeometry as CoordinateSystem3D
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
109
diff
changeset
|
31 #include <cassert> |
0 | 32 |
33 namespace OrthancStone | |
34 { | |
281 | 35 // this is an adapter between a IWorldSceneMouseTracker |
36 // that is tracking a mouse in scene coordinates/mm and | |
37 // an IMouseTracker that is tracking a mouse | |
38 // in screen coordinates/pixels. | |
0 | 39 class WorldSceneWidget::SceneMouseTracker : public IMouseTracker |
40 { | |
41 private: | |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
42 ViewportGeometry view_; |
0 | 43 std::auto_ptr<IWorldSceneMouseTracker> tracker_; |
281 | 44 |
0 | 45 public: |
46 SceneMouseTracker(const ViewportGeometry& view, | |
47 IWorldSceneMouseTracker* tracker) : | |
48 view_(view), | |
49 tracker_(tracker) | |
50 { | |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
51 if (tracker == NULL) |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
52 { |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
53 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
54 } |
0 | 55 } |
56 | |
57 virtual void Render(Orthanc::ImageAccessor& target) | |
58 { | |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
59 if (tracker_->HasRender()) |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
60 { |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
61 CairoSurface surface(target); |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
62 CairoContext context(surface); |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
63 view_.ApplyTransform(context); |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
64 tracker_->Render(context, view_.GetZoom()); |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
65 } |
0 | 66 } |
67 | |
281 | 68 virtual void MouseUp() |
0 | 69 { |
70 tracker_->MouseUp(); | |
71 } | |
72 | |
281 | 73 virtual void MouseMove(int x, |
0 | 74 int y) |
75 { | |
76 double sceneX, sceneY; | |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
77 view_.MapPixelCenterToScene(sceneX, sceneY, x, y); |
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
78 tracker_->MouseMove(x, y, sceneX, sceneY); |
0 | 79 } |
80 }; | |
81 | |
82 | |
83 bool WorldSceneWidget::RenderCairo(CairoContext& context) | |
84 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
85 view_.ApplyTransform(context); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
86 return RenderScene(context, view_); |
0 | 87 } |
88 | |
89 | |
90 void WorldSceneWidget::RenderMouseOverCairo(CairoContext& context, | |
91 int x, | |
92 int y) | |
93 { | |
94 ViewportGeometry view = GetView(); | |
95 view.ApplyTransform(context); | |
96 | |
97 double sceneX, sceneY; | |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
98 view.MapPixelCenterToScene(sceneX, sceneY, x, y); |
331
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
99 |
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
100 if (interactor_) |
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
101 { |
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
102 interactor_->MouseOver(context, *this, view, sceneX, sceneY, GetStatusBar()); |
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
103 } |
0 | 104 } |
105 | |
106 | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
107 void WorldSceneWidget::SetSceneExtent(ViewportGeometry& view) |
0 | 108 { |
109
53bd9277b025
using the Extent class
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
91
diff
changeset
|
109 view.SetSceneExtent(GetSceneExtent()); |
0 | 110 } |
111 | |
112 | |
113 void WorldSceneWidget::SetSize(unsigned int width, | |
114 unsigned int height) | |
115 { | |
116 CairoWidget::SetSize(width, height); | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
117 view_.SetDisplaySize(width, height); |
0 | 118 } |
119 | |
120 | |
121 void WorldSceneWidget::SetInteractor(IWorldSceneInteractor& interactor) | |
122 { | |
123 interactor_ = &interactor; | |
124 } | |
125 | |
126 | |
330 | 127 void WorldSceneWidget::FitContent() |
0 | 128 { |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
129 SetSceneExtent(view_); |
330 | 130 view_.FitContent(); |
0 | 131 |
278 | 132 NotifyContentChanged(); |
0 | 133 } |
134 | |
135 | |
136 void WorldSceneWidget::SetView(const ViewportGeometry& view) | |
137 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
138 view_ = view; |
0 | 139 |
278 | 140 NotifyContentChanged(); |
0 | 141 } |
142 | |
143 | |
144 IMouseTracker* WorldSceneWidget::CreateMouseTracker(MouseButton button, | |
145 int x, | |
146 int y, | |
147 KeyboardModifiers modifiers) | |
148 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
149 double sceneX, sceneY; |
332
50e5ec1bdd46
separating ZoomMouseTracker and PanMouseTracker from WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
331
diff
changeset
|
150 view_.MapPixelCenterToScene(sceneX, sceneY, x, y); |
0 | 151 |
281 | 152 // asks the Widget Interactor to provide a mouse tracker |
331
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
153 std::auto_ptr<IWorldSceneMouseTracker> tracker; |
0 | 154 |
331
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
155 if (interactor_) |
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
156 { |
356
885f0a5eaa49
mouse tracker to set windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
333
diff
changeset
|
157 tracker.reset(interactor_->CreateMouseTracker(*this, view_, button, modifiers, x, y, sceneX, sceneY, GetStatusBar())); |
331
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
158 } |
7ccf919faff0
simplify WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
330
diff
changeset
|
159 |
0 | 160 if (tracker.get() != NULL) |
161 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
48
diff
changeset
|
162 return new SceneMouseTracker(view_, tracker.release()); |
0 | 163 } |
333
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
164 else if (hasDefaultMouseEvents_) |
0 | 165 { |
333
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
166 switch (button) |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
167 { |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
168 case MouseButton_Middle: |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
169 return new SceneMouseTracker(view_, new PanMouseTracker(*this, x, y)); |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
170 |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
171 case MouseButton_Right: |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
172 return new SceneMouseTracker(view_, new ZoomMouseTracker(*this, x, y)); |
0 | 173 |
333
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
174 default: |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
175 return NULL; |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
176 } |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
177 } |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
178 else |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
179 { |
08683537a227
possibility to turn off default mouse events in WorldSceneWidget
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
332
diff
changeset
|
180 return NULL; |
0 | 181 } |
182 } | |
183 | |
184 | |
185 void WorldSceneWidget::MouseWheel(MouseWheelDirection direction, | |
186 int x, | |
187 int y, | |
281 | 188 KeyboardModifiers modifiers) |
0 | 189 { |
190 if (interactor_) | |
191 { | |
192 interactor_->MouseWheel(*this, direction, modifiers, GetStatusBar()); | |
193 } | |
194 } | |
195 | |
196 | |
327 | 197 void WorldSceneWidget::KeyPressed(KeyboardKeys key, |
198 char keyChar, | |
0 | 199 KeyboardModifiers modifiers) |
200 { | |
201 if (interactor_) | |
202 { | |
327 | 203 interactor_->KeyPressed(*this, key, keyChar, modifiers, GetStatusBar()); |
0 | 204 } |
205 } | |
206 } |