# HG changeset patch # User Sebastien Jodogne # Date 1791485073 -7200 # Node ID 2788f73cb1a45b3b18824694b669c2d4501b1c0c # Parent 07e20eaa0e90f7ffed9dce3be8683e0cd0448a83 cont diff -r 07e20eaa0e90 -r 2788f73cb1a4 OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp --- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp Thu Oct 08 20:35:08 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.cpp Thu Oct 08 20:44:33 2026 +0200 @@ -67,7 +67,7 @@ throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } - modifiedZone_ = tool_->AngleHitTest(originalClickPosition_); + modifiedZone_ = tool_->AngleHitTest(scene, originalClickPosition_); originalMemento_.reset(dynamic_cast(tool->CreateMemento())); boost::shared_ptr sharedViewport = viewport.lock(); @@ -267,18 +267,16 @@ return ss.str(); } - void AngleMeasureTool::Highlight(ScenePoint2D p) + void AngleMeasureTool::Highlight(const Scene2D& scene, + ScenePoint2D p) { - AngleHighlightArea angleHighlightArea = AngleHitTest(p); + AngleHighlightArea angleHighlightArea = AngleHitTest(scene, p); SetAngleHighlightArea(angleHighlightArea); } - AngleMeasureTool::AngleHighlightArea AngleMeasureTool::AngleHitTest(ScenePoint2D p) const + AngleMeasureTool::AngleHighlightArea AngleMeasureTool::AngleHitTest(const Scene2D& scene, + ScenePoint2D p) const { - std::unique_ptr lock(GetViewportLock()); - const ViewportController& controller = lock->GetController(); - const Scene2D& scene = controller.GetScene(); - const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = @@ -327,9 +325,10 @@ return AngleHighlightArea_None; } - bool AngleMeasureTool::HitTest(ScenePoint2D p) + bool AngleMeasureTool::HitTest(const Scene2D& scene, + ScenePoint2D p) { - return AngleHitTest(p) != AngleHighlightArea_None; + return AngleHitTest(scene, p) != AngleHighlightArea_None; } @@ -342,7 +341,7 @@ const Scene2D& scene = controller.GetScene(); ScenePoint2D scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - if (!HitTest(scenePos)) + if (!HitTest(scene, scenePos)) { return NULL; } diff -r 07e20eaa0e90 -r 2788f73cb1a4 OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h --- a/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h Thu Oct 08 20:35:08 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/AngleMeasureTool.h Thu Oct 08 20:44:33 2026 +0200 @@ -80,8 +80,10 @@ void SetCenter(ScenePoint2D start); void SetSide2End(ScenePoint2D start); - virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE; - virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE; + virtual bool HitTest(const Scene2D& scene, + ScenePoint2D p) ORTHANC_OVERRIDE; + virtual void Highlight(const Scene2D& scene, + ScenePoint2D p) ORTHANC_OVERRIDE; virtual void ResetHighlightState() ORTHANC_OVERRIDE; virtual IFlexiblePointerTracker* CreateEditionTracker(bool isCreation, const PointerEvent& e) ORTHANC_OVERRIDE; @@ -100,7 +102,8 @@ }; - AngleHighlightArea AngleHitTest(ScenePoint2D p) const; + AngleHighlightArea AngleHitTest(const Scene2D& scene, + ScenePoint2D p) const; private: class Tracker; diff -r 07e20eaa0e90 -r 2788f73cb1a4 OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp --- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp Thu Oct 08 20:35:08 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.cpp Thu Oct 08 20:44:33 2026 +0200 @@ -61,7 +61,7 @@ throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } - modifiedZone_ = tool_->LineHitTest(originalClickPosition_); + modifiedZone_ = tool_->LineHitTest(scene, originalClickPosition_); originalMemento_.reset(dynamic_cast(tool->CreateMemento())); boost::shared_ptr sharedViewport = viewport.lock(); @@ -236,49 +236,45 @@ SetLineHighlightArea(LineHighlightArea_None); } - void LineMeasureTool::Highlight(ScenePoint2D p) + void LineMeasureTool::Highlight(const Scene2D& scene, + ScenePoint2D p) { - LineHighlightArea lineHighlightArea = LineHitTest(p); + LineHighlightArea lineHighlightArea = LineHitTest(scene, p); SetLineHighlightArea(lineHighlightArea); } - LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(ScenePoint2D p) + LineMeasureTool::LineHighlightArea LineMeasureTool::LineHitTest(const Scene2D& scene, + ScenePoint2D p) { - std::unique_ptr lock(GetViewportLock()); - if (lock.get() != NULL) - { - ViewportController& controller = lock->GetController(); - const Scene2D& scene = controller.GetScene(); + const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); + const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = + pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * + pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; - const double pixelToScene = scene.GetCanvasToSceneTransform().ComputeZoom(); - const double SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD = - pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD * - pixelToScene * HIT_TEST_MAX_DISTANCE_CANVAS_COORD; + const double sqDistanceFromStart = + ScenePoint2D::SquaredDistancePtPt(p, start_); - const double sqDistanceFromStart = - ScenePoint2D::SquaredDistancePtPt(p, start_); - - if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return LineHighlightArea_Start; + if (sqDistanceFromStart <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return LineHighlightArea_Start; - const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); + const double sqDistanceFromEnd = ScenePoint2D::SquaredDistancePtPt(p, end_); - if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return LineHighlightArea_End; + if (sqDistanceFromEnd <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return LineHighlightArea_End; - const double sqDistanceFromPtSegment = - ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); + const double sqDistanceFromPtSegment = + ScenePoint2D::SquaredDistancePtSegment(start_, end_, p); - if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) - return LineHighlightArea_Segment; - } + if (sqDistanceFromPtSegment <= SQUARED_HIT_TEST_MAX_DISTANCE_SCENE_COORD) + return LineHighlightArea_Segment; return LineHighlightArea_None; } - bool LineMeasureTool::HitTest(ScenePoint2D p) + bool LineMeasureTool::HitTest(const Scene2D& scene, + ScenePoint2D p) { - return LineHitTest(p) != LineHighlightArea_None; + return LineHitTest(scene, p) != LineHighlightArea_None; } IFlexiblePointerTracker* LineMeasureTool::CreateEditionTracker(bool isCreation, @@ -290,7 +286,7 @@ const Scene2D& scene = controller.GetScene(); ScenePoint2D scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform()); - if (!HitTest(scenePos)) + if (!HitTest(scene, scenePos)) { return NULL; } @@ -319,7 +315,6 @@ { if (IsEnabled()) { - std::unique_ptr lock(GetViewportLock()); ViewportController& controller = lock->GetController(); Scene2D& scene = controller.GetScene(); @@ -379,6 +374,7 @@ } } } + { // Set the text layer propreties double deltaX = end_.GetX() - start_.GetX(); diff -r 07e20eaa0e90 -r 2788f73cb1a4 OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h --- a/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h Thu Oct 08 20:35:08 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h Thu Oct 08 20:44:33 2026 +0200 @@ -76,8 +76,10 @@ void Set(ScenePoint2D start, ScenePoint2D end); - virtual bool HitTest(ScenePoint2D p) ORTHANC_OVERRIDE; - virtual void Highlight(ScenePoint2D p) ORTHANC_OVERRIDE; + virtual bool HitTest(const Scene2D& scene, + ScenePoint2D p) ORTHANC_OVERRIDE; + virtual void Highlight(const Scene2D& scene, + ScenePoint2D p) ORTHANC_OVERRIDE; virtual void ResetHighlightState() ORTHANC_OVERRIDE; virtual IFlexiblePointerTracker* CreateEditionTracker(bool isCreation, const PointerEvent& e) ORTHANC_OVERRIDE; @@ -94,7 +96,8 @@ }; - LineHighlightArea LineHitTest(ScenePoint2D p); + LineHighlightArea LineHitTest(const Scene2D& scene, + ScenePoint2D p); private: class Tracker; diff -r 07e20eaa0e90 -r 2788f73cb1a4 OrthancStone/Sources/Scene2DViewport/MeasureTool.h --- a/OrthancStone/Sources/Scene2DViewport/MeasureTool.h Thu Oct 08 20:35:08 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/MeasureTool.h Thu Oct 08 20:44:33 2026 +0200 @@ -124,7 +124,8 @@ true, then a click at that position will return a tracker to edit the measuring tool */ - virtual bool HitTest(ScenePoint2D p) = 0; + virtual bool HitTest(const Scene2D& scene, + ScenePoint2D p) = 0; /** This method must return a memento the captures the tool state (not including @@ -150,7 +151,8 @@ Will change the measuring tool to provide visual feedback on the GUI element that is in the pointer hit zone */ - virtual void Highlight(ScenePoint2D p) = 0; + virtual void Highlight(const Scene2D& scene, + ScenePoint2D p) = 0; /** This function must reset the visual highlighted hot zone feedback diff -r 07e20eaa0e90 -r 2788f73cb1a4 OrthancStone/Sources/Scene2DViewport/ViewportController.cpp --- a/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp Thu Oct 08 20:35:08 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp Thu Oct 08 20:44:33 2026 +0200 @@ -107,7 +107,7 @@ for (size_t i = 0; i < measureTools_.size(); ++i) { - if (measureTools_[i]->HitTest(p)) + if (measureTools_[i]->HitTest(*scene_, p)) ret.push_back(measureTools_[i]); } return ret; @@ -224,7 +224,7 @@ // Check whether there is already a measure tool at that position for (size_t i = 0; i < measureTools_.size(); ++i) { - if (measureTools_[i]->HitTest(event.GetMainPosition())) + if (measureTools_[i]->HitTest(*scene_, event.GetMainPosition())) { activeTracker_.reset(measureTools_[i]->CreateEditionTracker(false, event)); InvalidateViewport();