diff Framework/Scene2DViewport/ViewportController.h @ 1331:ab81ee8fce1f broker

- Viewport is not passed and stored as a shared_ptr instead of raw reference. - ViewportController can now be injected with an undo stack (not a ctor param anymore, as a preparation for the move of the undo stack to an interactor) - Added (temp) flag to disable emscripten events registration in the WebAssemblyViewport (because legacy client code deals with them directly) - Added emscripten_clear_timeout in ~WebGLViewportsRegistry - Removed GenericToolbox::HoldingRef whose responsibility is better served with proper callback un-registration.
author Benjamin Golinvaux <bgo@osimis.io>
date Mon, 30 Mar 2020 14:23:46 +0200
parents adf234ecaa00
children 30deba7bc8e2
line wrap: on
line diff
--- a/Framework/Scene2DViewport/ViewportController.h	Mon Mar 30 08:47:30 2020 +0200
+++ b/Framework/Scene2DViewport/ViewportController.h	Mon Mar 30 14:23:46 2020 +0200
@@ -41,7 +41,7 @@
     {
     }
 
-    virtual IFlexiblePointerTracker* CreateTracker(IViewport& viewport,
+    virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr<IViewport> viewport,
                                                    const PointerEvent& event,
                                                    unsigned int viewportWidth,
                                                    unsigned int viewportHeight) = 0;
@@ -52,7 +52,7 @@
   class DefaultViewportInteractor : public IViewportInteractor
   {
   public:
-    virtual IFlexiblePointerTracker* CreateTracker(IViewport& viewport,
+    virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr<IViewport> viewport,
                                                    const PointerEvent& event,
                                                    unsigned int viewportWidth,
                                                    unsigned int viewportHeight) ORTHANC_OVERRIDE;
@@ -109,13 +109,10 @@
   {
   public:
     ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, \
-                                        SceneTransformChanged, ViewportController);
-
-    ViewportController(IViewport& viewport);
+                                        SceneTransformChanged, \
+                                        ViewportController);
 
-    ViewportController(IViewport& viewport, const Scene2D& scene /* will be cloned */);
-
-    ViewportController(IViewport& viewport, boost::weak_ptr<UndoStack> undoStackW);
+    ViewportController(boost::shared_ptr<IViewport> viewport);
 
     ~ViewportController();
 
@@ -124,7 +121,8 @@
     (in scene coords). A tracker can then be requested from the chosen 
     measure tool, if needed
     */
-    std::vector<boost::shared_ptr<MeasureTool> > HitTestMeasureTools(ScenePoint2D p);
+    std::vector<boost::shared_ptr<MeasureTool> > HitTestMeasureTools(
+      ScenePoint2D p);
 
     /**
     This function will traverse the measuring tools and will clear their 
@@ -223,6 +221,34 @@
       return *scene_;
     }
 
+    /**
+    This method is used in a move pattern: when the ownership of the scene 
+    managed by this viewport controller must be transferred to another 
+    controller.
+    */
+    Scene2D* ReleaseScene()
+    {
+      return scene_.release();
+    }
+
+    /**
+    This method is used when one wishes to replace the scene that is currently
+    managed by the controller. The previous scene is deleted and the controller
+    now has ownership of the new one.
+    */
+    void AcquireScene(Scene2D* scene)
+    {
+      scene_.reset(scene);
+    }
+
+    /**
+    Sets the undo stack that is used by PushCommand, Undo...
+    */
+    void SetUndoStack(boost::weak_ptr<UndoStack> undoStackW)
+    {
+      undoStackW_ = undoStackW;
+    }
+    
     bool HasActiveTracker() const
     {
       return activeTracker_.get() != NULL;
@@ -231,7 +257,7 @@
   private:
     double GetCanvasToSceneFactor() const;
 
-    IViewport&                                    viewport_;
+    boost::shared_ptr<IViewport>                  viewport_;
     boost::weak_ptr<UndoStack>                    undoStackW_;  // Global stack, possibly shared by all viewports
     std::vector<boost::shared_ptr<MeasureTool> >  measureTools_;
     boost::shared_ptr<IFlexiblePointerTracker>    activeTracker_;  // TODO - Couldn't this be a "std::unique_ptr"?