changeset 2335:f845b27efc74 refactoring

breaking - non-const Scene2D in interactors/trackers
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sun, 04 Oct 2026 11:13:59 +0200
parents ba5cde199312
children 6690c80fa1a9
files Applications/Samples/Common/ISingleViewportApplicationCore.h Applications/Samples/Common/SimpleViewerCore.cpp Applications/Samples/Common/SimpleViewerCore.h Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp Applications/Samples/Sdl/SingleViewportSdlApplication.cpp OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.cpp OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.h OrthancStone/Sources/Scene2D/GrayscaleWindowingSceneTracker.cpp OrthancStone/Sources/Scene2D/GrayscaleWindowingSceneTracker.h OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.cpp OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.h OrthancStone/Sources/Scene2D/PanSceneTracker.cpp OrthancStone/Sources/Scene2D/PanSceneTracker.h OrthancStone/Sources/Scene2D/PinchZoomTracker.cpp OrthancStone/Sources/Scene2D/PinchZoomTracker.h OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp OrthancStone/Sources/Scene2D/RotateSceneTracker.h OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp OrthancStone/Sources/Scene2D/ZoomSceneTracker.h OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.h OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.h OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.h OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.cpp OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.h OrthancStone/Sources/Scene2DViewport/IFlexiblePointerTracker.h OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp OrthancStone/Sources/Scene2DViewport/MeasureTrackers.h OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.cpp OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.h OrthancStone/Sources/Viewport/IViewportInteractor.h
diffstat 33 files changed, 124 insertions(+), 135 deletions(-) [+]
line wrap: on
line diff
--- a/Applications/Samples/Common/ISingleViewportApplicationCore.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/Applications/Samples/Common/ISingleViewportApplicationCore.h	Sun Oct 04 11:13:59 2026 +0200
@@ -41,10 +41,7 @@
 
     virtual IViewportInteractor* CreateMouseInteractor() = 0;
 
-    virtual bool HandleKeyDown(const IEnvironment::ILock& environmentLock,
+    virtual void HandleKeyDown(const IEnvironment::ILock& environmentLock,
                                char key) = 0;
-
-    virtual void Render(const IEnvironment::ILock& environmentLock,
-                        IViewport::ILock& viewportLock) = 0;
   };
 }
--- a/Applications/Samples/Common/SimpleViewerCore.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -202,7 +202,7 @@
   }
 
 
-  bool SimpleViewerCore::HandleKeyDown(const IEnvironment::ILock& environmentLock,
+  void SimpleViewerCore::HandleKeyDown(const IEnvironment::ILock& environmentLock,
                                        char key)
   {
     switch (key)
@@ -270,22 +270,6 @@
     default:
       break;
     }
-
-    return false;  // No need to repaint
-  }
-
-
-  void SimpleViewerCore::Render(const IEnvironment::ILock& environmentLock,
-                                IViewport::ILock& viewportLock)
-  {
-    if (!annotations_)
-    {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
-    }
-    else
-    {
-      annotations_->Render(viewportLock.GetController().GetScene());
-    }
   }
 
 
--- a/Applications/Samples/Common/SimpleViewerCore.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.h	Sun Oct 04 11:13:59 2026 +0200
@@ -61,12 +61,9 @@
 
     virtual IViewportInteractor* CreateMouseInteractor() ORTHANC_OVERRIDE;
 
-    virtual bool HandleKeyDown(const IEnvironment::ILock& environmentLock,
+    virtual void HandleKeyDown(const IEnvironment::ILock& environmentLock,
                                char key) ORTHANC_OVERRIDE;
 
-    virtual void Render(const IEnvironment::ILock& environmentLock,
-                        IViewport::ILock& viewportLock) ORTHANC_OVERRIDE;
-
   public:
     void LoadFrameFromOrthanc(const std::string& instanceId,
                               unsigned int frameIndex);
--- a/Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -80,7 +80,7 @@
     }
 
 
-    virtual bool HandleKeyDown(const IEnvironment::ILock& environmentLock,
+    virtual void HandleKeyDown(const IEnvironment::ILock& environmentLock,
                                char key) ORTHANC_OVERRIDE
     {
       if (key == 'b')
@@ -109,12 +109,10 @@
           source.SetDicomDirSource();
           oracle.Submit(environment, toto_, new ParseDicomFromFileCommand(source, "hand.dcm"));
         }
-
-        return false;
       }
       else
       {
-        return SimpleViewerCore::HandleKeyDown(environmentLock, key);
+        SimpleViewerCore::HandleKeyDown(environmentLock, key);
       }
     }
   };
