comparison Framework/Scene2DViewport/LayerHolder.cpp @ 1203:f3bb9a6dd949 broker

locking abstraction in IViewport
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 29 Nov 2019 21:22:21 +0100
parents 32eaf4929b08
children 86a8266b8888
comparison
equal deleted inserted replaced
1200:54cbffabdc45 1203:f3bb9a6dd949
41 41
42 } 42 }
43 43
44 void LayerHolder::CreateLayers() 44 void LayerHolder::CreateLayers()
45 { 45 {
46 assert(baseLayerIndex_ == -1); 46 boost::shared_ptr<ViewportController> controller = controllerW_.lock();
47 47
48 baseLayerIndex_ = GetScene().GetMaxDepth() + 100; 48 if (controller)
49 {
50 std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
51
52 assert(baseLayerIndex_ == -1);
49 53
50 for (int i = 0; i < polylineLayerCount_; ++i) 54 baseLayerIndex_ = lock->GetScene().GetMaxDepth() + 100;
51 { 55
52 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer()); 56 for (int i = 0; i < polylineLayerCount_; ++i)
53 GetScene().SetLayer(baseLayerIndex_ + i, layer.release()); 57 {
58 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer());
59 lock->GetScene().SetLayer(baseLayerIndex_ + i, layer.release());
60 }
61
62 for (int i = 0; i < textLayerCount_; ++i)
63 {
64 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
65 lock->GetScene().SetLayer(
66 baseLayerIndex_ + polylineLayerCount_ + i,
67 layer.release());
68 }
54 } 69 }
55
56 for (int i = 0; i < textLayerCount_; ++i)
57 {
58 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer());
59 GetScene().SetLayer(
60 baseLayerIndex_ + polylineLayerCount_ + i,
61 layer.release());
62 }
63
64 } 70 }
65 71
66 void LayerHolder::CreateLayersIfNeeded() 72 void LayerHolder::CreateLayersIfNeeded()
67 { 73 {
68 if (baseLayerIndex_ == -1) 74 if (baseLayerIndex_ == -1)
72 bool LayerHolder::AreLayersCreated() const 78 bool LayerHolder::AreLayersCreated() const
73 { 79 {
74 return (baseLayerIndex_ != -1); 80 return (baseLayerIndex_ != -1);
75 } 81 }
76 82
77 Scene2D& LayerHolder::GetScene()
78 {
79 boost::shared_ptr<ViewportController> controller = controllerW_.lock();
80 ORTHANC_ASSERT(controller.get() != 0, "Zombie attack!");
81 return controller->GetScene();
82 }
83
84 void LayerHolder::DeleteLayersIfNeeded() 83 void LayerHolder::DeleteLayersIfNeeded()
85 { 84 {
86 if (baseLayerIndex_ != -1) 85 if (baseLayerIndex_ != -1)
87 DeleteLayers(); 86 DeleteLayers();
88 } 87 }
89 88
90 void LayerHolder::DeleteLayers() 89 void LayerHolder::DeleteLayers()
91 { 90 {
92 for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i) 91 boost::shared_ptr<ViewportController> controller = controllerW_.lock();
92
93 if (controller)
93 { 94 {
94 ORTHANC_ASSERT(GetScene().HasLayer(baseLayerIndex_ + i), "No layer"); 95 std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
95 GetScene().DeleteLayer(baseLayerIndex_ + i); 96
97 for (int i = 0; i < textLayerCount_ + polylineLayerCount_; ++i)
98 {
99 ORTHANC_ASSERT(lock->GetScene().HasLayer(baseLayerIndex_ + i), "No layer");
100 lock->GetScene().DeleteLayer(baseLayerIndex_ + i);
101 }
102 baseLayerIndex_ = -1;
96 } 103 }
97 baseLayerIndex_ = -1;
98 } 104 }
99 105
100 PolylineSceneLayer* LayerHolder::GetPolylineLayer(int index /*= 0*/) 106 PolylineSceneLayer* LayerHolder::GetPolylineLayer(int index /*= 0*/)
101 { 107 {
102 using namespace Orthanc; 108 boost::shared_ptr<ViewportController> controller = controllerW_.lock();
103 ORTHANC_ASSERT(baseLayerIndex_ != -1);
104 ORTHANC_ASSERT(GetScene().HasLayer(GetPolylineLayerIndex(index)));
105 ISceneLayer* layer =
106 &(GetScene().GetLayer(GetPolylineLayerIndex(index)));
107 109
108 PolylineSceneLayer* concreteLayer = 110 if (controller)
109 dynamic_cast<PolylineSceneLayer*>(layer); 111 {
112 std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
110 113
111 ORTHANC_ASSERT(concreteLayer != NULL); 114 using namespace Orthanc;
112 return concreteLayer; 115 ORTHANC_ASSERT(baseLayerIndex_ != -1);
116 ORTHANC_ASSERT(lock->GetScene().HasLayer(GetPolylineLayerIndex(index)));
117 ISceneLayer* layer =
118 &(lock->GetScene().GetLayer(GetPolylineLayerIndex(index)));
119
120 PolylineSceneLayer* concreteLayer =
121 dynamic_cast<PolylineSceneLayer*>(layer);
122
123 ORTHANC_ASSERT(concreteLayer != NULL);
124 return concreteLayer;
125 }
126 else
127 {
128 return NULL; // TODO
129 }
113 } 130 }
114 131
115 TextSceneLayer* LayerHolder::GetTextLayer(int index /*= 0*/) 132 TextSceneLayer* LayerHolder::GetTextLayer(int index /*= 0*/)
116 { 133 {
117 using namespace Orthanc; 134 boost::shared_ptr<ViewportController> controller = controllerW_.lock();
118 ORTHANC_ASSERT(baseLayerIndex_ != -1);
119 ORTHANC_ASSERT(GetScene().HasLayer(GetTextLayerIndex(index)));
120 ISceneLayer* layer =
121 &(GetScene().GetLayer(GetTextLayerIndex(index)));
122 135
123 TextSceneLayer* concreteLayer = 136 if (controller)
124 dynamic_cast<TextSceneLayer*>(layer); 137 {
138 std::auto_ptr<IViewport::ILock> lock(controller->GetViewport().Lock());
125 139
126 ORTHANC_ASSERT(concreteLayer != NULL); 140 using namespace Orthanc;
127 return concreteLayer; 141 ORTHANC_ASSERT(baseLayerIndex_ != -1);
142 ORTHANC_ASSERT(lock->GetScene().HasLayer(GetTextLayerIndex(index)));
143 ISceneLayer* layer =
144 &(lock->GetScene().GetLayer(GetTextLayerIndex(index)));
145
146 TextSceneLayer* concreteLayer =
147 dynamic_cast<TextSceneLayer*>(layer);
148
149 ORTHANC_ASSERT(concreteLayer != NULL);
150 return concreteLayer;
151 }
152 else
153 {
154 return NULL; // TODO
155 }
128 } 156 }
129 157
130 int LayerHolder::GetPolylineLayerIndex(int index /*= 0*/) 158 int LayerHolder::GetPolylineLayerIndex(int index /*= 0*/)
131 { 159 {
132 using namespace Orthanc; 160 using namespace Orthanc;