diff Framework/Scene2DViewport/EditLineMeasureTracker.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 ab81ee8fce1f
line wrap: on
line diff
--- a/Framework/Scene2DViewport/EditLineMeasureTracker.cpp	Wed Mar 04 09:44:34 2020 +0100
+++ b/Framework/Scene2DViewport/EditLineMeasureTracker.cpp	Wed Mar 04 09:45:38 2020 +0100
@@ -28,23 +28,18 @@
 {
   EditLineMeasureTracker::EditLineMeasureTracker(
     boost::shared_ptr<MeasureTool>  measureTool,
-    boost::weak_ptr<ViewportController> controllerW,
-    const PointerEvent& e) 
-    : EditMeasureTracker(controllerW, e)
+    IViewport& viewport,
+    const PointerEvent& e)
+    : EditMeasureTracker(viewport, e)
   {
     ScenePoint2D scenePos = e.GetMainPosition();
-
     {
-      boost::shared_ptr<ViewportController> controller = controllerW.lock();
-      if (controller)
-      {
-        scenePos = e.GetMainPosition().Apply(controller->GetScene().GetCanvasToSceneTransform());
-      }
+      std::unique_ptr<IViewport::ILock> lock(viewport_.Lock());
+      Scene2D& scene = lock->GetController().GetScene();
+      scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform());
     }
-
     modifiedZone_ = dynamic_cast<LineMeasureTool&>(*measureTool).LineHitTest(scenePos);
-
-    command_.reset(new EditLineMeasureCommand(measureTool, controllerW));
+    command_.reset(new EditLineMeasureCommand(measureTool, viewport));
   }
 
   EditLineMeasureTracker::~EditLineMeasureTracker()
@@ -54,48 +49,48 @@
 
   void EditLineMeasureTracker::PointerMove(const PointerEvent& e)
   {
-    boost::shared_ptr<ViewportController> controller = controllerW_.lock();
-    if (controller)
-    {
-      ScenePoint2D scenePos = e.GetMainPosition().Apply(
-        controller->GetScene().GetCanvasToSceneTransform());
-      
-      ScenePoint2D delta = scenePos - GetOriginalClickPosition();
+    std::unique_ptr<IViewport::ILock> lock(viewport_.Lock());
+    ViewportController& controller = lock->GetController();
+    Scene2D& scene = controller.GetScene();
+
+    ScenePoint2D scenePos = e.GetMainPosition().Apply(
+      scene.GetCanvasToSceneTransform());
 
-      boost::shared_ptr<LineMeasureToolMemento> memento =
-        boost::dynamic_pointer_cast<LineMeasureToolMemento>(command_->mementoOriginal_);
+    ScenePoint2D delta = scenePos - GetOriginalClickPosition();
 
-      ORTHANC_ASSERT(memento.get() != NULL);
+    boost::shared_ptr<LineMeasureToolMemento> memento =
+      boost::dynamic_pointer_cast<LineMeasureToolMemento>(command_->mementoOriginal_);
+
+    ORTHANC_ASSERT(memento.get() != NULL);
 
-      switch (modifiedZone_)
-      {
-        case LineMeasureTool::LineHighlightArea_Start:
-        {
-          ScenePoint2D newStart = memento->start_ + delta;
-          GetCommand()->SetStart(newStart);
-        }
-        break;
-        case LineMeasureTool::LineHighlightArea_End:
-        {
-          ScenePoint2D newEnd = memento->end_ + delta;
-          GetCommand()->SetEnd(newEnd);
-        }
-        break;
-        case LineMeasureTool::LineHighlightArea_Segment:
-        {
-          ScenePoint2D newStart = memento->start_ + delta;
-          ScenePoint2D newEnd = memento->end_ + delta;
-          GetCommand()->SetStart(newStart);
-          GetCommand()->SetEnd(newEnd);
-        }
-        break;
-        default:
-          LOG(WARNING) << "Warning: please retry the measuring tool editing operation!";
-          break;
-      }
+    switch (modifiedZone_)
+    {
+    case LineMeasureTool::LineHighlightArea_Start:
+    {
+      ScenePoint2D newStart = memento->start_ + delta;
+      GetCommand()->SetStart(newStart);
+    }
+    break;
+    case LineMeasureTool::LineHighlightArea_End:
+    {
+      ScenePoint2D newEnd = memento->end_ + delta;
+      GetCommand()->SetEnd(newEnd);
+    }
+    break;
+    case LineMeasureTool::LineHighlightArea_Segment:
+    {
+      ScenePoint2D newStart = memento->start_ + delta;
+      ScenePoint2D newEnd = memento->end_ + delta;
+      GetCommand()->SetStart(newStart);
+      GetCommand()->SetEnd(newEnd);
+    }
+    break;
+    default:
+      LOG(WARNING) << "Warning: please retry the measuring tool editing operation!";
+      break;
     }
   }
-  
+
   void EditLineMeasureTracker::PointerUp(const PointerEvent& e)
   {
     alive_ = false;