diff Framework/Scene2DViewport/EditAngleMeasureTracker.cpp @ 1203:f3bb9a6dd949 broker

locking abstraction in IViewport
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 29 Nov 2019 21:22:21 +0100
parents e713f1a99861
children 86a8266b8888
line wrap: on
line diff
--- a/Framework/Scene2DViewport/EditAngleMeasureTracker.cpp	Fri Nov 29 11:03:41 2019 +0100
+++ b/Framework/Scene2DViewport/EditAngleMeasureTracker.cpp	Fri Nov 29 21:22:21 2019 +0100
@@ -31,8 +31,14 @@
     const PointerEvent& e)
     : EditMeasureTracker(controllerW, e)
   {
-    ScenePoint2D scenePos = e.GetMainPosition().Apply(
-      GetScene().GetCanvasToSceneTransform());
+    ScenePoint2D scenePos = e.GetMainPosition();
+
+    boost::shared_ptr<ViewportController> controller = controllerW_.lock();
+    if (controller)
+    {
+      std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
+      scenePos = e.GetMainPosition().Apply(lock->GetScene().GetCanvasToSceneTransform());
+    }
 
     modifiedZone_ = dynamic_cast<AngleMeasureTool&>(*measureTool).AngleHitTest(scenePos);
 
@@ -46,50 +52,55 @@
 
   void EditAngleMeasureTracker::PointerMove(const PointerEvent& e)
   {
-    ScenePoint2D scenePos = e.GetMainPosition().Apply(
-      GetScene().GetCanvasToSceneTransform());
-
-    ScenePoint2D delta = scenePos - GetOriginalClickPosition();
-
-    boost::shared_ptr<AngleMeasureToolMemento> memento =
-      boost::dynamic_pointer_cast<AngleMeasureToolMemento>(command_->mementoOriginal_);
-
-    ORTHANC_ASSERT(memento.get() != NULL);
-
-    switch (modifiedZone_)
-    {
-    case AngleMeasureTool::AngleHighlightArea_Center:
-    {
-      ScenePoint2D newCenter = memento->center_ + delta;
-      GetCommand()->SetCenter(newCenter);
-    }
-    break;
-    case AngleMeasureTool::AngleHighlightArea_Side1:
-    case AngleMeasureTool::AngleHighlightArea_Side2:
+    boost::shared_ptr<ViewportController> controller = controllerW_.lock();
+    if (controller)
     {
-      ScenePoint2D newCenter = memento->center_ + delta;
-      ScenePoint2D newSide1End = memento->side1End_ + delta;
-      ScenePoint2D newSide2End = memento->side2End_ + delta;
-      GetCommand()->SetCenter(newCenter);
-      GetCommand()->SetSide1End(newSide1End);
-      GetCommand()->SetSide2End(newSide2End);
-    }
-    break;
-    case AngleMeasureTool::AngleHighlightArea_Side1End:
-    {
-      ScenePoint2D newSide1End = memento->side1End_ + delta;
-      GetCommand()->SetSide1End(newSide1End);
-    }
-    break;
-    case AngleMeasureTool::AngleHighlightArea_Side2End:
-    {
-      ScenePoint2D newSide2End = memento->side2End_ + delta;
-      GetCommand()->SetSide2End(newSide2End);
-    }
-    break;
-    default:
-      LOG(WARNING) << "Warning: please retry the measuring tool editing operation!";
-      break;
+      std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
+      ScenePoint2D scenePos = e.GetMainPosition().Apply(
+        lock->GetScene().GetCanvasToSceneTransform());
+
+      ScenePoint2D delta = scenePos - GetOriginalClickPosition();
+
+      boost::shared_ptr<AngleMeasureToolMemento> memento =
+        boost::dynamic_pointer_cast<AngleMeasureToolMemento>(command_->mementoOriginal_);
+
+      ORTHANC_ASSERT(memento.get() != NULL);
+
+      switch (modifiedZone_)
+      {
+        case AngleMeasureTool::AngleHighlightArea_Center:
+        {
+          ScenePoint2D newCenter = memento->center_ + delta;
+          GetCommand()->SetCenter(newCenter);
+        }
+        break;
+        case AngleMeasureTool::AngleHighlightArea_Side1:
+        case AngleMeasureTool::AngleHighlightArea_Side2:
+        {
+          ScenePoint2D newCenter = memento->center_ + delta;
+          ScenePoint2D newSide1End = memento->side1End_ + delta;
+          ScenePoint2D newSide2End = memento->side2End_ + delta;
+          GetCommand()->SetCenter(newCenter);
+          GetCommand()->SetSide1End(newSide1End);
+          GetCommand()->SetSide2End(newSide2End);
+        }
+        break;
+        case AngleMeasureTool::AngleHighlightArea_Side1End:
+        {
+          ScenePoint2D newSide1End = memento->side1End_ + delta;
+          GetCommand()->SetSide1End(newSide1End);
+        }
+        break;
+        case AngleMeasureTool::AngleHighlightArea_Side2End:
+        {
+          ScenePoint2D newSide2End = memento->side2End_ + delta;
+          GetCommand()->SetSide2End(newSide2End);
+        }
+        break;
+        default:
+          LOG(WARNING) << "Warning: please retry the measuring tool editing operation!";
+          break;
+      }
     }
   }