changeset 2377:94d62ecd8d50 refactoring

dropped dependency of LayerHolder on IViewport
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 09 Oct 2026 15:15:07 +0200
parents 9aae69fb63e1
children 29020ee1e020
files OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/LayerHolder.cpp OrthancStone/Sources/Scene2DViewport/LayerHolder.h OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.cpp OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.h
diffstat 6 files changed, 126 insertions(+), 149 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp	Thu Oct 08 20:52:17 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp	Fri Oct 09 15:15:07 2026 +0200
@@ -186,9 +186,9 @@
     boost::weak_ptr<IViewport> viewport)
     : MeasureTool(viewport)
 #if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1
-    , layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(viewport,1,5)))
+    , layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(1, 5)))
 #else
-    , layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(viewport,1,1)))
+    , layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(1, 1)))
 #endif
     , angleHighlightArea_(AngleHighlightArea_None)
   {
@@ -212,9 +212,12 @@
 
   void AngleMeasureTool::RemoveFromScene()
   {
+    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
+
     if (layerHolder_->AreLayersCreated() && IsSceneAlive())
     {
-      layerHolder_->DeleteLayers();
+      layerHolder_->DeleteLayers(lock->GetController().GetScene());
+      lock->Invalidate();
     }
   }
 
@@ -259,11 +262,14 @@
     RefreshScene();
   }
 
+
   std::string AngleMeasureTool::GetDescription()
   {
     std::stringstream ss;
-    ss << "AngleMeasureTool. Center = " << center_ << " Side1End = " 
-       << side1End_ << " Side2End = " << side2End_;
+    ss << "AngleMeasureTool. "
+       << "Center = (" << center_.GetX() << ", " << center_.GetY() << ") "
+       << "Side1End = (" << side1End_.GetX() << ", " << side1End_.GetY() << ") "
+       << "Side2End = (" << side2End_.GetX() << ", " << side2End_.GetY() << ") ";
     return ss.str();
   }
 
@@ -367,11 +373,11 @@
 
       if (IsEnabled())
       {
-        layerHolder_->CreateLayersIfNeeded();
+        layerHolder_->CreateLayersIfNeeded(scene);
 
         {
           // Fill the polyline layer with the measurement lines
-          PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0);
+          PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(scene, 0);
           if (polylineLayer)
           {
             polylineLayer->ClearAllChains();
--- a/OrthancStone/Sources/Scene2DViewport/LayerHolder.cpp	Thu Oct 08 20:52:17 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/LayerHolder.cpp	Fri Oct 09 15:15:07 2026 +0200
@@ -20,45 +20,29 @@
  * <http://www.gnu.org/licenses/>.
  **/
 
+
 #include "LayerHolder.h"
-#include "../Scene2D/TextSceneLayer.h"
+
 #include "../Scene2D/PolylineSceneLayer.h"
-#include "../Scene2D/Scene2D.h"
-#include "../Viewport/IViewport.h"
+#include "../Scene2D/TextSceneLayer.h"
 #include "../StoneException.h"
-#include "ViewportController.h"
+
 
 namespace OrthancStone
 {
-  LayerHolder::LayerHolder(
-    boost::weak_ptr<IViewport> viewport,
-    int        polylineLayerCount,
-    int        textLayerCount,
-    int        infoTextCount)
-    : textLayerCount_(textLayerCount)
-    , polylineLayerCount_(polylineLayerCount)
-    , infoTextCount_(infoTextCount)
-    , viewport_(viewport)
-    , baseLayerIndex_(-1)
+  LayerHolder::LayerHolder(int polylineLayerCount,
+                           int textLayerCount,
+                           int infoTextCount) :
+    textLayerCount_(textLayerCount),
+    polylineLayerCount_(polylineLayerCount),
+    infoTextCount_(infoTextCount),
+    baseLayerIndex_(-1)
   {
-
   }
 
-  IViewport::ILock* LayerHolder::GetViewportLock()
+
+  void LayerHolder::CreateLayers(Scene2D& scene)
   {
-    boost::shared_ptr<IViewport> viewport = viewport_.lock();
-    if (viewport)
-      return viewport->Lock();
-    else
-      return NULL;
-  }
-
-  void LayerHolder::CreateLayers()
-  {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    ViewportController& controller = lock->GetController();
-    Scene2D& scene = controller.GetScene();
-
     assert(baseLayerIndex_ == -1);
 
     baseLayerIndex_ = scene.GetMaxDepth() + 100;
@@ -74,48 +58,48 @@
       std::unique_ptr<TextSceneLayer> layer(new TextSceneLayer());
       scene.SetLayer(baseLayerIndex_ + polylineLayerCount_ + i, layer.release());
     }
-    lock->Invalidate();
   }
 
-  void LayerHolder::CreateLayersIfNeeded()
+
+  void LayerHolder::CreateLayersIfNeeded(Scene2D& scene)
   {
     if (baseLayerIndex_ == -1)
-      CreateLayers();
+    {
+      CreateLayers(scene);
+    }
   }
 
+
   bool LayerHolder::AreLayersCreated() const
   {
     return (baseLayerIndex_ != -1);
   }
 
-  void LayerHolder::DeleteLayersIfNeeded()
+
+  void LayerHolder::DeleteLayersIfNeeded(Scene2D& scene)
   {
     if (baseLayerIndex_ != -1)
-      DeleteLayers();
-  }
-  
-  void LayerHolder::DeleteLayers()
-  {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    if (lock)
     {
-      Scene2D& scene = lock->GetController().GetScene();
-
-      for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i)
-      {
-        ORTHANC_ASSERT(scene.HasLayer(baseLayerIndex_ + i), "No layer");
-        scene.DeleteLayer(baseLayerIndex_ + i);
-      }
-      baseLayerIndex_ = -1;
-      lock->Invalidate();
+      DeleteLayers(scene);
     }
   }
   
-  PolylineSceneLayer* LayerHolder::GetPolylineLayer(int index /*= 0*/)
+
+  void LayerHolder::DeleteLayers(Scene2D& scene)
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    const Scene2D& scene = lock->GetController().GetScene();
+    for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i)
+    {
+      ORTHANC_ASSERT(scene.HasLayer(baseLayerIndex_ + i), "No layer");
+      scene.DeleteLayer(baseLayerIndex_ + i);
+    }
 
