Mercurial > hg > orthanc-stone
comparison Framework/Scene2D/PanSceneTracker.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 |
---|---|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | 19 **/ |
20 | 20 |
21 | 21 |
22 #include "PanSceneTracker.h" | 22 #include "PanSceneTracker.h" |
23 #include "../Viewport/IViewport.h" | |
23 #include "../Scene2DViewport/ViewportController.h" | 24 #include "../Scene2DViewport/ViewportController.h" |
25 | |
26 #include <memory> | |
24 | 27 |
25 namespace OrthancStone | 28 namespace OrthancStone |
26 { | 29 { |
27 PanSceneTracker::PanSceneTracker(boost::weak_ptr<ViewportController> controllerW, | 30 PanSceneTracker::PanSceneTracker(IViewport& viewport, |
28 const PointerEvent& event) | 31 const PointerEvent& event) |
29 : OneGesturePointerTracker(controllerW) | 32 : OneGesturePointerTracker(viewport) |
30 , originalSceneToCanvas_(GetController()->GetSceneToCanvasTransform()) | |
31 , originalCanvasToScene_(GetController()->GetCanvasToSceneTransform()) | |
32 { | 33 { |
34 | |
35 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); | |
36 | |
37 originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); | |
38 originalCanvasToScene_ = lock->GetController().GetCanvasToSceneTransform(); | |
39 | |
33 pivot_ = event.GetMainPosition().Apply(originalCanvasToScene_); | 40 pivot_ = event.GetMainPosition().Apply(originalCanvasToScene_); |
34 } | 41 } |
35 | 42 |
36 | 43 |
37 void PanSceneTracker::PointerMove(const PointerEvent& event) | 44 void PanSceneTracker::PointerMove(const PointerEvent& event) |
38 { | 45 { |
39 ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_); | 46 ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_); |
40 | 47 |
41 // The controller is a weak pointer. It could be deleted when the | 48 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
42 // tracker is still alive (for instance, because of a lost WebGL | 49 |
43 // context) | 50 lock->GetController().SetSceneToCanvasTransform( |
44 if(GetController().get() != NULL) | 51 AffineTransform2D::Combine( |
45 { | 52 originalSceneToCanvas_, |
46 GetController()->SetSceneToCanvasTransform( | 53 AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), |
47 AffineTransform2D::Combine( | 54 p.GetY() - pivot_.GetY()))); |
48 originalSceneToCanvas_, | 55 lock->Invalidate(); |
49 AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), | |
50 p.GetY() - pivot_.GetY()))); | |
51 } | |
52 } | 56 } |
53 | 57 |
54 void PanSceneTracker::Cancel() | 58 void PanSceneTracker::Cancel() |
55 { | 59 { |
56 if(GetController().get() != NULL) | 60 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
57 { | 61 lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); |
58 GetController()->SetSceneToCanvasTransform(originalSceneToCanvas_); | |
59 } | |
60 } | 62 } |
61 | |
62 } | 63 } |