changeset 2385:bebd0583ebda refactoring

move IViewport::GetController() outside of ILock
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sun, 11 Oct 2026 10:21:23 +0200
parents 83ea57ed2863
children f5f903bfa044
files Applications/Samples/Common/RtViewerView.cpp Applications/Samples/Common/SimpleViewerCore.cpp Applications/Samples/Sdl/RtViewer/RtViewerSdl.cpp Applications/Samples/Sdl/SingleViewportSdlApplication.cpp Applications/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h OrthancStone/Sources/Platforms/Sdl/SdlViewport.cpp OrthancStone/Sources/Platforms/Sdl/SdlViewport.h OrthancStone/Sources/Platforms/WebAssembly/WebAssemblyViewport.cpp OrthancStone/Sources/Platforms/WebAssembly/WebAssemblyViewport.h OrthancStone/Sources/Platforms/WebAssembly/WebGLViewportsRegistry.cpp OrthancStone/Sources/Platforms/WebAssembly/WebGLViewportsRegistry.h OrthancStone/Sources/Viewport/IViewport.h
diffstat 12 files changed, 62 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/Applications/Samples/Common/RtViewerView.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/Applications/Samples/Common/RtViewerView.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -83,7 +83,7 @@
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
 
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Scene2D& scene = controller.GetScene();
 
     std::stringstream msg;
@@ -119,7 +119,7 @@
   void RtViewerView::DisplayFloatingCtrlInfoText(const PointerEvent& e)
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Scene2D& scene = controller.GetScene();
 
     ScenePoint2D p = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform());
@@ -151,7 +151,7 @@
   void RtViewerView::HideInfoText()
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Scene2D& scene = controller.GetScene();
 
     scene.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX);
@@ -166,14 +166,14 @@
   void RtViewerView::Invalidate()
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    lock->GetCompositor().FitContent(lock->GetController().GetScene());
+    lock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
     lock->Invalidate();
   }
 
   void RtViewerView::FitContent()
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    lock->GetCompositor().FitContent(lock->GetController().GetScene());
+    lock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
     lock->Invalidate();
   }
 
@@ -234,15 +234,15 @@
     {
       if (ctVolumeLayerSource_.get() != NULL)
       {
-        ctVolumeLayerSource_->Update(lock->GetController().GetScene(), planes_[currentPlane_]);
+        ctVolumeLayerSource_->Update(viewport_->GetController()->GetScene(), planes_[currentPlane_]);
       }
       if (doseVolumeLayerSource_.get() != NULL)
       {
-        doseVolumeLayerSource_->Update(lock->GetController().GetScene(), planes_[currentPlane_]);
+        doseVolumeLayerSource_->Update(viewport_->GetController()->GetScene(), planes_[currentPlane_]);
       }
       if (structLayerSource_.get() != NULL)
       {
-        structLayerSource_->Update(lock->GetController().GetScene(), planes_[currentPlane_]);
+        structLayerSource_->Update(viewport_->GetController()->GetScene(), planes_[currentPlane_]);
       }
     }
     lock->Invalidate();
@@ -259,7 +259,7 @@
      **/
     lock->RefreshCanvasSize();
     
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     ICompositor& compositor = lock->GetCompositor();
 
     // False means we do NOT let a hi-DPI aware desktop managedr treat this as a legacy application that requires
@@ -285,7 +285,7 @@
   void RtViewerView::RegisterMessages()
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Register<ViewportController::SceneTransformChanged>(controller, &RtViewerView::OnSceneTransformChanged);
   }
 
@@ -321,7 +321,7 @@
                                        ILayerStyleConfigurator* style)
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Scene2D& scene = controller.GetScene();
     int depth = scene.GetMaxDepth() + 1;
 
@@ -339,7 +339,7 @@
                                          ILayerStyleConfigurator* style)
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Scene2D& scene = controller.GetScene();
     int depth = scene.GetMaxDepth() + 1;
 
@@ -354,7 +354,7 @@
   void RtViewerView::SetStructureSet(const boost::shared_ptr<DicomStructureSetLoader>& volume)
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     Scene2D& scene = controller.GetScene();
     int depth = scene.GetMaxDepth() + 1;
 
