diff OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp @ 1972:9c0adcc8feec

refactoring to simplify OneGesturePointerTracker
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 28 Oct 2022 16:21:28 +0200
parents 7053b8a0aaec
children 5a434f5889f8
line wrap: on
line diff
--- a/OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp	Fri Oct 28 13:38:19 2022 +0200
+++ b/OrthancStone/Sources/Scene2D/RotateSceneTracker.cpp	Fri Oct 28 16:21:28 2022 +0200
@@ -21,57 +21,73 @@
  **/
 
 #include "RotateSceneTracker.h"
+
 #include "../Scene2DViewport/ViewportController.h"
+#include "../Viewport/ViewportLocker.h"
 
 namespace OrthancStone
 {
   RotateSceneTracker::RotateSceneTracker(boost::weak_ptr<IViewport> viewport,
                                          const PointerEvent& event) :
-    OneGesturePointerTracker(viewport),
+    viewport_(viewport),
     click_(event.GetMainPosition()),
-    aligner_(viewport, click_),
     referenceAngle_(0),
     isFirst_(true)
   {
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform();
+    ViewportLocker locker(viewport_);
+    
+    if (locker.IsValid())
+    {
+      aligner_.reset(new Internals::FixedPointAligner(locker.GetController(), click_));
+      originalSceneToCanvas_ = locker.GetController().GetSceneToCanvasTransform();
+    }
   }
 
   
-  void RotateSceneTracker::PointerMove(const PointerEvent& event)
+  void RotateSceneTracker::PointerMove(const PointerEvent& event,
+                                       const Scene2D& scene)
   {
-    ScenePoint2D p = event.GetMainPosition();
-    double dx = p.GetX() - click_.GetX();
-    double dy = p.GetY() - click_.GetY();
+    if (aligner_.get() != NULL)
+    {
+      ScenePoint2D p = event.GetMainPosition();
+      double dx = p.GetX() - click_.GetX();
+      double dy = p.GetY() - click_.GetY();
 
-    if (std::abs(dx) > 5.0 ||
-        std::abs(dy) > 5.0)
-    {
-      double a = atan2(dy, dx);
-
-      if (isFirst_)
+      if (std::abs(dx) > 5.0 ||
+          std::abs(dy) > 5.0)
       {
-        referenceAngle_ = a;
-        isFirst_ = false;
-      }
+        double a = atan2(dy, dx);
 
-      std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
+        if (isFirst_)
+        {
+          referenceAngle_ = a;
+          isFirst_ = false;
+        }
 
-      lock->GetController().SetSceneToCanvasTransform(
-        AffineTransform2D::Combine(
-          AffineTransform2D::CreateRotation(a - referenceAngle_),
-          originalSceneToCanvas_));
-      aligner_.Apply();
-      lock->Invalidate();
+        ViewportLocker locker(viewport_);
+    
+        if (locker.IsValid())
+        {
+          locker.GetController().SetSceneToCanvasTransform(
+            AffineTransform2D::Combine(
+              AffineTransform2D::CreateRotation(a - referenceAngle_),
+              originalSceneToCanvas_));
+          aligner_->Apply(locker.GetController());
+          locker.Invalidate();
+        }
+      }
     }
   }
 
   
   void RotateSceneTracker::Cancel()
   {
-    // See remark above
-    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
-    lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_);
-    lock->Invalidate();
+    ViewportLocker locker(viewport_);
+    
+    if (locker.IsValid())
+    {
+      locker.GetController().SetSceneToCanvasTransform(originalSceneToCanvas_);
+      locker.Invalidate();
+    }
   }
 }