Mercurial > hg > orthanc-stone
comparison Framework/Scene2DViewport/EditAngleMeasureTracker.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 |
---|---|
25 | 25 |
26 namespace OrthancStone | 26 namespace OrthancStone |
27 { | 27 { |
28 EditAngleMeasureTracker::EditAngleMeasureTracker( | 28 EditAngleMeasureTracker::EditAngleMeasureTracker( |
29 boost::shared_ptr<MeasureTool> measureTool, | 29 boost::shared_ptr<MeasureTool> measureTool, |
30 boost::weak_ptr<ViewportController> controllerW, | 30 IViewport& viewport, |
31 const PointerEvent& e) | 31 const PointerEvent& e) |
32 : EditMeasureTracker(controllerW, e) | 32 : EditMeasureTracker(viewport, e) |
33 { | 33 { |
34 ScenePoint2D scenePos = e.GetMainPosition(); | 34 ScenePoint2D scenePos = e.GetMainPosition(); |
35 | |
36 boost::shared_ptr<ViewportController> controller = controllerW_.lock(); | |
37 if (controller) | |
38 { | 35 { |
39 scenePos = e.GetMainPosition().Apply(controller->GetScene().GetCanvasToSceneTransform()); | 36 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
37 ViewportController& controller = lock->GetController(); | |
38 scenePos = e.GetMainPosition().Apply(controller.GetScene().GetCanvasToSceneTransform()); | |
40 } | 39 } |
41 | |
42 modifiedZone_ = dynamic_cast<AngleMeasureTool&>(*measureTool).AngleHitTest(scenePos); | 40 modifiedZone_ = dynamic_cast<AngleMeasureTool&>(*measureTool).AngleHitTest(scenePos); |
43 | 41 command_.reset(new EditAngleMeasureCommand(measureTool, viewport)); |
44 command_.reset(new EditAngleMeasureCommand(measureTool, controllerW)); | |
45 } | 42 } |
46 | 43 |
47 EditAngleMeasureTracker::~EditAngleMeasureTracker() | 44 EditAngleMeasureTracker::~EditAngleMeasureTracker() |
48 { | 45 { |
49 | 46 |
50 } | 47 } |
51 | 48 |
52 void EditAngleMeasureTracker::PointerMove(const PointerEvent& e) | 49 void EditAngleMeasureTracker::PointerMove(const PointerEvent& e) |
53 { | 50 { |
54 boost::shared_ptr<ViewportController> controller = controllerW_.lock(); | 51 std::unique_ptr<IViewport::ILock> lock(viewport_.Lock()); |
55 if (controller) | 52 ViewportController& controller = lock->GetController(); |
53 Scene2D& scene = controller.GetScene(); | |
54 | |
55 ScenePoint2D scenePos = e.GetMainPosition().Apply( | |
56 scene.GetCanvasToSceneTransform()); | |
57 | |
58 ScenePoint2D delta = scenePos - GetOriginalClickPosition(); | |
59 | |
60 boost::shared_ptr<AngleMeasureToolMemento> memento = | |
61 boost::dynamic_pointer_cast<AngleMeasureToolMemento>(command_->mementoOriginal_); | |
62 | |
63 ORTHANC_ASSERT(memento.get() != NULL); | |
64 | |
65 switch (modifiedZone_) | |
56 { | 66 { |
57 ScenePoint2D scenePos = e.GetMainPosition().Apply( | 67 case AngleMeasureTool::AngleHighlightArea_Center: |
58 controller->GetScene().GetCanvasToSceneTransform()); | |
59 | |
60 ScenePoint2D delta = scenePos - GetOriginalClickPosition(); | |
61 | |
62 boost::shared_ptr<AngleMeasureToolMemento> memento = | |
63 boost::dynamic_pointer_cast<AngleMeasureToolMemento>(command_->mementoOriginal_); | |
64 | |
65 ORTHANC_ASSERT(memento.get() != NULL); | |
66 | |
67 switch (modifiedZone_) | |
68 { | 68 { |
69 case AngleMeasureTool::AngleHighlightArea_Center: | 69 ScenePoint2D newCenter = memento->center_ + delta; |
70 { | 70 GetCommand()->SetCenter(newCenter); |
71 ScenePoint2D newCenter = memento->center_ + delta; | 71 } |
72 GetCommand()->SetCenter(newCenter); | 72 break; |
73 } | 73 case AngleMeasureTool::AngleHighlightArea_Side1: |
74 case AngleMeasureTool::AngleHighlightArea_Side2: | |
75 { | |
76 ScenePoint2D newCenter = memento->center_ + delta; | |
77 ScenePoint2D newSide1End = memento->side1End_ + delta; | |
78 ScenePoint2D newSide2End = memento->side2End_ + delta; | |
79 GetCommand()->SetCenter(newCenter); | |
80 GetCommand()->SetSide1End(newSide1End); | |
81 GetCommand()->SetSide2End(newSide2End); | |
82 } | |
83 break; | |
84 case AngleMeasureTool::AngleHighlightArea_Side1End: | |
85 { | |
86 ScenePoint2D newSide1End = memento->side1End_ + delta; | |
87 GetCommand()->SetSide1End(newSide1End); | |
88 } | |
89 break; | |
90 case AngleMeasureTool::AngleHighlightArea_Side2End: | |
91 { | |
92 ScenePoint2D newSide2End = memento->side2End_ + delta; | |
93 GetCommand()->SetSide2End(newSide2End); | |
94 } | |
95 break; | |
96 default: | |
97 LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; | |
74 break; | 98 break; |
75 case AngleMeasureTool::AngleHighlightArea_Side1: | |
76 case AngleMeasureTool::AngleHighlightArea_Side2: | |
77 { | |
78 ScenePoint2D newCenter = memento->center_ + delta; | |
79 ScenePoint2D newSide1End = memento->side1End_ + delta; | |
80 ScenePoint2D newSide2End = memento->side2End_ + delta; | |
81 GetCommand()->SetCenter(newCenter); | |
82 GetCommand()->SetSide1End(newSide1End); | |
83 GetCommand()->SetSide2End(newSide2End); | |
84 } | |
85 break; | |
86 case AngleMeasureTool::AngleHighlightArea_Side1End: | |
87 { | |
88 ScenePoint2D newSide1End = memento->side1End_ + delta; | |
89 GetCommand()->SetSide1End(newSide1End); | |
90 } | |
91 break; | |
92 case AngleMeasureTool::AngleHighlightArea_Side2End: | |
93 { | |
94 ScenePoint2D newSide2End = memento->side2End_ + delta; | |
95 GetCommand()->SetSide2End(newSide2End); | |
96 } | |
97 break; | |
98 default: | |
99 LOG(WARNING) << "Warning: please retry the measuring tool editing operation!"; | |
100 break; | |
101 } | |
102 } | 99 } |
103 } | 100 } |
104 | 101 |
105 void EditAngleMeasureTracker::PointerUp(const PointerEvent& e) | 102 void EditAngleMeasureTracker::PointerUp(const PointerEvent& e) |
106 { | 103 { |
117 { | 114 { |
118 boost::shared_ptr<EditAngleMeasureCommand> ret = boost::dynamic_pointer_cast<EditAngleMeasureCommand>(command_); | 115 boost::shared_ptr<EditAngleMeasureCommand> ret = boost::dynamic_pointer_cast<EditAngleMeasureCommand>(command_); |
119 ORTHANC_ASSERT(ret.get() != NULL, "Internal error in EditAngleMeasureTracker::GetCommand()"); | 116 ORTHANC_ASSERT(ret.get() != NULL, "Internal error in EditAngleMeasureTracker::GetCommand()"); |
120 return ret; | 117 return ret; |
121 } | 118 } |
122 | |
123 } | 119 } |