Mercurial > hg > orthanc-stone
diff 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 |
line wrap: on
line diff
--- a/Framework/Scene2D/PanSceneTracker.cpp Wed Mar 04 09:44:34 2020 +0100 +++ b/Framework/Scene2D/PanSceneTracker.cpp Wed Mar 04 09:45:38 2020 +0100 @@ -20,16 +20,23 @@ #include "PanSceneTracker.h" +#include "../Viewport/IViewport.h" #include "../Scene2DViewport/ViewportController.h" +#include <memory> + namespace OrthancStone { - PanSceneTracker::PanSceneTracker(boost::weak_ptr<ViewportController> controllerW, + PanSceneTracker::PanSceneTracker(IViewport& viewport, const PointerEvent& event) - : OneGesturePointerTracker(controllerW) - , originalSceneToCanvas_(GetController()->GetSceneToCanvasTransform()) - , originalCanvasToScene_(GetController()->GetCanvasToSceneTransform()) + : OneGesturePointerTracker(viewport) { + + std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); + + originalSceneToCanvas_ = lock->GetController().GetSceneToCanvasTransform(); + originalCanvasToScene_ = lock->GetController().GetCanvasToSceneTransform(); + pivot_ = event.GetMainPosition().Apply(originalCanvasToScene_); } @@ -38,25 +45,19 @@ { ScenePoint2D p = event.GetMainPosition().Apply(originalCanvasToScene_); - // The controller is a weak pointer. It could be deleted when the - // tracker is still alive (for instance, because of a lost WebGL - // context) - if(GetController().get() != NULL) - { - GetController()->SetSceneToCanvasTransform( - AffineTransform2D::Combine( - originalSceneToCanvas_, - AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), - p.GetY() - pivot_.GetY()))); - } + std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); + + lock->GetController().SetSceneToCanvasTransform( + AffineTransform2D::Combine( + originalSceneToCanvas_, + AffineTransform2D::CreateOffset(p.GetX() - pivot_.GetX(), + p.GetY() - pivot_.GetY()))); + lock->Invalidate(); } void PanSceneTracker::Cancel() { - if(GetController().get() != NULL) - { - GetController()->SetSceneToCanvasTransform(originalSceneToCanvas_); - } + std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); + lock->GetController().SetSceneToCanvasTransform(originalSceneToCanvas_); } - }