changeset 2371:3644864d95ad refactoring

removed dependency of MeasureCommands on IViewport
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Oct 2026 19:52:31 +0200
parents 5c4491e700ad
children 6de9b26f7811
files Applications/Samples/Common/SimpleViewerCore.cpp OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/MeasureCommands.cpp OrthancStone/Sources/Scene2DViewport/MeasureCommands.h OrthancStone/Sources/Scene2DViewport/ViewportController.cpp
diffstat 6 files changed, 77 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/Applications/Samples/Common/SimpleViewerCore.cpp	Thu Oct 08 19:29:56 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.cpp	Thu Oct 08 19:52:31 2026 +0200
@@ -26,6 +26,8 @@
 #define TEST_MEASURE_TOOLS   1
 
 
+#include "../../../OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h"
+#include "../../../OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h"
 #include "../../../OrthancStone/Sources/Scene2DViewport/UndoStack.h"
 #include "../../../OrthancStone/Sources/Viewport/DefaultViewportInteractor.h"
 
@@ -261,7 +263,7 @@
         if (core_->annotations_->GetActiveTool() == AnnotationsSceneLayer::Tool_Remove)
         {
           std::unique_ptr<IViewport::ILock> viewportLock(core_->viewport_->Lock());
-          viewportLock->GetController().PushCommand(boost::make_shared<DeleteMeasureCommand>(tools[0], core_->viewport_));
+          viewportLock->GetController().PushCommand(boost::make_shared<DeleteMeasureCommand>(viewportLock->GetController(), tools[0]));
           return NULL;
         }
         else
--- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp	Thu Oct 08 19:29:56 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp	Thu Oct 08 19:52:31 2026 +0200
@@ -66,18 +66,18 @@
       modifiedZone_ = tool_->AngleHitTest(originalClickPosition_);
       originalMemento_.reset(dynamic_cast<AngleMeasureTool::Memento*>(tool->CreateMemento()));
 
-      if (isCreation)
+      boost::shared_ptr<IViewport> sharedViewport = viewport.lock();
+      if (sharedViewport)
       {
-        boost::shared_ptr<IViewport> sharedViewport = viewport.lock();
-        if (sharedViewport)
+        std::unique_ptr<IViewport::ILock> lock(sharedViewport->Lock());
+        if (isCreation)
         {
-          std::unique_ptr<IViewport::ILock> lock(sharedViewport->Lock());
-          lock->GetController().PushCommand(boost::make_shared<CreateMeasureCommand>(boost::dynamic_pointer_cast<MeasureTool>(tool_), viewport));
+          lock->GetController().PushCommand(boost::make_shared<CreateMeasureCommand>(lock->GetController(), boost::dynamic_pointer_cast<MeasureTool>(tool_)));
         }
-      }
-      else
-      {
-        editCommand_ = boost::make_shared<EditMeasureCommand>(boost::dynamic_pointer_cast<MeasureTool>(tool_), viewport_);
+        else
+        {
+          editCommand_ = boost::make_shared<EditMeasureCommand>(lock->GetController(), boost::dynamic_pointer_cast<MeasureTool>(tool_));
+        }
       }
     }
 
--- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp	Thu Oct 08 19:29:56 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp	Thu Oct 08 19:52:31 2026 +0200
@@ -64,18 +64,18 @@
       modifiedZone_ = tool_->LineHitTest(originalClickPosition_);
       originalMemento_.reset(dynamic_cast<LineMeasureTool::Memento*>(tool->CreateMemento()));
 
-      if (isCreation)
+      boost::shared_ptr<IViewport> sharedViewport = viewport.lock();
+      if (sharedViewport)
       {
-        boost::shared_ptr<IViewport> sharedViewport = viewport.lock();
-        if (sharedViewport)
+        std::unique_ptr<IViewport::ILock> lock(sharedViewport->Lock());
+        if (isCreation)
         {
-          std::unique_ptr<IViewport::ILock> lock(sharedViewport->Lock());
-          lock->GetController().PushCommand(boost::make_shared<CreateMeasureCommand>(boost::dynamic_pointer_cast<MeasureTool>(tool_), viewport));
+          lock->GetController().PushCommand(boost::make_shared<CreateMeasureCommand>(lock->GetController(), boost::dynamic_pointer_cast<MeasureTool>(tool_)));
         }
-      }
-      else
-      {
-        editCommand_ = boost::make_shared<EditMeasureCommand>(boost::dynamic_pointer_cast<MeasureTool>(tool_), viewport_);
+        else
+        {
+          editCommand_ = boost::make_shared<EditMeasureCommand>(lock->GetController(), boost::dynamic_pointer_cast<MeasureTool>(tool_));
+        }
       }
     }
 
