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/event/common/stage-impl.h>
28 #include <dali/internal/update/manager/update-manager.h>
38 namespace // unnamed namespace
41 typedef std::vector<Layer*> LayerContainer;
42 typedef LayerContainer::iterator LayerIter;
43 typedef LayerContainer::reverse_iterator ReverseLayerIter;
46 * A private helper template to return an iterator to the layer passed in.
47 * @param[in] first position to start searching from
48 * @param[in] last position to search to
49 * @param[in] layer to search for
50 * @return iterator to layer if found
52 template<class InputIterator> InputIterator Find( InputIterator first, InputIterator last, const Layer& layer )
54 for( ; first != last ; ++first )
56 if( *first == &layer )
64 } // unnamed namespace
66 LayerList* LayerList::New( Stage& stage, bool systemLevel )
68 return new LayerList( stage, systemLevel );
71 LayerList::~LayerList()
75 unsigned int LayerList::GetLayerCount() const
77 return mLayers.size();
80 Layer* LayerList::GetLayer( unsigned int depth ) const
82 DALI_ASSERT_ALWAYS( depth < mLayers.size() );
84 return mLayers[ depth ];
87 unsigned int LayerList::GetDepth( const Layer* layer ) const
89 for( unsigned int count = 0; count < mLayers.size(); ++count )
91 if( layer == mLayers[ count ] )
99 void LayerList::RegisterLayer(Layer& layer)
101 DALI_ASSERT_DEBUG( mLayers.end() == Find( mLayers.begin(), mLayers.end(), layer) );
102 mLayers.push_back(&layer);
107 void LayerList::UnregisterLayer(Layer& layer)
110 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
111 DALI_ASSERT_DEBUG(iter != mLayers.end());
119 void LayerList::RaiseLayer(Layer& raiseLayer)
121 LayerIter iter = Find( mLayers.begin(), mLayers.end(), raiseLayer);
123 if (iter != mLayers.end() &&
124 iter+1 != mLayers.end())
126 LayerIter nextIter = iter+1;
129 std::swap(*iter, *nextIter);
135 void LayerList::LowerLayer(Layer& lowerLayer)
137 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), lowerLayer);
139 if (iter != mLayers.rend() &&
140 iter+1 != mLayers.rend())
142 ReverseLayerIter nextIter = iter+1;
145 std::swap(*iter, *nextIter);
151 void LayerList::RaiseLayerToTop( const Layer& layer )
153 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
155 if (iter != mLayers.end() &&
156 iter+1 != mLayers.end())
158 Layer* raised = *iter;
160 copy(iter+1, mLayers.end(), iter);
161 mLayers.back() = raised;
167 void LayerList::LowerLayerToBottom( const Layer& layer )
169 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), layer);
171 if (iter != mLayers.rend() &&
172 iter+1 != mLayers.rend())
174 Layer* lowered = *iter;
176 copy(iter+1, mLayers.rend(), iter);
177 mLayers.front() = lowered;
183 void LayerList::MoveLayerAbove( const Layer& layer, const Layer& target )
185 // check if it already is
186 if( layer.GetDepth() == ( target.GetDepth() + 1 ) )
191 // find the layer to move
192 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
194 if( iter != mLayers.end() )
196 Layer* moved = *iter;
197 mLayers.erase( iter );
199 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
200 // if target is not found there's a programming error somewhere
201 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
202 // iterT might be the last
203 if( ( iterT+1 ) == mLayers.end() )
205 mLayers.push_back( moved );
209 mLayers.insert( iterT+1, moved );
216 void LayerList::MoveLayerBelow( const Layer& layer, const Layer& target )
218 // check if it already is in correct order
219 if( layer.GetDepth() == ( target.GetDepth() - 1 ) )
224 // find the layer to move
225 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
226 if( iter != mLayers.end() )
228 Layer* moved = *iter;
229 mLayers.erase( iter );
231 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
232 // if target is not found there's a programming error somewhere
233 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
234 mLayers.insert( iterT, moved );
240 LayerList::LayerList( Stage& stage, bool systemLevel )
242 mIsSystemLevel( systemLevel )
246 void LayerList::SetLayerDepths()
248 // we've got a list of on-stage layers on actor side, need to get their stage
249 // pointers so we can send them to the update manager
250 std::vector< SceneGraph::Layer* > layers;
251 layers.reserve( mLayers.size() );
253 // Set the layers (possibly) new depth
254 for (LayerIter iter = mLayers.begin(); iter != mLayers.end(); ++iter)
256 SceneGraph::Layer* layerPtr = const_cast< SceneGraph::Layer* >( &( (*iter)->GetSceneLayerOnStage() ) );
257 layers.push_back( layerPtr );
260 // Layers are being used in a separate thread; queue a message to set order
261 SetLayerDepthsMessage( mStage.GetUpdateManager(), layers, mIsSystemLevel );
264 } // namespace Internal