changeset 2358:047bf02a8864 refactoring

fix compatibility of MeasureTool
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 08 Oct 2026 10:22:05 +0200
parents 7d2877f8e978
children cb7b6eb39ebb
files Applications/Samples/Common/SimpleViewerCore.cpp Applications/Samples/Common/SimpleViewerCore.h OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h OrthancStone/Sources/Scene2DViewport/MeasureTool.h OrthancStone/Sources/Scene2DViewport/ViewportController.cpp
diffstat 8 files changed, 117 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/Applications/Samples/Common/SimpleViewerCore.cpp	Wed Oct 07 09:23:35 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.cpp	Thu Oct 08 10:22:05 2026 +0200
@@ -149,6 +149,21 @@
       std::unique_ptr<IViewport::ILock> viewportLock(viewport->Lock());
       viewportLock->GetController().SetUndoStack(boost::make_shared<UndoStack>());
     }
+
+#if TEST_LINE_MEASURE_TOOL == 1
+    lineMeasureTool_ = OrthancStone::LineMeasureTool::Create(viewport);
+    lineMeasureTool_->Enable();
+    lineMeasureTool_->Set(OrthancStone::ScenePoint2D(200, 100),
+                          OrthancStone::ScenePoint2D(100, 200));
+#endif
+
+#if TEST_ANGLE_MEASURE_TOOL == 1
+    angleMeasureTool_ = OrthancStone::AngleMeasureTool::Create(viewport);
+    angleMeasureTool_->Enable();
+    angleMeasureTool_->SetCenter(OrthancStone::ScenePoint2D(300, 300));
+    angleMeasureTool_->SetSide1End(OrthancStone::ScenePoint2D(200, 400));
+    angleMeasureTool_->SetSide2End(OrthancStone::ScenePoint2D(400, 400));
+#endif
   }
 
 
@@ -198,17 +213,32 @@
     DefaultViewportInteractor                 default_;
     boost::shared_ptr<AnnotationsSceneLayer>  annotations_;
 
+#if TEST_LINE_MEASURE_TOOL == 1
+    boost::shared_ptr<LineMeasureTool>  lineMeasureTool_;  // TODO Refactoring - Remove
+#endif
+
+#if TEST_ANGLE_MEASURE_TOOL == 1
+    boost::shared_ptr<AngleMeasureTool>  angleMeasureTool_;  // TODO Refactoring - Remove
+#endif
+
   public:
-    Interactor(const boost::shared_ptr<SimpleViewerCore>& core,
-               const boost::shared_ptr<AnnotationsSceneLayer>& annotations) :
-      annotations_(annotations)
+    Interactor(const boost::shared_ptr<SimpleViewerCore>& core)
     {
-      if (!core ||
-          !annotations)
+      if (!core)
       {
         throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
       }
 
+      annotations_ = core->annotations_;
+
+#if TEST_LINE_MEASURE_TOOL == 1
+      lineMeasureTool_ = core->lineMeasureTool_;
+#endif
+
+#if TEST_ANGLE_MEASURE_TOOL == 1
+      angleMeasureTool_ = core->angleMeasureTool_;
+#endif
+
       default_.SetWindowingLayer(0);
       default_.SetObserverFactory(new Factory(core));
     }
@@ -218,6 +248,14 @@
                                                    unsigned int viewportWidth,
                                                    unsigned int viewportHeight) ORTHANC_OVERRIDE
     {
+#if TEST_LINE_MEASURE_TOOL == 1
+      return lineMeasureTool_->CreateEditionTracker(event);
+#endif
+
+#if TEST_ANGLE_MEASURE_TOOL == 1
+      return angleMeasureTool_->CreateEditionTracker(event);
+#endif
+
       annotations_->ClearHover();
 
       if (event.GetMouseButton() == MouseButton_Left)
@@ -251,7 +289,7 @@
     }
     else
     {
-      return new Interactor(shared_from_this(), annotations_);
+      return new Interactor(shared_from_this());
     }
   }
 
