comparison OrthancStone/Sources/Scene2D/ZoomSceneTracker.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
20 * <http://www.gnu.org/licenses/>. 20 * <http://www.gnu.org/licenses/>.
21 **/ 21 **/
22 22
23 23
24 #include "ZoomSceneTracker.h" 24 #include "ZoomSceneTracker.h"
25
25 #include "../Scene2DViewport/ViewportController.h" 26 #include "../Scene2DViewport/ViewportController.h"
27 #include "../Viewport/ViewportLocker.h"
26 28
27 namespace OrthancStone 29 namespace OrthancStone
28 { 30 {
29 ZoomSceneTracker::ZoomSceneTracker(boost::weak_ptr<IViewport> viewport, 31 ZoomSceneTracker::ZoomSceneTracker(boost::weak_ptr<IViewport> viewport,
30 const PointerEvent& event, 32 const PointerEvent& event,
31 unsigned int canvasHeight) 33 unsigned int canvasHeight) :
32 : OneGesturePointerTracker(viewport) 34 viewport_(viewport),
33 , clickY_(event.GetMainPosition().GetY()) 35 clickY_(event.GetMainPosition().GetY())
34 , aligner_(viewport, event.GetMainPosition()) 36 {
35 { 37 ViewportLocker locker(viewport_);
36 38
37 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); 39 if (locker.IsValid())
38 originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); 40 {
41 originalSceneToCanvas_ = locker.GetController().GetSceneToCanvasTransform();
39 42
40 if (canvasHeight <= 3) 43 if (canvasHeight > 3)
41 { 44 {
42 active_ = false; 45 normalization_ = 1.0 / static_cast<double>(canvasHeight - 1);
43 } 46 aligner_.reset(new Internals::FixedPointAligner(locker.GetController(), event.GetMainPosition()));
44 else 47 }
45 {
46 normalization_ = 1.0 / static_cast<double>(canvasHeight - 1);
47 active_ = true;
48 } 48 }
49 } 49 }
50 50
51 void ZoomSceneTracker::PointerMove(const PointerEvent& event) 51 void ZoomSceneTracker::PointerMove(const PointerEvent& event,
52 const Scene2D& scene)
52 { 53 {
53 static const double MIN_ZOOM = -4; 54 static const double MIN_ZOOM = -4;
54 static const double MAX_ZOOM = 4; 55 static const double MAX_ZOOM = 4;
55 56
56 if (active_) 57 if (aligner_.get() != NULL)
57 { 58 {
58 double y = event.GetMainPosition().GetY(); 59 double y = event.GetMainPosition().GetY();
59 60
60 // In the range [-1,1] 61 // In the range [-1,1]
61 double dy = static_cast<double>(y - clickY_) * normalization_; 62 double dy = static_cast<double>(y - clickY_) * normalization_;
76 z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; 77 z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0;
77 } 78 }
78 79
79 double zoom = pow(2.0, z); 80 double zoom = pow(2.0, z);
80 81
81 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); 82 ViewportLocker locker(viewport_);
82 lock->GetController().SetSceneToCanvasTransform( 83
83 AffineTransform2D::Combine( 84 if (locker.IsValid())
84 AffineTransform2D::CreateScaling(zoom, zoom), 85 {
85 originalSceneToCanvas_)); 86 locker.GetController().SetSceneToCanvasTransform(
86 aligner_.Apply(); 87 AffineTransform2D::Combine(
87 lock->Invalidate(); 88 AffineTransform2D::CreateScaling(zoom, zoom),
89 originalSceneToCanvas_));
90 aligner_->Apply(locker.GetController());
91 locker.Invalidate();
92 }
88 } 93 }
89 } 94 }
90 95
91 void ZoomSceneTracker::Cancel() 96 void ZoomSceneTracker::Cancel()
92 { 97 {
93 std::unique_ptr<IViewport::ILock> lock(GetViewportLock()); 98 ViewportLocker locker(viewport_);
94 lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); 99
95 lock->Invalidate(); 100 if (locker.IsValid())
101 {
102 locker.GetController().SetSceneToCanvasTransform(originalSceneToCanvas_);
103 locker.Invalidate();
104 }
96 } 105 }
97 } 106 }