--- a/Applications/Samples/Sdl/SingleViewportSdlApplication.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/Applications/Samples/Sdl/SingleViewportSdlApplication.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -100,7 +100,7 @@
             else
             {
               std::unique_ptr<IEnvironment::ILock> environmentLock(context->GetEnvironment().AcquireLock());
-              paint = core_->HandleKeyDown(*environmentLock, s[0]);
+              core_->HandleKeyDown(*environmentLock, s[0]);
             }
           }
         }
@@ -137,6 +137,7 @@
               else if (interactor->HasMouseHover())
               {
                 interactor->HandleMouseHover(*viewport_, p);
+                viewportLock->Invalidate();
               }
               break;
             }
@@ -155,12 +156,6 @@
 
       if (paint)
       {
-        {
-          std::unique_ptr<IEnvironment::ILock> environmentLock(context->GetEnvironment().AcquireLock());
-          std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-          core_->Render(*environmentLock, *viewportLock);
-        }
-
         viewport_->Paint();
       }
 
--- a/OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -1051,22 +1051,26 @@
     }
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
       primitive_.MovePreview(event.GetMainPosition().Apply(canvasToScene_) - sceneClick_, scene);
+
       that_.BroadcastMessage(AnnotationChangedMessage(that_));
+      that_.Render(scene);
     }
       
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE
+                           Scene2D& scene) ORTHANC_OVERRIDE
     {
       primitive_.MoveDone(event.GetMainPosition().Apply(canvasToScene_) - sceneClick_, scene);
       alive_ = false;
+
       that_.BroadcastMessage(AnnotationChangedMessage(that_));
+      that_.Render(scene);
     }
 
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
@@ -1075,7 +1079,7 @@
       return alive_;
     }
 
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE
     {
       //primitive_.MoveDone(ScenePoint2D(0, 0), scene);
       primitive_.MoveDone(sceneClick_, scene);   // TODO Check this
@@ -2392,7 +2396,7 @@
     }
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
       if (annotation_ != NULL)
       {
@@ -2400,19 +2404,21 @@
         annotation_->SignalMove(annotation_->GetHandle(1), scene);
 
         layer_.BroadcastMessage(AnnotationChangedMessage(layer_));
+        layer_.Render(scene);
       }
     }
       
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE
+                           Scene2D& scene) ORTHANC_OVERRIDE
     {
       annotation_ = NULL;  // IsAlive() becomes false
 
       layer_.BroadcastMessage(AnnotationAddedMessage(layer_));
+      layer_.Render(scene);
     }
 
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
@@ -2421,7 +2427,7 @@
       return (annotation_ != NULL);
     }
 
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE
     {
       if (annotation_ != NULL)
       {
@@ -2453,13 +2459,14 @@
     }
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
       if (length_ != NULL)
       {
         length_->GetHandle(1).SetCenter(event.GetMainPosition().Apply(canvasToScene_));
         length_->SignalMove(length_->GetHandle(1), scene);
         that_.BroadcastMessage(AnnotationChangedMessage(that_));
+        that_.Render(scene);
       }
 
       if (angle_ != NULL)
@@ -2467,11 +2474,12 @@
         angle_->GetHandle(2).SetCenter(event.GetMainPosition().Apply(canvasToScene_));
         angle_->SignalMove(angle_->GetHandle(2), scene);
         that_.BroadcastMessage(AnnotationChangedMessage(that_));
+        that_.Render(scene);
       }
     }
       
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE
+                           Scene2D& scene) ORTHANC_OVERRIDE
     {
       if (length_ != NULL)
       {
@@ -2485,17 +2493,19 @@
         length_ = NULL;
 
         that_.BroadcastMessage(AnnotationChangedMessage(that_));
+        that_.Render(scene);
       }
       else
       {
         angle_ = NULL;  // IsAlive() becomes false
 
         that_.BroadcastMessage(AnnotationAddedMessage(that_));
+        that_.Render(scene);
       }
     }
 
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
@@ -2505,7 +2515,7 @@
               angle_ != NULL);
     }
 
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE
     {
       if (length_ != NULL)
       {
@@ -2527,25 +2537,27 @@
   public:
     CreatePixelProbeTracker(AnnotationsSceneLayer& that,
                             const ScenePoint2D& sceneClick,
-                            const Scene2D& scene)
+                            Scene2D& scene)
     {
       PixelProbeAnnotation* annotation = new PixelProbeAnnotation(that, sceneClick);
       annotation->UpdateProbe(scene);
+
       that.BroadcastMessage(AnnotationAddedMessage(that));
+      that.Render(scene);
     }
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
       
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE
+                           Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
@@ -2554,7 +2566,7 @@
       return false;
     }
 
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
   };