+    baseLayerIndex_ = -1;
+  }
+
+
+  PolylineSceneLayer* LayerHolder::GetPolylineLayer(Scene2D& scene,
+                                                    int index /*= 0*/)
+  {
     ORTHANC_ASSERT(baseLayerIndex_ != -1);
     ORTHANC_ASSERT(scene.HasLayer(GetPolylineLayerIndex(index)));
     ISceneLayer* layer = &(scene.GetLayer(GetPolylineLayerIndex(index)));
@@ -127,28 +111,28 @@
     return concreteLayer;
   }
 
-  TextSceneLayer* LayerHolder::GetTextLayer(int index /*= 0*/)
+
+  TextSceneLayer* LayerHolder::GetTextLayer(Scene2D& scene,
+                                            int index /*= 0*/)
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    const Scene2D& scene = lock->GetController().GetScene();
-
     ORTHANC_ASSERT(baseLayerIndex_ != -1);
     ORTHANC_ASSERT(scene.HasLayer(GetTextLayerIndex(index)));
     ISceneLayer* layer = &(scene.GetLayer(GetTextLayerIndex(index)));
       
-    TextSceneLayer* concreteLayer =
-      dynamic_cast<TextSceneLayer*>(layer);
+    TextSceneLayer* concreteLayer = dynamic_cast<TextSceneLayer*>(layer);
       
     ORTHANC_ASSERT(concreteLayer != NULL);
     return concreteLayer;
   }
 
+
   int LayerHolder::GetPolylineLayerIndex(int index /*= 0*/)
   {
     ORTHANC_ASSERT(index < polylineLayerCount_);
     return baseLayerIndex_ + index;
   }
   
