Mercurial > hg > orthanc-stone
changeset 2368:f510260c4ffa refactoring
simplified AngleMeasureTool
| author | Sebastien Jodogne <s.jodogne@gmail.com> |
|---|---|
| date | Thu, 08 Oct 2026 19:26:55 +0200 |
| parents | 1cd6717413bb |
| children | 7b815ead4e7d |
| files | OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp |
| diffstat | 3 files changed, 160 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp Thu Oct 08 19:14:19 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp Thu Oct 08 19:26:55 2026 +0200 @@ -20,27 +20,160 @@ * <http://www.gnu.org/licenses/>. **/ + #include "AngleMeasureTool.h" + +#include "../StoneException.h" +#include "LayerHolder.h" +#include "MeasureCommands.h" #include "MeasureToolsToolbox.h" -#include "EditAngleMeasureTracker.h" -#include "LayerHolder.h" -#include "../StoneException.h" #include <Logging.h> #include <boost/math/constants/constants.hpp> #include <boost/make_shared.hpp> -//// <HACK> -//// REMOVE THIS -//#ifndef NDEBUG -//extern void -//TrackerSample_SetInfoDisplayMessage(std::string key, std::string value); -//#endif -//// </HACK> namespace OrthancStone { + class AngleMeasureTool::Tracker : public IFlexiblePointerTracker + { + private: + boost::shared_ptr<AngleMeasureTool> tool_; + std::unique_ptr<AngleMeasureTool::Memento> originalMemento_; + ScenePoint2D originalClickPosition_; + AngleMeasureTool::AngleHighlightArea modifiedZone_; + bool alive_; + boost::weak_ptr<IViewport>& viewport_; // TODO Refactoring + boost::shared_ptr<EditMeasureCommand> editCommand_; + + public: + Tracker(const boost::shared_ptr<AngleMeasureTool>& tool, + bool isCreation, + const Scene2D& scene, + const PointerEvent& e, + boost::weak_ptr<IViewport>& viewport) : + tool_(tool), + originalClickPosition_(e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform())), + alive_(true), + viewport_(viewport) + { + if (!tool) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + modifiedZone_ = tool_->AngleHitTest(originalClickPosition_); + originalMemento_.reset(dynamic_cast<AngleMeasureTool::Memento*>(tool->CreateMemento())); + + if (isCreation) + { + boost::shared_ptr<IViewport> sharedViewport = viewport.lock(); + if (sharedViewport) + { + std::unique_ptr<IViewport::ILock> lock(sharedViewport->Lock()); + lock->GetController().PushCommand(boost::make_shared<CreateMeasureCommand>(boost::dynamic_pointer_cast<MeasureTool>(tool_), viewport)); + } + } + else + { + editCommand_ = boost::make_shared<EditMeasureCommand>(boost::dynamic_pointer_cast<MeasureTool>(tool_), viewport_); + } + } + + bool PointerMove(const PointerEvent &event, + Scene2D &scene) ORTHANC_OVERRIDE + { + if (alive_) + { + const ScenePoint2D scenePos = event.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + const ScenePoint2D delta = scenePos - originalClickPosition_; + + switch (modifiedZone_) + { + case AngleMeasureTool::AngleHighlightArea_Center: + { + tool_->SetCenter(originalMemento_->GetCenter() + delta); + break; + } + + case AngleMeasureTool::AngleHighlightArea_Side1: + case AngleMeasureTool::AngleHighlightArea_Side2: + { + tool_->SetCenter(originalMemento_->GetCenter() + delta); + tool_->SetSide1End(originalMemento_->GetSide1End() + delta); + tool_->SetSide2End(originalMemento_->GetSide2End() + delta); + break; + } + + case AngleMeasureTool::AngleHighlightArea_Side1End: + { + tool_->SetSide1End(originalMemento_->GetSide1End() + delta); + break; + } + + case AngleMeasureTool::AngleHighlightArea_Side2End: + { + tool_->SetSide2End(originalMemento_->GetSide2End() + delta); + break; + } + + default: + LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; + break; + } + + return true; + } + else + { + return false; + } + } + + void PointerUp(const PointerEvent &event, + Scene2D &scene) ORTHANC_OVERRIDE + { + if (alive_ && editCommand_) + { + editCommand_->SetMementoModified(tool_->CreateMemento()); + + boost::shared_ptr<IViewport> sharedViewport = viewport_.lock(); + if (sharedViewport) + { + std::unique_ptr<IViewport::ILock> lock(sharedViewport->Lock()); + lock->GetController().PushCommand(editCommand_); + } + } + + alive_ = false; + } + + void PointerDown(const PointerEvent &event, + Scene2D &scene) ORTHANC_OVERRIDE + { + LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) " + << "are ignored when the edit angle tracker is active"; + } + + bool IsAlive() const ORTHANC_OVERRIDE + { + return alive_; + } + + void Cancel(Scene2D &scene) ORTHANC_OVERRIDE + { + alive_ = false; + tool_->SetMemento(*originalMemento_); + } + + void SetObserver(IObserver *observer) ORTHANC_OVERRIDE + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); + } + }; + + // the params in the LayerHolder ctor specify the number of polyline and text // layers AngleMeasureTool::AngleMeasureTool( @@ -198,11 +331,10 @@ const PointerEvent& e) { std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); + ViewportController& controller = lock->GetController(); const Scene2D& scene = controller.GetScene(); - - ScenePoint2D scenePos = e.GetMainPosition().Apply( - scene.GetCanvasToSceneTransform()); + ScenePoint2D scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); if (!HitTest(scenePos)) { @@ -210,15 +342,7 @@ } else { - /** - new EditLineMeasureTracker( - boost::shared_ptr<LineMeasureTool> measureTool; - MessageBroker & broker, - boost::weak_ptr<IViewport> viewport, - const PointerEvent & e); - */ - - return new EditAngleMeasureTracker(shared_from_this(), viewport_, e); + return new Tracker(boost::dynamic_pointer_cast<AngleMeasureTool>(shared_from_this()), isCreation, scene, e, viewport_); } }
--- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h Thu Oct 08 19:14:19 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h Thu Oct 08 19:26:55 2026 +0200 @@ -103,6 +103,8 @@ AngleHighlightArea AngleHitTest(ScenePoint2D p) const; private: + class Tracker; + explicit AngleMeasureTool(boost::weak_ptr<IViewport> viewport); virtual void RefreshScene() ORTHANC_OVERRIDE;
--- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp Thu Oct 08 19:14:19 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp Thu Oct 08 19:26:55 2026 +0200 @@ -20,9 +20,11 @@ * <http://www.gnu.org/licenses/>. **/ + +#include "LineMeasureTool.h" + #include "../StoneException.h" #include "LayerHolder.h" -#include "LineMeasureTool.h" #include "MeasureCommands.h" #include "MeasureToolsToolbox.h" @@ -144,6 +146,7 @@ void Cancel(Scene2D &scene) ORTHANC_OVERRIDE { alive_ = false; + tool_->SetMemento(*originalMemento_); } void SetObserver(IObserver *observer) ORTHANC_OVERRIDE @@ -280,24 +283,18 @@ const PointerEvent& e) { std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); - if (lock.get() != NULL) - { - ViewportController& controller = lock->GetController(); - const Scene2D& scene = controller.GetScene(); - ScenePoint2D scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - if (!HitTest(scenePos)) - { - return NULL; - } - else - { - return new Tracker(boost::dynamic_pointer_cast<LineMeasureTool>(shared_from_this()), isCreation, scene, e, viewport_); - } + ViewportController& controller = lock->GetController(); + const Scene2D& scene = controller.GetScene(); + ScenePoint2D scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); + + if (!HitTest(scenePos)) + { + return NULL; } else { - return NULL; + return new Tracker(boost::dynamic_pointer_cast<LineMeasureTool>(shared_from_this()), isCreation, scene, e, viewport_); } }
