diff Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp @ 1789:462d7a0e064e

added line measures to sdl single frame viewer sample
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 17 May 2021 11:55:21 +0200
parents 9ac2a65d4172
children b325761e0bd3
line wrap: on
line diff
--- a/Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp	Sat May 15 12:17:17 2021 +0200
+++ b/Applications/Samples/Sdl/SingleFrameViewer/SdlSimpleViewer.cpp	Mon May 17 11:55:21 2021 +0200
@@ -24,12 +24,15 @@
 #include "../../Common/SampleHelpers.h"
 
 #include "../../../../OrthancStone/Sources/Loaders/GenericLoadersContext.h"
+#include "../../../../OrthancStone/Sources/Scene2DViewport/LineMeasureTool.h"
+#include "../../../../OrthancStone/Sources/Scene2DViewport/UndoStack.h"
 #include "../../../../OrthancStone/Sources/StoneEnumerations.h"
 #include "../../../../OrthancStone/Sources/StoneException.h"
 #include "../../../../OrthancStone/Sources/StoneInitialization.h"
 #include "../../../../OrthancStone/Sources/Viewport/DefaultViewportInteractor.h"
 #include "../../../Platforms/Sdl/SdlViewport.h"
 
+#include <EmbeddedResources.h>
 #include <Compatibility.h>  // For std::unique_ptr<>
 #include <OrthancException.h>
 
@@ -65,6 +68,17 @@
 
   std::cout << desc << std::endl;
 
+  std::cout << std::endl << "Keyboard shorcuts:" << std::endl
+            << "  f\tToggle fullscreen display" << std::endl
+            << "  l\tEnable/disable the line measure tool" << std::endl
+            << "  q\tExit" << std::endl
+            << "  s\tFit the viewpoint to the image" << std::endl
+            << std::endl << "Mouse buttons:" << std::endl
+            << "  left  \tChange windowing, or edit measure" << std::endl
+            << "  center\tMove the viewpoint, or move measure" << std::endl
+            << "  right \tZoom, or move measure" << std::endl
+            << std::endl;
+
   po::variables_map vm;
   try
   {
@@ -127,6 +141,8 @@
         OrthancStone::SdlCairoViewport::Create("Stone of Orthanc", 800, 600);
 #endif
 
+      boost::shared_ptr<OrthancStone::UndoStack> undoStack(new OrthancStone::UndoStack);
+
       OrthancStone::GenericLoadersContext context(1, 4, 1);
 
       Orthanc::WebServiceParameters orthancWebService;
@@ -136,6 +152,19 @@
       context.StartOracle();
 
       {
+        {
+          std::string font;
+          Orthanc::EmbeddedResources::GetFileResource(font, Orthanc::EmbeddedResources::UBUNTU_FONT);
+          
+          std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock());
+          lock->GetCompositor().SetFont(0, font, 16, Orthanc::Encoding_Latin1);
+          lock->GetController().SetUndoStack(undoStack);
+        }
+
+        boost::shared_ptr<OrthancStone::LineMeasureTool> lineMeasureTool(OrthancStone::LineMeasureTool::Create(viewport));
+        bool lineMeasureFirst = true;
+        bool lineMeasureEnabled = false;
+        lineMeasureTool->Disable();
 
         boost::shared_ptr<SdlSimpleViewerApplication> application(
           SdlSimpleViewerApplication::Create(context, viewport));
@@ -185,20 +214,46 @@
               {
                 switch (event.key.keysym.sym)
                 {
-                case SDLK_f:
-                  viewport->ToggleMaximize();
-                  break;
+                  case SDLK_f:
+                    viewport->ToggleMaximize();
+                    break;
+
+                  case SDLK_s:
+                    application->FitContent();
+                    break;
+
+                  case SDLK_q:
+                    stop = true;
+                    break;
 
-                case SDLK_s:
-                  application->FitContent();
-                  break;
+                  case SDLK_l:
+                    if (lineMeasureEnabled)
+                    {
+                      lineMeasureTool->Disable();
+                      lineMeasureEnabled = false;
+                    }
+                    else
+                    {
+                      if (lineMeasureFirst)
+                      {
+                        std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock());
+                        OrthancStone::Extent2D extent;
+                        lock->GetController().GetScene().GetBoundingBox(extent);
+                        if (!extent.IsEmpty())
+                        {
+                          OrthancStone::ScenePoint2D p(extent.GetCenterX(), extent.GetCenterY());
+                          lineMeasureTool->Set(p, p);
+                        }
+                        lineMeasureFirst = false;
+                      }
+                      
+                      lineMeasureTool->Enable();
+                      lineMeasureEnabled = true;
+                    }
+                    break;
 
-                case SDLK_q:
-                  stop = true;
-                  break;
-
-                default:
-                  break;
+                  default:
+                    break;
                 }
               }
               else if (event.type == SDL_MOUSEBUTTONDOWN ||
@@ -214,27 +269,42 @@
 
                   switch (event.type)
                   {
-                  case SDL_MOUSEBUTTONDOWN:
-                    lock->GetController().HandleMousePress(interactor, p,
-                                                           lock->GetCompositor().GetCanvasWidth(),
-                                                           lock->GetCompositor().GetCanvasHeight());
-                    lock->Invalidate();
-                    break;
-
-                  case SDL_MOUSEMOTION:
-                    if (lock->GetController().HandleMouseMove(p))
+                    case SDL_MOUSEBUTTONDOWN:
                     {
+                      boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t;
+                      if (lineMeasureEnabled)
+                      {
+                        t = lineMeasureTool->CreateEditionTracker(p);
+                      }
+                      
+                      if (t.get() != NULL)
+                      {
+                        lock->GetController().AcquireActiveTracker(t);
+                      }
+                      else
+                      {
+                        lock->GetController().HandleMousePress(interactor, p,
+                                                               lock->GetCompositor().GetCanvasWidth(),
+                                                               lock->GetCompositor().GetCanvasHeight());
+                      }
                       lock->Invalidate();
+                      break;
                     }
-                    break;
 
-                  case SDL_MOUSEBUTTONUP:
-                    lock->GetController().HandleMouseRelease(p);
-                    lock->Invalidate();
-                    break;
+                    case SDL_MOUSEMOTION:
+                      if (lock->GetController().HandleMouseMove(p))
+                      {
+                        lock->Invalidate();
+                      }
+                      break;
 
-                  default:
-                    throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+                    case SDL_MOUSEBUTTONUP:
+                      lock->GetController().HandleMouseRelease(p);
+                      lock->Invalidate();
+                      break;
+
+                    default:
+                      throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
                   }
                 }
               }