Mercurial > hg > orthanc-stone
comparison Framework/Scene2D/ZoomSceneTracker.cpp @ 1305:a5326ce4f24b broker
Trackers and measuring tools now use the viewport instead of ViewportController, so that proper locks can be used
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 04 Mar 2020 09:45:38 +0100 |
parents | 2d8ab34c8c91 |
children | ab81ee8fce1f |
comparison
equal
deleted
inserted
replaced
1304:b7fa67bf87fa | 1305:a5326ce4f24b |
---|---|
20 | 20 |
21 | 21 |
22 #include "ZoomSceneTracker.h" | 22 #include "ZoomSceneTracker.h" |
23 #include "../Scene2DViewport/ViewportController.h" | 23 #include "../Scene2DViewport/ViewportController.h" |
24 | 24 |
25 using boost::weak_ptr; | |
26 using boost::shared_ptr; | |
27 | |
28 namespace OrthancStone | 25 namespace OrthancStone |
29 { | 26 { |
30 ZoomSceneTracker::ZoomSceneTracker(weak_ptr<ViewportController> controllerW, | 27 ZoomSceneTracker::ZoomSceneTracker(IViewport& viewport, |
31 const PointerEvent& event, | 28 const PointerEvent& event, |
32 unsigned int canvasHeight) | 29 unsigned int canvasHeight) |
33 : OneGesturePointerTracker(controllerW) | 30 : OneGesturePointerTracker(viewport) |
34 , clickY_(event.GetMainPosition().GetY()) | 31 , clickY_(event.GetMainPosition().GetY()) |
35 , aligner_(controllerW, event.GetMainPosition()) | 32 , aligner_(viewport, event.GetMainPosition()) |
36 , originalSceneToCanvas_(GetController()->GetSceneToCanvasTransform()) | |
37 { | 33 { |
34 | |
35 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); | |
36 originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); | |
37 | |
38 if (canvasHeight <= 3) | 38 if (canvasHeight <= 3) |
39 { | 39 { |
40 active_ = false; | 40 active_ = false; |
41 } | 41 } |
42 else | 42 else |
74 z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; | 74 z = MIN_ZOOM + (MAX_ZOOM - MIN_ZOOM) * (dy + 1.0) / 2.0; |
75 } | 75 } |
76 | 76 |
77 double zoom = pow(2.0, z); | 77 double zoom = pow(2.0, z); |
78 | 78 |
79 // The controller is a weak pointer. It could be deleted when the | 79 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
80 // tracker is still alive (for instance, because of a lost WebGL | 80 lock->GetController().SetSceneToCanvasTransform( |
81 // context) | 81 AffineTransform2D::Combine( |
82 if(GetController().get() != NULL) | 82 AffineTransform2D::CreateScaling(zoom, zoom), |
83 { | 83 originalSceneToCanvas_)); |
84 GetController()->SetSceneToCanvasTransform( | 84 aligner_.Apply(); |
85 AffineTransform2D::Combine( | 85 lock->Invalidate(); |
86 AffineTransform2D::CreateScaling(zoom, zoom), | |
87 originalSceneToCanvas_)); | |
88 | |
89 aligner_.Apply(); | |
90 } | |
91 } | 86 } |
92 } | 87 } |
93 | 88 |
94 void ZoomSceneTracker::Cancel() | 89 void ZoomSceneTracker::Cancel() |
95 { | 90 { |
96 if(GetController().get() != NULL) | 91 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
97 { | 92 lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); |
98 GetController()->SetSceneToCanvasTransform(originalSceneToCanvas_); | 93 lock->Invalidate(); |
99 } | |
100 } | 94 } |
101 } | 95 } |