+
   int LayerHolder::GetTextLayerIndex(int index /*= 0*/)
   {
     ORTHANC_ASSERT(index < textLayerCount_);
--- a/OrthancStone/Sources/Scene2DViewport/LayerHolder.h	Thu Oct 08 20:52:17 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/LayerHolder.h	Fri Oct 09 15:15:07 2026 +0200
@@ -22,11 +22,10 @@
 
 #pragma once
 
-#include "../Viewport/IViewport.h"
+#include "../Scene2D/Scene2D.h"
 
 #include <boost/noncopyable.hpp>
-#include <boost/weak_ptr.hpp>
-#include <boost/shared_ptr.hpp>
+
 
 namespace OrthancStone
 {
@@ -39,25 +38,35 @@
   */
   class LayerHolder : public boost::noncopyable
   {
+  private:
+    int textLayerCount_;
+    int polylineLayerCount_;
+    int infoTextCount_;
+    int baseLayerIndex_;
+
+    int GetPolylineLayerIndex(int index);
+
+    int GetTextLayerIndex(int index);
+
+    int GetInfoTextLayerIndex(int index);
+
   public:
     /**
     This ctor merely stores the scene and layer counts. No layer creation
     performed at this time
     */
-    LayerHolder(
-      boost::weak_ptr<IViewport> viewport,
-      int polylineLayerCount, int textLayerCount, int infoTextCount = 0);
+    LayerHolder(int polylineLayerCount, int textLayerCount, int infoTextCount = 0);
 
     /**
     This actually creates the layers
     */
-    void CreateLayers();
+    void CreateLayers(Scene2D& scene);
 
     /**
     This creates the layers if they are not created yet. Can be useful in 
     some scenarios
     */
-    void CreateLayersIfNeeded();
+    void CreateLayersIfNeeded(Scene2D& scene);
 
     /**
     Whether the various text and polylines layers have all been created or 
@@ -68,12 +77,12 @@
     /**
     This removes the layers from the scene
     */
-    void DeleteLayers();
+    void DeleteLayers(Scene2D& scene);
 
     /**
     This removes the layers from the scene if they are already created
     */
-    void DeleteLayersIfNeeded();
+    void DeleteLayersIfNeeded(Scene2D& scene);
 
     /**
     Please note that the returned pointer belongs to the scene.Don't you dare
@@ -82,7 +91,8 @@
     This throws if the index is not valid or if the layers are not created or
     have been deleted
     */
-    PolylineSceneLayer* GetPolylineLayer(int index = 0);
+    PolylineSceneLayer* GetPolylineLayer(Scene2D& scene,
+                                         int index = 0);
 
     /**
     Please note that the returned pointer belongs to the scene. Don't you dare
@@ -91,27 +101,7 @@
     This throws if the index is not valid or if the layers are not created or
     have been deleted
     */
-    TextSceneLayer* GetTextLayer(int index = 0);
-
-    //TextSceneLayer* GetTextLayer(int index = 0);
-
-  private:
-
-    /**
-    This will return a scoped lock to the viewport.
-    If the viewport does not exist anymore, then nullptr is returned.
-    */
-    IViewport::ILock* GetViewportLock();
-
-    int GetPolylineLayerIndex(int index = 0);
-    int GetTextLayerIndex(int index = 0);
-    int GetInfoTextLayerIndex(int index = 0);
-
-    int textLayerCount_;
-    int polylineLayerCount_;
-    int infoTextCount_;
-    boost::weak_ptr<IViewport> viewport_;
-    int baseLayerIndex_;
+    TextSceneLayer* GetTextLayer(Scene2D& scene,
+                                 int index = 0);
   };
 }
-
--- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp	Thu Oct 08 20:52:17 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp	Fri Oct 09 15:15:07 2026 +0200
@@ -162,9 +162,9 @@
     boost::weak_ptr<IViewport> viewport):
     MeasureTool(viewport),
 #if ORTHANC_STONE_ENABLE_OUTLINED_TEXT == 1
-    layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(viewport,1,5))),
+    layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(1, 5))),
 #else
-    layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(viewport,1,1))),
+    layerHolder_(boost::shared_ptr<LayerHolder>(new LayerHolder(1, 1))),
 #endif
     baseLayerIndex_(0),
     lineHighlightArea_(LineHighlightArea_None)
@@ -190,9 +190,12 @@
 
   void LineMeasureTool::RemoveFromScene()
   {
+    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
+
     if (layerHolder_->AreLayersCreated() && IsSceneAlive())
     {
-      layerHolder_->DeleteLayers();
+      layerHolder_->DeleteLayers(lock->GetController().GetScene());
+      lock->Invalidate();
     }
   }
   
@@ -227,7 +230,9 @@
   std::string LineMeasureTool::GetDescription()
   {
     std::stringstream ss;
-    ss << "LineMeasureTool. Start = " << start_ << " End = " << end_;
+    ss << "LineMeasureTool. "
+       << "Start = (" << start_.GetX() << ", " << start_.GetY() << ") "
+       << "End = (" << end_.GetX() << ", " << end_.GetY() << ") ";
     return ss.str();
   }
 
@@ -319,11 +324,12 @@
         ViewportController& controller = lock->GetController();
         Scene2D& scene = controller.GetScene();
 