@@ -2572,7 +2584,7 @@
     }
 
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE
+                           Scene2D& scene) ORTHANC_OVERRIDE
     {
       std::unique_ptr<TextAnnotationRequiredMessage> request;
       
@@ -2585,6 +2597,7 @@
       
       GetLayer().BroadcastMessage(AnnotationChangedMessage(GetLayer()));
       GetLayer().BroadcastMessage(*request);
+      GetLayer().Render(scene);
     }
   };
 
@@ -2599,17 +2612,17 @@
     }
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
       
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE
+                           Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE
+                             Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
 
@@ -2618,7 +2631,7 @@
       return false;
     }
 
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE
     {
     }
   };
@@ -2774,7 +2787,7 @@
   bool AnnotationsSceneLayer::ClearHover()
   {
     bool needsRefresh = false;
-      
+
     for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it)
     {
       assert(*it != NULL);
@@ -2789,17 +2802,17 @@
   }
   
 
-  bool AnnotationsSceneLayer::SetMouseHover(const ScenePoint2D& p,
-                                            const Scene2D& scene)
+  void AnnotationsSceneLayer::SetMouseHover(const ScenePoint2D& p,
+                                            Scene2D& scene)
   {
+    bool needsRefresh = false;
+
     if (activeTool_ == Tool_None)
     {
-      return ClearHover();
+      needsRefresh = ClearHover();
     }
     else
     {
-      bool needsRefresh = false;
-      
       const ScenePoint2D s = p.Apply(scene.GetCanvasToSceneTransform());
       
       for (GeometricPrimitives::iterator it = primitives_.begin(); it != primitives_.end(); ++it)
@@ -2814,14 +2827,17 @@
         
         (*it)->SetHover(hover);
       }
-
-      return needsRefresh;
+    }
+
+    if (needsRefresh)
+    {
+      Render(scene);
     }
   }
 
 
   IFlexiblePointerTracker* AnnotationsSceneLayer::CreateTracker(const ScenePoint2D& p,
-                                                                const Scene2D& scene)
+                                                                Scene2D& scene)
   {
     /**
      * WARNING: The created trackers must NOT keep a reference to "scene"!
--- a/OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/AnnotationsSceneLayer.h	Sun Oct 04 11:13:59 2026 +0200
@@ -171,11 +171,11 @@
     
     bool ClearHover();
 
-    bool SetMouseHover(const ScenePoint2D& p /* expressed in canvas coordinates */,
-                       const Scene2D& scene);
+    void SetMouseHover(const ScenePoint2D& p /* expressed in canvas coordinates */,
+                       Scene2D& scene);
 
     IFlexiblePointerTracker* CreateTracker(const ScenePoint2D& p /* expressed in canvas coordinates */,
-                                           const Scene2D& scene);
+                                           Scene2D& scene);
     
     void Serialize(Json::Value& target) const;
     
--- a/OrthancStone/Sources/Scene2D/GrayscaleWindowingSceneTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/GrayscaleWindowingSceneTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -155,7 +155,7 @@
   }
   
   void GrayscaleWindowingSceneTracker::PointerMove(const PointerEvent& event,
-                                                   const Scene2D& scene)
+                                                   Scene2D& scene)
   {
     if (active_)
     {
@@ -174,7 +174,7 @@
     }
   }
 
-  void GrayscaleWindowingSceneTracker::Cancel(const Scene2D& scene)
+  void GrayscaleWindowingSceneTracker::Cancel(Scene2D& scene)
   {
     SetWindowing(originalCenter_, originalWidth_);
   }
--- a/OrthancStone/Sources/Scene2D/GrayscaleWindowingSceneTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/GrayscaleWindowingSceneTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -54,8 +54,8 @@
                                    unsigned int canvasHeight);
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
   };
 }
--- a/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -62,7 +62,7 @@
       
 
   void MagnifyingGlassTracker::PointerUp(const PointerEvent& event,
-                                         const Scene2D& scene)
+                                         Scene2D& scene)
   {
     Cancel(scene);
     OneGesturePointerTracker::PointerUp(event, scene);
@@ -70,7 +70,7 @@
 
   
   void MagnifyingGlassTracker::PointerMove(const PointerEvent& event,
-                                           const Scene2D& scene)
+                                           Scene2D& scene)
   {
     ViewportLocker locker(viewport_);
     
@@ -81,7 +81,7 @@
   }
     
 
