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 }