2 * Copyright (c) 2018 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.
17 #include <dali/integration-api/debug.h>
19 #include <dali/public-api/animation/animation.h>
20 #include <dali/public-api/object/type-registry-helper.h>
21 #include <dali-toolkit/public-api/controls/control.h>
22 #include <dali/devel-api/object/handle-devel.h>
23 #include <dali-toolkit/devel-api/layouting/layout-item-impl.h>
24 #include <dali-toolkit/devel-api/layouting/layout-group-impl.h>
25 #include <dali-toolkit/internal/layouting/layout-transition-data-impl.h>
26 #include <dali-toolkit/internal/layouting/layout-item-data-impl.h>
28 #include <dali/devel-api/scripting/enum-helper.h>
33 #if defined(DEBUG_ENABLED)
34 Debug::Filter* gLayoutFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_LAYOUT" );
37 const char* WIDTH_SPECIFICATION_NAME( "widthSpecification" );
38 const char* HEIGHT_SPECIFICATION_NAME( "heightSpecification" );
49 LayoutItem::LayoutItem()
50 : mImpl( new LayoutItem::Impl() ),
55 LayoutItem::~LayoutItem()
57 // An object with a unique_ptr to an opaque structure must define it's destructor in the translation unit
58 // where the opaque structure is defined. It cannot use the default method in the header file.
61 LayoutItemPtr LayoutItem::New( Handle& owner )
63 LayoutItemPtr layoutPtr = new LayoutItem();
67 void LayoutItem::Initialize( Handle& owner, const std::string& containerType )
69 mImpl->mOwner = &(owner.GetBaseObject());
70 RegisterChildProperties( containerType );
71 OnInitialize(); // Ensure direct deriving class gets initialized
74 Handle LayoutItem::GetOwner() const
76 return Handle::DownCast(BaseHandle(mImpl->mOwner));
79 void LayoutItem::Unparent()
81 // Enable directly derived types to first remove children
84 // Remove myself from parent
85 LayoutParent* parent = GetParent();
88 parent->Remove( *this );
91 // Remove parent reference
98 LayoutTransitionDataPtr LayoutItem::GetDefaultTransition()
100 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::GetDefaultTransition\n" );
101 if ( !mImpl->mDefaultTransitionData.Get() )
103 auto owner = GetOwner();
104 auto actor = Actor::DownCast( owner );
106 mImpl->mDefaultTransitionData = LayoutTransitionData::New();
109 map[ Dali::Toolkit::LayoutTransitionData::AnimatorKey::PROPERTY ] = Actor::Property::POSITION;
110 map[ Dali::Toolkit::LayoutTransitionData::AnimatorKey::TARGET_VALUE ] = Property::Value(); // capture from layout update
111 map[ Dali::Toolkit::LayoutTransitionData::AnimatorKey::ANIMATOR ] = std::string(); // default animator with default duration
112 // Capture calculated position after layout, apply default linear animation
113 mImpl->mDefaultTransitionData->AddPropertyAnimator( actor, map );
117 map[ Dali::Toolkit::LayoutTransitionData::AnimatorKey::PROPERTY ] = Actor::Property::SIZE;
118 map[ Dali::Toolkit::LayoutTransitionData::AnimatorKey::TARGET_VALUE ] = Property::Value(); // capture from layout update
119 map[ Dali::Toolkit::LayoutTransitionData::AnimatorKey::ANIMATOR ] = std::string(); // default animator with default duration
120 // Capture calculated size after layout, apply default linear animation
121 mImpl->mDefaultTransitionData->AddPropertyAnimator( actor, map );
124 return mImpl->mDefaultTransitionData;
127 void LayoutItem::SetAnimateLayout( bool animateLayout )
129 auto owner = GetOwner();
130 auto actor = Actor::DownCast(owner);
132 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetAnimateLayout animateLayout(%s) owner(%s)\n", (animateLayout)?"true":"false",
133 ( ( Actor::DownCast( owner) ) ? Actor::DownCast(owner).GetName().c_str() : "Invalid Actor" ) );
135 mImpl->mAnimated = animateLayout;
137 OnAnimationStateChanged( animateLayout );
140 bool LayoutItem::IsLayoutAnimated() const
142 return mImpl->mAnimated;
145 void LayoutItem::SetTransitionData( int layoutTransitionType, Internal::LayoutTransitionDataPtr layoutTransitionDataPtr )
147 switch ( layoutTransitionType )
149 case Dali::Toolkit::LayoutTransitionData::ON_CHILD_ADD:
150 mImpl->mOnChildAddTransitionData = layoutTransitionDataPtr;
152 case Dali::Toolkit::LayoutTransitionData::ON_CHILD_REMOVE:
153 mImpl->mOnChildRemoveTransitionData = layoutTransitionDataPtr;
155 case Dali::Toolkit::LayoutTransitionData::ON_CHILD_FOCUS:
156 mImpl->mOnChildFocusTransitionData = layoutTransitionDataPtr;
158 case Dali::Toolkit::LayoutTransitionData::ON_OWNER_SET:
159 mImpl->mOnOwnerSetTransitionData = layoutTransitionDataPtr;
161 case Dali::Toolkit::LayoutTransitionData::ON_LAYOUT_CHANGE:
162 mImpl->mOnLayoutChangeTransitionData = layoutTransitionDataPtr;
169 Internal::LayoutTransitionDataPtr LayoutItem::GetTransitionData( int layoutTransitionType ) const
171 switch ( layoutTransitionType )
173 case Dali::Toolkit::LayoutTransitionData::ON_CHILD_ADD:
174 return mImpl->mOnChildAddTransitionData.Get();
175 case Dali::Toolkit::LayoutTransitionData::ON_CHILD_REMOVE:
176 return mImpl->mOnChildRemoveTransitionData.Get();
177 case Dali::Toolkit::LayoutTransitionData::ON_CHILD_FOCUS:
178 return mImpl->mOnChildFocusTransitionData.Get();
179 case Dali::Toolkit::LayoutTransitionData::ON_OWNER_SET:
180 return mImpl->mOnOwnerSetTransitionData.Get();
181 case Dali::Toolkit::LayoutTransitionData::ON_LAYOUT_CHANGE:
182 return mImpl->mOnLayoutChangeTransitionData.Get();
184 return LayoutTransitionDataPtr();
188 void LayoutItem::RegisterChildProperties( const std::string& containerType )
190 // Call on derived types
191 auto typeInfo = TypeRegistry::Get().GetTypeInfo( containerType );
194 Property::IndexContainer indices;
195 typeInfo.GetChildPropertyIndices( indices );
197 if( std::find( indices.Begin(), indices.End(), Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION ) ==
200 ChildPropertyRegistration( typeInfo.GetName(), WIDTH_SPECIFICATION_NAME,
201 Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION, Property::INTEGER );
203 ChildPropertyRegistration( typeInfo.GetName(), HEIGHT_SPECIFICATION_NAME,
204 Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION, Property::INTEGER );
207 OnRegisterChildProperties( containerType );
211 void LayoutItem::OnRegisterChildProperties( const std::string& containerType )
216 void LayoutItem::Measure( MeasureSpec widthMeasureSpec, MeasureSpec heightMeasureSpec )
218 DALI_LOG_TRACE_METHOD( gLayoutFilter );
220 const bool forceLayout = mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
222 const bool specChanged =
223 ( widthMeasureSpec != mImpl->mOldWidthMeasureSpec ) ||
224 ( heightMeasureSpec != mImpl->mOldHeightMeasureSpec );
226 const bool isSpecExactly =
227 ( widthMeasureSpec.GetMode() == MeasureSpec::Mode::EXACTLY ) &&
228 ( heightMeasureSpec.GetMode() == MeasureSpec::Mode::EXACTLY );
230 const bool matchesSpecSize =
231 ( GetMeasuredWidth() == widthMeasureSpec.GetSize() ) &&
232 ( GetMeasuredHeight() == heightMeasureSpec.GetSize() );
234 const bool needsLayout = specChanged && ( !isSpecExactly || !matchesSpecSize );
236 DALI_LOG_STREAM( gLayoutFilter, Debug::Verbose, "LayoutItem::Measure("<<widthMeasureSpec<<", "<<heightMeasureSpec<<") Owner:"
237 <<Actor::DownCast(GetOwner()).GetName() <<" forceLayout="<<forceLayout
238 <<", specChanged="<<specChanged<<", isSpecExactly="<<isSpecExactly
239 <<", matchesSpecSize="<<matchesSpecSize
240 <<", needsLayout="<<needsLayout <<(forceLayout||needsLayout?" Remeasuring":" NoChange"));
242 if( forceLayout || needsLayout )
244 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_MEASURED_DIMENSION_SET );
246 // measure ourselves, this should set the measured dimension flag back
247 #if defined(DEBUG_ENABLED)
248 std::ostringstream o;
249 o<<widthMeasureSpec<<","<<heightMeasureSpec;
250 DALI_LOG_INFO( gLayoutFilter, Debug::General, "LayoutItem::Measure Calling %s OnMeasure( %s )\n", Actor::DownCast(GetOwner()).GetName().c_str(), o.str().c_str());
252 OnMeasure( widthMeasureSpec, heightMeasureSpec );
253 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_MEASURE_NEEDED_BEFORE_LAYOUT );
255 // flag not set, setMeasuredDimension() was not invoked, we raise an exception to warn the developer
256 DALI_ASSERT_ALWAYS( mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_MEASURED_DIMENSION_SET ) &&
257 "Layout's OnMeasure() Measured dimension flag not set" );
258 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_LAYOUT_REQUIRED );
261 mImpl->mOldWidthMeasureSpec = widthMeasureSpec;
262 mImpl->mOldHeightMeasureSpec = heightMeasureSpec;
265 void LayoutItem::Layout( LayoutLength l, LayoutLength t, LayoutLength r, LayoutLength b )
267 DALI_LOG_TRACE_METHOD( gLayoutFilter );
269 if( mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_MEASURE_NEEDED_BEFORE_LAYOUT ) )
271 OnMeasure( mImpl->mOldWidthMeasureSpec, mImpl->mOldHeightMeasureSpec );
272 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_MEASURE_NEEDED_BEFORE_LAYOUT );
275 LayoutData& layoutData = *mImpl->sLayoutData;
276 size_t size = layoutData.childrenLayoutDataArray.size();
278 bool changed = SetFrame( l, t, r, b );
280 if( changed || mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_LAYOUT_REQUIRED ) )
283 OnLayout( changed, l, t, r, b );
284 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_LAYOUT_REQUIRED );
287 if ( size != layoutData.childrenLayoutDataArray.size() )
289 layoutData.childrenLayoutDataArray.resize( size );
292 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
293 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_IS_LAID_OUT );
296 LayoutLength LayoutItem::GetMinimumWidth() const
298 return mImpl->mMinimumSize.GetWidth();
301 LayoutLength LayoutItem::GetMinimumHeight() const
303 return mImpl->mMinimumSize.GetHeight();
306 void LayoutItem::SetMinimumWidth( LayoutLength minimumWidth )
308 mImpl->mMinimumSize.SetWidth( minimumWidth );
312 void LayoutItem::SetMinimumHeight( LayoutLength minimumHeight )
314 mImpl->mMinimumSize.SetHeight( minimumHeight );
318 Extents LayoutItem::GetPadding() const
320 Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
323 Extents padding = control.GetProperty<Extents>( Toolkit::Control::Property::PADDING );
325 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::Padding for %s : (%d,%d,%d,%d) \n",
326 control.GetName().c_str(),
327 padding.start, padding.end, padding.top, padding.bottom
337 Extents LayoutItem::GetMargin() const
339 Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
342 return control.GetProperty<Extents>( Toolkit::Control::Property::MARGIN );
350 LayoutLength LayoutItem::GetDefaultSize( LayoutLength size, MeasureSpec measureSpec )
352 LayoutLength result = size;
353 auto specMode = measureSpec.GetMode();
354 auto specSize = measureSpec.GetSize();
356 DALI_LOG_STREAM( gLayoutFilter, Debug::Verbose, "LayoutItem::GetDefaultSize MeasureSpec("<<measureSpec<< ") size:" << size << "\n" );
360 case MeasureSpec::Mode::UNSPECIFIED:
365 case MeasureSpec::Mode::AT_MOST:
367 // Ensure the default size does not exceed the spec size unless the default size is 0.
368 // Another container could provide a default size of 0.
369 LayoutLength tmp = specSize;
371 // Do not set size to 0, use specSize in this case as could be a legacy container
372 if( size < tmp && size > LayoutLength( 0 ) )
382 case MeasureSpec::Mode::EXACTLY:
388 DALI_LOG_STREAM( gLayoutFilter, Debug::General, "LayoutItem::GetDefaultSize setting default size:" << result << "\n" );
392 void LayoutItem::OnMeasure( MeasureSpec widthMeasureSpec, MeasureSpec heightMeasureSpec)
394 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::OnMeasure\n");
396 // GetDefaultSize will limit the MeasureSpec to the suggested minimumWidth and minimumHeight
397 SetMeasuredDimensions( GetDefaultSize( GetSuggestedMinimumWidth(), widthMeasureSpec ),
398 GetDefaultSize( GetSuggestedMinimumHeight(), heightMeasureSpec ) );
401 void LayoutItem::OnLayout( bool changed, LayoutLength left, LayoutLength top, LayoutLength right, LayoutLength bottom )
405 void LayoutItem::SetParent( LayoutParent* parent )
407 mImpl->mLayoutParent = parent;
408 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_SET_FRAME );
411 LayoutParent* LayoutItem::GetParent()
413 return mImpl->mLayoutParent;
416 void LayoutItem::RequestLayout()
418 Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
421 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::RequestLayout control(%s)\n",
422 control.GetName().c_str() );
424 // @todo Enforce failure if called in Measure/Layout passes.
425 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
426 Toolkit::LayoutController layoutController = Toolkit::LayoutController::Get();
427 layoutController.RequestLayout( Toolkit::LayoutItem( this ) );
430 void LayoutItem::RequestLayout( Dali::Toolkit::LayoutTransitionData::Type layoutAnimationType )
432 Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
435 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::RequestLayout control(%s) layoutTranstionType(%d)\n",
436 control.GetName().c_str(), (int)layoutAnimationType );
438 // @todo Enforce failure if called in Measure/Layout passes.
439 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
440 Toolkit::LayoutController layoutController = Toolkit::LayoutController::Get();
441 layoutController.RequestLayout( Toolkit::LayoutItem(this), layoutAnimationType );
444 void LayoutItem::RequestLayout( Dali::Toolkit::LayoutTransitionData::Type layoutAnimationType, Actor gainedChild, Actor lostChild )
446 Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
449 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::RequestLayout control(%s) layoutTranstionType(%d)\n",
450 control.GetName().c_str(), (int)layoutAnimationType );
452 // @todo Enforce failure if called in Measure/Layout passes.
453 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
454 Toolkit::LayoutController layoutController = Toolkit::LayoutController::Get();
455 layoutController.RequestLayout( Toolkit::LayoutItem(this), layoutAnimationType, gainedChild, lostChild );
458 bool LayoutItem::IsLayoutRequested() const
460 return mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
463 void LayoutItem::SetLayoutRequested()
465 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
468 bool LayoutItem::IsResizePolicyRequired() const
470 return mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_USE_RESIZE_POLICY );
473 void LayoutItem::SetResizePolicyRequired( bool resizePolicyRequired )
475 if( resizePolicyRequired )
477 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_USE_RESIZE_POLICY );
481 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_USE_RESIZE_POLICY );
485 void LayoutItem::SetMeasuredDimensions( MeasuredSize measuredWidth, MeasuredSize measuredHeight )
488 DALI_LOG_STREAM( gLayoutFilter, Debug::Verbose, "LayoutItem::SetMeasuredDimensions width(" << measuredWidth.GetSize() << ") height(" << measuredHeight.GetSize() << ") Control:" <<
489 ( ( Actor::DownCast( GetOwner()) ) ? Actor::DownCast(GetOwner()).GetName().c_str() : "Invalid Actor" ) << "\n" );
491 mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_MEASURED_DIMENSION_SET );
492 mImpl->mMeasuredWidth = measuredWidth;
493 mImpl->mMeasuredHeight = measuredHeight;
496 LayoutLength LayoutItem::GetMeasuredWidth() const
498 // Get the size portion of the measured width
499 return mImpl->mMeasuredWidth.GetSize();
502 LayoutLength LayoutItem::GetMeasuredHeight() const
504 return mImpl->mMeasuredHeight.GetSize();
507 MeasuredSize LayoutItem::GetMeasuredWidthAndState() const
509 return mImpl->mMeasuredWidth;
512 MeasuredSize LayoutItem::GetMeasuredHeightAndState() const
514 return mImpl->mMeasuredHeight;
517 LayoutLength LayoutItem::GetSuggestedMinimumWidth() const
519 auto owner = GetOwner();
520 auto actor = Actor::DownCast(owner);
521 auto naturalSize = actor ? actor.GetNaturalSize() : Vector3::ZERO;
523 return std::max( mImpl->mMinimumSize.GetWidth(), LayoutLength( naturalSize.width ) );
526 LayoutLength LayoutItem::GetSuggestedMinimumHeight() const
528 auto owner = GetOwner();
529 auto actor = Actor::DownCast(owner);
530 auto naturalSize = actor ? actor.GetNaturalSize() : Vector3::ZERO;
532 return std::max( mImpl->mMinimumSize.GetHeight(), LayoutLength( naturalSize.height ) );
535 MeasuredSize LayoutItem::ResolveSizeAndState( LayoutLength size, MeasureSpec measureSpec, MeasuredSize::State childMeasuredState )
537 auto specMode = measureSpec.GetMode();
538 LayoutLength specSize = measureSpec.GetSize();
543 case MeasureSpec::Mode::AT_MOST:
547 result = MeasuredSize( specSize, MeasuredSize::MEASURED_SIZE_TOO_SMALL );
551 result.SetSize( size );
556 case MeasureSpec::Mode::EXACTLY:
558 result.SetSize( specSize );
562 case MeasureSpec::Mode::UNSPECIFIED:
565 result.SetSize( size );
570 result.SetState( childMeasuredState );
575 bool LayoutItem::SetFrame( LayoutLength left, LayoutLength top, LayoutLength right, LayoutLength bottom )
577 bool changed = false;
579 DALI_LOG_STREAM( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame enter(" << left << ", " << top << ", " << right << ", " << bottom << ")\n" );
581 if( mImpl->mLeft != left || mImpl->mRight != right || mImpl->mTop != top || mImpl->mBottom != bottom || mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_SET_FRAME ) )
584 mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_FORCE_SET_FRAME );
587 LayoutLength oldWidth = mImpl->mRight - mImpl->mLeft;
588 LayoutLength oldHeight = mImpl->mBottom - mImpl->mTop;
589 LayoutLength newWidth = right - left;
590 LayoutLength newHeight = bottom - top;
591 bool sizeChanged = ( newWidth != oldWidth ) || ( newHeight != oldHeight );
595 mImpl->mRight = right;
596 mImpl->mBottom = bottom;
598 // Reflect up to parent control
599 auto owner = GetOwner();
600 auto actor = Actor::DownCast( owner );
601 LayoutData& layoutData = *mImpl->sLayoutData;
605 if( changed || mImpl->mAnimated )
607 layoutData.layoutPositionDataArray.push_back(
608 LayoutPositionData( actor, left.AsDecimal(), top.AsDecimal(), right.AsDecimal(), bottom.AsDecimal(), mImpl->mAnimated ) );
611 if( mImpl->mAnimated && !layoutData.speculativeLayout )
613 if( layoutData.layoutTransition.layoutTransitionType != -1 )
615 LayoutItem* transitionOwner = layoutData.layoutTransition.layoutItem.Get();
616 LayoutTransitionDataPtr layoutTransitionDataPtr = GetTransitionData( layoutData.layoutTransition.layoutTransitionType );
618 // Found transition owner
619 if( transitionOwner == this && layoutTransitionDataPtr.Get() )
621 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame apply transition to (%s), transition type (%d)\n", actor.GetName().c_str(), layoutData.layoutTransition.layoutTransitionType );
622 layoutTransitionDataPtr->CollectLayoutDataElements( actor, layoutData );
627 LayoutTransitionData::CollectChildrenLayoutDataElements( actor, layoutData );
634 LayoutTransitionDataPtr layoutTransitionDataPtr = GetTransitionData( Dali::Toolkit::LayoutTransitionData::ON_LAYOUT_CHANGE );
635 if( layoutTransitionDataPtr ) // has custom default animation and normal update
637 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame apply custom default transition to (%s), transition type (%d)\n", actor.GetName().c_str(), Dali::Toolkit::LayoutTransitionData::ON_LAYOUT_CHANGE );
638 layoutTransitionDataPtr->CollectLayoutDataElements( actor, layoutData );
642 DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame apply default transition to (%s), transition type (%d)\n", actor.GetName().c_str(), layoutData.layoutTransition.layoutTransitionType );
643 GetDefaultTransition()->CollectLayoutDataElements( actor, layoutData );
650 // TODO: do we need it
653 SizeChange( LayoutSize( newWidth, newHeight ), LayoutSize( oldWidth, oldHeight ) );
656 DALI_LOG_STREAM( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame exit(" << left << ", " << top << ", " << right << ", " << bottom << ")\n" );
661 void LayoutItem::OnLayoutAnimationFinished( Animation& animation )
663 auto owner = GetOwner();
664 auto actor = Actor::DownCast(owner);
667 actor.SetSize( Vector3( mImpl->mRight.AsInteger() - mImpl->mLeft.AsInteger(), mImpl->mBottom.AsInteger() - mImpl->mTop.AsInteger(), 0.0f ) );
671 void LayoutItem::SizeChange( LayoutSize newSize, LayoutSize oldSize)
673 OnSizeChanged( newSize, oldSize );
677 void LayoutItem::OnSizeChanged( LayoutSize newSize, LayoutSize oldSize )
681 void LayoutItem::OnInitialize()
686 } // namespace Internal
687 } // namespace Toolkit