2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
18 #include <dali/internal/event/actors/layer-list.h>
21 #include <algorithm> // for std::swap
24 #include <dali/integration-api/debug.h>
25 #include <dali/internal/event/actors/layer-impl.h>
26 #include <dali/internal/event/common/stage-impl.h>
27 #include <dali/internal/update/manager/update-manager.h>
37 namespace // unnamed namespace
40 typedef std::vector<Layer*> LayerContainer;
41 typedef LayerContainer::iterator LayerIter;
42 typedef LayerContainer::reverse_iterator ReverseLayerIter;
45 * A private helper template to return an iterator to the layer passed in.
46 * @param[in] first position to start searching from
47 * @param[in] last position to search to
48 * @param[in] layer to search for
49 * @return iterator to layer if found
51 template<class InputIterator> InputIterator Find( InputIterator first, InputIterator last, const Layer& layer )
53 for( ; first != last ; ++first )
55 if( *first == &layer )
63 } // unnamed namespace
65 LayerList* LayerList::New( Stage& stage, bool systemLevel )
67 return new LayerList( stage, systemLevel );
70 LayerList::~LayerList()
74 unsigned int LayerList::GetLayerCount() const
76 return mLayers.size();
79 Layer* LayerList::GetLayer( unsigned int depth ) const
81 DALI_ASSERT_ALWAYS( depth < mLayers.size() );
83 return mLayers[ depth ];
86 unsigned int LayerList::GetDepth( const Layer* layer ) const
88 for( unsigned int count = 0; count < mLayers.size(); ++count )
90 if( layer == mLayers[ count ] )
98 void LayerList::RegisterLayer(Layer& layer)
100 DALI_ASSERT_DEBUG( mLayers.end() == Find( mLayers.begin(), mLayers.end(), layer) );
101 mLayers.push_back(&layer);
106 void LayerList::UnregisterLayer(Layer& layer)
109 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
110 DALI_ASSERT_DEBUG(iter != mLayers.end());
118 void LayerList::RaiseLayer(Layer& raiseLayer)
120 LayerIter iter = Find( mLayers.begin(), mLayers.end(), raiseLayer);
122 if (iter != mLayers.end() &&
123 iter+1 != mLayers.end())
125 LayerIter nextIter = iter+1;
128 std::swap(*iter, *nextIter);
134 void LayerList::LowerLayer(Layer& lowerLayer)
136 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), lowerLayer);
138 if (iter != mLayers.rend() &&
139 iter+1 != mLayers.rend())
141 ReverseLayerIter nextIter = iter+1;
144 std::swap(*iter, *nextIter);
150 void LayerList::RaiseLayerToTop( const Layer& layer )
152 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
154 if (iter != mLayers.end() &&
155 iter+1 != mLayers.end())
157 Layer* raised = *iter;
159 copy(iter+1, mLayers.end(), iter);
160 mLayers.back() = raised;
166 void LayerList::LowerLayerToBottom( const Layer& layer )
168 ReverseLayerIter iter = Find( mLayers.rbegin(), mLayers.rend(), layer);
170 if (iter != mLayers.rend() &&
171 iter+1 != mLayers.rend())
173 Layer* lowered = *iter;
175 copy(iter+1, mLayers.rend(), iter);
176 mLayers.front() = lowered;
182 void LayerList::MoveLayerAbove( const Layer& layer, const Layer& target )
184 // check if it already is
185 if( layer.GetDepth() == ( target.GetDepth() + 1 ) )
190 // find the layer to move
191 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
193 if( iter != mLayers.end() )
195 Layer* moved = *iter;
196 mLayers.erase( iter );
198 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
199 // if target is not found there's a programming error somewhere
200 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
201 // iterT might be the last
202 if( ( iterT+1 ) == mLayers.end() )
204 mLayers.push_back( moved );
208 mLayers.insert( iterT+1, moved );
215 void LayerList::MoveLayerBelow( const Layer& layer, const Layer& target )
217 // check if it already is in correct order
218 if( layer.GetDepth() == ( target.GetDepth() - 1 ) )
223 // find the layer to move
224 LayerIter iter = Find( mLayers.begin(), mLayers.end(), layer);
225 if( iter != mLayers.end() )
227 Layer* moved = *iter;
228 mLayers.erase( iter );
230 LayerIter iterT = Find( mLayers.begin(), mLayers.end(), target);
231 // if target is not found there's a programming error somewhere
232 DALI_ASSERT_DEBUG( iterT != mLayers.end() );
233 mLayers.insert( iterT, moved );
239 LayerList::LayerList( Stage& stage, bool systemLevel )
241 mIsSystemLevel( systemLevel )
245 void LayerList::SetLayerDepths()
247 // we've got a list of on-stage layers on actor side, need to get their stage
248 // pointers so we can send them to the update manager
249 std::vector< SceneGraph::Layer* > layers;
250 layers.reserve( mLayers.size() );
252 // Set the layers (possibly) new depth
253 for (LayerIter iter = mLayers.begin(); iter != mLayers.end(); ++iter)
255 SceneGraph::Layer* layerPtr = const_cast< SceneGraph::Layer* >( &( (*iter)->GetSceneLayerOnStage() ) );
256 layers.push_back( layerPtr );
259 // Layers are being used in a separate thread; queue a message to set order
260 SetLayerDepthsMessage( mStage.GetUpdateManager(), layers, mIsSystemLevel );
263 } // namespace Internal