X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Fpublic-api%2Fcontrols%2Fcontrol-impl.cpp;h=8f862f5ee9d8c3fb318cf5efb835ad3772ac19de;hp=d7df20a35516da11117dbd1e3d94de634cfc79d2;hb=66581ed768a430adc3e6a630948c28bfe6c32aa4;hpb=3e3ba0c9a854a2a392b74baab03ae171833d3ac0 diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp old mode 100644 new mode 100755 index d7df20a..8f862f5 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,18 +30,19 @@ #include // INTERNAL INCLUDES -#include +#include #include +#include #include #include +#include #include #include -#include #include +#include #include #include #include -#include #include namespace Dali @@ -61,6 +62,30 @@ Debug::Filter* gLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_CO #endif /** + * @brief Replace the background visual if it's a color visual with the renderIfTransparent property set as required. + * @param[in] controlImpl The control implementation + * @param[in] renderIfTransaparent Whether we should render if the color is transparent + */ +void ChangeBackgroundColorVisual( Control& controlImpl, bool renderIfTransparent ) +{ + Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( controlImpl ); + + Toolkit::Visual::Base backgroundVisual = controlDataImpl.GetVisual( Toolkit::Control::Property::BACKGROUND ); + if( backgroundVisual ) + { + Property::Map map; + backgroundVisual.CreatePropertyMap( map ); + Property::Value* typeValue = map.Find( Toolkit::Visual::Property::TYPE ); + if( typeValue && typeValue->Get< int >() == Toolkit::Visual::COLOR ) + { + // Only change it if it's a color visual + map[ Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ] = renderIfTransparent; + controlImpl.SetBackground( map ); + } + } +} + +/** * @brief Creates a clipping renderer if required. * (EG. If no renders exist and clipping is enabled). * @param[in] controlImpl The control implementation. @@ -72,57 +97,38 @@ void CreateClippingRenderer( Control& controlImpl ) int clippingMode = ClippingMode::DISABLED; if( self.GetProperty( Actor::Property::CLIPPING_MODE ).Get( clippingMode ) ) { - Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( controlImpl ); - - if( ( clippingMode == ClippingMode::CLIP_CHILDREN ) && - controlDataImpl.mVisuals.Empty() && - ( self.GetRendererCount() == 0u ) ) + switch( clippingMode ) { - controlImpl.SetBackgroundColor( Color::TRANSPARENT ); + case ClippingMode::CLIP_CHILDREN: + { + if( self.GetRendererCount() == 0u ) + { + Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( controlImpl ); + if( controlDataImpl.mVisuals.Empty() ) + { + controlImpl.SetBackgroundColor( Color::TRANSPARENT ); + } + else + { + // We have visuals, check if we've set the background and re-create it to + // render even if transparent (only if it's a color visual) + ChangeBackgroundColorVisual( controlImpl, true ); + } + } + break; + } + + case ClippingMode::DISABLED: + case ClippingMode::CLIP_TO_BOUNDING_BOX: + { + // If we have a background visual, check if it's a color visual and remove the render if transparent flag + ChangeBackgroundColorVisual( controlImpl, false ); + break; + } } } } -/** - * @brief Sets Control::Property::BACKGROUND visual - * @param[in] controlImpl The control implementation - * @param[in] visual The control background visual - * @param[in] size The current size - */ -void SetBackgroundVisual( Control::Impl& controlImpl, Toolkit::Visual::Base& visual, const Vector2& size ) -{ - Property::Map transformMap = Property::Map(); - - Vector2 newSize( 0.f, 0.f ); - newSize.width = size.width + ( controlImpl.mPadding.start + controlImpl.mPadding.end ); - newSize.height = size.height + ( controlImpl.mPadding.top + controlImpl.mPadding.bottom ); - - if( ( controlImpl.mMargin.start != 0 ) || - ( controlImpl.mMargin.end != 0 ) || - ( controlImpl.mMargin.top != 0 ) || - ( controlImpl.mMargin.bottom != 0 ) ) - { - transformMap.Add( Toolkit::Visual::Transform::Property::SIZE, newSize ) - .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::Visual::Transform::Property::OFFSET, Vector2( controlImpl.mMargin.start, controlImpl.mMargin.top ) ) - .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) - .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN ); - } - else if( ( controlImpl.mPadding.start != 0 ) || - ( controlImpl.mPadding.end != 0 ) || - ( controlImpl.mPadding.top != 0 ) || - ( controlImpl.mPadding.bottom != 0 ) ) - { - transformMap.Add( Toolkit::Visual::Transform::Property::SIZE, newSize ) - .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) - .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN ); - } - - visual.SetTransformAndSize( transformMap, newSize ); // Send an empty map as we do not want to modify the visual's set transform -} - } // unnamed namespace @@ -168,6 +174,14 @@ void Control::SetBackgroundColor( const Vector4& color ) map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR; map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color; + int clippingMode = ClippingMode::DISABLED; + if( ( Self().GetProperty( Actor::Property::CLIPPING_MODE ).Get( clippingMode ) ) && + ( clippingMode == ClippingMode::CLIP_CHILDREN ) ) + { + // If clipping-mode is set to CLIP_CHILDREN, then force visual to add the render even if transparent + map[ Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ] = true; + } + SetBackground( map ); } @@ -411,13 +425,15 @@ bool Control::EmitKeyEventSignal( const KeyEvent& event ) bool consumed = false; + consumed = mImpl->FilterKeyEvent( event ); + // signals are allocated dynamically when someone connects - if ( !mImpl->mKeyEventSignal.Empty() ) + if ( !consumed && !mImpl->mKeyEventSignal.Empty() ) { consumed = mImpl->mKeyEventSignal.Emit( handle, event ); } - if (!consumed) + if ( !consumed ) { // Notification for derived classes consumed = OnKeyEvent(event); @@ -603,8 +619,7 @@ void Control::OnSizeSet(const Vector3& targetSize) if( visual ) { Vector2 size( targetSize ); - SetBackgroundVisual( *mImpl, visual, size ); - + visual.SetTransformAndSize( Property::Map(), size ); // Send an empty map as we do not want to modify the visual's set transform } } @@ -640,27 +655,50 @@ void Control::OnRelayout( const Vector2& size, RelayoutContainer& container ) Actor child = Self().GetChildAt( i ); Vector2 newChildSize( size ); - // When set the padding or margin on the control, child should be resized and repositioned. + // When setting the padding or margin on the control child should be resized and repositioned for legacy reasons. if( ( mImpl->mPadding.start != 0 ) || ( mImpl->mPadding.end != 0 ) || ( mImpl->mPadding.top != 0 ) || ( mImpl->mPadding.bottom != 0 ) || ( mImpl->mMargin.start != 0 ) || ( mImpl->mMargin.end != 0 ) || ( mImpl->mMargin.top != 0 ) || ( mImpl->mMargin.bottom != 0 ) ) { - newChildSize.width = size.width - ( mImpl->mPadding.start + mImpl->mPadding.end ); - newChildSize.height = size.height - ( mImpl->mPadding.top + mImpl->mPadding.bottom ); - - Vector3 childPosition = child.GetTargetSize(); - childPosition.x += ( mImpl->mMargin.start + mImpl->mPadding.start ); - childPosition.y += ( mImpl->mMargin.top + mImpl->mPadding.top ); - - child.SetPosition( childPosition ); + // Cannot use childs Position property as it can already have margin applied on it, + // so we end up cumulatively applying them over and over again. + Toolkit::Control childControl = Toolkit::Control::DownCast( child ); + + // If control not a LayoutItem layout then must be the old Relayout algorithm hence account + // for margins and padding. + // Padding is incorrect but may have to keep this functionality for compatibility. + if ( childControl && ! Toolkit::DevelControl::GetLayout( childControl ) ) + { + Extents padding = mImpl->mPadding; + + Dali::CustomActor ownerActor(GetOwner()); + Dali::LayoutDirection::Type layoutDirection = static_cast( ownerActor.GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); + + if( Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection ) + { + std::swap( padding.start, padding.end ); + } + + // Child size should include padding, this is the wrong use of padding but kept for compatibility. + newChildSize.width = size.width - ( padding.start + padding.end ); + newChildSize.height = size.height - ( padding.top + padding.bottom ); + + // Cannot use childs Position property as it can already have padding and margin applied on it, + // so we end up cumulatively applying them over and over again. + Vector2 childOffset( 0.f, 0.f ); + childOffset.x += ( mImpl->mMargin.start + padding.start ); + childOffset.y += ( mImpl->mMargin.top + padding.top ); + + child.SetPosition( childOffset.x, childOffset.y ); + } } - container.Add( child, newChildSize ); + container.Add( child, size ); } Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); if( visual ) { - SetBackgroundVisual( *mImpl, visual, size ); + visual.SetTransformAndSize( Property::Map(), size ); // Send an empty map as we do not want to modify the visual's set transform } } @@ -670,6 +708,7 @@ void Control::OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dime Vector3 Control::GetNaturalSize() { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::GetNaturalSize for %s\n", Self().GetName().c_str() ); Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); if( visual ) {