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