diff OrthancStone/Sources/Scene2DViewport/MeasureCommands.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/MeasureCommands.cpp	Wed Oct 28 20:06:55 2020 +0100
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureCommands.cpp	Wed Oct 28 20:14:34 2020 +0100
@@ -28,9 +28,19 @@
 
 namespace OrthancStone
 {
+  IViewport::ILock* MeasureCommand::GetViewportLock()
+  {
+    boost::shared_ptr<IViewport> viewport = viewport_.lock();
+    if (viewport)
+      return viewport->Lock();
+    else
+      return nullptr;
+  }
+
+
   void CreateMeasureCommand::Undo()
   {
-    std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<OrthancStone::IViewport::ILock> lock(GetViewportLock());
     // simply disable the measure tool upon undo
     GetMeasureTool()->Disable();
     lock->GetController().RemoveMeasureTool(GetMeasureTool());
@@ -38,12 +48,12 @@
 
   void CreateMeasureCommand::Redo()
   {
-    std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<OrthancStone::IViewport::ILock> lock(GetViewportLock());
     GetMeasureTool()->Enable();
     lock->GetController().AddMeasureTool(GetMeasureTool());
   }
 
-  CreateMeasureCommand::CreateMeasureCommand(boost::shared_ptr<IViewport> viewport)
+  CreateMeasureCommand::CreateMeasureCommand(boost::weak_ptr<IViewport> viewport)
     : MeasureCommand(viewport)
   {
 
@@ -57,7 +67,7 @@
 
   void DeleteMeasureCommand::Redo()
   {
-    std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<OrthancStone::IViewport::ILock> lock(GetViewportLock());
     // simply disable the measure tool upon undo
     GetMeasureTool()->Disable();
     lock->GetController().RemoveMeasureTool(GetMeasureTool());
@@ -65,7 +75,7 @@
 
   void DeleteMeasureCommand::Undo()
   {
-    std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<OrthancStone::IViewport::ILock> lock(GetViewportLock());
     GetMeasureTool()->Enable();
     lock->GetController().AddMeasureTool(GetMeasureTool());
   }
@@ -77,19 +87,19 @@
   }
 
   DeleteMeasureCommand::DeleteMeasureCommand(boost::shared_ptr<MeasureTool> measureTool,
-                                             boost::shared_ptr<IViewport> viewport) :
+                                             boost::weak_ptr<IViewport> viewport) :
     MeasureCommand(viewport),
     measureTool_(measureTool),
     mementoModified_(measureTool->GetMemento()),
     mementoOriginal_(measureTool->GetMemento())
   {
-    std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<OrthancStone::IViewport::ILock> lock(GetViewportLock());
     GetMeasureTool()->Disable();
     lock->GetController().RemoveMeasureTool(GetMeasureTool());
   }
 
   EditMeasureCommand::EditMeasureCommand(boost::shared_ptr<MeasureTool> measureTool,
-                                         boost::shared_ptr<IViewport> viewport) :
+                                         boost::weak_ptr<IViewport> viewport) :
     MeasureCommand(viewport),
     mementoModified_(measureTool->GetMemento()),
     mementoOriginal_(measureTool->GetMemento())