X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fbuttons%2Fbutton-impl.cpp;h=1af6848989ca93f00468a95ea4aeac6ddc09bbc0;hp=53f89ca6f6af580962a0e275f4dd9b19ae489256;hb=refs%2Fchanges%2F99%2F210399%2F9;hpb=e5dbcae1f8ee31b14d675793ab86161eeeefb029 diff --git a/dali-toolkit/internal/controls/buttons/button-impl.cpp b/dali-toolkit/internal/controls/buttons/button-impl.cpp index 53f89ca..1af6848 100644 --- a/dali-toolkit/internal/controls/buttons/button-impl.cpp +++ b/dali-toolkit/internal/controls/buttons/button-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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. @@ -27,19 +27,22 @@ #include #include #include +#include #include // INTERNAL INCLUDES #include #include #include -#include #include -#include +#include #include -#include +#include +#include #include - +#include +#include +#include #if defined(DEBUG_ENABLED) Debug::Filter* gLogButtonFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_BUTTON_CONTROL"); @@ -72,23 +75,18 @@ DALI_PROPERTY_REGISTRATION( Toolkit, Button, "initialAutoRepeatingDelay", DALI_PROPERTY_REGISTRATION( Toolkit, Button, "nextAutoRepeatingDelay", FLOAT, NEXT_AUTO_REPEATING_DELAY ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "togglable", BOOLEAN, TOGGLABLE ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selected", BOOLEAN, SELECTED ) -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedStateImage", MAP, UNSELECTED_STATE_IMAGE ) // Deprecated property -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selectedStateImage", MAP, SELECTED_STATE_IMAGE ) // Deprecated property -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabledStateImage", MAP, DISABLED_STATE_IMAGE ) // Deprecated property -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedColor", VECTOR4, UNSELECTED_COLOR ) // Deprecated property -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selectedColor", VECTOR4, SELECTED_COLOR ) // Deprecated property -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "label", MAP, LABEL ) -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "labelText", STRING, LABEL_TEXT ) // Deprecated property DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedVisual", MAP, UNSELECTED_VISUAL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selectedVisual", MAP, SELECTED_VISUAL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabledSelectedVisual", MAP, DISABLED_SELECTED_VISUAL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabledUnselectedVisual", MAP, DISABLED_UNSELECTED_VISUAL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedBackgroundVisual", MAP, UNSELECTED_BACKGROUND_VISUAL ) +DALI_PROPERTY_REGISTRATION( Toolkit, Button, "label", MAP, LABEL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selectedBackgroundVisual", MAP, SELECTED_BACKGROUND_VISUAL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabledUnselectedBackgroundVisual", MAP, DISABLED_UNSELECTED_BACKGROUND_VISUAL ) DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabledSelectedBackgroundVisual", MAP, DISABLED_SELECTED_BACKGROUND_VISUAL ) -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "labelStrutLength", INTEGER, LABEL_STRUT_LENGTH ) -DALI_PROPERTY_REGISTRATION( Toolkit, Button, "labelRelativeAlignment", STRING, LABEL_RELATIVE_ALIGNMENT ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "labelRelativeAlignment", STRING, LABEL_RELATIVE_ALIGNMENT ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "labelPadding", VECTOR4, LABEL_PADDING ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "visualPadding", VECTOR4, VISUAL_PADDING ) // Signals: DALI_SIGNAL_REGISTRATION( Toolkit, Button, "pressed", SIGNAL_PRESSED ) @@ -118,7 +116,7 @@ const Scripting::StringEnum ALIGNMENT_STRING_TABLE[] = const unsigned int ALIGNMENT_STRING_TABLE_COUNT = sizeof( ALIGNMENT_STRING_TABLE ) / sizeof( ALIGNMENT_STRING_TABLE[0] ); -const Property::Index GET_VISUAL_INDEX_FOR_STATE[][Button::STATE_COUNT] = +const Property::Index VISUAL_INDEX_FOR_STATE[][Button::STATE_COUNT] = { { Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, Toolkit::Button::Property::UNSELECTED_VISUAL }, { Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, Toolkit::Button::Property::SELECTED_VISUAL }, @@ -126,15 +124,34 @@ const Property::Index GET_VISUAL_INDEX_FOR_STATE[][Button::STATE_COUNT] = { Toolkit::Button::Property::DISABLED_SELECTED_BACKGROUND_VISUAL, Toolkit::Button::Property::DISABLED_SELECTED_VISUAL } }; +/** + * Checks if given map contains a text string + */ +bool MapContainsTextString( Property::Map& map ) +{ + bool result = false; + Property::Value* value = map.Find( Toolkit::TextVisual::Property::TEXT ); + if ( value ) + { + std::string textString; + value->Get( textString ); + if ( !textString.empty() ) + { + result = true; + } + } + return result; +} + } // unnamed namespace Button::Button() : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), mAutoRepeatingTimer(), - mForeGroundToLabelStrutLength( 0.0f ), mTextLabelAlignment( END ), mAutoRepeating( false ), mTogglableButton( false ), + mTextStringSetFlag( false ), mInitialAutoRepeatingDelay( 0.0f ), mNextAutoRepeatingDelay( 0.0f ), mAnimationTime( 0.0f ), @@ -153,45 +170,29 @@ void Button::SetAutoRepeating( bool autoRepeating ) { mAutoRepeating = autoRepeating; - // An autorepeating button can't be a togglable button. + // An autorepeating button can't be a toggle button. if( autoRepeating ) { - mTogglableButton = false; - if( IsSelected() ) { - SetSelected( false ); + SetSelected( false ); // UnSelect before switching off Toggle feature. } + mTogglableButton = false; } } -bool Button::IsAutoRepeating() const -{ - return mAutoRepeating; -} - void Button::SetInitialAutoRepeatingDelay( float initialAutoRepeatingDelay ) { DALI_ASSERT_DEBUG( initialAutoRepeatingDelay > 0.f ); mInitialAutoRepeatingDelay = initialAutoRepeatingDelay; } -float Button::GetInitialAutoRepeatingDelay() const -{ - return mInitialAutoRepeatingDelay; -} - void Button::SetNextAutoRepeatingDelay( float nextAutoRepeatingDelay ) { DALI_ASSERT_DEBUG( nextAutoRepeatingDelay > 0.f ); mNextAutoRepeatingDelay = nextAutoRepeatingDelay; } -float Button::GetNextAutoRepeatingDelay() const -{ - return mNextAutoRepeatingDelay; -} - void Button::SetTogglableButton( bool togglable ) { mTogglableButton = togglable; @@ -203,11 +204,6 @@ void Button::SetTogglableButton( bool togglable ) } } -bool Button::IsTogglableButton() const -{ - return mTogglableButton; -} - void Button::SetSelected( bool selected ) { if( mTogglableButton ) @@ -278,17 +274,6 @@ bool Button::ValidateState( State requestedState ) return transitionTable[mButtonState][requestedState]; } -void Button::PerformFunctionOnVisualsInState( void(Button::*functionPtr)( Property::Index visualIndex), State state ) -{ - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::PerformFunctionOnVisualsInState BACKROUND visual(%d) for state (%d)\n", GET_VISUAL_INDEX_FOR_STATE[state][BACKGROUND], state ); - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::PerformFunctionOnVisualsInState FOREGROUND visuals(%d) for state (%d)\n", GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND], state ); - - (this->*functionPtr)( GET_VISUAL_INDEX_FOR_STATE[state][BACKGROUND] ); - (this->*functionPtr)( GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND] ); - - RelayoutRequest(); -} - void Button::ChangeState( State requestedState ) { DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::ChangeState ReuestedState(%d)\n", requestedState ); @@ -300,20 +285,21 @@ void Button::ChangeState( State requestedState ) return; } - // If not on stage the button could have still been set to selected so update state/ + // If not on stage the button could have still been set to selected so update state mPreviousButtonState = mButtonState; // Store previous state for visual removal (used when animations ended) mButtonState = requestedState; // Update current state if ( Self().OnStage() ) { - // Clear existing animation and remove visual being transitioned out before starting a new transition of visuals. ClearTransitionAnimation(); OnStateChange( mButtonState ); // Notify derived buttons - //// When animations enabled PerformFunctionOnVisualsInState( &Button::TransitionButtonVisualOut, mPreviousButtonState ); - PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState ); - // When animations enabled then call PerformFunctionOnVisualsInState( &Button::TransitionButtonVisualIn, mButtonState ); - // then StartTransitionAnimation(); - // and ClearTransitionAnimation(); - PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState ); // Derived button can override OnButtonVisualRemoval + SelectRequiredVisual( VISUAL_INDEX_FOR_STATE[ mButtonState ][ BACKGROUND ] ); + SelectRequiredVisual( VISUAL_INDEX_FOR_STATE[ mButtonState ][ FOREGROUND ] ); + // If animation supported then visual removal should be performed after any transition animation has completed. + // If Required Visual is not loaded before current visual is removed then a flickering will be evident. + // Derived button can override OnButtonVisualRemoval + OnButtonVisualRemoval( VISUAL_INDEX_FOR_STATE[ mPreviousButtonState ][ BACKGROUND ] ); + OnButtonVisualRemoval( VISUAL_INDEX_FOR_STATE[ mPreviousButtonState ][ FOREGROUND ] ); + RelayoutRequest(); } Toolkit::Button handle( GetOwner() ); @@ -327,91 +313,34 @@ bool Button::IsSelected() const return mTogglableButton && selected; } -void Button::SetAnimationTime( float animationTime ) -{ - mAnimationTime = animationTime; -} - -float Button::GetAnimationTime() const -{ - return mAnimationTime; -} - -void Button::SetLabelText( const std::string& label ) +void Button::MergeWithExistingLabelProperties( const Property::Map& inMap, Property::Map& outMap ) { - Property::Map labelProperty; - labelProperty.Insert( "text", label ); - SetupLabel( labelProperty ); -} - -std::string Button::GetLabelText() const -{ - Toolkit::TextLabel label = Dali::Toolkit::TextLabel::DownCast( mLabel ); - if( label ) - { - return label.GetProperty( Dali::Toolkit::TextLabel::Property::TEXT ); - } - return std::string(); -} + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties with %d properties\n", inMap.Count() ); -void Button::SetupLabel( const Property::Map& properties ) -{ - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "SetupLabel\n"); - - // If we don't have a label yet, create one. - if( !mLabel ) + /** + * Properties for the Label visual could be from a style sheet but after being set the "TEXT" property could be set. + * Hence would need to create the Text Visual with the complete merged set of properties. + * + * 1) Find Label Visual + * 2) Retrieve current properties ( settings ) + * 3) Merge with new properties ( settings ) + * 4) Return new merged map + */ + Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, Toolkit::Button::Property::LABEL ); + if ( visual ) { - // If we don't have a label, create one and set it up. - // Note: The label text is set from the passed in property map after creation. - mLabel = Toolkit::TextLabel::New(); - mLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" ); - mLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" ); - mLabel.SetParentOrigin( ParentOrigin::TOP_LEFT ); - mLabel.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - - // todo DEBUG - mLabel.SetProperty( Toolkit::Control::Property::BACKGROUND, Dali::Property::Map() - .Add( Toolkit::Visual::Property::TYPE, Dali::Toolkit::Visual::COLOR ) - .Add( Toolkit::ColorVisual::Property::MIX_COLOR, Color::RED ) - ); - - ResizePolicy::Type policy = Self().GetResizePolicy( Dimension::ALL_DIMENSIONS ); - if ( policy == ResizePolicy::USE_NATURAL_SIZE || policy == ResizePolicy::FIT_TO_CHILDREN ) - { - mLabel.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); - } - else - { - // todo Can't set Text Label to USE_ASSIGNED_SIZE as causes a relayout in it whilst doing a relayout = error - //mLabel.SetResizePolicy(ResizePolicy::USE_ASSIGNED_SIZE, Dimension::ALL_DIMENSIONS ); - } - Self().Add( mLabel ); + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties Visual already exists, retrieving existing map\n"); + visual.CreatePropertyMap( outMap ); + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties retrieved %d properties\n", outMap.Count() ); } - // Set any properties specified for the label by iterating through all property key-value pairs. - for( unsigned int i = 0, mapCount = properties.Count(); i < mapCount; ++i ) - { - const StringValuePair& propertyPair( properties.GetPair( i ) ); - - // Convert the property string to a property index. - Property::Index setPropertyIndex = mLabel.GetPropertyIndex( propertyPair.first ); - if( setPropertyIndex != Property::INVALID_INDEX ) - { - // If the conversion worked, we have a valid property index, - // Set the property to the new value. - mLabel.SetProperty( setPropertyIndex, propertyPair.second ); - } - } + outMap.Merge( inMap ); - // Notify derived button classes of the change. - OnLabelSet( false ); + // Store if a text string has been supplied. - RelayoutRequest(); -} + mTextStringSetFlag = MapContainsTextString( outMap ); -void Button::SetLabelStrutLength( unsigned int length ) -{ - mForeGroundToLabelStrutLength = length; + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties now has %d properties\n", outMap.Count() ); } void Button::SetLabelAlignment( Button::Align labelAlignment) @@ -420,17 +349,19 @@ void Button::SetLabelAlignment( Button::Align labelAlignment) RelayoutRequest(); } -float Button::GetLabelStrutLength() -{ - return mForeGroundToLabelStrutLength; -} - Button::Align Button::GetLabelAlignment() { return mTextLabelAlignment; } -void Button::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const float visualDepth ) +/** + * Create Visual for given index from a property map or url. + * 1) Check if value passed in is a url and create visual + * 2) Create visual from map if step (1) is false + * 3) Register visual with control with false for enable flag. Button will later enable visual when needed ( Button::SelectRequiredVisual ) + * 4) Unregister visual if empty map was provided. This is the method to remove a visual + */ +void Button::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const int visualDepth ) { DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent index(%d)\n", index ); Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get(); @@ -442,6 +373,7 @@ void Button::CreateVisualsForComponent( Property::Index index, const Property::V DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent Using image URL(%d)\n", index ); if ( !imageUrl.empty() ) { + DALI_ASSERT_DEBUG( index != Toolkit::Button::Property::LABEL && "Creating a Image Visual instead of Text Visual " ); buttonVisual = visualFactory.CreateVisual( imageUrl, ImageDimensions() ); } } @@ -458,45 +390,34 @@ void Button::CreateVisualsForComponent( Property::Index index, const Property::V if ( buttonVisual ) { - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "RegisterVisual index(%d)\n", index ); - buttonVisual.SetDepthIndex( visualDepth ); - // Background Visuals take full size of control - RegisterVisual( index, buttonVisual, false ); + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent RegisterVisual index(%d) enabled(%s)\n", + index, DevelControl::IsVisualEnabled( *this, index )?"true":"false" ); + // enable the visual if needed for current state + const bool enabled = ( ( index == VISUAL_INDEX_FOR_STATE[ mButtonState ][ BACKGROUND ] )|| + ( index == VISUAL_INDEX_FOR_STATE[ mButtonState ][ FOREGROUND ] )|| + ( index == Toolkit::Button::Property::LABEL ) ); + DevelControl::RegisterVisual( *this, index, buttonVisual, enabled, visualDepth ); } else { - UnregisterVisual( index ); - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "Button visual not created or empty map provided (clearing visual).(%d)\n", index); + DevelControl::UnregisterVisual( *this, index ); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "CreateVisualsForComponent Visual not created or empty map (clearing visual).(%d)\n", index); } + RelayoutRequest(); } -const Vector4 Button::GetUnselectedColor() const -{ - return mUnselectedColor; -} - -const Vector4 Button::GetSelectedColor() const -{ - return mSelectedColor; -} - -// Legacy code whilst Color can be set by direct Property setting ( deprecated ) instead of setting a Visual -void Button::SetColor( const Vector4& color, Property::Index visualIndex ) +bool Button::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const { - if ( visualIndex == Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL ) - { - mSelectedColor = color; - } - else + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetPropertyMapForVisual visual(%d)\n", visualIndex); + bool success = false; + Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, visualIndex ); + if ( visual ) { - mUnselectedColor = color; + visual.CreatePropertyMap( retreivedMap ); + success = true; } - - Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR; - map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color; - - CreateVisualsForComponent( visualIndex, map, DepthIndex::BACKGROUND ); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetPropertyMapForVisual %s\n", success?"Success":"Failure"); + return success; } bool Button::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes ) @@ -524,12 +445,12 @@ bool Button::DoClickAction( const Property::Map& attributes ) if( !mClickActionPerforming ) { mClickActionPerforming = true; - OnButtonDown(); + ButtonDown(); if ( !mTogglableButton ) { mButtonPressedState = DEPRESSED; } - OnButtonUp(); + ButtonUp(); mClickActionPerforming = false; return true; @@ -538,7 +459,7 @@ bool Button::DoClickAction( const Property::Map& attributes ) return false; } -void Button::OnButtonDown() +void Button::ButtonDown() { if( mTogglableButton ) { @@ -567,27 +488,33 @@ void Button::OnButtonDown() mPressedSignal.Emit( handle ); } -void Button::OnButtonUp() +void Button::ButtonUp() { + bool emitSignalsForPressAndReleaseAction = false; + if( DEPRESSED == mButtonPressedState ) { - if( mTogglableButton ) + if( mTogglableButton ) // Button up will change state { - if ( TOGGLE_DEPRESSED != mButtonPressedState ) - { - SetSelected( !IsSelected() ); - mButtonPressedState = UNPRESSED; - } + emitSignalsForPressAndReleaseAction = OnToggleReleased(); // Derived toggle buttons can override this to provide custom behaviour } else { - Released(); + Released(); // Button up will result in unselected state if( mAutoRepeating ) { mAutoRepeatingTimer.Reset(); } + emitSignalsForPressAndReleaseAction = true; } + } + else if ( TOGGLE_DEPRESSED == mButtonPressedState ) + { + emitSignalsForPressAndReleaseAction = true; // toggle released after being pressed, a click + } + if ( emitSignalsForPressAndReleaseAction ) + { // The clicked and released signals should be emitted regardless of toggle mode. Toolkit::Button handle( GetOwner() ); mReleasedSignal.Emit( handle ); @@ -595,6 +522,14 @@ void Button::OnButtonUp() } } +bool Button::OnToggleReleased() +{ + SetSelected( !IsSelected() ); + mButtonPressedState = UNPRESSED; + return true; +} + + void Button::OnTouchPointLeave() { if( DEPRESSED == mButtonPressedState ) @@ -697,50 +632,53 @@ bool Button::OnAccessibilityActivated() bool Button::OnTouch( Actor actor, const TouchData& touch ) { - // Only events are processed when the button is not disabled and the touch event has only - // one touch point. + // Only events are processed when the button is not disabled + auto result( false ); - if( !IsDisabled() && ( 1 == touch.GetPointCount() ) ) + if( !IsDisabled() ) { - switch( touch.GetState( 0 ) ) + if ( 1 == touch.GetPointCount() ) { - case PointState::DOWN: - { - OnButtonDown(); - break; - } - case PointState::UP: - { - OnButtonUp(); - break; - } - case PointState::INTERRUPTED: + switch( touch.GetState( 0 ) ) { - OnTouchPointInterrupted(); - break; - } - case PointState::LEAVE: - { - OnTouchPointLeave(); - break; - } - case PointState::MOTION: - case PointState::STATIONARY: // FALLTHROUGH - { - // Nothing to do - break; + case PointState::DOWN: + { + ButtonDown(); + break; + } + case PointState::UP: + { + ButtonUp(); + break; + } + case PointState::INTERRUPTED: + { + OnTouchPointInterrupted(); + break; + } + case PointState::LEAVE: + { + OnTouchPointLeave(); + break; + } + case PointState::MOTION: + case PointState::STATIONARY: // FALLTHROUGH + { + // Nothing to do + break; + } } } - } - else if( 1 < touch.GetPointCount() ) - { - OnTouchPointLeave(); // Notification for derived classes. + else if( 1 < touch.GetPointCount() ) + { + OnTouchPointLeave(); // Notification for derived classes. - // Sets the button state to the default - mButtonPressedState = UNPRESSED; + // Sets the button state to the default + mButtonPressedState = UNPRESSED; + } + result = true; } - - return false; + return result; } bool Button::OnKeyboardEnter() @@ -775,9 +713,13 @@ void Button::OnStageDisconnection() void Button::OnStageConnection( int depth ) { DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::OnStageConnection ptr(%p) \n", this ); - PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState ); + OnButtonVisualRemoval( VISUAL_INDEX_FOR_STATE[ mPreviousButtonState ][ BACKGROUND ] ); + OnButtonVisualRemoval( VISUAL_INDEX_FOR_STATE[ mPreviousButtonState ][ FOREGROUND ] ); + SelectRequiredVisual( Toolkit::Button::Property::LABEL ); + SelectRequiredVisual( VISUAL_INDEX_FOR_STATE[ mButtonState ][ BACKGROUND ] ); + SelectRequiredVisual( VISUAL_INDEX_FOR_STATE[ mButtonState ][ FOREGROUND ] ); Control::OnStageConnection( depth ); // Enabled visuals will be put on stage - + RelayoutRequest(); } Vector3 Button::GetNaturalSize() @@ -787,56 +729,79 @@ Vector3 Button::GetNaturalSize() bool horizontalAlignment = mTextLabelAlignment == BEGIN || mTextLabelAlignment == END; // label and visual side by side // Get natural size of foreground ( largest of the possible visuals ) - Size largestForegroundVisual; - Size labelSize; + Size largestProvidedVisual; + Size labelSize = Size::ZERO; + + bool foreGroundVisualUsed = false; - for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++) + for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++ ) { - Toolkit::Visual::Base visual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND] ); + Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, VISUAL_INDEX_FOR_STATE[state][FOREGROUND] ); Size visualSize; if ( visual ) { visual.GetNaturalSize( visualSize ); - largestForegroundVisual.width = std::max(largestForegroundVisual.width, visualSize.width ); - largestForegroundVisual.height = std::max(largestForegroundVisual.height, visualSize.height ); + largestProvidedVisual.width = std::max(largestProvidedVisual.width, visualSize.width ); + largestProvidedVisual.height = std::max(largestProvidedVisual.height, visualSize.height ); + foreGroundVisualUsed = true; + } + } + + if ( !foreGroundVisualUsed ) // If foreground visual not supplied then use the background visual to calculate Natural size + { + for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++ ) + { + Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, VISUAL_INDEX_FOR_STATE[state][BACKGROUND] ); + Size visualSize; + if ( visual ) + { + visual.GetNaturalSize( visualSize ); + largestProvidedVisual.width = std::max(largestProvidedVisual.width, visualSize.width ); + largestProvidedVisual.height = std::max(largestProvidedVisual.height, visualSize.height ); + } } } // Get horizontal padding total - if ( largestForegroundVisual.width > 0 ) // if visual exists + if ( largestProvidedVisual.width > 0 ) // if visual exists { - size.width += largestForegroundVisual.width + mForegroundPadding.left + mForegroundPadding.right; + size.width += largestProvidedVisual.width + mForegroundPadding.left + mForegroundPadding.right; } // Get vertical padding total - if ( largestForegroundVisual.height > 0 ) + if ( largestProvidedVisual.height > 0 ) { - size.height += largestForegroundVisual.height + mForegroundPadding.top + mForegroundPadding.bottom; + size.height += largestProvidedVisual.height + mForegroundPadding.top + mForegroundPadding.bottom; } DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize visual Size(%f,%f)\n", - largestForegroundVisual.width, largestForegroundVisual.height ); + largestProvidedVisual.width, largestProvidedVisual.height ); - // Get natural size of label - if ( mLabel ) + // Get natural size of label if text has been set + if ( mTextStringSetFlag ) { - labelSize = Vector2( mLabel.GetNaturalSize()); + Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, Toolkit::Button::Property::LABEL ); - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize labelSize(%f,%f) padding(%f,%f)\n", - labelSize.width, labelSize.height, mLabelPadding.left + mLabelPadding.right, mLabelPadding.top + mLabelPadding.bottom); + if ( visual ) + { + visual.GetNaturalSize( labelSize ); - labelSize.width += mLabelPadding.left + mLabelPadding.right; - labelSize.height += mLabelPadding.top + mLabelPadding.bottom; + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize labelSize(%f,%f) padding(%f,%f)\n", + labelSize.width, labelSize.height, mLabelPadding.left + mLabelPadding.right, mLabelPadding.top + mLabelPadding.bottom); - // Add label size to height or width depending on alignment position - if ( horizontalAlignment ) - { - size.width += labelSize.width; - size.height = std::max(size.height, labelSize.height ); - } - else - { - size.height += labelSize.height; - size.width = std::max(size.width, labelSize.width ); + labelSize.width += mLabelPadding.left + mLabelPadding.right; + labelSize.height += mLabelPadding.top + mLabelPadding.bottom; + + // Add label size to height or width depending on alignment position + if ( horizontalAlignment ) + { + size.width += labelSize.width; + size.height = std::max(size.height, labelSize.height ); + } + else + { + size.height += labelSize.height; + size.width = std::max(size.width, labelSize.width ); + } } } @@ -855,33 +820,20 @@ Vector3 Button::GetNaturalSize() void Button::OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension ) { DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnSetResizePolicy\n"); - - if ( policy != ResizePolicy::USE_NATURAL_SIZE || policy != ResizePolicy::FIT_TO_CHILDREN ) - { - if ( mLabel ) - { - // todo Can't set Text Label to USE_ASSIGNED_SIZE as causes a relayout in it whilst doing a relayout = error - //mLabel.SetResizePolicy(ResizePolicy::USE_ASSIGNED_SIZE, Dimension::ALL_DIMENSIONS ); - } - } - RelayoutRequest(); } +/** + * Visuals are sized and positioned in this function. + * Whilst the control has it's size negotiated it has to size it's visuals explicitly here. + */ + void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) { DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout targetSize(%f,%f) ptr(%p) state[%d]\n", size.width, size.height, this, mButtonState ); - PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState ); - - ResizePolicy::Type widthResizePolicy = Self().GetResizePolicy( Dimension::WIDTH ); - ResizePolicy::Type heightResizePolicy = Self().GetResizePolicy( Dimension::HEIGHT ); - - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout resize policy: width:%d height:%d\n", heightResizePolicy, widthResizePolicy); - - Toolkit::Visual::Base currentVisual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[mButtonState][FOREGROUND] ); - - Toolkit::Visual::Base currentBackGroundVisual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[mButtonState][BACKGROUND] ); + Toolkit::Visual::Base currentVisual = DevelControl::GetVisual( *this, VISUAL_INDEX_FOR_STATE[mButtonState][FOREGROUND] ); + Toolkit::Visual::Base currentBackGroundVisual = DevelControl::GetVisual( *this, VISUAL_INDEX_FOR_STATE[mButtonState][BACKGROUND] ); // Sizes and padding set to zero, if not present then values will no effect calculations. Vector2 visualPosition = Vector2::ZERO; @@ -890,7 +842,7 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) Padding foregroundVisualPadding = Padding(0.0f, 0.0f, 0.0f, 0.0f ); Padding labelVisualPadding = Padding(0.0f, 0.0f, 0.0f, 0.0f ); - if ( mLabel ) + if ( mTextStringSetFlag ) { DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Label padding setting padding:%f,%f,%f,%f\n", mLabelPadding.y, mLabelPadding.x, mLabelPadding.width,mLabelPadding.height ); labelVisualPadding = mLabelPadding; @@ -910,6 +862,10 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout visualAndPaddingSize(%f,%f)\n", visualAndPaddingSize.width, visualAndPaddingSize.height); + // Text Visual should take all space available after foreground visual size and all padding is considered. + // Remaining Space priority, Foreground padding, foreground visual, Text padding then Text visual. + Size remainingSpaceForText = Size::ZERO; + switch ( mTextLabelAlignment ) { case BEGIN : @@ -920,6 +876,9 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) labelPosition.x = labelVisualPadding.x; labelPosition.y = labelVisualPadding.top; + + remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y; + remainingSpaceForText.height = size.height - labelVisualPadding.top - labelVisualPadding.bottom; break; } case END : @@ -930,6 +889,9 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) labelPosition.x = visualAndPaddingSize.width + labelVisualPadding.x; labelPosition.y = labelVisualPadding.top; + + remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y; + remainingSpaceForText.height = size.height - labelVisualPadding.top - labelVisualPadding.bottom; break; } case TOP : @@ -940,6 +902,10 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) labelPosition.x = labelVisualPadding.left; labelPosition.y = labelVisualPadding.top; + + remainingSpaceForText.width = size.width - labelVisualPadding.x - labelVisualPadding.y; + remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.top - labelVisualPadding.bottom; + break; } case BOTTOM : @@ -950,70 +916,82 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) labelPosition.x = labelVisualPadding.left; labelPosition.y = visualAndPaddingSize.height + labelVisualPadding.top; + + remainingSpaceForText.width = size.width - labelVisualPadding.x - labelVisualPadding.y; + remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.top - labelVisualPadding.bottom; + break; } } if ( currentBackGroundVisual ) { - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual bakcground size to(%f,%f)\n", size.width, size.height); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual background size to(%f,%f)\n", size.width, size.height); Property::Map visualTransform; - visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, size ) - .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 0.0f, 0.0f, 1.0f, 1.0f) ); // Use relative size + visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, size ) + .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ); currentBackGroundVisual.SetTransformAndSize( visualTransform, size ); } if ( currentVisual ) { - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual size to(%f,%f)\n", visualSize.width, visualSize.height); - - currentVisual.SetProperty( Toolkit::Visual::DevelProperty::TRANSFORM, - Dali::Property::Map() - .Add( Toolkit::Visual::DevelProperty::Transform::Property::SIZE, visualSize ) - .Add( Toolkit::Visual::DevelProperty::Transform::Property::OFFSET, visualPosition ) - .Add( Toolkit::Visual::DevelProperty::Transform::Property::OFFSET_SIZE_MODE, Vector4(1.0f, 1.0f, 1.0f,1.0f) ) - .Add( Toolkit::Visual::DevelProperty::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) - .Add( Toolkit::Visual::DevelProperty::Transform::Property::ANCHOR_POINT, visualAnchorPoint ) - ); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual size to(%f,%f)\n", visualSize.width, visualSize.height); + + Property::Map visualTransform; + + visualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, visualSize ) + .Add( Toolkit::Visual::Transform::Property::OFFSET, visualPosition ) + .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ) + .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, visualAnchorPoint ); + + currentVisual.SetTransformAndSize( visualTransform, size ); } - if ( mLabel ) + if ( mTextStringSetFlag ) { - // When Text visual size can be set, determine the size here. - // Text Visual should take all space available after foreground visual size and all padding is considered. - // Remaining Space priority, Foreground padding, foreground visual, Text padding then Text visual. - - Size remainingSpaceForText = Size::ZERO; - remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y; - remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.width - labelVisualPadding.height; + Toolkit::Visual::Base textVisual = DevelControl::GetVisual( *this, Toolkit::Button::Property::LABEL ); // No need to search for Label visual if no text set. - if ( !currentVisual ) + if ( textVisual ) { - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Only Text\n"); + if ( !currentVisual ) + { + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Only Text\n"); + labelPosition.x = labelVisualPadding.left; + labelPosition.y = labelVisualPadding.height; + } - // Center Text if no foreground visual - Size labelNaturalSize = Vector2( mLabel.GetNaturalSize() ); + Vector2 preSize = Vector2( static_cast< int >( remainingSpaceForText.x ), static_cast< int >( remainingSpaceForText.y )); - // A Text visual will take up all the remainingSpaceForText, for now TextLabel natural size needed for positioning. - labelPosition.x = labelVisualPadding.left + remainingSpaceForText.width*0.5 - labelNaturalSize.width *0.5; - labelPosition.y = labelVisualPadding.height + remainingSpaceForText.height*0.5 - labelNaturalSize.height *0.5; - } + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size(%f,%f) text Position(%f,%f) \n", remainingSpaceForText.width, remainingSpaceForText.height, labelPosition.x, labelPosition.y); - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size(%f,%f) text Position(%f,%f) \n", remainingSpaceForText.width, remainingSpaceForText.height, labelPosition.x, labelPosition.y); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size -- (%f,%f) text Position(%f,%f) \n", preSize.width, preSize.height, labelPosition.x, labelPosition.y); - mLabel.SetPosition( labelPosition.x, labelPosition.y ); - container.Add( mLabel, remainingSpaceForText ); // Currently a TextLabel is used and size can not be set here. + + Property::Map textVisualTransform; + textVisualTransform.Add( Toolkit::Visual::Transform::Property::SIZE, preSize ) + .Add( Toolkit::Visual::Transform::Property::OFFSET, labelPosition ) + .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ) + .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, visualAnchorPoint ); + + textVisual.SetTransformAndSize( textVisualTransform, size ); + } } + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout selected (%s) \n", IsSelected()?"yes":"no" ); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout << \n"); } void Button::OnTap(Actor actor, const TapGesture& tap) { - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnTap\n" ); + // Prevents Parent getting a tap event } void Button::SetUpTimer( float delay ) @@ -1050,7 +1028,6 @@ void Button::Pressed() if( mButtonState == UNSELECTED_STATE ) { - ClearTransitionAnimation(); ChangeState( SELECTED_STATE ); OnPressed(); // Notifies the derived class the button has been pressed. } @@ -1062,45 +1039,20 @@ void Button::Released() if( mButtonState == SELECTED_STATE && !mTogglableButton ) { - ClearTransitionAnimation(); ChangeState( UNSELECTED_STATE ); OnReleased(); // // Notifies the derived class the button has been released. } mButtonPressedState = UNPRESSED; } -Button::PressState Button::GetPressedState() -{ - return mButtonPressedState; -} - -Button::State Button::GetButtonState() -{ - return mButtonState; -} - void Button::SelectRequiredVisual( Property::Index visualIndex ) { DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SelectRequiredVisual index(%d) state(%d)\n", visualIndex, mButtonState ); - - EnableVisual( visualIndex, true ); -} - -void Button::TransitionButtonVisualOut( Property::Index visualIndex ) -{ - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::TransitionButtonVisualOut index(%d)\n", visualIndex); - - // PrepareForTranstionOut and OnTransitionOut needs to be called on visual instead of Actor once animating is possible -} - -void Button::TransitionButtonVisualIn( Property::Index visualIndex ) -{ - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::TransitionButtonVisualIn index(%d)\n", visualIndex ); -} - -void Button::OnTransitionIn( Actor actor ) -{ - PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState ); // Derived button can override OnButtonVisualRemoval + // only enable visuals that exist + if( DevelControl::GetVisual( *this, visualIndex ) ) + { + DevelControl::EnableVisual( *this, visualIndex, true ); + } } void Button::RemoveVisual( Property::Index visualIndex ) @@ -1108,11 +1060,11 @@ void Button::RemoveVisual( Property::Index visualIndex ) // Use OnButtonVisualRemoval if want button developer to have the option to override removal. DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::RemoveVisual index(%d) state(%d)\n", visualIndex, mButtonState ); - Toolkit::Visual::Base visual = GetVisual( visualIndex ); + Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, visualIndex ); if( visual ) { - EnableVisual( visualIndex, false ); + DevelControl::EnableVisual( *this, visualIndex, false ); } } @@ -1123,47 +1075,6 @@ void Button::OnButtonVisualRemoval( Property::Index visualIndex ) RemoveVisual( visualIndex ); } -void Button::StartTransitionAnimation() -{ - if( mTransitionAnimation ) - { - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::StartTransitionAnimation progress(%f) duration(%f) state(%d) \n", - mTransitionAnimation.GetCurrentProgress(), mTransitionAnimation.GetDuration(), - mTransitionAnimation.GetState()); - mTransitionAnimation.Play(); - } -} - -void Button::ClearTransitionAnimation() -{ - if( mTransitionAnimation ) - { - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::ClearTransitionAnimation progress(%f) duration(%f) state(%d) \n", - mTransitionAnimation.GetCurrentProgress(), mTransitionAnimation.GetDuration(), - mTransitionAnimation.GetState()); - mTransitionAnimation.Clear(); - mTransitionAnimation.Reset(); - } -} - -Dali::Animation Button::GetTransitionAnimation() -{ - if( !mTransitionAnimation ) - { - mTransitionAnimation = Dali::Animation::New( GetAnimationTime() ); - mTransitionAnimation.FinishedSignal().Connect( this, &Button::TransitionAnimationFinished ); - } - - return mTransitionAnimation; -} - -void Button::TransitionAnimationFinished( Dali::Animation& source ) -{ - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::TransitionAnimationFinished\n" ); - ClearTransitionAnimation(); - PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState ); // Derived button can override OnButtonVisualRemoval -} - void Button::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value ) { Toolkit::Button button = Toolkit::Button::DownCast( Dali::BaseHandle( object ) ); @@ -1210,21 +1121,6 @@ void Button::SetProperty( BaseObject* object, Property::Index index, const Prope break; } - case Toolkit::Button::Property::UNSELECTED_STATE_IMAGE: // Legacy Tizen 3.0 - { - GetImplementation( button ).CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_VISUAL, value, DepthIndex::CONTENT ); - break; - } - case Toolkit::Button::Property::DISABLED_STATE_IMAGE: // Legacy Tizen 3.0 - { - GetImplementation( button ).CreateVisualsForComponent( Toolkit::Button::Property::DISABLED_UNSELECTED_VISUAL, value, DepthIndex::CONTENT ); - break; - } - case Toolkit::Button::Property::SELECTED_STATE_IMAGE: // Legacy Tizen 3.0 - { - GetImplementation( button ).CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_VISUAL, value, DepthIndex::CONTENT ); - break; - } case Toolkit::Button::Property::UNSELECTED_VISUAL: case Toolkit::Button::Property::SELECTED_VISUAL: case Toolkit::Button::Property::DISABLED_SELECTED_VISUAL: @@ -1243,47 +1139,40 @@ void Button::SetProperty( BaseObject* object, Property::Index index, const Prope break; } - case Toolkit::Button::Property::UNSELECTED_COLOR: + case Toolkit::Button::Property::LABEL: { - DALI_LOG_WARNING("[%s] Using deprecated Property Button::Property::UNSELECTED_COLOR instead use Button::Property::UNSELECTED_BACKGROUND_VISUAL\n", __FUNCTION__); - GetImplementation( button ).SetColor( value.Get< Vector4 >(), Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL ); - break; - } + Property::Map outTextVisualProperties; + std::string textString; - case Toolkit::Button::Property::SELECTED_COLOR: - { - DALI_LOG_WARNING("[%s] Using deprecated Property Button::Property::SELECTED_COLOR instead use Button::Property::SELECTED_BACKGROUND_VISUAL\n", __FUNCTION__); - GetImplementation( button ).SetColor( value.Get< Vector4 >(), Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL ); - break; - } + if ( value.Get( textString ) ) + { + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SetProperty Setting TextVisual with string[%s]\n", textString.c_str() ); - case Toolkit::Button::Property::LABEL_TEXT: - { - DALI_LOG_WARNING("[%s] Using deprecated Property Button::Property::LABEL_TEXT instead use Button::Property::LABEL\n", __FUNCTION__); - Property::Map labelTextProperty; - labelTextProperty.Insert( "text", value.Get< std::string >() ); - GetImplementation( button ).SetupLabel( labelTextProperty ); - break; - } + Property::Map setPropertyMap; + setPropertyMap.Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::TEXT ) + .Add( Toolkit::TextVisual::Property::TEXT, textString ); - case Toolkit::Button::Property::LABEL: - { - // Get a Property::Map from the property if possible. - Property::Map setPropertyMap; - if( value.Get( setPropertyMap ) ) + GetImplementation( button ).MergeWithExistingLabelProperties( setPropertyMap, outTextVisualProperties ); + } + else { - GetImplementation( button ).SetupLabel( setPropertyMap ); + // Get a Property::Map from the property if possible. + Property::Map* setPropertyMap = value.GetMap(); + if( setPropertyMap ) + { + TextVisual::ConvertStringKeysToIndexKeys( *setPropertyMap ); + GetImplementation( button ).MergeWithExistingLabelProperties( *setPropertyMap, outTextVisualProperties ); + } } - break; - } - case Toolkit::Button::Property::LABEL_STRUT_LENGTH: - { - GetImplementation( button ).SetLabelStrutLength( value.Get< int >() ); + if( !outTextVisualProperties.Empty() ) + { + GetImplementation( button ).CreateVisualsForComponent( index, outTextVisualProperties, DepthIndex::CONTENT ); + } break; } - case Toolkit::Button::Property::LABEL_RELATIVE_ALIGNMENT: + case Toolkit::DevelButton::Property::LABEL_RELATIVE_ALIGNMENT: { Button::Align labelAlignment(END); Scripting::GetEnumeration< Button::Align> ( value.Get< std::string >().c_str(), @@ -1293,6 +1182,20 @@ void Button::SetProperty( BaseObject* object, Property::Index index, const Prope GetImplementation( button ).SetLabelAlignment( labelAlignment ); break; } + + case Toolkit::DevelButton::Property::LABEL_PADDING: + { + Vector4 padding ( value.Get< Vector4 >() ); + GetImplementation( button ).SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) ); + break; + } + + case Toolkit::DevelButton::Property::VISUAL_PADDING: + { + Vector4 padding ( value.Get< Vector4 >() ); + GetImplementation( button ).SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) ); + break; + } } } } @@ -1343,56 +1246,25 @@ Property::Value Button::GetProperty( BaseObject* object, Property::Index propert break; } - case Toolkit::Button::Property::UNSELECTED_STATE_IMAGE: - { - value = GetImplementation( button ).GetUrlForImageVisual( Toolkit::Button::Property::UNSELECTED_VISUAL ); - break; - } - - case Toolkit::Button::Property::SELECTED_STATE_IMAGE: - { - value = GetImplementation( button ).GetUrlForImageVisual( Toolkit::Button::Property::SELECTED_VISUAL ); - break; - } - - case Toolkit::Button::Property::DISABLED_STATE_IMAGE: - { - value = GetImplementation( button ).GetUrlForImageVisual( Toolkit::Button::Property::DISABLED_UNSELECTED_VISUAL ); - break; - } - - case Toolkit::Button::Property::UNSELECTED_COLOR: - { - value = GetImplementation( button ).GetUnselectedColor(); - break; - } - - case Toolkit::Button::Property::SELECTED_COLOR: - { - value = GetImplementation( button ).GetSelectedColor(); - break; - } - - case Toolkit::Button::Property::LABEL_TEXT: - { - value = GetImplementation( button ).GetLabelText(); - break; - } - + case Toolkit::Button::Property::UNSELECTED_VISUAL: + case Toolkit::Button::Property::SELECTED_VISUAL: + case Toolkit::Button::Property::DISABLED_SELECTED_VISUAL: + case Toolkit::Button::Property::DISABLED_UNSELECTED_VISUAL: + case Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL: + case Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL: + case Toolkit::Button::Property::DISABLED_SELECTED_BACKGROUND_VISUAL: + case Toolkit::Button::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL: case Toolkit::Button::Property::LABEL: { - Property::Map emptyMap; - value = emptyMap; - break; - } - - case Toolkit::Button::Property::LABEL_STRUT_LENGTH: - { - value = GetImplementation( button ).GetLabelStrutLength(); + Property::Map visualProperty; + if ( GetImplementation( button ).GetPropertyMapForVisual( propertyIndex, visualProperty ) ) + { + value = visualProperty; + } break; } - case Toolkit::Button::Property::LABEL_RELATIVE_ALIGNMENT: + case Toolkit::DevelButton::Property::LABEL_RELATIVE_ALIGNMENT: { const char* alignment = Scripting::GetEnumerationName< Button::Align >( GetImplementation( button ).GetLabelAlignment(), ALIGNMENT_STRING_TABLE, @@ -1404,6 +1276,19 @@ Property::Value Button::GetProperty( BaseObject* object, Property::Index propert break; } + + case Toolkit::DevelButton::Property::LABEL_PADDING: + { + Padding padding = GetImplementation( button ).GetLabelPadding(); + value = Vector4( padding.x, padding.y, padding.top, padding.bottom); + break; + } + + case Toolkit::DevelButton::Property::VISUAL_PADDING: + { + Padding padding = GetImplementation( button ).GetForegroundPadding(); + value = Vector4( padding.x, padding.y, padding.top, padding.bottom); + } } } @@ -1434,109 +1319,6 @@ Padding Button::GetForegroundPadding() return mForegroundPadding; } -//////////////////////////////////////////////////////////////////////// -// Legacy functions from Tizen 2.4 and 3.0 - -void Button::SetLabel( Actor label ) -{ - if ( label ) - { - Property::Value value =""; - value = label.GetProperty(Toolkit::TextLabel::Property::TEXT); - - SetLabelText( value.Get() ); - } -} - -void Button::SetUnselectedImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_VISUAL, filename, DepthIndex::CONTENT ); - } -} - -void Button::SetBackgroundImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::UNSELECTED_BACKGROUND_VISUAL, filename, DepthIndex::BACKGROUND ); - } -} - -void Button::SetSelectedImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_VISUAL, filename, DepthIndex::CONTENT ); - } -} - -void Button::SetSelectedBackgroundImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL, filename, DepthIndex::BACKGROUND ); - } -} - -void Button::SetDisabledBackgroundImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL, filename, DepthIndex::BACKGROUND ); - } -} - -void Button::SetDisabledImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::DISABLED_UNSELECTED_VISUAL, filename, DepthIndex::CONTENT ); - } -} - -void Button::SetDisabledSelectedImage( const std::string& filename ) -{ - if( !filename.empty() ) - { - CreateVisualsForComponent( Toolkit::Button::Property::DISABLED_SELECTED_VISUAL, filename, DepthIndex::CONTENT ); - } -} - -std::string Button::GetUrlForImageVisual( Property::Index index ) -{ - Toolkit::Visual::Base visual = GetVisual( index ); - std::string result; - - if ( visual ) - { - Dali::Property::Map retreivedMap; - visual.CreatePropertyMap( retreivedMap ); - Property::Value* value = retreivedMap.Find( Toolkit::ImageVisual::Property::URL, Property::STRING ); - if ( value ) - { - result = value->Get(); - } - } - - return result; -} - -// Below functions DEPRECATED_1_0.50 - Return empty Actors - -Actor Button::GetButtonImage() const -{ - DALI_LOG_WARNING("Button::GetButtonImage @DEPRECATED_1_0.50 Returning empty Actor \n"); - return Actor();; -} - -Actor Button::GetSelectedImage() const -{ - DALI_LOG_WARNING("Button::GetSelectedImage @DEPRECATED_1_0.50 Returning empty Actor \n"); - return Actor(); -} - } // namespace Internal } // namespace Toolkit