-  void MagnifyingGlassTracker::Cancel(const Scene2D& scene)
+  void MagnifyingGlassTracker::Cancel(Scene2D& scene)
   {
     ViewportLocker locker(viewport_);
     
--- a/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/MagnifyingGlassTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -46,11 +46,11 @@
                            const PointerEvent& event);
     
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE;
+                           Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
   };
 }
--- a/OrthancStone/Sources/Scene2D/PanSceneTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/PanSceneTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -44,7 +44,7 @@
 
 
   void PanSceneTracker::PointerMove(const PointerEvent& event,
-                                    const Scene2D& scene)
+                                    Scene2D& scene)
   {
     ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_);
 
@@ -61,7 +61,7 @@
     }
   }
 
-  void PanSceneTracker::Cancel(const Scene2D& scene)
+  void PanSceneTracker::Cancel(Scene2D& scene)
   {
     ViewportLocker locker(viewport_);
     
--- a/OrthancStone/Sources/Scene2D/PanSceneTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/PanSceneTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -40,8 +40,8 @@
                     const PointerEvent& event);
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
   };
 }
--- a/OrthancStone/Sources/Scene2D/PinchZoomTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/PinchZoomTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -65,7 +65,7 @@
 
 
   void PinchZoomTracker::PointerMove(const PointerEvent &event,
-                                     const Scene2D &scene)
+                                     Scene2D &scene)
   {
     if (state_ == State_OneFinger &&
         event.GetPositionsCount() == 2)
--- a/OrthancStone/Sources/Scene2D/PinchZoomTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/PinchZoomTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -53,16 +53,16 @@
                      const PointerEvent& event);
 
     virtual void PointerMove(const PointerEvent &event,
-                             const Scene2D &scene) ORTHANC_OVERRIDE;
+                             Scene2D &scene) ORTHANC_OVERRIDE;
 
     virtual void PointerUp(const PointerEvent &event,
-                           const Scene2D &scene) ORTHANC_OVERRIDE
+                           Scene2D &scene) ORTHANC_OVERRIDE
     {
       state_ = State_Dead;
     }
 
     virtual void PointerDown(const PointerEvent &event,
-                             const Scene2D &scene) ORTHANC_OVERRIDE
+                             Scene2D &scene) ORTHANC_OVERRIDE
     {
     }
 
@@ -71,7 +71,7 @@
       return state_ != State_Dead;
     }
 
-    virtual void Cancel(const Scene2D &scene) ORTHANC_OVERRIDE
+    virtual void Cancel(Scene2D &scene) ORTHANC_OVERRIDE
     {
       state_ = State_Dead;
     }
--- a/OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -45,7 +45,7 @@
 
   
   void RotateSceneTracker::PointerMove(const PointerEvent& event,
-                                       const Scene2D& scene)
+                                       Scene2D& scene)
   {
     if (aligner_.get() != NULL)
     {
@@ -80,7 +80,7 @@
   }
 
   
-  void RotateSceneTracker::Cancel(const Scene2D& scene)
+  void RotateSceneTracker::Cancel(Scene2D& scene)
   {
     ViewportLocker locker(viewport_);
     
--- a/OrthancStone/Sources/Scene2D/RotateSceneTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/RotateSceneTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -45,8 +45,8 @@
                        const PointerEvent& event);
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
   };
 }
--- a/OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/ZoomSceneTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -49,7 +49,7 @@
   }
   
   void ZoomSceneTracker::PointerMove(const PointerEvent& event,
-                                     const Scene2D& scene)
+                                     Scene2D& scene)
   {
     static const double MIN_ZOOM = -4;
     static const double MAX_ZOOM = 4;
@@ -93,7 +93,7 @@
     }
   }
 
-  void ZoomSceneTracker::Cancel(const Scene2D& scene)
+  void ZoomSceneTracker::Cancel(Scene2D& scene)
   {
     ViewportLocker locker(viewport_);
     
--- a/OrthancStone/Sources/Scene2D/ZoomSceneTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2D/ZoomSceneTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -48,8 +48,8 @@
                      unsigned int canvasHeight);
 
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
   };
 }
