Mercurial > hg > orthanc-stone
comparison Framework/Scene2DViewport/LineMeasureTool.cpp @ 1305:a5326ce4f24b broker
Trackers and measuring tools now use the viewport instead of ViewportController, so that proper locks can be used
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 04 Mar 2020 09:45:38 +0100 |
parents | 7ec8fea061b9 |
children | 1f877e0846fe |
comparison
equal
deleted
inserted
replaced
1304:b7fa67bf87fa | 1305:a5326ce4f24b |
---|---|
30 | 30 |
31 namespace OrthancStone | 31 namespace OrthancStone |
32 { | 32 { |
33 | 33 |
34 LineMeasureTool::LineMeasureTool( | 34 LineMeasureTool::LineMeasureTool( |
35 boost::weak_ptr<ViewportController> controllerW) | 35 IViewport& viewport) |
36 : MeasureTool(controllerW) | 36 : MeasureTool(viewport) |
37 #if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 | 37 #if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 |
38 , layerHolder_(boost::make_shared<LayerHolder>(controllerW, 1, 5)) | 38 , layerHolder_(boost::make_shared<LayerHolder>(viewport, 1, 5)) |
39 #else | 39 #else |
40 , layerHolder_(boost::make_shared<LayerHolder>(controllerW, 1, 1)) | 40 , layerHolder_(boost::make_shared<LayerHolder>(viewport, 1, 1)) |
41 #endif | 41 #endif |
42 , lineHighlightArea_(LineHighlightArea_None) | 42 , lineHighlightArea_(LineHighlightArea_None) |
43 { | 43 { |
44 | 44 |
45 } | 45 } |
104 { | 104 { |
105 LineHighlightArea lineHighlightArea = LineHitTest(p); | 105 LineHighlightArea lineHighlightArea = LineHitTest(p); |
106 SetLineHighlightArea(lineHighlightArea); | 106 SetLineHighlightArea(lineHighlightArea); |
107 } | 107 } |
108 | 108 |
109 LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) const | 109 LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) |
110 { | 110 { |
111 const double pixelToScene = | 111 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
112 GetController()->GetScene().GetCanvasToSceneTransform().ComputeZoom(); | 112 ViewportController& controller = lock->GetController(); |
113 const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; | 113 Scene2D& scene = controller.GetScene(); |
114 | 114 |
115 const double sqDistanceFromStart = ScenePoint2D::SquaredDistancePtPt(p, start_); | 115 const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); |
116 const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = | |
117 pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * | |
118 pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; | |
119 | |
120 const double sqDistanceFromStart = | |
121 ScenePoint2D::SquaredDistancePtPt(p, start_); | |
122 | |
116 if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | 123 if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) |
117 return LineHighlightArea_Start; | 124 return LineHighlightArea_Start; |
118 | 125 |
119 const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); | 126 const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); |
127 | |
120 if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | 128 if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) |
121 return LineHighlightArea_End; | 129 return LineHighlightArea_End; |
122 | 130 |
123 const double sqDistanceFromPtSegment = ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); | 131 const double sqDistanceFromPtSegment = |
132 ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); | |
133 | |
124 if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) | 134 if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) |
125 return LineHighlightArea_Segment; | 135 return LineHighlightArea_Segment; |
126 | 136 |
127 return LineHighlightArea_None; | 137 return LineHighlightArea_None; |
128 } | 138 } |
129 | 139 |
130 bool LineMeasureTool::HitTest(ScenePoint2D p) const | 140 bool LineMeasureTool::HitTest(ScenePoint2D p) |
131 { | 141 { |
132 return LineHitTest(p) != LineHighlightArea_None; | 142 return LineHitTest(p) != LineHighlightArea_None; |
133 } | 143 } |
134 | 144 |
135 boost::shared_ptr<IFlexiblePointerTracker> LineMeasureTool::CreateEditionTracker(const PointerEvent& e) | 145 boost::shared_ptr<IFlexiblePointerTracker> LineMeasureTool::CreateEditionTracker(const PointerEvent& e) |
136 { | 146 { |
147 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); | |
148 ViewportController& controller = lock->GetController(); | |
149 Scene2D& scene = controller.GetScene(); | |
150 | |
137 ScenePoint2D scenePos = e.GetMainPosition().Apply( | 151 ScenePoint2D scenePos = e.GetMainPosition().Apply( |
138 GetController()->GetScene().GetCanvasToSceneTransform()); | 152 scene.GetCanvasToSceneTransform()); |
139 | 153 |
140 if (!HitTest(scenePos)) | 154 if (!HitTest(scenePos)) |
141 return boost::shared_ptr<IFlexiblePointerTracker>(); | 155 return boost::shared_ptr<IFlexiblePointerTracker>(); |
142 | 156 |
143 /** | 157 /** |
144 new EditLineMeasureTracker( | 158 new EditLineMeasureTracker( |
145 boost::shared_ptr<LineMeasureTool> measureTool; | 159 boost::shared_ptr<LineMeasureTool> measureTool; |
146 MessageBroker & broker, | 160 MessageBroker & broker, |
147 boost::weak_ptr<ViewportController> controllerW, | 161 IViewport& viewport, |
148 const PointerEvent & e); | 162 const PointerEvent & e); |
149 */ | 163 */ |
150 boost::shared_ptr<EditLineMeasureTracker> editLineMeasureTracker( | 164 boost::shared_ptr<EditLineMeasureTracker> editLineMeasureTracker( |
151 new EditLineMeasureTracker(shared_from_this(), GetController(), e)); | 165 new EditLineMeasureTracker(shared_from_this(), viewport_, e)); |
152 return editLineMeasureTracker; | 166 return editLineMeasureTracker; |
153 } | 167 } |
154 | |
155 | 168 |
156 boost::shared_ptr<MeasureToolMemento> LineMeasureTool::GetMemento() const | 169 boost::shared_ptr<MeasureToolMemento> LineMeasureTool::GetMemento() const |
157 { | 170 { |
158 boost::shared_ptr<LineMeasureToolMemento> memento(new LineMeasureToolMemento()); | 171 boost::shared_ptr<LineMeasureToolMemento> memento(new LineMeasureToolMemento()); |
159 memento->start_ = start_; | 172 memento->start_ = start_; |
160 memento->end_ = end_; | 173 memento->end_ = end_; |
161 return memento; | 174 return memento; |
162 } | 175 } |
163 | 176 |
164 void LineMeasureTool::SetMemento(boost::shared_ptr<MeasureToolMemento> mementoBase) | 177 void LineMeasureTool::SetMemento( |
165 { | 178 boost::shared_ptr<MeasureToolMemento> mementoBase) |
166 boost::shared_ptr<LineMeasureToolMemento> memento = boost::dynamic_pointer_cast<LineMeasureToolMemento>(mementoBase); | 179 { |
180 boost::shared_ptr<LineMeasureToolMemento> memento = | |
181 boost::dynamic_pointer_cast<LineMeasureToolMemento>(mementoBase); | |
182 | |
167 ORTHANC_ASSERT(memento.get() != NULL, "Internal error: wrong (or bad) memento"); | 183 ORTHANC_ASSERT(memento.get() != NULL, "Internal error: wrong (or bad) memento"); |
184 | |
168 start_ = memento->start_; | 185 start_ = memento->start_; |
169 end_ = memento->end_; | 186 end_ = memento->end_; |
170 RefreshScene(); | 187 RefreshScene(); |
171 } | 188 } |
172 | 189 |
174 { | 191 { |
175 if (IsSceneAlive()) | 192 if (IsSceneAlive()) |
176 { | 193 { |
177 if (IsEnabled()) | 194 if (IsEnabled()) |
178 { | 195 { |
196 | |
197 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); | |
198 ViewportController& controller = lock->GetController(); | |
199 Scene2D& scene = controller.GetScene(); | |
200 | |
179 layerHolder_->CreateLayersIfNeeded(); | 201 layerHolder_->CreateLayersIfNeeded(); |
180 | |
181 { | 202 { |
182 // Fill the polyline layer with the measurement line | 203 // Fill the polyline layer with the measurement line |
183 | 204 |
184 PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); | 205 PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0); |
185 if (polylineLayer) | 206 if (polylineLayer) |
208 { | 229 { |
209 { | 230 { |
210 PolylineSceneLayer::Chain chain; | 231 PolylineSceneLayer::Chain chain; |
211 | 232 |
212 //TODO: take DPI into account | 233 //TODO: take DPI into account |
213 AddSquare(chain, GetController()->GetScene(), start_, | 234 AddSquare(chain, controller.GetScene(), start_, |
214 GetController()->GetHandleSideLengthS()); | 235 controller.GetHandleSideLengthS()); |
215 | 236 |
216 if (lineHighlightArea_ == LineHighlightArea_Start) | 237 if (lineHighlightArea_ == LineHighlightArea_Start) |
217 polylineLayer->AddChain(chain, true, highlightColor); | 238 polylineLayer->AddChain(chain, true, highlightColor); |
218 else | 239 else |
219 polylineLayer->AddChain(chain, true, color); | 240 polylineLayer->AddChain(chain, true, color); |
221 | 242 |
222 { | 243 { |
223 PolylineSceneLayer::Chain chain; | 244 PolylineSceneLayer::Chain chain; |
224 | 245 |
225 //TODO: take DPI into account | 246 //TODO: take DPI into account |
226 AddSquare(chain, GetController()->GetScene(), end_, | 247 AddSquare(chain, controller.GetScene(), end_, |
227 GetController()->GetHandleSideLengthS()); | 248 controller.GetHandleSideLengthS()); |
228 | 249 |
229 if (lineHighlightArea_ == LineHighlightArea_End) | 250 if (lineHighlightArea_ == LineHighlightArea_End) |
230 polylineLayer->AddChain(chain, true, highlightColor); | 251 polylineLayer->AddChain(chain, true, highlightColor); |
231 else | 252 else |
232 polylineLayer->AddChain(chain, true, color); | 253 polylineLayer->AddChain(chain, true, color); |
246 // TODO: for now we simply position the text overlay at the middle | 267 // TODO: for now we simply position the text overlay at the middle |
247 // of the measuring segment | 268 // of the measuring segment |
248 double midX = 0.5 * (end_.GetX() + start_.GetX()); | 269 double midX = 0.5 * (end_.GetX() + start_.GetX()); |
249 double midY = 0.5 * (end_.GetY() + start_.GetY()); | 270 double midY = 0.5 * (end_.GetY() + start_.GetY()); |
250 | 271 |
272 { | |
273 | |
251 #if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 | 274 #if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1 |
252 SetTextLayerOutlineProperties( | 275 SetTextLayerOutlineProperties( |
253 GetController()->GetScene(), layerHolder_, buf, ScenePoint2D(midX, midY), 0); | 276 scene, layerHolder_, buf, ScenePoint2D(midX, midY), 0); |
254 #else | 277 #else |
255 SetTextLayerProperties( | 278 SetTextLayerProperties( |
256 GetController()->GetScene(), layerHolder_, buf, ScenePoint2D(midX, midY), 0); | 279 scene, layerHolder_, buf, ScenePoint2D(midX, midY), 0); |
257 #endif | 280 #endif |
281 lock->Invalidate(); | |
282 } | |
258 } | 283 } |
284 lock->Invalidate(); | |
259 } | 285 } |
260 else | 286 else |
261 { | 287 { |
262 RemoveFromScene(); | 288 RemoveFromScene(); |
263 } | 289 } |