changeset 2345:88b6e1c19d03 refactoring

simplified MagnifyingGlassTracker and ZoomSceneTracker
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 06 Oct 2026 15:58:35 +0200
parents dbba1b96b35a
children aa15732517f6
files OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.cpp OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.h OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp OrthancStone/Sources/Scene2D/ZoomSceneTracker.h OrthancStone/Sources/Viewport/DefaultViewportInteractor.cpp
diffstat 5 files changed, 46 insertions(+), 91 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.cpp	Tue Oct 06 15:42:43 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.cpp	Tue Oct 06 15:58:35 2026 +0200
@@ -23,41 +23,30 @@
 
 #include "MagnifyingGlassTracker.h"
 
-#include "../Scene2DViewport/ViewportController.h"
-#include "../Viewport/ViewportLocker.h"
-
 namespace OrthancStone
 {
-  void MagnifyingGlassTracker::Update(const ViewportLocker& locker,
+  void MagnifyingGlassTracker::Update(Scene2D& scene,
                                       const PointerEvent& event)
   {
     ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_);
 
-    locker.GetController().SetSceneToCanvasTransform(
+    scene.SetSceneToCanvasTransform(
       AffineTransform2D::Combine(
         originalSceneToCanvas_,
         AffineTransform2D::CreateOffset(p.GetX(), p.GetY()),
         AffineTransform2D::CreateScaling(5, 5),
         AffineTransform2D::CreateOffset(-pivot_.GetX(), -pivot_.GetY())));
-
-    locker.Invalidate();
   }
     
 
-  MagnifyingGlassTracker::MagnifyingGlassTracker(boost::weak_ptr<IViewport> viewport,
-                                                 const PointerEvent& event) :
-    viewport_(viewport)
+  MagnifyingGlassTracker::MagnifyingGlassTracker(Scene2D& scene,
+                                                 const PointerEvent& event)
   {
-    ViewportLocker locker(viewport_);
-    
-    if (locker.IsValid())
-    {
-      originalSceneToCanvas_ = locker.GetController().GetScene().GetSceneToCanvasTransform();
-      originalCanvasToScene_ = locker.GetController().GetScene().GetCanvasToSceneTransform();
-      pivot_ = event.GetMainPosition().Apply(locker.GetController().GetScene().GetCanvasToSceneTransform());
+    originalSceneToCanvas_ = scene.GetSceneToCanvasTransform();
+    originalCanvasToScene_ = scene.GetCanvasToSceneTransform();
+    pivot_ = event.GetMainPosition().Apply(scene.GetCanvasToSceneTransform());
 
-      Update(locker, event);
-    }
+    Update(scene, event);
   }
       
 
@@ -72,28 +61,13 @@
   bool MagnifyingGlassTracker::PointerMove(const PointerEvent& event,
                                            Scene2D& scene)
   {
-    ViewportLocker locker(viewport_);
-    
-    if (locker.IsValid())
-    {
-      Update(locker, event);
-      return true;
-    }
-    else
-    {
-      return false;
-    }
+    Update(scene, event);
+    return true;
   }
     
 
   void MagnifyingGlassTracker::Cancel(Scene2D& scene)
   {
-    ViewportLocker locker(viewport_);
-    
-    if (locker.IsValid())
-    {
-      locker.GetController().SetSceneToCanvasTransform(originalSceneToCanvas_);
-      locker.Invalidate();
-    }
+    scene.SetSceneToCanvasTransform(originalSceneToCanvas_);
   }
 }
--- a/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.h	Tue Oct 06 15:42:43 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.h	Tue Oct 06 15:58:35 2026 +0200
@@ -23,26 +23,24 @@
 
 #pragma once
 
+#include "../Scene2D/Scene2D.h"
 #include "../Scene2DViewport/OneGesturePointerTracker.h"
-#include "../Viewport/ViewportLocker.h"
 
-#include <boost/weak_ptr.hpp>
 
 namespace OrthancStone
 {
   class MagnifyingGlassTracker : public OneGesturePointerTracker
   {
   private:
-    boost::weak_ptr<IViewport>  viewport_;
-    ScenePoint2D                pivot_;
-    AffineTransform2D           originalSceneToCanvas_;
-    AffineTransform2D           originalCanvasToScene_;
+    ScenePoint2D       pivot_;
+    AffineTransform2D  originalSceneToCanvas_;
+    AffineTransform2D  originalCanvasToScene_;
 
-    void Update(const ViewportLocker& locker,
+    void Update(Scene2D& scene,
                 const PointerEvent& event);
     
   public:
-    MagnifyingGlassTracker(boost::weak_ptr<IViewport> viewport,
+    MagnifyingGlassTracker(Scene2D& scene,
                            const PointerEvent& event);
     
     virtual void PointerUp(const PointerEvent& event,
--- a/OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp	Tue Oct 06 15:42:43 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp	Tue Oct 06 15:58:35 2026 +0200
@@ -23,31 +23,24 @@
 
 #include "ZoomSceneTracker.h"
 
-#include "../Scene2DViewport/ViewportController.h"
-#include "../Viewport/ViewportLocker.h"
 
 namespace OrthancStone
 {
-  ZoomSceneTracker::ZoomSceneTracker(boost::weak_ptr<IViewport> viewport,
+  ZoomSceneTracker::ZoomSceneTracker(const Scene2D& scene,
                                      const PointerEvent& event,
                                      unsigned int canvasHeight) :
-    viewport_(viewport),
     clickY_(event.GetMainPosition().GetY())
-  {    
-    ViewportLocker locker(viewport_);
-    
-    if (locker.IsValid())
+  {
+    originalSceneToCanvas_ = scene.GetSceneToCanvasTransform();
+
+    if (canvasHeight > 3)
     {
-      originalSceneToCanvas_ = locker.GetController().GetScene().GetSceneToCanvasTransform();
-
-      if (canvasHeight > 3)
-      {
-        normalization_ = 1.0 / static_cast<double>(canvasHeight - 1);
-        aligner_.reset(new Internals::FixedPointAligner(locker.GetController().GetScene(), event.GetMainPosition()));
-      }
+      normalization_ = 1.0 / static_cast<double>(canvasHeight - 1);
+      aligner_.reset(new Internals::FixedPointAligner(scene, event.GetMainPosition()));
     }
   }
   
+
   bool ZoomSceneTracker::PointerMove(const PointerEvent& event,
                                      Scene2D& scene)
   {
@@ -77,33 +70,21 @@
         z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0;
       }
 
-      ViewportLocker locker(viewport_);
-    
-      if (locker.IsValid())
-      {
-        const double zoom = pow(2.0, z);
+      const double zoom = pow(2.0, z);
 
-        locker.GetController().SetSceneToCanvasTransform(
-          AffineTransform2D::Combine(
-            AffineTransform2D::CreateScaling(zoom, zoom),
-            originalSceneToCanvas_));
-        aligner_->Apply(locker.GetController().GetScene());
-        locker.Invalidate();
-        return true;
-      }
+      scene.SetSceneToCanvasTransform(AffineTransform2D::Combine(
+                                        AffineTransform2D::CreateScaling(zoom, zoom),
+                                        originalSceneToCanvas_));
+      aligner_->Apply(scene);
+      return true;
     }
 
     return false;
   }
 
+
   void ZoomSceneTracker::Cancel(Scene2D& scene)
   {
-    ViewportLocker locker(viewport_);
-    
-    if (locker.IsValid())
-    {
-      locker.GetController().SetSceneToCanvasTransform(originalSceneToCanvas_);
-      locker.Invalidate();
-    }
+    scene.SetSceneToCanvasTransform(originalSceneToCanvas_);
   }
 }
--- a/OrthancStone/Sources/Scene2D/ZoomSceneTracker.h	Tue Oct 06 15:42:43 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/ZoomSceneTracker.h	Tue Oct 06 15:58:35 2026 +0200
@@ -25,25 +25,21 @@
 
 
 #include "../Scene2DViewport/OneGesturePointerTracker.h"
-#include "../Viewport/IViewport.h"
 #include "Internals/FixedPointAligner.h"
 
-#include <boost/weak_ptr.hpp>
-
 namespace OrthancStone
 {
   class ZoomSceneTracker : public OneGesturePointerTracker
   {
   private:
-    boost::weak_ptr<IViewport>    viewport_;
-    double                        clickY_;
-    double                        normalization_;
-    AffineTransform2D             originalSceneToCanvas_;
+    double             clickY_;
+    double             normalization_;
+    AffineTransform2D  originalSceneToCanvas_;
 
     std::unique_ptr<Internals::FixedPointAligner>  aligner_;
     
   public:
-    ZoomSceneTracker(boost::weak_ptr<IViewport> viewport,
+    ZoomSceneTracker(const Scene2D& scene,
                      const PointerEvent& event,
                      unsigned int canvasHeight);
 
--- a/OrthancStone/Sources/Viewport/DefaultViewportInteractor.cpp	Tue Oct 06 15:42:43 2026 +0200
+++ b/OrthancStone/Sources/Viewport/DefaultViewportInteractor.cpp	Tue Oct 06 15:58:35 2026 +0200
@@ -36,7 +36,7 @@
 namespace OrthancStone
 {
   IFlexiblePointerTracker* DefaultViewportInteractor::CreateTrackerInternal(
-    const boost::shared_ptr<IViewport>& viewport,
+    const boost::shared_ptr<IViewport>& viewport,   // TODO Refactoring - Should be Scene2D&
     MouseAction action,
     const PointerEvent& event,
     unsigned int viewportWidth,
@@ -77,10 +77,16 @@
         return new PanSceneTracker(viewport, event);
       
       case MouseAction_Zoom:
-        return new ZoomSceneTracker(viewport, event, viewportHeight);
+      {
+        std::unique_ptr<IViewport::ILock> lock(viewport->Lock());
+        return new ZoomSceneTracker(lock->GetController().GetScene(), event, viewportHeight);
+      }
       
       case MouseAction_MagnifyingGlass:
-        return new MagnifyingGlassTracker(viewport, event);
+      {
+        std::unique_ptr<IViewport::ILock> lock(viewport->Lock());
+        return new MagnifyingGlassTracker(lock->GetController().GetScene(), event);
+      }
 
       default:
         throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);