-        layerHolder_->CreateLayersIfNeeded();
+        layerHolder_->CreateLayersIfNeeded(scene);
+
         {
           // Fill the polyline layer with the measurement line
 
-          PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(0);
+          PolylineSceneLayer* polylineLayer = layerHolder_->GetPolylineLayer(scene, 0);
           if (polylineLayer)
           {
             polylineLayer->ClearAllChains();
--- a/OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.cpp	Thu Oct 08 20:52:17 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.cpp	Fri Oct 09 15:15:07 2026 +0200
@@ -22,15 +22,12 @@
 
 #include "MeasureToolsToolbox.h"
 
-#include "../Scene2D/Scene2D.h"
 #include "../Scene2D/TextSceneLayer.h"
-#include "../StoneException.h"
-#include "LayerHolder.h"
 
 #include <boost/math/constants/constants.hpp>
 
 
-static const double g_pi = boost::math::constants::pi<double>();
+static const double G_PI = boost::math::constants::pi<double>();
 static const uint8_t TEXT_COLOR_RED = 0;
 static const uint8_t TEXT_COLOR_GREEN = 223;
 static const uint8_t TEXT_COLOR_BLUE = 81;
@@ -58,7 +55,7 @@
 
   double RadiansToDegrees(double angleRad)
   {
-    static const double factor = 180.0 / g_pi;
+    static const double factor = 180.0 / G_PI;
     return angleRad * factor;
   }
 
@@ -185,7 +182,7 @@
     // let's fix this:
     if (!clockwise)
     {
-      angle2Rad -= 2 * g_pi;
+      angle2Rad -= 2.0 * G_PI;
       // now we are sure angle2Rad < angle1Rad (since they were normalized) 
       // and, thus, going from 1 to 2 means the angle values will DECREASE,
       // which is the definition of anticlockwise
@@ -224,7 +221,7 @@
     chain.clear();
     chain.reserve(numSubdivisions);
 
-    double angleIncr = (2.0 * g_pi)
+    double angleIncr = (2.0 * G_PI)
       / static_cast<double>(numSubdivisions);
 
     double theta = 0;
@@ -242,10 +239,17 @@
   double NormalizeAngle(double angle)
   {
     double retAngle = angle;
-    while (retAngle < -1.0 * g_pi)
-      retAngle += 2 * g_pi;
-    while (retAngle >= g_pi)
-      retAngle -= 2 * g_pi;
+
+    while (retAngle < -G_PI)
+    {
+      retAngle += 2 * G_PI;
+    }
+
+    while (retAngle >= G_PI)
+    {
+      retAngle -= 2 * G_PI;
+    }
+
     return retAngle;
   }
 
@@ -296,12 +300,11 @@
   and will use the first four ones for the text background and the fifth one
   for the actual text
   */
-  void SetTextLayerOutlineProperties(
-    const Scene2D& scene
-    , boost::shared_ptr<LayerHolder> layerHolder
-    , const char* text
-    , ScenePoint2D p
-    , int startingLayerIndex) 
+  void SetTextLayerOutlineProperties(const Scene2D& scene,
+                                     boost::shared_ptr<LayerHolder> layerHolder,
+                                     const char* text,
+                                     ScenePoint2D p,
+                                     int startingLayerIndex) 
   {
     double xoffsets[5] = { 2, 0, -2, 0, 0 };
     double yoffsets[5] = { 0, -2, 0, 2, 0 };
@@ -339,14 +342,13 @@
     }
   }
 #else
-  void SetTextLayerProperties(
-    const Scene2D& scene
-    , boost::shared_ptr<LayerHolder> layerHolder
-    , const char* text
-    , ScenePoint2D p
-    , int layerIndex)
+  void SetTextLayerProperties(Scene2D& scene,
+                              boost::shared_ptr<LayerHolder> layerHolder,
+                              const std::string& text,
+                              ScenePoint2D p,
+                              int layerIndex)
   {
-    TextSceneLayer* textLayer = layerHolder->GetTextLayer(layerIndex);
+    TextSceneLayer* textLayer = layerHolder->GetTextLayer(scene, layerIndex);
     if (textLayer != NULL)
     {
       textLayer->SetText(text);
@@ -355,11 +357,4 @@
     }
   }
 #endif 
-
-  std::ostream& operator<<(std::ostream& os, const ScenePoint2D& p)
-  {
-    os << "x = " << p.GetX() << " , y = " << p.GetY();
-    return os;
-  }
-
 }
--- a/OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.h	Thu Oct 08 20:52:17 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureToolsToolbox.h	Fri Oct 09 15:15:07 2026 +0200
@@ -184,21 +184,17 @@
   The five text layers are supposed to already exist in the scene, starting
   from startingLayerIndex, up to (and not including) startingLayerIndex+5.
   */
-  void SetTextLayerOutlineProperties(
-    const Scene2D& scene
-    , boost::shared_ptr<LayerHolder> layerHolder
-    , const char* text
-    , ScenePoint2D p
-    , int startingLayerIndex);
+  void SetTextLayerOutlineProperties(Scene2D& scene,
+                                     boost::shared_ptr<LayerHolder> layerHolder,
+                                     const std::string& text,
+                                     ScenePoint2D p,
+                                     int startingLayerIndex);
 #else
-  void SetTextLayerProperties(
-    const Scene2D& scene
-    , boost::shared_ptr<LayerHolder> layerHolder
-    , const char* text
-    , ScenePoint2D p
-    , int layerIndex);
+  void SetTextLayerProperties(Scene2D& scene,
+                              boost::shared_ptr<LayerHolder> layerHolder,
+                              const std::string& text,
+                              ScenePoint2D p,
+                              int layerIndex);
 #endif
-
-  std::ostream& operator<<(std::ostream& os, const ScenePoint2D& p);
 }