Mercurial > hg > orthanc-stone
comparison Framework/Scene2DViewport/ViewportController.cpp @ 1331:ab81ee8fce1f broker
- Viewport is not passed and stored as a shared_ptr instead
of raw reference.
- ViewportController can now be injected with an undo
stack (not a ctor param anymore, as a preparation for the
move of the undo stack to an interactor)
- Added (temp) flag to disable emscripten events registration
in the WebAssemblyViewport (because legacy client code
deals with them directly)
- Added emscripten_clear_timeout in ~WebGLViewportsRegistry
- Removed GenericToolbox::HoldingRef whose responsibility is
better served with proper callback un-registration.
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Mon, 30 Mar 2020 14:23:46 +0200 |
parents | 1f877e0846fe |
children |
comparison
equal
deleted
inserted
replaced
1329:8d3e669f01a2 | 1331:ab81ee8fce1f |
---|---|
31 #include <boost/make_shared.hpp> | 31 #include <boost/make_shared.hpp> |
32 | 32 |
33 namespace OrthancStone | 33 namespace OrthancStone |
34 { | 34 { |
35 IFlexiblePointerTracker* DefaultViewportInteractor::CreateTracker( | 35 IFlexiblePointerTracker* DefaultViewportInteractor::CreateTracker( |
36 IViewport& viewport, | 36 boost::shared_ptr<IViewport> viewport, |
37 const PointerEvent& event, | 37 const PointerEvent& event, |
38 unsigned int viewportWidth, | 38 unsigned int viewportWidth, |
39 unsigned int viewportHeight) | 39 unsigned int viewportHeight) |
40 { | 40 { |
41 switch (event.GetMouseButton()) | 41 switch (event.GetMouseButton()) |
61 default: | 61 default: |
62 return NULL; | 62 return NULL; |
63 } | 63 } |
64 } | 64 } |
65 | 65 |
66 | 66 ViewportController::ViewportController(boost::shared_ptr<IViewport> viewport) |
67 ViewportController::ViewportController(IViewport& viewport) | |
68 : viewport_(viewport) | 67 : viewport_(viewport) |
69 , undoStackW_(boost::shared_ptr<UndoStack>(new UndoStack())) | |
70 | |
71 , scene_(new Scene2D) | 68 , scene_(new Scene2D) |
72 , canvasToSceneFactor_(1) | 69 , canvasToSceneFactor_(1) |
73 { | 70 { |
74 } | 71 // undoStack_ is not default-initialized, which basically means empty. |
75 | 72 // The controller must be able to cope with this. |
76 ViewportController::ViewportController(IViewport& viewport, | 73 } |
77 const Scene2D& scene) | 74 |
78 : viewport_(viewport) | |
79 , undoStackW_(boost::shared_ptr<UndoStack>(new UndoStack())) | |
80 , scene_(scene.Clone()) | |
81 , canvasToSceneFactor_(1) | |
82 { | |
83 } | |
84 | |
85 ViewportController::ViewportController(IViewport& viewport, | |
86 boost::weak_ptr<UndoStack> undoStackW) | |
87 : viewport_(viewport) | |
88 , undoStackW_(undoStackW) | |
89 , scene_(new Scene2D) | |
90 , canvasToSceneFactor_(1) | |
91 { | |
92 } | |
93 | |
94 ViewportController::~ViewportController() | 75 ViewportController::~ViewportController() |
95 { | 76 { |
96 } | 77 } |
97 | 78 |
98 void ViewportController::PushCommand(boost::shared_ptr<MeasureCommand> command) | 79 void ViewportController::PushCommand( |
80 boost::shared_ptr<MeasureCommand> command) | |
99 { | 81 { |
100 boost::shared_ptr<UndoStack> undoStack = undoStackW_.lock(); | 82 boost::shared_ptr<UndoStack> undoStack = undoStackW_.lock(); |
101 if (undoStack.get() != NULL) | 83 if (undoStack.get() != NULL) |
102 { | 84 { |
103 undoStack->PushCommand(command); | 85 undoStack->PushCommand(command); |
104 } | 86 } |
105 else | 87 else |
106 { | 88 { |
107 LOG(ERROR) << "Internal error: no undo stack in the viewport controller!"; | 89 LOG(ERROR) << "Internal error: no undo stack!"; |
108 } | 90 } |
109 } | 91 } |
110 | 92 |
111 void ViewportController::Undo() | 93 void ViewportController::Undo() |
112 { | 94 { |
115 { | 97 { |
116 undoStack->Undo(); | 98 undoStack->Undo(); |
117 } | 99 } |
118 else | 100 else |
119 { | 101 { |
120 LOG(ERROR) << "Internal error: no undo stack in the viewport controller!"; | 102 LOG(ERROR) << "Internal error: no undo stack!"; |
121 } | 103 } |
122 } | 104 } |
123 | 105 |
124 void ViewportController::Redo() | 106 void ViewportController::Redo() |
125 { | 107 { |
128 { | 110 { |
129 undoStack->Redo(); | 111 undoStack->Redo(); |
130 } | 112 } |
131 else | 113 else |
132 { | 114 { |
133 LOG(ERROR) << "Internal error: no undo stack in the viewport controller!"; | 115 LOG(ERROR) << "Internal error: no undo stack!"; |
134 } | 116 } |
135 } | 117 } |
136 | 118 |
137 bool ViewportController::CanUndo() const | 119 bool ViewportController::CanUndo() const |
138 { | 120 { |
141 { | 123 { |
142 return undoStack->CanUndo(); | 124 return undoStack->CanUndo(); |
143 } | 125 } |
144 else | 126 else |
145 { | 127 { |
146 LOG(ERROR) << "Internal error: no undo stack in the viewport controller!"; | 128 LOG(ERROR) << "Internal error: no undo stack!"; |
147 return false; | 129 return false; |
148 } | 130 } |
149 } | 131 } |
150 | 132 |
151 bool ViewportController::CanRedo() const | 133 bool ViewportController::CanRedo() const |
155 { | 137 { |
156 return undoStack->CanRedo(); | 138 return undoStack->CanRedo(); |
157 } | 139 } |
158 else | 140 else |
159 { | 141 { |
160 LOG(ERROR) << "Internal error: no undo stack in the viewport controller!"; | 142 LOG(ERROR) << "Internal error: no undo stack!"; |
161 return false; | 143 return false; |
162 } | 144 } |
163 } | 145 } |
164 | 146 |
165 std::vector<boost::shared_ptr<MeasureTool> > ViewportController::HitTestMeasureTools( | 147 std::vector<boost::shared_ptr<MeasureTool> > |
166 ScenePoint2D p) | 148 ViewportController::HitTestMeasureTools(ScenePoint2D p) |
167 { | 149 { |
168 std::vector<boost::shared_ptr<MeasureTool> > ret; | 150 std::vector<boost::shared_ptr<MeasureTool> > ret; |
169 | 151 |
170 for (size_t i = 0; i < measureTools_.size(); ++i) | 152 for (size_t i = 0; i < measureTools_.size(); ++i) |
171 { | 153 { |
172 if (measureTools_[i]->HitTest(p)) | 154 if (measureTools_[i]->HitTest(p)) |
173 ret.push_back(measureTools_[i]); | 155 ret.push_back(measureTools_[i]); |
174 } | 156 } |
175 return ret; | 157 return ret; |
176 } | 158 } |
177 | 159 |
178 | |
179 void ViewportController::ResetMeasuringToolsHighlight() | 160 void ViewportController::ResetMeasuringToolsHighlight() |
180 { | 161 { |
181 for (size_t i = 0; i < measureTools_.size(); ++i) | 162 for (size_t i = 0; i < measureTools_.size(); ++i) |
182 { | 163 { |
183 measureTools_[i]->ResetHighlightState(); | 164 measureTools_[i]->ResetHighlightState(); |
184 } | 165 } |
185 } | 166 } |
186 | 167 |
187 OrthancStone::AffineTransform2D ViewportController::GetCanvasToSceneTransform() const | 168 OrthancStone::AffineTransform2D |
169 ViewportController::GetCanvasToSceneTransform() const | |
188 { | 170 { |
189 return scene_->GetCanvasToSceneTransform(); | 171 return scene_->GetCanvasToSceneTransform(); |
190 } | 172 } |
191 | 173 |
192 OrthancStone::AffineTransform2D ViewportController::GetSceneToCanvasTransform() const | 174 OrthancStone::AffineTransform2D |
175 ViewportController::GetSceneToCanvasTransform() const | |
193 { | 176 { |
194 return scene_->GetSceneToCanvasTransform(); | 177 return scene_->GetSceneToCanvasTransform(); |
195 } | 178 } |
196 | 179 |
197 void ViewportController::SetSceneToCanvasTransform(const AffineTransform2D& transform) | 180 void ViewportController::SetSceneToCanvasTransform( |
181 const AffineTransform2D& transform) | |
198 { | 182 { |
199 scene_->SetSceneToCanvasTransform(transform); | 183 scene_->SetSceneToCanvasTransform(transform); |
200 | 184 |
201 canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); | 185 canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); |
202 BroadcastMessage(SceneTransformChanged(*this)); | 186 BroadcastMessage(SceneTransformChanged(*this)); |
208 scene_->FitContent(viewportWidth, viewportHeight); | 192 scene_->FitContent(viewportWidth, viewportHeight); |
209 canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); | 193 canvasToSceneFactor_ = scene_->GetCanvasToSceneTransform().ComputeZoom(); |
210 BroadcastMessage(SceneTransformChanged(*this)); | 194 BroadcastMessage(SceneTransformChanged(*this)); |
211 } | 195 } |
212 | 196 |
213 void ViewportController::AddMeasureTool(boost::shared_ptr<MeasureTool> measureTool) | 197 void ViewportController::AddMeasureTool( |
214 { | 198 boost::shared_ptr<MeasureTool> measureTool) |
215 ORTHANC_ASSERT(std::find(measureTools_.begin(), measureTools_.end(), measureTool) | 199 { |
216 == measureTools_.end(), "Duplicate measure tool"); | 200 ORTHANC_ASSERT(std::find(measureTools_.begin(), |
201 measureTools_.end(), | |
202 measureTool) == measureTools_.end(), | |
203 "Duplicate measure tool"); | |
217 measureTools_.push_back(measureTool); | 204 measureTools_.push_back(measureTool); |
218 } | 205 } |
219 | 206 |
220 void ViewportController::RemoveMeasureTool(boost::shared_ptr<MeasureTool> measureTool) | 207 void ViewportController::RemoveMeasureTool( |
221 { | 208 boost::shared_ptr<MeasureTool> measureTool) |
222 ORTHANC_ASSERT(std::find(measureTools_.begin(), measureTools_.end(), measureTool) | 209 { |
223 != measureTools_.end(), "Measure tool not found"); | 210 ORTHANC_ASSERT(std::find(measureTools_.begin(), |
211 measureTools_.end(), | |
212 measureTool) != measureTools_.end(), | |
213 "Measure tool not found"); | |
224 measureTools_.erase( | 214 measureTools_.erase( |
225 std::remove(measureTools_.begin(), measureTools_.end(), measureTool), | 215 std::remove(measureTools_.begin(), measureTools_.end(), measureTool), |
226 measureTools_.end()); | 216 measureTools_.end()); |
227 } | 217 } |
228 | 218 |
250 { | 240 { |
251 return TEXT_CENTER_DISTANCE_CANVAS_COORD * GetCanvasToSceneFactor(); | 241 return TEXT_CENTER_DISTANCE_CANVAS_COORD * GetCanvasToSceneFactor(); |
252 } | 242 } |
253 | 243 |
254 | 244 |
255 void ViewportController::HandleMousePress(OrthancStone::IViewportInteractor& interactor, | 245 void ViewportController::HandleMousePress( |
256 const PointerEvent& event, | 246 OrthancStone::IViewportInteractor& interactor, |
257 unsigned int viewportWidth, | 247 const PointerEvent& event, |
258 unsigned int viewportHeight) | 248 unsigned int viewportWidth, |
249 unsigned int viewportHeight) | |
259 { | 250 { |
260 if (activeTracker_) | 251 if (activeTracker_) |
261 { | 252 { |
262 // We are dealing with a multi-stage tracker (that is made of several interactions) | 253 // We are dealing with a multi-stage tracker (that is made of several |
254 // interactions) | |
263 activeTracker_->PointerDown(event); | 255 activeTracker_->PointerDown(event); |
264 | 256 |
265 if (!activeTracker_->IsAlive()) | 257 if (!activeTracker_->IsAlive()) |
266 { | 258 { |
267 activeTracker_.reset(); | 259 activeTracker_.reset(); |
278 return; | 270 return; |
279 } | 271 } |
280 } | 272 } |
281 | 273 |
282 // No measure tool, create new tracker from the interactor | 274 // No measure tool, create new tracker from the interactor |
283 activeTracker_.reset(interactor.CreateTracker(viewport_, event, viewportWidth, viewportHeight)); | 275 activeTracker_.reset(interactor.CreateTracker(viewport_, |
276 event, | |
277 viewportWidth, | |
278 viewportHeight)); | |
284 } | 279 } |
285 } | 280 } |
286 | 281 |
287 bool ViewportController::HandleMouseMove(const PointerEvent& event) | 282 bool ViewportController::HandleMouseMove(const PointerEvent& event) |
288 { | 283 { |