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=5224db117a5ef943c4584424249f7128a2650b0c;hp=8f862f5ee9d8c3fb318cf5efb835ad3772ac19de;hb=a7c4e86e15b7eef5b0d50b12f6da4b1c650b8c33;hpb=7742c07e1fdc5d78bab7c2c9cc5d7803f04fb012 diff --git a/dali-toolkit/public-api/controls/control-impl.cpp b/dali-toolkit/public-api/controls/control-impl.cpp old mode 100755 new mode 100644 index 8f862f5..5224db1 --- a/dali-toolkit/public-api/controls/control-impl.cpp +++ b/dali-toolkit/public-api/controls/control-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -71,17 +72,14 @@ 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 ) + if( backgroundVisual && backgroundVisual.GetType() == Toolkit::Visual::COLOR ) { 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 ); - } + + // Only change it if it's a color visual + map[ Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ] = renderIfTransparent; + controlImpl.SetBackground( map ); } } @@ -170,24 +168,42 @@ const std::string& Control::GetStyleName() const void Control::SetBackgroundColor( const Vector4& color ) { mImpl->mBackgroundColor = color; + Property::Map map; map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR; map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color; + bool renderIfTransparent = false; 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; + renderIfTransparent = true; } - SetBackground( map ); -} + Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); + if( visual && visual.GetType() == Toolkit::Visual::COLOR ) + { + Property::Map visualMap; + visual.CreatePropertyMap( visualMap ); -Vector4 Control::GetBackgroundColor() const -{ - return mImpl->mBackgroundColor; + Property::Value* renderValue = visualMap.Find( Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT ); + Property::Value* colorValue = visualMap.Find( Toolkit::ColorVisual::Property::MIX_COLOR ); + if( renderValue && colorValue ) + { + if( ( renderValue->Get< bool >() == true || colorValue->Get< Vector4 >().a > 0.0f ) + && ( renderIfTransparent || color.a > 0.0f ) ) + { + // Update background color only + mImpl->DoAction( Toolkit::Control::Property::BACKGROUND, DevelColorVisual::Action::UPDATE_PROPERTY, map ); + return; + } + } + } + + SetBackground( map ); } void Control::SetBackground( const Property::Map& map ) @@ -203,15 +219,6 @@ void Control::SetBackground( const Property::Map& map ) } } -void Control::SetBackgroundImage( Image image ) -{ - Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( image ); - if( visual ) - { - mImpl->RegisterVisual( Toolkit::Control::Property::BACKGROUND, visual, DepthIndex::BACKGROUND ); - } -} - void Control::ClearBackground() { mImpl->UnregisterVisual( Toolkit::Control::Property::BACKGROUND ); @@ -221,30 +228,30 @@ void Control::ClearBackground() RelayoutRequest(); } -void Control::EnableGestureDetection(Gesture::Type type) +void Control::EnableGestureDetection(GestureType::Value type) { - if ( (type & Gesture::Pinch) && !mImpl->mPinchGestureDetector ) + if ( (type & GestureType::PINCH) && !mImpl->mPinchGestureDetector ) { mImpl->mPinchGestureDetector = PinchGestureDetector::New(); mImpl->mPinchGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PinchDetected); mImpl->mPinchGestureDetector.Attach(Self()); } - if ( (type & Gesture::Pan) && !mImpl->mPanGestureDetector ) + if ( (type & GestureType::PAN) && !mImpl->mPanGestureDetector ) { mImpl->mPanGestureDetector = PanGestureDetector::New(); mImpl->mPanGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PanDetected); mImpl->mPanGestureDetector.Attach(Self()); } - if ( (type & Gesture::Tap) && !mImpl->mTapGestureDetector ) + if ( (type & GestureType::TAP) && !mImpl->mTapGestureDetector ) { mImpl->mTapGestureDetector = TapGestureDetector::New(); mImpl->mTapGestureDetector.DetectedSignal().Connect(mImpl, &Impl::TapDetected); mImpl->mTapGestureDetector.Attach(Self()); } - if ( (type & Gesture::LongPress) && !mImpl->mLongPressGestureDetector ) + if ( (type & GestureType::LONG_PRESS) && !mImpl->mLongPressGestureDetector ) { mImpl->mLongPressGestureDetector = LongPressGestureDetector::New(); mImpl->mLongPressGestureDetector.DetectedSignal().Connect(mImpl, &Impl::LongPressDetected); @@ -252,27 +259,27 @@ void Control::EnableGestureDetection(Gesture::Type type) } } -void Control::DisableGestureDetection(Gesture::Type type) +void Control::DisableGestureDetection(GestureType::Value type) { - if ( (type & Gesture::Pinch) && mImpl->mPinchGestureDetector ) + if ( (type & GestureType::PINCH) && mImpl->mPinchGestureDetector ) { mImpl->mPinchGestureDetector.Detach(Self()); mImpl->mPinchGestureDetector.Reset(); } - if ( (type & Gesture::Pan) && mImpl->mPanGestureDetector ) + if ( (type & GestureType::PAN) && mImpl->mPanGestureDetector ) { mImpl->mPanGestureDetector.Detach(Self()); mImpl->mPanGestureDetector.Reset(); } - if ( (type & Gesture::Tap) && mImpl->mTapGestureDetector ) + if ( (type & GestureType::TAP) && mImpl->mTapGestureDetector ) { mImpl->mTapGestureDetector.Detach(Self()); mImpl->mTapGestureDetector.Reset(); } - if ( (type & Gesture::LongPress) && mImpl->mLongPressGestureDetector) + if ( (type & GestureType::LONG_PRESS) && mImpl->mLongPressGestureDetector) { mImpl->mLongPressGestureDetector.Detach(Self()); mImpl->mLongPressGestureDetector.Reset(); @@ -311,7 +318,7 @@ bool Control::IsKeyboardNavigationSupported() void Control::SetKeyInputFocus() { - if( Self().OnStage() ) + if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) { Toolkit::KeyInputFocusManager::Get().SetFocus(Toolkit::Control::DownCast(Self())); } @@ -320,7 +327,7 @@ void Control::SetKeyInputFocus() bool Control::HasKeyInputFocus() { bool result = false; - if( Self().OnStage() ) + if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) { Toolkit::Control control = Toolkit::KeyInputFocusManager::Get().GetCurrentFocusControl(); if( Self() == control ) @@ -333,7 +340,7 @@ bool Control::HasKeyInputFocus() void Control::ClearKeyInputFocus() { - if( Self().OnStage() ) + if( Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) { Toolkit::KeyInputFocusManager::Get().RemoveFocus(Toolkit::Control::DownCast(Self())); } @@ -379,11 +386,6 @@ bool Control::OnAccessibilityPan(PanGesture gesture) return false; // Accessibility pan gesture is not handled by default } -bool Control::OnAccessibilityTouch(const TouchEvent& touchEvent) -{ - return false; // Accessibility touch event is not handled by default -} - bool Control::OnAccessibilityValueChange(bool isIncrease) { return false; // Accessibility value change action is not handled by default @@ -459,8 +461,7 @@ void Control::Initialize() // Call deriving classes so initialised before styling is applied to them. OnInitialize(); - if( (mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS) || - !(mImpl->mFlags & DISABLE_STYLE_CHANGE_SIGNALS) ) + if( !(mImpl->mFlags & DISABLE_STYLE_CHANGE_SIGNALS) ) { Toolkit::StyleManager styleManager = StyleManager::Get(); @@ -487,14 +488,6 @@ void Control::OnInitialize() { } -void Control::OnControlChildAdd( Actor& child ) -{ -} - -void Control::OnControlChildRemove( Actor& child ) -{ -} - void Control::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) { // By default the control is only interested in theme (not font) changes @@ -513,12 +506,12 @@ void Control::OnPinch(const PinchGesture& pinch) mImpl->mStartingPinchScale = new Vector3; } - if( pinch.state == Gesture::Started ) + if( pinch.GetState() == GestureState::STARTED ) { - *( mImpl->mStartingPinchScale ) = Self().GetCurrentScale(); + *( mImpl->mStartingPinchScale ) = Self().GetCurrentProperty< Vector3 >( Actor::Property::SCALE ); } - Self().SetScale( *( mImpl->mStartingPinchScale ) * pinch.scale ); + Self().SetProperty( Actor::Property::SCALE, *( mImpl->mStartingPinchScale ) * pinch.GetScale() ); } void Control::OnPan( const PanGesture& pan ) @@ -555,9 +548,9 @@ void Control::EmitKeyInputFocusSignal( bool focusGained ) } } -void Control::OnStageConnection( int depth ) +void Control::OnSceneConnection( int depth ) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::OnStageConnection number of registered visuals(%d)\n", mImpl->mVisuals.Size() ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::OnSceneConnection number of registered visuals(%d)\n", mImpl->mVisuals.Size() ); Actor self( Self() ); @@ -566,18 +559,22 @@ void Control::OnStageConnection( int depth ) // Check whether the visual is empty and enabled if( (*iter)->visual && (*iter)->enabled ) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::OnStageConnection Setting visual(%d) on stage\n", (*iter)->index ); - Toolkit::GetImplementation((*iter)->visual).SetOnStage( self ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::OnSceneConnection Setting visual(%d) on scene\n", (*iter)->index ); + Toolkit::GetImplementation((*iter)->visual).SetOnScene( self ); } } // The clipping renderer is only created if required. CreateClippingRenderer( *this ); + + // Request to be laid out when the control is connected to the Scene. + // Signal that a Relayout may be needed } -void Control::OnStageDisconnection() + +void Control::OnSceneDisconnection() { - mImpl->OnStageDisconnection(); + mImpl->OnSceneDisconnection(); } void Control::OnKeyInputFocusGained() @@ -592,21 +589,17 @@ void Control::OnKeyInputFocusLost() void Control::OnChildAdd(Actor& child) { - // Notify derived classes. - OnControlChildAdd( child ); } void Control::OnChildRemove(Actor& child) { - // Notify derived classes. - OnControlChildRemove( child ); } -void Control::OnPropertySet( Property::Index index, Property::Value propertyValue ) +void Control::OnPropertySet( Property::Index index, const Property::Value& propertyValue ) { // If the clipping mode has been set, we may need to create a renderer. - // Only do this if we are already on-stage as the OnStageConnection will handle the off-stage clipping controls. - if( ( index == Actor::Property::CLIPPING_MODE ) && Self().OnStage() ) + // Only do this if we are already on-stage as the OnSceneConnection will handle the off-stage clipping controls. + if( ( index == Actor::Property::CLIPPING_MODE ) && Self().GetProperty< bool >( Actor::Property::CONNECTED_TO_SCENE ) ) { // Note: This method will handle whether creation of the renderer is required. CreateClippingRenderer( *this ); @@ -628,26 +621,11 @@ void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize) // @todo size negotiate background to new size, animate as well? } -bool Control::OnTouchEvent(const TouchEvent& event) -{ - return false; // Do not consume -} - -bool Control::OnHoverEvent(const HoverEvent& event) -{ - return false; // Do not consume -} - bool Control::OnKeyEvent(const KeyEvent& event) { return false; // Do not consume } -bool Control::OnWheelEvent(const WheelEvent& event) -{ - return false; // Do not consume -} - void Control::OnRelayout( const Vector2& size, RelayoutContainer& container ) { for( unsigned int i = 0, numChildren = Self().GetChildCount(); i < numChildren; ++i ) @@ -655,44 +633,32 @@ void Control::OnRelayout( const Vector2& size, RelayoutContainer& container ) Actor child = Self().GetChildAt( i ); Vector2 newChildSize( size ); - // When setting the padding or margin on the control child should be resized and repositioned for legacy reasons. + // When set the padding or margin on the control, child should be resized and repositioned. 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 ) ) { - // 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; + Extents padding = mImpl->mPadding; - Dali::CustomActor ownerActor(GetOwner()); - Dali::LayoutDirection::Type layoutDirection = static_cast( ownerActor.GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); + 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 ); - } + 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 ); + 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 ); + // 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 ); - } + child.SetProperty( Actor::Property::POSITION, Vector2( childOffset.x, childOffset.y ) ); } - - container.Add( child, size ); + container.Add( child, newChildSize ); } Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); @@ -708,7 +674,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() ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Control::GetNaturalSize for %s\n", Self().GetProperty< std::string >( Dali::Actor::Property::NAME ).c_str() ); Toolkit::Visual::Base visual = mImpl->GetVisual( Toolkit::Control::Property::BACKGROUND ); if( visual ) {