changeset 2387:560be8bec5d7 refactoring

SimpleViewerCore does not use IViewport
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sun, 11 Oct 2026 10:45:16 +0200
parents f5f903bfa044
children 153403085188
files Applications/Samples/Common/RtViewerView.cpp Applications/Samples/Common/SimpleViewerCore.cpp Applications/Samples/Common/SimpleViewerCore.h
diffstat 3 files changed, 26 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/Applications/Samples/Common/RtViewerView.cpp	Sun Oct 11 10:33:33 2026 +0200
+++ b/Applications/Samples/Common/RtViewerView.cpp	Sun Oct 11 10:45:16 2026 +0200
@@ -118,9 +118,7 @@
 
   void RtViewerView::DisplayFloatingCtrlInfoText(const PointerEvent& e)
   {
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = *viewport_->GetController();
-    Scene2D& scene = controller.GetScene();
+    Scene2D& scene = viewport_->GetController()->GetScene();
 
     ScenePoint2D p = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform());
 
@@ -150,11 +148,7 @@
 
   void RtViewerView::HideInfoText()
   {
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    ViewportController& controller = *viewport_->GetController();
-    Scene2D& scene = controller.GetScene();
-
-    scene.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX);
+    viewport_->GetController()->GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX);
   }
 
   void RtViewerView::OnSceneTransformChanged(
@@ -165,16 +159,12 @@
 
   void RtViewerView::Invalidate()
   {
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    lock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
-    lock->Invalidate();
+    viewport_->GetController()->InvalidateViewport();
   }
 
   void RtViewerView::FitContent()
   {
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
-    lock->GetCompositor().FitContent(viewport_->GetController()->GetScene());
-    lock->Invalidate();
+    viewport_->GetController()->FitContent();
   }
 
   void RtViewerView::Scroll(int delta)
@@ -223,6 +213,7 @@
 
   void RtViewerView::UpdateLayers()
   {
+    // TODO Refactoring - Moving this lock down results in crash => is the environment mutex locked?
     std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
 
     if (planes_.size() == 0)
--- a/Applications/Samples/Common/SimpleViewerCore.cpp	Sun Oct 11 10:33:33 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.cpp	Sun Oct 11 10:45:16 2026 +0200
@@ -51,8 +51,8 @@
     //layer->SetLinearInterpolation(true);
     layer->SetLinearInterpolation(false);
 
-    viewport_->GetController()->GetScene().SetLayer(0, layer.release());
-    viewport_->GetController()->FitContent();
+    controller_->GetScene().SetLayer(0, layer.release());
+    controller_->FitContent();
   }
 
 
@@ -116,8 +116,8 @@
 
   void SimpleViewerCore::RenderAnnotations()
   {
-    annotations_->Render(viewport_->GetController()->GetScene());
-    viewport_->GetController()->InvalidateViewport();
+    annotations_->Render(controller_->GetScene());
+    controller_->InvalidateViewport();
   }
 
 
@@ -136,14 +136,14 @@
     }
 
     if (context_ ||
-        viewport_ ||
+        controller_ ||
         annotations_)
     {
       throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
     }
 
     context_ = context;
-    viewport_ = viewport;
+    controller_ = viewport->GetController();
 
     dicomLoader_ = DicomResourcesLoader::Create(*context);
 
@@ -159,26 +159,26 @@
 
     Register<AnnotationsSceneLayer::AnnotationRemovedMessage>(*annotations_, &SimpleViewerCore::Handle);
 
-    viewport_->GetController()->SetUndoStack(boost::make_shared<UndoStack>());
+    controller_->SetUndoStack(boost::make_shared<UndoStack>());
 
 #if TEST_MEASURE_TOOLS == 1
     {
-      boost::shared_ptr<LineMeasureTool> tool = OrthancStone::LineMeasureTool::Create(viewport_->GetController());
+      boost::shared_ptr<LineMeasureTool> tool = OrthancStone::LineMeasureTool::Create(controller_);
       tool->Enable();
       tool->Set(OrthancStone::ScenePoint2D(200, 100),
                 OrthancStone::ScenePoint2D(100, 200));
 
-      viewport_->GetController()->AddMeasureTool(boost::dynamic_pointer_cast<MeasureTool>(tool));
+      controller_->AddMeasureTool(boost::dynamic_pointer_cast<MeasureTool>(tool));
     }
 
     {
-      boost::shared_ptr<AngleMeasureTool> tool = OrthancStone::AngleMeasureTool::Create(viewport_->GetController());
+      boost::shared_ptr<AngleMeasureTool> tool = OrthancStone::AngleMeasureTool::Create(controller_);
       tool->Enable();
       tool->SetCenter(OrthancStone::ScenePoint2D(300, 300));
       tool->SetSide1End(OrthancStone::ScenePoint2D(200, 400));
       tool->SetSide2End(OrthancStone::ScenePoint2D(400, 400));
 
-      viewport_->GetController()->AddMeasureTool(boost::dynamic_pointer_cast<MeasureTool>(tool));
+      controller_->AddMeasureTool(boost::dynamic_pointer_cast<MeasureTool>(tool));
     }
 #endif
   }
@@ -259,14 +259,14 @@
         const ScenePoint2D p = event.GetMainPosition().Apply(scene.GetCanvasToSceneTransform());
 
         std::vector< boost::shared_ptr<MeasureTool> > tools;
-        tools = core_->viewport_->GetController()->HitTestMeasureTools(p);
+        tools = core_->controller_->HitTestMeasureTools(p);
 
         if (!tools.empty())
         {
           if (core_->annotations_->GetActiveTool() == AnnotationsSceneLayer::Tool_Remove)
           {
             boost::shared_ptr<MeasureCommand> command(new DeleteMeasureCommand(tools[0]));
-            core_->viewport_->GetController()->PushCommand(command);
+            core_->controller_->PushCommand(command);
             return NULL;
           }
           else
@@ -283,10 +283,10 @@
               break;
 
             case AnnotationsSceneLayer::Tool_Length:
-              return core_->viewport_->GetController()->CreateLineMeasure(event);
+              return core_->controller_->CreateLineMeasure(event);
 
             case AnnotationsSceneLayer::Tool_Angle:
-              return core_->viewport_->GetController()->CreateAngleMeasure(event);
+              return core_->controller_->CreateAngleMeasure(event);
 
             default:
               LOG(ERROR) << "This tool is not supported if not using the annotations layer";
@@ -341,23 +341,23 @@
     switch (key)
     {
       case 's':
-        viewport_->GetController()->FitContent();
+        controller_->FitContent();
         break;
 
       case 'u':
       {
-        if (viewport_->GetController()->CanUndo())
+        if (controller_->CanUndo())
         {
-          viewport_->GetController()->Undo();
+          controller_->Undo();
         }
         break;
       }
 
       case 'U':
       {
-        if (viewport_->GetController()->CanRedo())
+        if (controller_->CanRedo())
         {
-          viewport_->GetController()->Redo();
+          controller_->Redo();
         }
         break;
       }
--- a/Applications/Samples/Common/SimpleViewerCore.h	Sun Oct 11 10:33:33 2026 +0200
+++ b/Applications/Samples/Common/SimpleViewerCore.h	Sun Oct 11 10:45:16 2026 +0200
@@ -40,7 +40,7 @@
   {
   protected:
     boost::shared_ptr<StoneApplication::Context>  context_;
-    boost::shared_ptr<IViewport>                  viewport_;
+    boost::shared_ptr<ViewportController>         controller_;
 
   private:
     class Interactor;