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 }