--- a/Applications/Samples/Common/SimpleViewerCore.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -51,10 +51,11 @@
     //layer->SetLinearInterpolation(true);
     layer->SetLinearInterpolation(false);
 
+    viewport_->GetController()->GetScene().SetLayer(0, layer.release());
+
     {
       std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-      viewportLock->GetController().GetScene().SetLayer(0, layer.release());
-      viewportLock->GetCompositor().FitContent(viewportLock->GetController().GetScene());
+      viewportLock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
       viewportLock->Invalidate();
     }
   }
@@ -122,7 +123,7 @@
   {
     // This is necessary to update the size of handles in the annotations layer while zoom level changes
     std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport_->Lock());
-    annotations_->Render(lock->GetController().GetScene());
+    annotations_->Render(viewport_->GetController()->GetScene());
     lock->Invalidate();
   }
 
@@ -154,10 +155,7 @@
 
     Register<AnnotationsSceneLayer::AnnotationRemovedMessage>(*annotations_, &SimpleViewerCore::Handle);
 
-    {
-      std::unique_ptr<IViewport::ILock> viewportLock(viewport->Lock());
-      viewportLock->GetController().SetUndoStack(boost::make_shared<UndoStack>());
-    }
+    viewport_->GetController()->SetUndoStack(boost::make_shared<UndoStack>());
 
 #if 0 && TEST_MEASURE_TOOLS == 1    // TODO Refactoring - Reenable this
     {
@@ -261,14 +259,14 @@
         std::unique_ptr<IViewport::ILock> viewportLock(core_->viewport_->Lock());
 
         std::vector< boost::shared_ptr<MeasureTool> > tools;
-        tools = viewportLock->GetController().HitTestMeasureTools(p);
+        tools = core_->viewport_->GetController()->HitTestMeasureTools(p);
 
         if (!tools.empty())
         {
           if (core_->annotations_->GetActiveTool() == AnnotationsSceneLayer::Tool_Remove)
           {
             boost::shared_ptr<MeasureCommand> command(new DeleteMeasureCommand(tools[0]));
-            viewportLock->GetController().PushCommand(command);
+            core_->viewport_->GetController()->PushCommand(command);
             return NULL;
           }
           else
@@ -285,10 +283,10 @@
               break;
 
             case AnnotationsSceneLayer::Tool_Length:
-              return viewportLock->GetController().CreateLineMeasure(event);
+              return core_->viewport_->GetController()->CreateLineMeasure(event);
 
             case AnnotationsSceneLayer::Tool_Angle:
-              return viewportLock->GetController().CreateAngleMeasure(event);
+              return core_->viewport_->GetController()->CreateAngleMeasure(event);
 
             default:
               LOG(ERROR) << "This tool is not supported if not using the annotations layer";
@@ -345,7 +343,7 @@
       case 's':
       {
         std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-        viewportLock->GetCompositor().FitContent(viewportLock->GetController().GetScene());
+        viewportLock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
         viewportLock->Invalidate();
         break;
       }
@@ -353,19 +351,18 @@
       case 'u':
       {
         std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-        if (viewportLock->GetController().CanUndo())
+        if (viewport_->GetController()->CanUndo())
         {
-          viewportLock->GetController().Undo();
+          viewport_->GetController()->Undo();
         }
         break;
       }
 
       case 'U':
       {
-        std::unique_ptr<IViewport::ILock> viewportLock(viewport_->Lock());
-        if (viewportLock->GetController().CanRedo())
+        if (viewport_->GetController()->CanRedo())
         {
-          viewportLock->GetController().Redo();
+          viewport_->GetController()->Redo();
         }
         break;
       }
--- a/Applications/Samples/Sdl/RtViewer/RtViewerSdl.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/Applications/Samples/Sdl/RtViewer/RtViewerSdl.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -174,7 +174,7 @@
                                    unsigned int canvasHeight)
   {
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = lock->GetController();
+    ViewportController& controller = *viewport_->GetController();
     const Scene2D& scene = controller.GetScene();
 
     std::string ttf;
@@ -319,7 +319,7 @@
             case SDLK_s:
             {
               std::unique_ptr<IViewport::ILock> lock(view->GetViewport()->Lock());
-              lock->GetCompositor().FitContent(lock->GetController().GetScene());
+              lock->GetCompositor().FitContent(view->GetViewport()->GetController()->GetScene());
               lock->Invalidate();
             }
             break;
@@ -350,17 +350,17 @@
               {
               case SDL_MOUSEBUTTONDOWN:
                 interactor.SetWindowingLayer(view->GetCtLayerIndex());
-                lock->GetController().HandleMousePress(interactor, p,
-                                                       lock->GetCompositor().GetCanvasWidth(),
-                                                       lock->GetCompositor().GetCanvasHeight());
+                view->GetViewport()->GetController()->HandleMousePress(interactor, p,
+                                                                       lock->GetCompositor().GetCanvasWidth(),
+                                                                       lock->GetCompositor().GetCanvasHeight());
                 break;
 
               case SDL_MOUSEMOTION:
-                lock->GetController().HandleMouseMove(p);
+                view->GetViewport()->GetController()->HandleMouseMove(p);
                 break;
 
               case SDL_MOUSEBUTTONUP:
-                lock->GetController().HandleMouseRelease(p);
+                view->GetViewport()->GetController()->HandleMouseRelease(p);
                 break;
 
               default:
--- a/Applications/Samples/Sdl/SingleViewportSdlApplication.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/Applications/Samples/Sdl/SingleViewportSdlApplication.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -119,27 +119,27 @@
             {
             case SDL_MOUSEBUTTONDOWN:
             {
-              viewportLock->GetController().HandleMousePress(*interactor, p, viewportLock->GetCompositor().GetCanvasWidth(),
-                                                             viewportLock->GetCompositor().GetCanvasHeight());
+              viewport_->GetController()->HandleMousePress(*interactor, p, viewportLock->GetCompositor().GetCanvasWidth(),
+                                                           viewportLock->GetCompositor().GetCanvasHeight());
               break;
             }
 
             case SDL_MOUSEMOTION:
             {
-              if (viewportLock->GetController().HasActiveTracker())
+              if (viewport_->GetController()->HasActiveTracker())
               {
-                viewportLock->GetController().HandleMouseMove(p);
+                viewport_->GetController()->HandleMouseMove(p);
               }
               else if (interactor->HasMouseHover())
               {
-                interactor->HandleMouseHover(viewportLock->GetController().GetScene(), p);
+                interactor->HandleMouseHover(viewport_->GetController()->GetScene(), p);
                 viewportLock->Invalidate();
               }
               break;
             }
 
             case SDL_MOUSEBUTTONUP:
-              viewportLock->GetController().HandleMouseRelease(p);
+              viewport_->GetController()->HandleMouseRelease(p);
               break;
 
             default:
--- a/Applications/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h	Sun Oct 11 09:56:59 2026 +0200
+++ b/Applications/Samples/WebAssembly/SingleFrameViewer/SingleFrameViewerApplication.h	Sun Oct 11 10:21:23 2026 +0200
@@ -59,10 +59,11 @@
         message.GetInstanceParameters().CreateTexture(message.GetImage()));
       layer->SetLinearInterpolation(true);
 
+      viewport_->GetController()->GetScene().SetLayer(0, layer.release());
+
       {
         std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-        lock->GetController().GetScene().SetLayer(0, layer.release());
-        lock->GetCompositor().FitContent(lock->GetController().GetScene());
+        lock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
         lock->Invalidate();
       }
     }
@@ -137,7 +138,7 @@
     void FitContent()
     {
       std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-      lock->GetCompositor().FitContent(lock->GetController().GetScene());
+      lock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
       lock->Invalidate();
     }
   };
--- a/OrthancStone/Sources/Platforms/Sdl/SdlViewport.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Platforms/Sdl/SdlViewport.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -146,7 +146,7 @@
   void SdlOpenGLViewport::Paint()
   {
     SdlLock lock(*this);
-    lock.GetCompositor().Refresh(lock.GetController().GetScene());
+    lock.GetCompositor().Refresh(GetController()->GetScene());
   }
 #endif
 
@@ -196,7 +196,7 @@
   {
     SdlLock lock(*this);
 
-    lock.GetCompositor().Refresh(lock.GetController().GetScene());
+    lock.GetCompositor().Refresh(GetController()->GetScene());
     CreateSdlSurfaceFromCompositor(dynamic_cast<CairoCompositor&>(lock.GetCompositor()));
     
     if (sdlSurface_ != NULL)
--- a/OrthancStone/Sources/Platforms/Sdl/SdlViewport.h	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Platforms/Sdl/SdlViewport.h	Sun Oct 11 10:21:23 2026 +0200
@@ -87,11 +87,6 @@
 
       virtual ICompositor& GetCompositor() ORTHANC_OVERRIDE;
       
-      virtual ViewportController& GetController() ORTHANC_OVERRIDE
-      {
-        return *that_.controller_;
-      }
-
       virtual void Invalidate() ORTHANC_OVERRIDE
       {
         that_.SendRefreshEvent();
@@ -137,6 +132,11 @@
 
     // Must be invoked from the main SDL thread
     virtual void Paint() = 0;
+
+    virtual const boost::shared_ptr<ViewportController>& GetController() const ORTHANC_OVERRIDE
+    {
+      return controller_;
+    }
   };
 
 
--- a/OrthancStone/Sources/Platforms/WebAssembly/WebAssemblyViewport.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Platforms/WebAssembly/WebAssemblyViewport.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -105,12 +105,6 @@
       }
     }
 
