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 {