#include <dali/public-api/object/type-registry-helper.h>
#include <dali-toolkit/public-api/controls/control.h>
#include <dali-toolkit/devel-api/layouting/layout-item-impl.h>
+#include <dali-toolkit/devel-api/layouting/layout-group-impl.h>
#include <dali-toolkit/internal/layouting/layout-item-data-impl.h>
+namespace
+{
+
#if defined(DEBUG_ENABLED)
- Debug::Filter* gLayoutFilter = Debug::Filter::New( Debug::Verbose, false, "LOG_LAYOUT" );
+Debug::Filter* gLayoutFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_LAYOUT" );
#endif
-namespace
-{
const char* WIDTH_SPECIFICATION_NAME( "widthSpecification" );
const char* HEIGHT_SPECIFICATION_NAME( "heightSpecification" );
// Enable directly derived types to first remove children
OnUnparent();
+ // Remove myself from parent
+ LayoutParent* parent = GetParent();
+ if( parent )
+ {
+ parent->Remove( *this );
+ }
+
+ // Remove parent reference
+ SetParent(nullptr);
+
// Last, clear owner
mImpl->mOwner = NULL;
}
void LayoutItem::SetAnimateLayout( bool animateLayout )
{
mImpl->mAnimated = animateLayout;
+
+ OnAnimationStateChanged( animateLayout );
}
bool LayoutItem::IsLayoutAnimated() const
void LayoutItem::Measure( MeasureSpec widthMeasureSpec, MeasureSpec heightMeasureSpec )
{
+ DALI_LOG_TRACE_METHOD( gLayoutFilter );
+
const bool forceLayout = mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
const bool specChanged =
const bool needsLayout = specChanged && ( !isSpecExactly || !matchesSpecSize );
- if( forceLayout || needsLayout)
+ DALI_LOG_STREAM( gLayoutFilter, Debug::Verbose, "LayoutItem::Measure("<<widthMeasureSpec<<", "<<heightMeasureSpec<<") Owner:"<<Actor::DownCast(GetOwner()).GetName() <<" forceLayout="<<forceLayout<<", specChanged="<<specChanged<<", isSpecExactly="<<isSpecExactly<<", matchesSpecSize="<<matchesSpecSize<<", needsLayout="<<needsLayout <<std::endl <<(forceLayout||needsLayout?" Remeasuring":" NoChange"));
+
+ if( forceLayout || needsLayout )
{
mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_MEASURED_DIMENSION_SET );
- //resolveRtlPropertiesIfNeeded();
-
- int cacheIndex = -1; // = forceLayout ? -1 : mMeasureCache.indexOfKey(key);
- if( cacheIndex < 0 ) //|| sIgnoreMeasureCache )
- {
- // measure ourselves, this should set the measured dimension flag back
- OnMeasure( widthMeasureSpec, heightMeasureSpec );
- mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_MEASURE_NEEDED_BEFORE_LAYOUT );
- }
- else
- {
- mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_MEASURE_NEEDED_BEFORE_LAYOUT );
- }
+ // measure ourselves, this should set the measured dimension flag back
+#if defined(DEBUG_ENABLED)
+ std::ostringstream o;
+ o<<widthMeasureSpec<<","<<heightMeasureSpec;
+ DALI_LOG_INFO( gLayoutFilter, Debug::Concise, "Calling %s OnMeasure( %s )\n", Actor::DownCast(GetOwner()).GetName().c_str(), o.str().c_str());
+#endif
+ OnMeasure( widthMeasureSpec, heightMeasureSpec );
+ mImpl->ClearPrivateFlag( Impl::PRIVATE_FLAG_MEASURE_NEEDED_BEFORE_LAYOUT );
// flag not set, setMeasuredDimension() was not invoked, we raise an exception to warn the developer
DALI_ASSERT_ALWAYS( mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_MEASURED_DIMENSION_SET ) &&
mImpl->mOldWidthMeasureSpec = widthMeasureSpec;
mImpl->mOldHeightMeasureSpec = heightMeasureSpec;
-
- //mMeasureCache.put(key, ((long) mMeasuredWidth) << 32 | (long) mMeasuredHeight & 0xffffffffL); // suppress sign extension
}
void LayoutItem::Layout( LayoutLength l, LayoutLength t, LayoutLength r, LayoutLength b )
Extents LayoutItem::GetPadding() const
{
- return mImpl->mPadding;
+ Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
+ if( control )
+ {
+ Extents padding = control.GetProperty<Extents>( Toolkit::Control::Property::PADDING );
+
+ DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutBase::Padding for %s : (%d,%d,%d,%d) \n",
+ control.GetName().c_str(),
+ padding.start, padding.end, padding.top, padding.bottom
+ );
+ return padding;
+ }
+ else
+ {
+ return Extents();
+ }
+}
+
+Extents LayoutItem::GetMargin() const
+{
+ Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
+ if ( control )
+ {
+ return control.GetProperty<Extents>( Toolkit::Control::Property::MARGIN );
+ }
+ else
+ {
+ return Extents();
+ }
}
LayoutLength LayoutItem::GetDefaultSize( LayoutLength size, MeasureSpec measureSpec )
break;
}
case MeasureSpec::Mode::AT_MOST:
+ {
+ LayoutLength tmp = specSize;
+ if( size < tmp )
+ {
+ result = size;
+ }
+ else
+ {
+ result = specSize;
+ }
+ break;
+ }
case MeasureSpec::Mode::EXACTLY:
{
result = specSize;
{
}
+void LayoutItem::SetParent( LayoutParent* parent )
+{
+ mImpl->mLayoutParent = parent;
+}
+
LayoutParent* LayoutItem::GetParent()
{
return mImpl->mLayoutParent;
void LayoutItem::RequestLayout()
{
+ Toolkit::Control control = Toolkit::Control::DownCast( mImpl->mOwner );
+ if ( control )
+ {
+ DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::RequestLayout %s\n", control.GetName().c_str());
+ }
// @todo Enforce failure if called in Measure/Layout passes.
mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
Toolkit::LayoutController layoutController = Toolkit::LayoutController::Get();
return mImpl->GetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
}
+void LayoutItem::SetLayoutRequested()
+{
+ mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_FORCE_LAYOUT );
+}
+
void LayoutItem::SetMeasuredDimensions( MeasuredSize measuredWidth, MeasuredSize measuredHeight )
{
+ DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutBase::SetMeasuredDimensions width(%d) height(%d) \n",
+ MeasureSpec::IntType( measuredWidth.GetSize() ),
+ MeasureSpec::IntType( measuredHeight.GetSize() )
+ );
+
mImpl->SetPrivateFlag( Impl::PRIVATE_FLAG_MEASURED_DIMENSION_SET );
mImpl->mMeasuredWidth = measuredWidth;
mImpl->mMeasuredHeight = measuredHeight;
{
bool changed = false;
- DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame(%d, %d, %d, %d)\n", left.mValue, top.mValue, right.mValue, bottom.mValue );
+ DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame enter(%d, %d, %d, %d)\n", left.mValue, top.mValue, right.mValue, bottom.mValue );
if( mImpl->mLeft != left || mImpl->mRight != right || mImpl->mTop != top || mImpl->mBottom != bottom )
{
SizeChange( LayoutSize( newWidth, newHeight ), LayoutSize( oldWidth, oldHeight ) );
}
}
+
+ DALI_LOG_INFO( gLayoutFilter, Debug::Verbose, "LayoutItem::SetFrame exit(%d, %d, %d, %d)\n", left.mValue, top.mValue, right.mValue, bottom.mValue );
+
return changed;
}