--- a/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -48,7 +48,7 @@
   }
 
   void CreateAngleMeasureTracker::PointerMove(const PointerEvent& event,
-                                              const Scene2D& scene)
+                                              Scene2D& scene)
   {
     if (!alive_)
     {
@@ -85,7 +85,7 @@
   }
 
   void CreateAngleMeasureTracker::PointerUp(const PointerEvent& e,
-                                            const Scene2D& scene)
+                                            Scene2D& scene)
   {
     // TODO: the current app does not prevent multiple PointerDown AND
     // PointerUp to be sent to the tracker.
@@ -111,7 +111,7 @@
   }
 
   void CreateAngleMeasureTracker::PointerDown(const PointerEvent& e,
-                                              const Scene2D& scene)
+                                              Scene2D& scene)
   {
     switch (state_)
     {
--- a/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/CreateAngleMeasureTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -46,13 +46,13 @@
     ~CreateAngleMeasureTracker();
 
     virtual void PointerMove(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerUp(const PointerEvent& e,
-                           const Scene2D& scene) ORTHANC_OVERRIDE;
+                           Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerDown(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
 
   private:
     boost::shared_ptr<CreateAngleMeasureCommand> GetCommand();
--- a/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -49,7 +49,7 @@
   }
 
   void CreateLineMeasureTracker::PointerMove(const PointerEvent& event,
-                                             const Scene2D& scene)
+                                             Scene2D& scene)
   {
     if (!alive_)
     {
@@ -75,7 +75,7 @@
   }
 
   void CreateLineMeasureTracker::PointerUp(const PointerEvent& e,
-                                           const Scene2D& scene)
+                                           Scene2D& scene)
   {
     // TODO: the current app does not prevent multiple PointerDown AND
     // PointerUp to be sent to the tracker.
@@ -86,7 +86,7 @@
   }
 
   void CreateLineMeasureTracker::PointerDown(const PointerEvent& e,
-                                             const Scene2D& scene)
+                                             Scene2D& scene)
   {
     LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) "
       "are ignored when the line measure creation tracker is active";
--- a/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/CreateLineMeasureTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -46,11 +46,13 @@
     ~CreateLineMeasureTracker();
 
     virtual void PointerMove(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
+
     virtual void PointerUp(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                           Scene2D& scene) ORTHANC_OVERRIDE;
+
     virtual void PointerDown(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
 
   private:
     boost::shared_ptr<CreateLineMeasureCommand> GetCommand();
--- a/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -51,7 +51,7 @@
   }
 
   void EditAngleMeasureTracker::PointerMove(const PointerEvent& e,
-                                            const Scene2D& scene)
+                                            Scene2D& scene)
   {
     std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     
@@ -108,13 +108,13 @@
   }
 
   void EditAngleMeasureTracker::PointerUp(const PointerEvent& e,
-                                          const Scene2D& scene)
+                                          Scene2D& scene)
   {
     alive_ = false;
   }
 
   void EditAngleMeasureTracker::PointerDown(const PointerEvent& e,
-                                            const Scene2D& scene)
+                                            Scene2D& scene)
   {
     LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) "
       "are ignored when the edit angle tracker is active";
--- a/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/EditAngleMeasureTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -46,13 +46,13 @@
     ~EditAngleMeasureTracker();
 
     virtual void PointerMove(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerUp(const PointerEvent& e,
-                           const Scene2D& scene) ORTHANC_OVERRIDE;
+                           Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerDown(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
 
   private:
     AngleMeasureTool::AngleHighlightArea modifiedZone_;
--- a/OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -47,7 +47,7 @@
   }
 
   void EditLineMeasureTracker::PointerMove(const PointerEvent& e,
-                                           const Scene2D& scene)
+                                           Scene2D& scene)
   {
     std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     ViewportController& controller = lock->GetController();
@@ -93,13 +93,13 @@
   }
 
   void EditLineMeasureTracker::PointerUp(const PointerEvent& e,
-                                         const Scene2D& scene)
+                                         Scene2D& scene)
   {
     alive_ = false;
   }
 
   void EditLineMeasureTracker::PointerDown(const PointerEvent& e,
-                                           const Scene2D& scene)
+                                           Scene2D& scene)
   {
     LOG(WARNING) << "Additional touches (fingers, pen, mouse buttons...) "
       "are ignored when the edit line tracker is active";
--- a/OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/EditLineMeasureTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -49,12 +49,12 @@
       const PointerEvent&             e);
 
     virtual void PointerMove(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerUp(const PointerEvent& e,
-                           const Scene2D& scene) ORTHANC_OVERRIDE;
+                           Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerDown(const PointerEvent& e,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
   };
 }