@@ -261,68 +299,68 @@
   {
     switch (key)
     {
-    case 's':
-    {
-      std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-      viewportLock->GetCompositor().FitContent(viewportLock->GetController().GetScene());
-      viewportLock->Invalidate();
-      break;
-    }
+      case 's':
+      {
+        std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
+        viewportLock->GetCompositor().FitContent(viewportLock->GetController().GetScene());
+        viewportLock->Invalidate();
+        break;
+      }
 
-    case 'u':
-    {
-      std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-      if (viewportLock->GetController().CanUndo())
+      case 'u':
       {
-        viewportLock->GetController().Undo();
+        std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
+        if (viewportLock->GetController().CanUndo())
+        {
+          viewportLock->GetController().Undo();
+        }
+        break;
       }
-      break;
-    }
 
-    case 'U':
-    {
-      std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-      if (viewportLock->GetController().CanRedo())
+      case 'U':
       {
-        viewportLock->GetController().Redo();
+        std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
+        if (viewportLock->GetController().CanRedo())
+        {
+          viewportLock->GetController().Redo();
+        }
+        break;
       }
-      break;
-    }
 
-    case 'c':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Circle);
-      break;
+      case 'c':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Circle);
+        break;
 
-    case 'm':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Edit);
-      break;
+      case 'm':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Edit);
+        break;
 
-    case 'd':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Remove);
-      break;
+      case 'd':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Remove);
+        break;
 
-    case 'l':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Length);
-      break;
+      case 'l':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Length);
+        break;
 
-    case 'a':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Angle);
-      break;
+      case 'a':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_Angle);
+        break;
 
-    case 'p':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_PixelProbe);
-      break;
+      case 'p':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_PixelProbe);
+        break;
 
-    case 'e':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_EllipseProbe);
-      break;
+      case 'e':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_EllipseProbe);
+        break;
 
-    case 'r':
-      annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_RectangleProbe);
-      break;
+      case 'r':
+        annotations_->SetActiveTool(AnnotationsSceneLayer::Tool_RectangleProbe);
+        break;
 
-    default:
-      break;
+      default:
+        break;
     }
   }
 
--- a/Applications/Samples/Common/SimpleViewerCore.h	Wed Oct 07 09:23:35 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.h	Thu Oct 08 10:22:05 2026 +0200
@@ -22,12 +22,19 @@
 
 #pragma once
 
+// TODO Refactoring - Remove
+#define TEST_LINE_MEASURE_TOOL   1
+#define TEST_ANGLE_MEASURE_TOOL  1
+
 #include "../../../OrthancStone/Sources/Loaders/DicomResourcesLoader.h"
 #include "../../../OrthancStone/Sources/Loaders/SeriesFramesLoader.h"
 #include "../../../OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.h"
 #include "../../../OrthancStone/Sources/Scene2DViewport/ViewportController.h"
 #include "ISingleViewportApplicationCore.h"
 
+#include "../../../OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h"  // TODO Refactoring - Remove
+#include "../../../OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h"  // TODO Refactoring - Remove
+
 
 namespace OrthancStone
 {
@@ -49,6 +56,14 @@
     boost::shared_ptr<DicomResourcesLoader>       dicomLoader_;
     boost::shared_ptr<SeriesFramesLoader>         framesLoader_;
 
+#if TEST_LINE_MEASURE_TOOL == 1
+    boost::shared_ptr<LineMeasureTool>  lineMeasureTool_;  // TODO Refactoring - Remove
+#endif
+
+#if TEST_ANGLE_MEASURE_TOOL == 1
+    boost::shared_ptr<AngleMeasureTool>  angleMeasureTool_;  // TODO Refactoring - Remove
+#endif
+
   public:
     virtual void Handle(const New::IObservable& observable,
                         const FrameDecodedMessage& message) ORTHANC_OVERRIDE;
--- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp	Wed Oct 07 09:23:35 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp	Thu Oct 08 10:22:05 2026 +0200
@@ -198,7 +198,7 @@
   }
 
 
