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 }