--- a/OrthancStone/Sources/Scene2DViewport/IFlexiblePointerTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/IFlexiblePointerTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -46,14 +46,14 @@
     This method will be repeatedly called during user interaction
     */
     virtual void PointerMove(const PointerEvent& event,
-                             const Scene2D& scene) = 0;
+                             Scene2D& scene) = 0;
 
     /**
     This method will be called when a touch/pointer is removed (mouse up, 
     pen lift, finger removed...)
     */
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) = 0;
+                           Scene2D& scene) = 0;
 
     /**
     This method will be called when a touch/pointer is added (mouse down, 
@@ -66,7 +66,7 @@
     PointerUp.
     */
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) = 0;
+                             Scene2D& scene) = 0;
 
     /**
     This method will be repeatedly called by the tracker owner (for instance,
@@ -80,6 +80,6 @@
     its changes to the underlying model. If the model has been modified during
     tracker lifetime, it must be restored to its initial value
     */
-    virtual void Cancel(const Scene2D& scene) = 0;
+    virtual void Cancel(Scene2D& scene) = 0;
   };
 }
--- a/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -42,7 +42,7 @@
       return NULL;
   }
 
-  void CreateMeasureTracker::Cancel(const Scene2D& scene)
+  void CreateMeasureTracker::Cancel(Scene2D& scene)
   {
     commitResult_ = false;
     alive_ = false;
@@ -93,7 +93,7 @@
       return NULL;
   }
 
-  void EditMeasureTracker::Cancel(const Scene2D& scene)
+  void EditMeasureTracker::Cancel(Scene2D& scene)
   {
     commitResult_ = false;
     alive_ = false;
--- a/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/MeasureTrackers.h	Sun Oct 04 11:13:59 2026 +0200
@@ -57,7 +57,7 @@
     virtual ~CreateMeasureTracker();
     
   public:
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual bool IsAlive() const ORTHANC_OVERRIDE;
   };
@@ -91,7 +91,7 @@
     }
 
   public:
-    virtual void Cancel(const Scene2D& scene) ORTHANC_OVERRIDE;
+    virtual void Cancel(Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual bool IsAlive() const ORTHANC_OVERRIDE;
   };
--- a/OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.cpp	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.cpp	Sun Oct 04 11:13:59 2026 +0200
@@ -36,7 +36,7 @@
   }
 
   void OneGesturePointerTracker::PointerUp(const PointerEvent& event,
-                                           const Scene2D& scene)
+                                           Scene2D& scene)
   {
     // pointer up is only called for the LAST up event in case of a multi-touch
     // gesture
@@ -51,7 +51,7 @@
   }
 
   void OneGesturePointerTracker::PointerDown(const PointerEvent& event,
-                                             const Scene2D& scene)
+                                             Scene2D& scene)
   {
     // additional touches are not taken into account but we need to count 
     // the number of active touches
--- a/OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Scene2DViewport/OneGesturePointerTracker.h	Sun Oct 04 11:13:59 2026 +0200
@@ -53,10 +53,10 @@
     explicit OneGesturePointerTracker();
     
     virtual void PointerUp(const PointerEvent& event,
-                           const Scene2D& scene) ORTHANC_OVERRIDE;
+                           Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual void PointerDown(const PointerEvent& event,
-                             const Scene2D& scene) ORTHANC_OVERRIDE;
+                             Scene2D& scene) ORTHANC_OVERRIDE;
     
     virtual bool IsAlive() const ORTHANC_OVERRIDE;
   };
--- a/OrthancStone/Sources/Viewport/IViewportInteractor.h	Sun Oct 04 09:55:07 2026 +0200
+++ b/OrthancStone/Sources/Viewport/IViewportInteractor.h	Sun Oct 04 11:13:59 2026 +0200
@@ -34,14 +34,14 @@
     {
     }
 
-    virtual IFlexiblePointerTracker* CreateTracker(boost::weak_ptr<IViewport> viewport,
+    virtual IFlexiblePointerTracker* CreateTracker(boost::weak_ptr<IViewport> viewport,  // TODO Refresh - Why not reference here?
                                                    const PointerEvent& event,
                                                    unsigned int viewportWidth,
                                                    unsigned int viewportHeight) = 0;
 
     virtual bool HasMouseHover() const = 0;
 
-    virtual void HandleMouseHover(IViewport& viewport,
+    virtual void HandleMouseHover(IViewport& viewport,  // TODO Refresh - Why not IViewport::ILock here?
                                   const PointerEvent& event) = 0;
   };
 }