-  boost::shared_ptr<IFlexiblePointerTracker> AngleMeasureTool::CreateEditionTracker(const PointerEvent& e)
+  IFlexiblePointerTracker* AngleMeasureTool::CreateEditionTracker(const PointerEvent& e)
   {
     std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     ViewportController& controller = lock->GetController();
@@ -209,7 +209,7 @@
 
     if (!HitTest(scenePos))
     {
-      return boost::shared_ptr<IFlexiblePointerTracker>(); // NULL
+      return NULL;
     }
     else
     {
@@ -221,9 +221,7 @@
          const PointerEvent & e);
       */
 
-      boost::shared_ptr<EditAngleMeasureTracker> editAngleMeasureTracker(
-        new EditAngleMeasureTracker(shared_from_this(), viewport_, e));
-      return editAngleMeasureTracker;
+      return new EditAngleMeasureTracker(shared_from_this(), viewport_, e);
     }
   }
 
--- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h	Wed Oct 07 09:23:35 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h	Thu Oct 08 10:22:05 2026 +0200
@@ -53,7 +53,7 @@
     virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE;
     virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE;
     virtual void ResetHighlightState() ORTHANC_OVERRIDE;
-    virtual boost::shared_ptr<IFlexiblePointerTracker> CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE;
+    virtual IFlexiblePointerTracker* CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE;
     virtual MeasureToolMemento* CreateMemento() const ORTHANC_OVERRIDE;
     virtual void SetMemento(const MeasureToolMemento& memento) ORTHANC_OVERRIDE;
     virtual std::string GetDescription() ORTHANC_OVERRIDE;
--- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp	Wed Oct 07 09:23:35 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp	Thu Oct 08 10:22:05 2026 +0200
@@ -155,7 +155,7 @@
     return LineHitTest(p) != LineHighlightArea_None;
   }
 
-  boost::shared_ptr<IFlexiblePointerTracker> LineMeasureTool::CreateEditionTracker(const PointerEvent& e)
+  IFlexiblePointerTracker* LineMeasureTool::CreateEditionTracker(const PointerEvent& e)
   {
     std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     if (lock.get() != NULL)
@@ -168,18 +168,16 @@
 
       if (!HitTest(scenePos))
       {
-        return boost::shared_ptr<IFlexiblePointerTracker>();  // NULL
+        return NULL;
       }
       else
       {
-        boost::shared_ptr<EditLineMeasureTracker> editLineMeasureTracker(
-          new EditLineMeasureTracker(shared_from_this(), viewport_, e));
-        return editLineMeasureTracker;
+        return new EditLineMeasureTracker(shared_from_this(), viewport_, e);
       }
     }
     else
     {
-      return boost::shared_ptr<IFlexiblePointerTracker>();  // NULL
+      return NULL;
     }
   }
 
--- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h	Wed Oct 07 09:23:35 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h	Thu Oct 08 10:22:05 2026 +0200
@@ -52,7 +52,7 @@
     virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE;
     virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE;
     virtual void ResetHighlightState() ORTHANC_OVERRIDE;
-    virtual boost::shared_ptr<IFlexiblePointerTracker> CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE;
+    virtual IFlexiblePointerTracker* CreateEditionTracker(const PointerEvent& e) ORTHANC_OVERRIDE;
     virtual MeasureToolMemento* CreateMemento() const ORTHANC_OVERRIDE;
     virtual void SetMemento(const MeasureToolMemento& memento) ORTHANC_OVERRIDE;
     virtual std::string GetDescription() ORTHANC_OVERRIDE;
--- a/OrthancStone/Sources/Scene2DViewport/MeasureTool.h	Wed Oct 07 09:23:35 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureTool.h	Thu Oct 08 10:22:05 2026 +0200
@@ -139,7 +139,7 @@
        or an empty pointer if no hit test (although this should have been checked
        first)
     */
-    virtual boost::shared_ptr<IFlexiblePointerTracker> CreateEditionTracker(const PointerEvent& e) = 0;
+    virtual IFlexiblePointerTracker* CreateEditionTracker(const PointerEvent& e) = 0;
 
     /**
        Will change the measuring tool to provide visual feedback on the GUI 
--- a/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp	Wed Oct 07 09:23:35 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp	Thu Oct 08 10:22:05 2026 +0200
@@ -227,7 +227,7 @@
       {
         if (measureTools_[i]->HitTest(event.GetMainPosition()))
         {
-          activeTracker_ = measureTools_[i]->CreateEditionTracker(event);
+          activeTracker_.reset(measureTools_[i]->CreateEditionTracker(event));
           InvalidateViewport();
           return;
         }