diff Framework/Scene2DViewport/CreateLineMeasureTracker.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 e146743f6cdc
children 86a8266b8888
line wrap: on
line diff
--- a/Framework/Scene2DViewport/CreateLineMeasureTracker.cpp	Fri Nov 29 11:03:41 2019 +0100
+++ b/Framework/Scene2DViewport/CreateLineMeasureTracker.cpp	Fri Nov 29 21:22:21 2019 +0100
@@ -30,10 +30,18 @@
     const PointerEvent&             e)
     : CreateMeasureTracker(controllerW)
   {
-    command_.reset(
-      new CreateLineMeasureCommand(
-        controllerW,
-        e.GetMainPosition().Apply(GetScene().GetCanvasToSceneTransform())));
+    ScenePoint2D point = e.GetMainPosition();
+    
+    {
+      boost::shared_ptr<ViewportController> controller = controllerW.lock();
+      if (controller)
+      {
+        std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
+        point = e.GetMainPosition().Apply(lock->GetScene().GetCanvasToSceneTransform());
+      }
+    }
+
+    command_.reset(new CreateLineMeasureCommand(controllerW, point));
   }
 
   CreateLineMeasureTracker::~CreateLineMeasureTracker()
@@ -50,16 +58,21 @@
         "PointerMove: active_ == false");
     }
 
-    ScenePoint2D scenePos = event.GetMainPosition().Apply(
-      GetScene().GetCanvasToSceneTransform());
-
-    //LOG(TRACE) << "scenePos.GetX() = " << scenePos.GetX() << "     " <<
-    //  "scenePos.GetY() = " << scenePos.GetY();
-
-    CreateLineMeasureTracker* concreteThis =
-      dynamic_cast<CreateLineMeasureTracker*>(this);
-    assert(concreteThis != NULL);
-    GetCommand()->SetEnd(scenePos);
+    boost::shared_ptr<ViewportController> controller = controllerW_.lock();
+    if (controller)
+    {
+      std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
+      ScenePoint2D scenePos = event.GetMainPosition().Apply(
+        lock->GetScene().GetCanvasToSceneTransform());
+      
+      //LOG(TRACE) << "scenePos.GetX() = " << scenePos.GetX() << "     " <<
+      //  "scenePos.GetY() = " << scenePos.GetY();
+      
+      CreateLineMeasureTracker* concreteThis =
+        dynamic_cast<CreateLineMeasureTracker*>(this);
+      assert(concreteThis != NULL);
+      GetCommand()->SetEnd(scenePos);
+    }
   }
 
   void CreateLineMeasureTracker::PointerUp(const PointerEvent& e)