Mercurial > hg > orthanc-stone
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 |