using Dali::Actor;
using Dali::Toolkit::MeasuredSize;
+CustomLayout::CustomLayout()
+: mBehaviourFlags( 0 )
+{
+}
+
CustomLayoutPtr CustomLayout::New()
{
CustomLayoutPtr layout( new CustomLayout() );
return layout;
}
+void CustomLayout::MeasureChildren( Dali::Toolkit::Internal::LayoutItemPtr childLayout, MeasureSpec widthMeasureSpec, MeasureSpec heightMeasureSpec, LayoutLength resultingWidth, LayoutLength resultingHeight )
+{
+ // Initially use the measure spec of the child's parent
+ auto childWidthMeasureSpec = widthMeasureSpec;
+ auto childHeightMeasureSpec = heightMeasureSpec;
+
+ if ( true == GetCustomBehaviourFlags( Test::CustomLayout::BEHAVIOUR_FLAG_UNCONSTRAINED_CHILD_WIDTH ) )
+ {
+ // Use unspecified width measure spec, child can be any width it desires
+ childWidthMeasureSpec = MeasureSpec( widthMeasureSpec.GetSize(), MeasureSpec::Mode::UNSPECIFIED );
+ }
+
+ if ( true == GetCustomBehaviourFlags( Test::CustomLayout::BEHAVIOUR_FLAG_UNCONSTRAINED_CHILD_HEIGHT) )
+ {
+ // Use unspecified height measure spec, child can be any height it desires
+ childHeightMeasureSpec = MeasureSpec( heightMeasureSpec.GetSize(), MeasureSpec::Mode::UNSPECIFIED );
+ }
+
+ MeasureChild( childLayout, childWidthMeasureSpec, childHeightMeasureSpec );
+ resultingWidth += childLayout->GetMeasuredWidth();
+ resultingHeight = std::max( childLayout->GetMeasuredHeight(), resultingHeight );
+}
+
void CustomLayout::OnMeasure( MeasureSpec widthMeasureSpec, MeasureSpec heightMeasureSpec )
{
auto accumulatedWidth = 0;
auto childLayout = GetChildAt( i );
if( childLayout )
{
- MeasureChild( childLayout, widthMeasureSpec, heightMeasureSpec );
- accumulatedWidth += childLayout->GetMeasuredWidth();
- maxHeight = std::max( childLayout->GetMeasuredHeight().mValue, maxHeight );
+ MeasureChildren( childLayout, widthMeasureSpec, heightMeasureSpec, accumulatedWidth, maxHeight );
}
}
LayoutLength childLeft( 0 );
// We want to vertically align the children to the middle
- auto height = bottom - top;
- auto middle = height / 2;
+ LayoutLength height = bottom - top;
+ LayoutLength middle = height / 2;
auto owner = GetOwner();
auto actor = Actor::DownCast(owner);
// Horizontally align the children to the left
int count = actor.GetChildCount();
- int currentLeft = 0;
+ LayoutLength currentLeft = 0;
for( int i = 0; i < count; i++)
{
{
Dali::Toolkit::Internal::LayoutItem& childLayoutImpl = GetImplementation( childLayout );
- auto childWidth = childLayoutImpl.GetMeasuredWidth();
- auto childHeight = childLayoutImpl.GetMeasuredHeight();
+ LayoutLength childWidth = childLayoutImpl.GetMeasuredWidth();
+ LayoutLength childHeight = childLayoutImpl.GetMeasuredHeight();
- childTop = middle - (childHeight / 2);
+ childTop = middle - childHeight / 2;
childLayoutImpl.Layout( currentLeft, childTop, currentLeft + childWidth, childTop + childHeight );
currentLeft += childWidth;
}
}
}
+void CustomLayout::SetCustomBehaviourFlag( int flag )
+{
+ mBehaviourFlags |= flag;
+ RequestLayout();
+}
+
+bool CustomLayout::GetCustomBehaviourFlags( int flagToCheck )
+{
+ return ( mBehaviourFlags & flagToCheck ) != 0;
+}
+
+void CustomLayout::ClearPrivateFlag( int flag )
+{
+ mBehaviourFlags &= ~flag;
+ RequestLayout();
+}
+
} // namespace Internal
} // namespace Test