2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/event/actors/layer-list.h>
22 #include <algorithm> // for std::swap
25 #include <dali/integration-api/debug.h>
26 #include <dali/internal/event/actors/layer-impl.h>
27 #include <dali/internal/update/manager/update-manager.h>
33 namespace // unnamed namespace
35 typedef std::vector<Layer*> LayerContainer;
36 using LayerIter = LayerContainer::iterator;
37 using ReverseLayerIter = LayerContainer::reverse_iterator;
40 * A private helper template to return an iterator to the layer passed in.
41 * @param[in] first position to start searching from
42 * @param[in] last position to search to
43 * @param[in] layer to search for
44 * @return iterator to layer if found
46 template<class InputIterator>
47 InputIterator Find(InputIterator first, InputIterator last, const Layer& layer)
49 for(; first != last; ++first)
59 } // unnamed namespace
61 LayerList* LayerList::New(SceneGraph::UpdateManager& updateManager)
63 return new LayerList(updateManager);
66 LayerList::~LayerList() = default;
68 uint32_t LayerList::GetLayerCount() const
70 return static_cast<uint32_t>(mLayers.size()); // // only 4,294,967,295 layers supported
73 Layer* LayerList::GetLayer(uint32_t depth) const
75 DALI_ASSERT_ALWAYS(depth < mLayers.size());
77 return mLayers[depth];
80 uint32_t LayerList::GetDepth(const Layer* layer) const
82 for(uint32_t count = 0; count < mLayers.size(); ++count)
84 if(layer == mLayers[count])
92 void LayerList::RegisterLayer(Layer& layer)
94 DALI_ASSERT_DEBUG(mLayers.end() == Find(mLayers.begin(), mLayers.end(), layer));
95 mLayers.push_back(&layer);
100 void LayerList::UnregisterLayer(Layer& layer)
103 LayerIter iter = Find(mLayers.begin(), mLayers.end(), layer);
104 DALI_ASSERT_DEBUG(iter != mLayers.end());
112 void LayerList::RaiseLayer(Layer& raiseLayer)
114 LayerIter iter = Find(mLayers.begin(), mLayers.end(), raiseLayer);
116 if(iter != mLayers.end() &&
117 iter + 1 != mLayers.end())
119 LayerIter nextIter = iter + 1;
122 std::swap(*iter, *nextIter);
128 void LayerList::LowerLayer(Layer& lowerLayer)
130 ReverseLayerIter iter = Find(mLayers.rbegin(), mLayers.rend(), lowerLayer);
132 if(iter != mLayers.rend() &&
133 iter + 1 != mLayers.rend())
135 ReverseLayerIter nextIter = iter + 1;
138 std::swap(*iter, *nextIter);
144 void LayerList::RaiseLayerToTop(const Layer& layer)
146 LayerIter iter = Find(mLayers.begin(), mLayers.end(), layer);
148 if(iter != mLayers.end() &&
149 iter + 1 != mLayers.end())
151 Layer* raised = *iter;
153 copy(iter + 1, mLayers.end(), iter);
154 mLayers.back() = raised;
160 void LayerList::LowerLayerToBottom(const Layer& layer)
162 ReverseLayerIter iter = Find(mLayers.rbegin(), mLayers.rend(), layer);
164 if(iter != mLayers.rend() &&
165 iter + 1 != mLayers.rend())
167 Layer* lowered = *iter;
169 copy(iter + 1, mLayers.rend(), iter);
170 mLayers.front() = lowered;
176 void LayerList::MoveLayerAbove(const Layer& layer, const Layer& target)
178 // check if it already is
179 if(layer.GetDepth() == (target.GetDepth() + 1))
184 // find the layer to move
185 LayerIter iter = Find(mLayers.begin(), mLayers.end(), layer);
187 if(iter != mLayers.end())
189 Layer* moved = *iter;
192 LayerIter iterT = Find(mLayers.begin(), mLayers.end(), target);
193 // if target is not found there's a programming error somewhere
194 DALI_ASSERT_DEBUG(iterT != mLayers.end());
195 // iterT might be the last
196 if((iterT + 1) == mLayers.end())
198 mLayers.push_back(moved);
202 mLayers.insert(iterT + 1, moved);
209 void LayerList::MoveLayerBelow(const Layer& layer, const Layer& target)
211 // check if it already is in correct order
212 if(layer.GetDepth() == (target.GetDepth() - 1))
217 // find the layer to move
218 LayerIter iter = Find(mLayers.begin(), mLayers.end(), layer);
219 if(iter != mLayers.end())
221 Layer* moved = *iter;
224 LayerIter iterT = Find(mLayers.begin(), mLayers.end(), target);
225 // if target is not found there's a programming error somewhere
226 DALI_ASSERT_DEBUG(iterT != mLayers.end());
227 mLayers.insert(iterT, moved);
233 LayerList::LayerList(SceneGraph::UpdateManager& updateManager)
234 : mUpdateManager(updateManager),
239 void LayerList::SetLayerDepths()
241 // we've got a list of on-stage layers on actor side, need to get their stage
242 // pointers so we can send them to the update manager
243 std::vector<SceneGraph::Layer*> layers;
244 layers.reserve(mLayers.size());
246 // Set the layers (possibly) new depth
247 for(LayerIter iter = mLayers.begin(); iter != mLayers.end(); ++iter)
249 SceneGraph::Layer* layerPtr = const_cast<SceneGraph::Layer*>(&((*iter)->GetSceneGraphLayer()));
250 layers.push_back(layerPtr);
253 // Layers are being used in a separate thread; queue a message to set order
254 SetLayerDepthsMessage(mUpdateManager, layers, &(mRoot->GetSceneGraphLayer()));
257 void LayerList::SetRootLayer(Layer* rootLayer)
264 } // namespace Internal