Mercurial > hg > orthanc-stone
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 } |