Mercurial > hg > orthanc-stone
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); }
