2 * Copyright (c) 2020 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>
35 namespace // unnamed namespace
38 typedef std::vector<Layer*> LayerContainer;
39 using LayerIter = LayerContainer::iterator;
40 using ReverseLayerIter = LayerContainer::reverse_iterator;
43 * A private helper template to return an iterator to the layer passed in.
44 * @param[in] first position to start searching from
45 * @param[in] last position to search to
46 * @param[in] layer to search for
47 * @return iterator to layer if found
49 template<class InputIterator> InputIterator Find( InputIterator first, InputIterator last, const Layer& layer )
51 for( ; first != last ; ++first )
53 if( *first == &layer )
61 } // unnamed namespace
63 LayerList* LayerList::New( SceneGraph::UpdateManager& updateManager )
65 return new LayerList( updateManager );
68 LayerList::~LayerList() = default;
70 uint32_t LayerList::GetLayerCount() const
72 return static_cast<uint32_t>( mLayers.size() ); // // only 4,294,967,295 layers supported
75 Layer* LayerList::GetLayer( uint32_t depth ) const
77 DALI_ASSERT_ALWAYS( depth < mLayers.size() );
79 return mLayers[ depth ];
82 uint32_t LayerList::GetDepth( const Layer* layer ) const
84 for( uint32_t count = 0; count < mLayers.size(); ++count )
86 if( layer == mLayers[ count ] )
94 void LayerList::RegisterLayer(Layer& layer)
96 DALI_ASSERT_DEBUG( mLayers.end() == Find( mLayers.begin(), mLayers.end(), layer) );
97 mLayers.push_back(&layer);
102 void LayerList::UnregisterLayer(Layer& layer)
105 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
106 DALI_ASSERT_DEBUG(iter != mLayers.end());
114 void LayerList::RaiseLayer(Layer& raiseLayer)
116 LayerIter iter = Find( mLayers.begin(), mLayers.end(), raiseLayer);
118 if (iter != mLayers.end() &&
119 iter+1 != mLayers.end())
121 LayerIter nextIter = iter+1;
124 std::swap(*iter, *nextIter);
130 void LayerList::LowerLayer(Layer& lowerLayer)
132 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), lowerLayer);
134 if (iter != mLayers.rend() &&
135 iter+1 != mLayers.rend())
137 ReverseLayerIter nextIter = iter+1;
140 std::swap(*iter, *nextIter);
146 void LayerList::RaiseLayerToTop( const Layer& layer )
148 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
150 if (iter != mLayers.end() &&
151 iter+1 != mLayers.end())
153 Layer* raised = *iter;
155 copy(iter+1, mLayers.end(), iter);
156 mLayers.back() = raised;
162 void LayerList::LowerLayerToBottom( const Layer& layer )
164 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), layer);
166 if (iter != mLayers.rend() &&
167 iter+1 != mLayers.rend())
169 Layer* lowered = *iter;
171 copy(iter+1, mLayers.rend(), iter);
172 mLayers.front() = lowered;
178 void LayerList::MoveLayerAbove( const Layer& layer, const Layer& target )
180 // check if it already is
181 if( layer.GetDepth() == ( target.GetDepth() + 1 ) )
186 // find the layer to move
187 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
189 if( iter != mLayers.end() )
191 Layer* moved = *iter;
192 mLayers.erase( iter );
194 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
195 // if target is not found there's a programming error somewhere
196 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
197 // iterT might be the last
198 if( ( iterT+1 ) == mLayers.end() )
200 mLayers.push_back( moved );
204 mLayers.insert( iterT+1, moved );
211 void LayerList::MoveLayerBelow( const Layer& layer, const Layer& target )
213 // check if it already is in correct order
214 if( layer.GetDepth() == ( target.GetDepth() - 1 ) )
219 // find the layer to move
220 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
221 if( iter != mLayers.end() )
223 Layer* moved = *iter;
224 mLayers.erase( iter );
226 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
227 // if target is not found there's a programming error somewhere
228 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
229 mLayers.insert( iterT, moved );
235 LayerList::LayerList( SceneGraph::UpdateManager& updateManager )
236 : mUpdateManager( updateManager ),
241 void LayerList::SetLayerDepths()
243 // we've got a list of on-stage layers on actor side, need to get their stage
244 // pointers so we can send them to the update manager
245 std::vector< SceneGraph::Layer* > layers;
246 layers.reserve( mLayers.size() );
248 // Set the layers (possibly) new depth
249 for (LayerIter iter = mLayers.begin(); iter != mLayers.end(); ++iter)
251 SceneGraph::Layer* layerPtr = const_cast< SceneGraph::Layer* >( &( (*iter)->GetSceneGraphLayer() ) );
252 layers.push_back( layerPtr );
255 // Layers are being used in a separate thread; queue a message to set order
256 SetLayerDepthsMessage( mUpdateManager, layers, &( mRoot->GetSceneGraphLayer() ) );
259 void LayerList::SetRootLayer(Layer* rootLayer)
266 } // namespace Internal