2 * Copyright (c) 2014 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 typedef LayerContainer::iterator LayerIter;
40 typedef LayerContainer::reverse_iterator ReverseLayerIter;
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, bool systemLevel )
65 return new LayerList( updateManager, systemLevel );
68 LayerList::~LayerList()
72 unsigned int LayerList::GetLayerCount() const
74 return mLayers.size();
77 Layer* LayerList::GetLayer( unsigned int depth ) const
79 DALI_ASSERT_ALWAYS( depth < mLayers.size() );
81 return mLayers[ depth ];
84 unsigned int LayerList::GetDepth( const Layer* layer ) const
86 for( unsigned int count = 0; count < mLayers.size(); ++count )
88 if( layer == mLayers[ count ] )
96 void LayerList::RegisterLayer(Layer& layer)
98 DALI_ASSERT_DEBUG( mLayers.end() == Find( mLayers.begin(), mLayers.end(), layer) );
99 mLayers.push_back(&layer);
104 void LayerList::UnregisterLayer(Layer& layer)
107 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
108 DALI_ASSERT_DEBUG(iter != mLayers.end());
116 void LayerList::RaiseLayer(Layer& raiseLayer)
118 LayerIter iter = Find( mLayers.begin(), mLayers.end(), raiseLayer);
120 if (iter != mLayers.end() &&
121 iter+1 != mLayers.end())
123 LayerIter nextIter = iter+1;
126 std::swap(*iter, *nextIter);
132 void LayerList::LowerLayer(Layer& lowerLayer)
134 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), lowerLayer);
136 if (iter != mLayers.rend() &&
137 iter+1 != mLayers.rend())
139 ReverseLayerIter nextIter = iter+1;
142 std::swap(*iter, *nextIter);
148 void LayerList::RaiseLayerToTop( const Layer& layer )
150 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
152 if (iter != mLayers.end() &&
153 iter+1 != mLayers.end())
155 Layer* raised = *iter;
157 copy(iter+1, mLayers.end(), iter);
158 mLayers.back() = raised;
164 void LayerList::LowerLayerToBottom( const Layer& layer )
166 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), layer);
168 if (iter != mLayers.rend() &&
169 iter+1 != mLayers.rend())
171 Layer* lowered = *iter;
173 copy(iter+1, mLayers.rend(), iter);
174 mLayers.front() = lowered;
180 void LayerList::MoveLayerAbove( const Layer& layer, const Layer& target )
182 // check if it already is
183 if( layer.GetDepth() == ( target.GetDepth() + 1 ) )
188 // find the layer to move
189 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
191 if( iter != mLayers.end() )
193 Layer* moved = *iter;
194 mLayers.erase( iter );
196 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
197 // if target is not found there's a programming error somewhere
198 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
199 // iterT might be the last
200 if( ( iterT+1 ) == mLayers.end() )
202 mLayers.push_back( moved );
206 mLayers.insert( iterT+1, moved );
213 void LayerList::MoveLayerBelow( const Layer& layer, const Layer& target )
215 // check if it already is in correct order
216 if( layer.GetDepth() == ( target.GetDepth() - 1 ) )
221 // find the layer to move
222 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
223 if( iter != mLayers.end() )
225 Layer* moved = *iter;
226 mLayers.erase( iter );
228 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
229 // if target is not found there's a programming error somewhere
230 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
231 mLayers.insert( iterT, moved );
237 LayerList::LayerList( SceneGraph::UpdateManager& updateManager, bool systemLevel )
238 : mUpdateManager( updateManager ),
239 mIsSystemLevel( systemLevel )
243 void LayerList::SetLayerDepths()
245 // we've got a list of on-stage layers on actor side, need to get their stage
246 // pointers so we can send them to the update manager
247 std::vector< SceneGraph::Layer* > layers;
248 layers.reserve( mLayers.size() );
250 // Set the layers (possibly) new depth
251 for (LayerIter iter = mLayers.begin(); iter != mLayers.end(); ++iter)
253 SceneGraph::Layer* layerPtr = const_cast< SceneGraph::Layer* >( &( (*iter)->GetSceneLayerOnStage() ) );
254 layers.push_back( layerPtr );
257 // Layers are being used in a separate thread; queue a message to set order
258 SetLayerDepthsMessage( mUpdateManager, layers, mIsSystemLevel );
261 } // namespace Internal