1 #ifndef DALI_TOOLKIT_INTERNAL_LAYOUT_CONTROLLER_H
2 #define DALI_TOOLKIT_INTERNAL_LAYOUT_CONTROLLER_H
5 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 #include <dali/public-api/object/base-object.h>
21 #include <dali/integration-api/core.h>
22 #include <dali-toolkit/public-api/controls/control.h>
23 #include <dali-toolkit/devel-api/layouting/layout-controller.h>
24 #include <dali-toolkit/devel-api/layouting/layout-item-impl.h>
25 #include <dali-toolkit/devel-api/layouting/layout-group-impl.h>
26 #include <dali-toolkit/internal/layouting/layout-transition-data-impl.h>
36 * @brief Layout controller handles measurement and layout of all
37 * controls that utilize Layouts.
39 class LayoutController : public Dali::BaseObject, public Integration::Processor
53 * Second stage initialization
58 * This marks the given layout and all its parents as dirty and triggers a transition if set.
60 void RequestLayout( LayoutItem& layout, int layoutTransitionType );
63 * Measures next level of layouts in the actor hierarchy.
65 void MeasureHierarchy( Actor root, MeasureSpec widthSpec, MeasureSpec heightSpec );
68 * Perform layout of the hierarchy
70 void PerformLayout( Actor root, int left, int top, int right, int bottom );
73 * Perform positioning of actors after layout update
75 void PerformLayoutPositioning( LayoutPositionDataArray& layoutPositionDataArray, bool all ) const;
78 * Perform animation of actors properties after layout update
80 void PerformLayoutAnimation( LayoutTransition& layoutTransition, LayoutPositionDataArray& layoutPositionDataArray, LayoutDataArray& layoutDataArray, LayoutAnimatorArray& layoutAnimatorArray );
82 protected: // Implementation of Processor
85 * @copydoc Dali::Integration::Processor::Process()
87 virtual void Process();
90 std::list< LayoutTransition > mLayoutTransitions;
91 struct AnimationFinishedFunctor
93 AnimationFinishedFunctor( LayoutController& layoutController, LayoutTransition& layoutTransition, LayoutPositionDataArray& array )
94 : layoutController( layoutController ),
95 layoutDataPositionArray(),
96 layoutItem( layoutTransition.layoutItem ),
97 layoutTransitionType( layoutTransition.layoutTransitionType )
99 layoutDataPositionArray.swap( array );
102 void operator()( Animation& animation )
104 layoutController.PerformLayoutPositioning( layoutDataPositionArray, true );
105 layoutController.mAnimationFinishedFunctors.pop_front();
106 if (layoutTransitionType != -1)
108 LayoutTransitionDataPtr layoutTransitionDataPtr = layoutItem->GetTransitionData( layoutTransitionType );
109 layoutTransitionDataPtr->EmitSignalFinish( layoutTransitionType );
113 LayoutController& layoutController;
114 LayoutPositionDataArray layoutDataPositionArray;
115 LayoutItemPtr layoutItem;
116 int layoutTransitionType;
119 bool mLayoutRequested;
120 Animation mAnimation;
121 std::list< AnimationFinishedFunctor > mAnimationFinishedFunctors;
123 SlotDelegate<LayoutController> mSlotDelegate;
126 } // namespace Internal
128 inline Internal::LayoutController& GetImpl( Dali::Toolkit::LayoutController& handle )
130 DALI_ASSERT_ALWAYS(handle);
131 Dali::BaseObject& object = handle.GetBaseObject();
132 return static_cast<Internal::LayoutController&>(object);
135 inline const Internal::LayoutController& GetImpl( const Dali::Toolkit::LayoutController& handle )
137 DALI_ASSERT_ALWAYS(handle);
138 const Dali::BaseObject& object = handle.GetBaseObject();
139 return static_cast<const Internal::LayoutController&>(object);
142 } // namespace Toolkit
145 #endif // DALI_TOOLKIT_INTERNAL_LAYOUT_CONTROLLER_H