-    virtual ViewportController& GetController() ORTHANC_OVERRIDE
-    {
-      assert(that_.controller_);
-      return *that_.controller_;
-    }
-
     virtual void Invalidate() ORTHANC_OVERRIDE
     {
       that_.Invalidate();
--- a/OrthancStone/Sources/Platforms/WebAssembly/WebAssemblyViewport.h	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Platforms/WebAssembly/WebAssemblyViewport.h	Sun Oct 11 10:21:23 2026 +0200
@@ -179,5 +179,10 @@
     }
 
     void FitForPrint();
+
+    virtual const boost::shared_ptr<ViewportController>& GetController() const ORTHANC_OVERRIDE
+    {
+      return controller_;
+    }
   };
 }
--- a/OrthancStone/Sources/Platforms/WebAssembly/WebGLViewportsRegistry.cpp	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Platforms/WebAssembly/WebGLViewportsRegistry.cpp	Sun Oct 11 10:21:23 2026 +0200
@@ -82,12 +82,12 @@
           std::unique_ptr<IViewport::ILock> lock(it->second->Lock());
 
           // TODO: remove ViewportController
-          Scene2D* scene = lock->GetController().ReleaseScene();
+          Scene2D* scene = it->second->GetController()->ReleaseScene();
           viewport = WebGLViewport::Create(it->first);
 
           {
             std::unique_ptr<IViewport::ILock> newLock(viewport->Lock());
-            newLock->GetController().AcquireScene(scene);
+            it->second->GetController()->AcquireScene(scene);
           }
         }
 
