X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Flayouting%2Fflex-layout-impl.cpp;h=bf5d084aa4580e464efe6182392b8dd60182aea4;hb=f8336fdc865faf2c19fe880252ad3bf1bb0aaee4;hp=648a7f653e1658d32dbbae0f786127d470f61df8;hpb=5a436526e75ad9bef35e98614a00527fe5586f78;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/layouting/flex-layout-impl.cpp b/dali-toolkit/internal/layouting/flex-layout-impl.cpp index 648a7f6..bf5d084 100644 --- a/dali-toolkit/internal/layouting/flex-layout-impl.cpp +++ b/dali-toolkit/internal/layouting/flex-layout-impl.cpp @@ -286,84 +286,33 @@ YGSize FlexLayout::OnChildMeasure( YGNodeRef node, YGMeasureMode widthMode, float innerHeight, YGMeasureMode heightMode ) { - // TODO: this function should try to get use of LayoutGroup::GetChildMeasureSpec - // or LayoutGroup::MeasureChild somehow since it is fixed now LayoutItem* childLayout = static_cast(node->getContext()); auto childOwner = childLayout->GetOwner(); auto desiredWidth = childOwner.GetProperty( Toolkit::LayoutItem::ChildProperty::WIDTH_SPECIFICATION ); auto desiredHeight = childOwner.GetProperty( Toolkit::LayoutItem::ChildProperty::HEIGHT_SPECIFICATION ); - - MeasureSpec::Mode measureWidthMode = MeasureSpec::Mode::AT_MOST; - MeasureSpec::Mode measureHeightMode = MeasureSpec::Mode::AT_MOST; - if( desiredWidth == Toolkit::ChildLayoutData::MATCH_PARENT ) - { - if( innerWidth != YGUndefined) - { - desiredWidth = innerWidth; - } - measureWidthMode = MeasureSpec::Mode::EXACTLY; - } - - if( desiredHeight == Toolkit::ChildLayoutData::MATCH_PARENT ) - { - if( innerHeight != YGUndefined) - { - desiredHeight = innerHeight; - } - measureHeightMode = MeasureSpec::Mode::EXACTLY; - } - - if( desiredWidth == Toolkit::ChildLayoutData::WRAP_CONTENT ) + auto parentWidthMeasureSpec = MeasureSpec( 0 ); + if ( innerWidth != YGUndefined ) { - measureWidthMode = MeasureSpec::Mode::UNSPECIFIED; + parentWidthMeasureSpec = MeasureSpec( innerWidth, static_cast(widthMode) ); } - - if( desiredHeight == Toolkit::ChildLayoutData::WRAP_CONTENT ) + auto parentHeightMeasureSpec = MeasureSpec( 0 ); + if ( innerHeight != YGUndefined ) { - measureHeightMode = MeasureSpec::Mode::UNSPECIFIED; + parentHeightMeasureSpec = MeasureSpec( innerHeight, static_cast(heightMode) ); } + auto childWidthMeasureSpec = LayoutGroup::GetChildMeasureSpec( parentWidthMeasureSpec, 0, desiredWidth); + auto childHeightMeasureSpec = LayoutGroup::GetChildMeasureSpec( parentHeightMeasureSpec, 0, desiredHeight); - MeasureSpec widthMeasureSpec = MeasureSpec( desiredWidth, measureWidthMode ); - MeasureSpec heightMeasureSpec = MeasureSpec( desiredHeight, measureHeightMode ); - if( measureWidthMode == MeasureSpec::Mode::UNSPECIFIED || - measureHeightMode == MeasureSpec::Mode::UNSPECIFIED ) + // Force to fill parent if a child wants to match parent even if GetChildMeasureSpec sets otherwise + if( desiredWidth == Toolkit::ChildLayoutData::MATCH_PARENT && innerWidth != YGUndefined ) { - // A measure just to get the size if the wrapped content - childLayout->Measure( widthMeasureSpec, heightMeasureSpec ); - desiredWidth = childLayout->GetMeasuredWidth(); - desiredHeight = childLayout->GetMeasuredHeight(); - // Remove padding here since the second measure will add it back - Extents padding = childLayout->GetPadding(); - desiredWidth = desiredWidth - padding.end - padding.start; - desiredHeight = desiredHeight - padding.bottom - padding.top; + childWidthMeasureSpec = MeasureSpec( innerWidth, MeasureSpec::Mode::EXACTLY ); } - - // Safety check to avoid going out of boundary - if( (innerWidth != YGUndefined && innerWidth != 0) && innerWidth < desiredWidth ) + if( desiredHeight == Toolkit::ChildLayoutData::MATCH_PARENT && innerHeight != YGUndefined ) { - desiredWidth = innerWidth; + childHeightMeasureSpec = MeasureSpec( innerHeight, MeasureSpec::Mode::EXACTLY ); } - if( (innerHeight != YGUndefined && innerHeight != 0) && innerHeight < desiredHeight ) - { - desiredHeight = innerHeight; - } - - // Measure for Yoga - MeasureSpec::Mode ygWidthMode = static_cast(widthMode); - if( measureWidthMode == MeasureSpec::Mode::EXACTLY ) - { - ygWidthMode = MeasureSpec::Mode::EXACTLY; - } - - MeasureSpec::Mode ygHeightMode = static_cast(heightMode); - if( measureHeightMode == MeasureSpec::Mode::EXACTLY ) - { - ygHeightMode = MeasureSpec::Mode::EXACTLY; - } - - MeasureSpec ygWidthMeasureSpec = MeasureSpec( desiredWidth, ygWidthMode ); - MeasureSpec ygHeightMeasureSpec = MeasureSpec( desiredHeight, ygHeightMode ); #if defined(DEBUG_ENABLED) auto actor = Actor::DownCast(childOwner); std::ostringstream oss; @@ -372,30 +321,23 @@ YGSize FlexLayout::OnChildMeasure( YGNodeRef node, { oss << "Actor Id:" << actor.GetId() << " Name:" << actor.GetName() << " "; } - oss << "innerWidth:" << ((innerWidth == YGUndefined) ? "YGUndefined " : "") << innerWidth << - " innerHeight:" << ((innerHeight == YGUndefined) ? "YGUndefined " : "") << innerHeight << + oss << "innerWidth:" << ( ( innerWidth == YGUndefined ) ? "YGUndefined " : "" ) << innerWidth << + " innerHeight:" << ( ( innerHeight == YGUndefined ) ? "YGUndefined " : "" ) << innerHeight << " desiredWidth:" << desiredWidth << " desiredHeight:" << desiredHeight << - " widthMeasureSpec:" << widthMeasureSpec << " heightMeasureSpec:" << heightMeasureSpec << - " ygWidthMeasureSpec:" << ygWidthMeasureSpec << " ygHeightMeasureSpec:" << ygHeightMeasureSpec << std::endl; + " childWidthMeasureSpec:" << childWidthMeasureSpec << " childHeightMeasureSpec:" << childHeightMeasureSpec << std::endl; DALI_LOG_INFO( gLogFilter, Debug::Concise, oss.str().c_str() ); #endif - if( measureWidthMode == MeasureSpec::Mode::UNSPECIFIED || - measureHeightMode == MeasureSpec::Mode::UNSPECIFIED ) - { - if( ygWidthMeasureSpec == widthMeasureSpec && ygHeightMeasureSpec == heightMeasureSpec ) - { - return YGSize{ - .width = childLayout->GetMeasuredWidth(), - .height = childLayout->GetMeasuredHeight(), - }; - } - } + childLayout->Measure( childWidthMeasureSpec, childHeightMeasureSpec ); + + // Remove padding here since Yoga doesn't consider it as a part of the node size + Extents padding = childLayout->GetPadding(); + auto measuredWidth = childLayout->GetMeasuredWidth() - padding.end - padding.start; + auto measuredHeight = childLayout->GetMeasuredHeight() - padding.bottom - padding.top; - childLayout->Measure( ygWidthMeasureSpec, ygHeightMeasureSpec ); return YGSize{ - .width = childLayout->GetMeasuredWidth(), - .height = childLayout->GetMeasuredHeight(), + .width = measuredWidth, + .height = measuredHeight, }; }