diff OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp @ 1606:874e178f34e9

- ViewportController now has weak ptr to Viewport - Measuring tools + related commands and all trackers now store only a weak_ptr to the Viewport and lock() on demand for usage - LayerHolder and FixedPoint aligner store only a weak_ptr to the Viewport, too - Fixed float/double warning in GrayscaleWindowingSceneTracker
author Benjamin Golinvaux <bgo@osimis.io>
date Wed, 28 Oct 2020 20:14:34 +0100
parents 8563ea5d8ae4
children 646e581e115b
line wrap: on
line diff
--- a/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp	Wed Oct 28 20:06:55 2020 +0100
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp	Wed Oct 28 20:14:34 2020 +0100
@@ -25,13 +25,22 @@
 namespace OrthancStone
 {
 
-  CreateMeasureTracker::CreateMeasureTracker(boost::shared_ptr<IViewport> viewport) :
+  CreateMeasureTracker::CreateMeasureTracker(boost::weak_ptr<IViewport> viewport) :
     commitResult_(true),
     viewport_(viewport),
     alive_(true)
   {
   }
 
+  IViewport::ILock* CreateMeasureTracker::GetViewportLock()
+  {
+    boost::shared_ptr<IViewport> viewport = viewport_.lock();
+    if (viewport)
+      return viewport->Lock();
+    else
+      return nullptr;
+  }
+
   void CreateMeasureTracker::Cancel()
   {
     commitResult_ = false;
@@ -49,7 +58,7 @@
     // to the undo stack
     // otherwise, we simply undo it
 
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
 
     if (commitResult_)
       lock->GetController().PushCommand(command_);
@@ -59,18 +68,27 @@
     lock->Invalidate();
   }
 
-  EditMeasureTracker::EditMeasureTracker(boost::shared_ptr<IViewport> viewport,
-                                         const PointerEvent& e) :
+  EditMeasureTracker::EditMeasureTracker(boost::weak_ptr<IViewport> viewport,
+    const PointerEvent& e) :
     commitResult_(true),
     viewport_(viewport),
     alive_(true)
   {
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
 
     originalClickPosition_ = e.GetMainPosition().Apply(
       lock->GetController().GetScene().GetCanvasToSceneTransform());
   }
 
+  IViewport::ILock* EditMeasureTracker::GetViewportLock()
+  {
+    boost::shared_ptr<IViewport> viewport = viewport_.lock();
+    if (viewport)
+      return viewport->Lock();
+    else
+      return nullptr;
+  }
+
   void EditMeasureTracker::Cancel()
   {
     commitResult_ = false;
@@ -88,7 +106,7 @@
     // to the undo stack
     // otherwise, we simply undo it
 
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
 
     if (commitResult_)
       lock->GetController().PushCommand(command_);