--- a/OrthancStone/Sources/Scene2DViewport/MeasureCommands.cpp	Thu Oct 08 19:29:56 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureCommands.cpp	Thu Oct 08 19:52:31 2026 +0200
@@ -20,81 +20,61 @@
  * <http://www.gnu.org/licenses/>.
  **/
 
+
 #include "MeasureCommands.h"
 
-#include <memory>
-
-#include <boost/make_shared.hpp>
-#include <boost/ref.hpp>
 
 namespace OrthancStone
 {
-  IViewport::ILock* MeasureCommand::GetViewportLock()
+  MeasureCommand::MeasureCommand(ViewportController& controller,
+                                 const boost::shared_ptr<MeasureTool>& tool) :
+    controller_(controller),
+    measureTool_(tool)
   {
-    boost::shared_ptr<IViewport> viewport = viewport_.lock();
-    if (viewport)
+    if (!tool)
     {
-      return viewport->Lock();
-    }
-    else
-    {
-      return NULL;
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
     }
   }
 
 
 
-  CreateMeasureCommand::CreateMeasureCommand(const boost::shared_ptr<MeasureTool>& tool,
-                                             boost::weak_ptr<IViewport> viewport) :
-    MeasureCommand(viewport),
-    measureTool_(tool)
-  {
-  }
-
-
   void CreateMeasureCommand::Undo()
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     // simply disable the measure tool upon undo
-    measureTool_->Disable();
-    lock->GetController().RemoveMeasureTool(measureTool_);
+    GetMeasureTool()->Disable();
+    GetController().RemoveMeasureTool(GetMeasureTool());
   }
 
 
   void CreateMeasureCommand::Redo()
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    measureTool_->Enable();
-    lock->GetController().AddMeasureTool(measureTool_);
+    GetMeasureTool()->Enable();
+    GetController().AddMeasureTool(GetMeasureTool());
   }
 
 
 
 
-  EditMeasureCommand::EditMeasureCommand(const boost::shared_ptr<MeasureTool>& measureTool,
-                                         boost::weak_ptr<IViewport> viewport) :
-    MeasureCommand(viewport),
-    measureTool_(measureTool),
-    mementoModified_(measureTool->CreateMemento()),
-    mementoOriginal_(measureTool->CreateMemento())
+  EditMeasureCommand::EditMeasureCommand(ViewportController& controller,
+                                         const boost::shared_ptr<MeasureTool>& tool) :
+    MeasureCommand(controller, tool),
+    mementoModified_(tool->CreateMemento()),
+    mementoOriginal_(tool->CreateMemento())
   {
-    if (!measureTool)
-    {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
-    }
   }
 
   void EditMeasureCommand::Undo()
   {
     // simply disable the measure tool upon undo
     assert(mementoOriginal_.get() != NULL);
-    GetMeasureTool().SetMemento(*mementoOriginal_);
+    GetMeasureTool()->SetMemento(*mementoOriginal_);
   }
 
   void EditMeasureCommand::Redo()
   {
     assert(mementoModified_.get() != NULL);
-    GetMeasureTool().SetMemento(*mementoModified_);
+    GetMeasureTool()->SetMemento(*mementoModified_);
   }
 
   const MeasureTool::IMemento& EditMeasureCommand::GetMementoOriginal() const
@@ -117,37 +97,26 @@
 
 
 
-  DeleteMeasureCommand::DeleteMeasureCommand(const boost::shared_ptr<MeasureTool>& measureTool,
-                                             boost::weak_ptr<IViewport> viewport) :
-    MeasureCommand(viewport),
-    measureTool_(measureTool)
+  DeleteMeasureCommand::DeleteMeasureCommand(ViewportController& controller,
+                                             const boost::shared_ptr<MeasureTool>& tool) :
+    MeasureCommand(controller, tool)
   {
-    if (!measureTool)
-    {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
-    }
-
-    {
-      std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-      measureTool_->Disable();
-      lock->GetController().RemoveMeasureTool(measureTool_);  // TODO Refactoring - Should probably be moved into ViewportController
-    }
+    GetMeasureTool()->Disable();
+    GetController().RemoveMeasureTool(GetMeasureTool());  // TODO Refactoring - Should probably be moved into ViewportController
   }
 
 
   void DeleteMeasureCommand::Undo()
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    measureTool_->Enable();
-    lock->GetController().AddMeasureTool(measureTool_);
+    GetMeasureTool()->Enable();
+    GetController().AddMeasureTool(GetMeasureTool());
   }
 
 
   void DeleteMeasureCommand::Redo()
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     // simply disable the measure tool upon undo
-    measureTool_->Disable();
-    lock->GetController().RemoveMeasureTool(measureTool_);
+    GetMeasureTool()->Disable();
+    GetController().RemoveMeasureTool(GetMeasureTool());
   }
 }
