comparison 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
comparison
equal deleted inserted replaced
1971:e5b31d55206d 1972:9c0adcc8feec
19 * License along with this program. If not, see 19 * License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>. 20 * <http://www.gnu.org/licenses/>.
21 **/ 21 **/
22 22
23 #include "RotateSceneTracker.h" 23 #include "RotateSceneTracker.h"
24
24 #include "../Scene2DViewport/ViewportController.h" 25 #include "../Scene2DViewport/ViewportController.h"
26 #include "../Viewport/ViewportLocker.h"
25 27
26 namespace OrthancStone 28 namespace OrthancStone
27 { 29 {
28 RotateSceneTracker::RotateSceneTracker(boost::weak_ptr<IViewport> viewport, 30 RotateSceneTracker::RotateSceneTracker(boost::weak_ptr<IViewport> viewport,
29 const PointerEvent& event) : 31 const PointerEvent& event) :
30 OneGesturePointerTracker(viewport), 32 viewport_(viewport),
31 click_(event.GetMainPosition()), 33 click_(event.GetMainPosition()),
32 aligner_(viewport, click_),
33 referenceAngle_(0), 34 referenceAngle_(0),
34 isFirst_(true) 35 isFirst_(true)
35 { 36 {
36 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); 37 ViewportLocker locker(viewport_);
37 originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); 38
39 if (locker.IsValid())
40 {
41 aligner_.reset(new Internals::FixedPointAligner(locker.GetController(), click_));
42 originalSceneToCanvas_ = locker.GetController().GetSceneToCanvasTransform();
43 }
38 } 44 }
39 45
40 46
41 void RotateSceneTracker::PointerMove(const PointerEvent& event) 47 void RotateSceneTracker::PointerMove(const PointerEvent& event,
48 const Scene2D& scene)
42 { 49 {
43 ScenePoint2D p = event.GetMainPosition(); 50 if (aligner_.get() != NULL)
44 double dx = p.GetX() - click_.GetX(); 51 {
45 double dy = p.GetY() - click_.GetY(); 52 ScenePoint2D p = event.GetMainPosition();
53 double dx = p.GetX() - click_.GetX();
54 double dy = p.GetY() - click_.GetY();
46 55
47 if (std::abs(dx) > 5.0 || 56 if (std::abs(dx) > 5.0 ||
48 std::abs(dy) > 5.0) 57 std::abs(dy) > 5.0)
49 { 58 {
50 double a = atan2(dy, dx); 59 double a = atan2(dy, dx);
51 60
52 if (isFirst_) 61 if (isFirst_)
53 { 62 {
54 referenceAngle_ = a; 63 referenceAngle_ = a;
55 isFirst_ = false; 64 isFirst_ = false;
65 }
66
67 ViewportLocker locker(viewport_);
68
69 if (locker.IsValid())
70 {
71 locker.GetController().SetSceneToCanvasTransform(
72 AffineTransform2D::Combine(
73 AffineTransform2D::CreateRotation(a - referenceAngle_),
74 originalSceneToCanvas_));
75 aligner_->Apply(locker.GetController());
76 locker.Invalidate();
77 }
56 } 78 }
57
58 std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
59
60 lock->GetController().SetSceneToCanvasTransform(
61 AffineTransform2D::Combine(
62 AffineTransform2D::CreateRotation(a - referenceAngle_),
63 originalSceneToCanvas_));
64 aligner_.Apply();
65 lock->Invalidate();
66 } 79 }
67 } 80 }
68 81
69 82
70 void RotateSceneTracker::Cancel() 83 void RotateSceneTracker::Cancel()
71 { 84 {
72 // See remark above 85 ViewportLocker locker(viewport_);
73 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); 86
74 lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); 87 if (locker.IsValid())
75 lock->Invalidate(); 88 {
89 locker.GetController().SetSceneToCanvasTransform(originalSceneToCanvas_);
90 locker.Invalidate();
91 }
76 } 92 }
77 } 93 }