comparison Framework/Scene2DViewport/EditLineMeasureTracker.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 7ec8fea061b9
children ab81ee8fce1f
comparison
equal deleted inserted replaced
1304:b7fa67bf87fa 1305:a5326ce4f24b
26 26
27 namespace OrthancStone 27 namespace OrthancStone
28 { 28 {
29 EditLineMeasureTracker::EditLineMeasureTracker( 29 EditLineMeasureTracker::EditLineMeasureTracker(
30 boost::shared_ptr<MeasureTool> measureTool, 30 boost::shared_ptr<MeasureTool> measureTool,
31 boost::weak_ptr<ViewportController> controllerW, 31 IViewport& viewport,
32 const PointerEvent& e) 32 const PointerEvent& e)
33 : EditMeasureTracker(controllerW, e) 33 : EditMeasureTracker(viewport, e)
34 { 34 {
35 ScenePoint2D scenePos = e.GetMainPosition(); 35 ScenePoint2D scenePos = e.GetMainPosition();
36
37 { 36 {
38 boost::shared_ptr<ViewportController> controller = controllerW.lock(); 37 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock());
39 if (controller) 38 Scene2D& scene = lock->GetController().GetScene();
40 { 39 scenePos = e.GetMainPosition().Apply(scene.GetCanvasToSceneTransform());
41 scenePos = e.GetMainPosition().Apply(controller->GetScene().GetCanvasToSceneTransform());
42 }
43 } 40 }
44
45 modifiedZone_ = dynamic_cast<LineMeasureTool&>(*measureTool).LineHitTest(scenePos); 41 modifiedZone_ = dynamic_cast<LineMeasureTool&>(*measureTool).LineHitTest(scenePos);
46 42 command_.reset(new EditLineMeasureCommand(measureTool, viewport));
47 command_.reset(new EditLineMeasureCommand(measureTool, controllerW));
48 } 43 }
49 44
50 EditLineMeasureTracker::~EditLineMeasureTracker() 45 EditLineMeasureTracker::~EditLineMeasureTracker()
51 { 46 {
52 47
53 } 48 }
54 49
55 void EditLineMeasureTracker::PointerMove(const PointerEvent& e) 50 void EditLineMeasureTracker::PointerMove(const PointerEvent& e)
56 { 51 {
57 boost::shared_ptr<ViewportController> controller = controllerW_.lock(); 52 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock());
58 if (controller) 53 ViewportController& controller = lock->GetController();
54 Scene2D& scene = controller.GetScene();
55
56 ScenePoint2D scenePos = e.GetMainPosition().Apply(
57 scene.GetCanvasToSceneTransform());
58
59 ScenePoint2D delta = scenePos - GetOriginalClickPosition();
60
61 boost::shared_ptr<LineMeasureToolMemento> memento =
62 boost::dynamic_pointer_cast<LineMeasureToolMemento>(command_->mementoOriginal_);
63
64 ORTHANC_ASSERT(memento.get() != NULL);
65
66 switch (modifiedZone_)
59 { 67 {
60 ScenePoint2D scenePos = e.GetMainPosition().Apply( 68 case LineMeasureTool::LineHighlightArea_Start:
61 controller->GetScene().GetCanvasToSceneTransform()); 69 {
62 70 ScenePoint2D newStart = memento->start_ + delta;
63 ScenePoint2D delta = scenePos - GetOriginalClickPosition(); 71 GetCommand()->SetStart(newStart);
64 72 }
65 boost::shared_ptr<LineMeasureToolMemento> memento = 73 break;
66 boost::dynamic_pointer_cast<LineMeasureToolMemento>(command_->mementoOriginal_); 74 case LineMeasureTool::LineHighlightArea_End:
67 75 {
68 ORTHANC_ASSERT(memento.get() != NULL); 76 ScenePoint2D newEnd = memento->end_ + delta;
69 77 GetCommand()->SetEnd(newEnd);
70 switch (modifiedZone_) 78 }
71 { 79 break;
72 case LineMeasureTool::LineHighlightArea_Start: 80 case LineMeasureTool::LineHighlightArea_Segment:
73 { 81 {
74 ScenePoint2D newStart = memento->start_ + delta; 82 ScenePoint2D newStart = memento->start_ + delta;
75 GetCommand()->SetStart(newStart); 83 ScenePoint2D newEnd = memento->end_ + delta;
76 } 84 GetCommand()->SetStart(newStart);
77 break; 85 GetCommand()->SetEnd(newEnd);
78 case LineMeasureTool::LineHighlightArea_End: 86 }
79 { 87 break;
80 ScenePoint2D newEnd = memento->end_ + delta; 88 default:
81 GetCommand()->SetEnd(newEnd); 89 LOG(WARNING) << "Warning: please retry the measuring tool editing operation!";
82 } 90 break;
83 break;
84 case LineMeasureTool::LineHighlightArea_Segment:
85 {
86 ScenePoint2D newStart = memento->start_ + delta;
87 ScenePoint2D newEnd = memento->end_ + delta;
88 GetCommand()->SetStart(newStart);
89 GetCommand()->SetEnd(newEnd);
90 }
91 break;
92 default:
93 LOG(WARNING) << "Warning: please retry the measuring tool editing operation!";
94 break;
95 }
96 } 91 }
97 } 92 }
98 93
99 void EditLineMeasureTracker::PointerUp(const PointerEvent& e) 94 void EditLineMeasureTracker::PointerUp(const PointerEvent& e)
100 { 95 {
101 alive_ = false; 96 alive_ = false;
102 } 97 }
103 98