--- a/OrthancStone/Sources/Scene2DViewport/MeasureCommands.h	Thu Oct 08 19:29:56 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureCommands.h	Thu Oct 08 19:52:31 2026 +0200
@@ -19,36 +19,38 @@
  * License along with this program. If not, see
  * <http://www.gnu.org/licenses/>.
  **/
+
+
 #pragma once
 
-#include "../Viewport/IViewport.h"
 #include "MeasureTool.h"
-#include "LineMeasureTool.h"
-#include "AngleMeasureTool.h"
 #include "UndoStack.h"
 
 #include <boost/shared_ptr.hpp>
-#include <boost/weak_ptr.hpp>
-#include <boost/noncopyable.hpp>
+
 
 namespace OrthancStone
 {
   class MeasureCommand : public UndoStack::ICommand
   {
-  protected:
-    boost::weak_ptr<IViewport> viewport_;
+  private:
+    ViewportController&             controller_;   // TODO Refactoring - Should be a boost::shared_ptr
+    boost::shared_ptr<MeasureTool>  measureTool_;
 
-    /**
-    This will return a scoped lock to the viewport.
-    If the viewport does not exist anymore, then nullptr is returned.
-    */
-    IViewport::ILock* GetViewportLock();
+  protected:
+    ViewportController& GetController() const
+    {
+      return controller_;
+    }
+
+    const boost::shared_ptr<MeasureTool>& GetMeasureTool() const
+    {
+      return measureTool_;
+    }
 
   public:
-    explicit MeasureCommand(boost::weak_ptr<IViewport> viewport) :
-      viewport_(viewport)
-    {
-    }
+    explicit MeasureCommand(ViewportController& controller,
+                            const boost::shared_ptr<MeasureTool>& measureTool);
 
     virtual ~MeasureCommand()
     {
@@ -62,12 +64,12 @@
   
   class CreateMeasureCommand : public MeasureCommand
   {
-  private:
-    boost::shared_ptr<MeasureTool>  measureTool_;
-
   public:
-    CreateMeasureCommand(const boost::shared_ptr<MeasureTool>& measureTool,
-                         boost::weak_ptr<IViewport> viewport);
+    CreateMeasureCommand(ViewportController& controller,
+                         const boost::shared_ptr<MeasureTool>& measureTool) :
+      MeasureCommand(controller, measureTool)
+    {
+    }
 
     virtual void Undo() ORTHANC_OVERRIDE;
     
@@ -78,23 +80,15 @@
   class EditMeasureCommand : public MeasureCommand
   {
   private:
-    boost::shared_ptr<MeasureTool>  measureTool_;
-
     /** This memento is updated by the subclasses upon modifications */
     std::unique_ptr<MeasureTool::IMemento> mementoModified_;
     
     /** This memento is the original object state */
     std::unique_ptr<MeasureTool::IMemento> mementoOriginal_;
 
-  protected:
-    MeasureTool& GetMeasureTool() const
-    {
-      return *measureTool_;
-    }
-
   public:
-    EditMeasureCommand(const boost::shared_ptr<MeasureTool>& measureTool,
-                       boost::weak_ptr<IViewport> viewport);
+    EditMeasureCommand(ViewportController& controller,
+                       const boost::shared_ptr<MeasureTool>& measureTool);
 
     virtual void Undo() ORTHANC_OVERRIDE;
 
@@ -108,12 +102,9 @@
 
   class DeleteMeasureCommand : public MeasureCommand
   {
-  private:
-    boost::shared_ptr<MeasureTool> measureTool_;
-
   public:
-    DeleteMeasureCommand(const boost::shared_ptr<MeasureTool>& measureTool,
-                         boost::weak_ptr<IViewport> viewport);
+    DeleteMeasureCommand(ViewportController& controller,
+                         const boost::shared_ptr<MeasureTool>& measureTool);
 
     virtual void Undo() ORTHANC_OVERRIDE;
     
--- a/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp	Thu Oct 08 19:29:56 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp	Thu Oct 08 19:52:31 2026 +0200
@@ -25,6 +25,8 @@
 #include "../StoneException.h"   // For ORTHANC_ASSERT
 #include "MeasureCommands.h"
 #include "UndoStack.h"
+#include "LineMeasureTool.h"
+#include "AngleMeasureTool.h"
 
 #include <boost/make_shared.hpp>