--- a/OrthancStone/Sources/Platforms/WebAssembly/WebGLViewportsRegistry.h	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Platforms/WebAssembly/WebGLViewportsRegistry.h	Sun Oct 11 10:21:23 2026 +0200
@@ -29,6 +29,8 @@
 
 namespace OrthancStone
 {
+  // TODO Refactoring - Move this class to graveyard
+
   /**
    * This singleton class must be used if many WebGL viewports are
    * created by the higher-level application, implying possible loss
--- a/OrthancStone/Sources/Viewport/IViewport.h	Sun Oct 11 09:56:59 2026 +0200
+++ b/OrthancStone/Sources/Viewport/IViewport.h	Sun Oct 11 10:21:23 2026 +0200
@@ -57,12 +57,6 @@
       */
       virtual ICompositor& GetCompositor() = 0;
 
-      /**
-      Do not store the result! Only access the compositor interface through
-      the lock.
-      */
-      virtual ViewportController& GetController() = 0;  // TODO Refactoring - Remove this
-
       virtual void Invalidate() = 0;
 
 
@@ -82,5 +76,7 @@
     }
 
     virtual ILock* Lock() = 0;
+
+    virtual const boost::shared_ptr<ViewportController>& GetController() const = 0;  // TODO Refactoring - Remove this
   };
 }