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>
36 namespace // unnamed namespace
39 typedef std::vector<Layer*> LayerContainer;
40 typedef LayerContainer::iterator LayerIter;
41 typedef LayerContainer::reverse_iterator ReverseLayerIter;
44 * A private helper template to return an iterator to the layer passed in.
45 * @param[in] first position to start searching from
46 * @param[in] last position to search to
47 * @param[in] layer to search for
48 * @return iterator to layer if found
50 template<class InputIterator> InputIterator Find( InputIterator first, InputIterator last, const Layer& layer )
52 for( ; first != last ; ++first )
54 if( *first == &layer )
62 } // unnamed namespace
64 LayerList* LayerList::New( Stage& stage, bool systemLevel )
66 return new LayerList( stage, systemLevel );
69 LayerList::~LayerList()
73 unsigned int LayerList::GetLayerCount() const
75 return mLayers.size();
78 Layer* LayerList::GetLayer( unsigned int depth ) const
80 DALI_ASSERT_ALWAYS( depth < mLayers.size() );
82 return mLayers[ depth ];
85 unsigned int LayerList::GetDepth( const Layer* layer ) const
87 for( unsigned int count = 0; count < mLayers.size(); ++count )
89 if( layer == mLayers[ count ] )
97 void LayerList::RegisterLayer(Layer& layer)
99 DALI_ASSERT_DEBUG( mLayers.end() == Find( mLayers.begin(), mLayers.end(), layer) );
100 mLayers.push_back(&layer);
105 void LayerList::UnregisterLayer(Layer& layer)
108 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
109 DALI_ASSERT_DEBUG(iter != mLayers.end());
117 void LayerList::RaiseLayer(Layer& raiseLayer)
119 LayerIter iter = Find( mLayers.begin(), mLayers.end(), raiseLayer);
121 if (iter != mLayers.end() &&
122 iter+1 != mLayers.end())
124 LayerIter nextIter = iter+1;
127 std::swap(*iter, *nextIter);
133 void LayerList::LowerLayer(Layer& lowerLayer)
135 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), lowerLayer);
137 if (iter != mLayers.rend() &&
138 iter+1 != mLayers.rend())
140 ReverseLayerIter nextIter = iter+1;
143 std::swap(*iter, *nextIter);
149 void LayerList::RaiseLayerToTop( const Layer& layer )
151 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
153 if (iter != mLayers.end() &&
154 iter+1 != mLayers.end())
156 Layer* raised = *iter;
158 copy(iter+1, mLayers.end(), iter);
159 mLayers.back() = raised;
165 void LayerList::LowerLayerToBottom( const Layer& layer )
167 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), layer);
169 if (iter != mLayers.rend() &&
170 iter+1 != mLayers.rend())
172 Layer* lowered = *iter;
174 copy(iter+1, mLayers.rend(), iter);
175 mLayers.front() = lowered;
181 void LayerList::MoveLayerAbove( const Layer& layer, const Layer& target )
183 // check if it already is
184 if( layer.GetDepth() == ( target.GetDepth() + 1 ) )
189 // find the layer to move
190 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
192 if( iter != mLayers.end() )
194 Layer* moved = *iter;
195 mLayers.erase( iter );
197 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
198 // if target is not found there's a programming error somewhere
199 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
200 // iterT might be the last
201 if( ( iterT+1 ) == mLayers.end() )
203 mLayers.push_back( moved );
207 mLayers.insert( iterT+1, moved );
214 void LayerList::MoveLayerBelow( const Layer& layer, const Layer& target )
216 // check if it already is in correct order
217 if( layer.GetDepth() == ( target.GetDepth() - 1 ) )
222 // find the layer to move
223 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
224 if( iter != mLayers.end() )
226 Layer* moved = *iter;
227 mLayers.erase( iter );
229 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
230 // if target is not found there's a programming error somewhere
231 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
232 mLayers.insert( iterT, moved );
238 LayerList::LayerList( Stage& stage, bool systemLevel )
240 mIsSystemLevel( systemLevel )
244 void LayerList::SetLayerDepths()
246 // we've got a list of on-stage layers on actor side, need to get their stage
247 // pointers so we can send them to the update manager
248 std::vector< SceneGraph::Layer* > layers;
249 layers.reserve( mLayers.size() );
251 // Set the layers (possibly) new depth
252 for (LayerIter iter = mLayers.begin(); iter != mLayers.end(); ++iter)
254 SceneGraph::Layer* layerPtr = const_cast< SceneGraph::Layer* >( &( (*iter)->GetSceneLayerOnStage() ) );
255 layers.push_back( layerPtr );
258 // Layers are being used in a separate thread; queue a message to set order
259 SetLayerDepthsMessage( mStage.GetUpdateManager(), layers, mIsSystemLevel );
262 } // namespace Internal