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=a984156980a06a6ff44dc30f4aa0d6ea5d705de5;hp=53f89ca6f6af580962a0e275f4dd9b19ae489256;hb=863244a09761c6e22a224299b6155a285e21d6ec;hpb=e5dbcae1f8ee31b14d675793ab86161eeeefb029 diff --git a/dali-toolkit/internal/controls/buttons/button-impl.cpp b/dali-toolkit/internal/controls/buttons/button-impl.cpp index 53f89ca..a984156 100644 --- a/dali-toolkit/internal/controls/buttons/button-impl.cpp +++ b/dali-toolkit/internal/controls/buttons/button-impl.cpp @@ -37,9 +37,9 @@ #include #include #include -#include #include - +#include +#include #if defined(DEBUG_ENABLED) Debug::Filter* gLogButtonFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_BUTTON_CONTROL"); @@ -87,7 +87,6 @@ DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedBackgroundVisual", 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 ) // Signals: @@ -126,15 +125,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,15 +171,14 @@ 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; } } @@ -280,8 +297,10 @@ bool Button::ValidateState( State 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 ); + 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] ); @@ -300,19 +319,16 @@ 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(); + // 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. PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState ); // Derived button can override OnButtonVisualRemoval } @@ -327,91 +343,60 @@ 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 ) { Property::Map labelProperty; - labelProperty.Insert( "text", label ); - SetupLabel( labelProperty ); + labelProperty.Add( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::TEXT) + .Add( Toolkit::TextVisual::Property::TEXT, label ); + + Self().SetProperty( Toolkit::Button::Property::LABEL, labelProperty ); } std::string Button::GetLabelText() const { - Toolkit::TextLabel label = Dali::Toolkit::TextLabel::DownCast( mLabel ); - if( label ) + Property::Value value = Self().GetProperty( Toolkit::Button::Property::LABEL ); + + Property::Map *labelProperty = value.GetMap(); + + std::string textLabel; + + if ( labelProperty ) { - return label.GetProperty( Dali::Toolkit::TextLabel::Property::TEXT ); + Property::Value* value = labelProperty->Find( Toolkit::TextVisual::Property::TEXT ); + value->Get( textLabel ); } - return std::string(); + + return textLabel; } -void Button::SetupLabel( const Property::Map& properties ) +void Button::MergeLabelProperties( const Property::Map& inMap, Property::Map& outMap ) { - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "SetupLabel\n"); + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties with %d properties\n", inMap.Count() ); - // 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 = GetVisual( 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,16 +405,19 @@ void Button::SetLabelAlignment( Button::Align labelAlignment) RelayoutRequest(); } -float Button::GetLabelStrutLength() -{ - return mForeGroundToLabelStrutLength; -} - Button::Align Button::GetLabelAlignment() { return mTextLabelAlignment; } +/** + * 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 float visualDepth ) { DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent index(%d)\n", index ); @@ -442,6 +430,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 +447,31 @@ void Button::CreateVisualsForComponent( Property::Index index, const Property::V if ( buttonVisual ) { - DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "RegisterVisual index(%d)\n", index ); + DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent RegisterVisual index(%d) enabled(%s)\n", + index, IsVisualEnabled( index )?"true":"false" ); buttonVisual.SetDepthIndex( visualDepth ); - // Background Visuals take full size of control - RegisterVisual( index, buttonVisual, false ); + RegisterVisual( index, buttonVisual, IsVisualEnabled( index ) ); } else { UnregisterVisual( index ); - DALI_LOG_INFO( gLogButtonFilter, Debug::General, "Button visual not created or empty map provided (clearing visual).(%d)\n", index); + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "CreateVisualsForComponent Visual not created or empty map (clearing visual).(%d)\n", index); } + PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState ); } -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 = GetVisual( 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 +499,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 +513,7 @@ bool Button::DoClickAction( const Property::Map& attributes ) return false; } -void Button::OnButtonDown() +void Button::ButtonDown() { if( mTogglableButton ) { @@ -567,34 +542,44 @@ void Button::OnButtonDown() mPressedSignal.Emit( handle ); } -void Button::OnButtonUp() +void Button::ButtonUp() { if( DEPRESSED == mButtonPressedState ) { - if( mTogglableButton ) + bool validButtonAction = false; + + if( mTogglableButton ) // Button up will change state { - if ( TOGGLE_DEPRESSED != mButtonPressedState ) - { - SetSelected( !IsSelected() ); - mButtonPressedState = UNPRESSED; - } + validButtonAction = 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(); } + validButtonAction = true; } - // The clicked and released signals should be emitted regardless of toggle mode. - Toolkit::Button handle( GetOwner() ); - mReleasedSignal.Emit( handle ); - mClickedSignal.Emit( handle ); + if ( validButtonAction ) + { + // The clicked and released signals should be emitted regardless of toggle mode. + Toolkit::Button handle( GetOwner() ); + mReleasedSignal.Emit( handle ); + mClickedSignal.Emit( handle ); + } } } +bool Button::OnToggleReleased() +{ + SetSelected( !IsSelected() ); + mButtonPressedState = UNPRESSED; + return true; +} + + void Button::OnTouchPointLeave() { if( DEPRESSED == mButtonPressedState ) @@ -706,12 +691,12 @@ bool Button::OnTouch( Actor actor, const TouchData& touch ) { case PointState::DOWN: { - OnButtonDown(); + ButtonDown(); break; } case PointState::UP: { - OnButtonUp(); + ButtonUp(); break; } case PointState::INTERRUPTED: @@ -775,9 +760,10 @@ void Button::OnStageDisconnection() void Button::OnStageConnection( int depth ) { DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::OnStageConnection ptr(%p) \n", this ); + PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState ); + SelectRequiredVisual( Toolkit::Button::Property::LABEL ); PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState ); Control::OnStageConnection( depth ); // Enabled visuals will be put on stage - } Vector3 Button::GetNaturalSize() @@ -788,7 +774,7 @@ Vector3 Button::GetNaturalSize() // Get natural size of foreground ( largest of the possible visuals ) Size largestForegroundVisual; - Size labelSize; + Size labelSize = Size::ZERO; for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++) { @@ -816,27 +802,32 @@ Vector3 Button::GetNaturalSize() DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize visual Size(%f,%f)\n", largestForegroundVisual.width, largestForegroundVisual.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 = GetVisual( 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,30 +846,18 @@ 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] ); @@ -890,7 +869,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 +889,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 +903,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 +916,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 +929,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,6 +943,10 @@ 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; } } @@ -968,44 +965,43 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) 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::DevelVisual::Transform::Property::SIZE, visualSize ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, visualPosition ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f) ) // Use absolute size + .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) + .Add( Toolkit::DevelVisual::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 = GetVisual( 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"); - - // Center Text if no foreground visual - Size labelNaturalSize = Vector2( mLabel.GetNaturalSize() ); + if ( !currentVisual ) + { + DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Only Text\n"); + labelPosition.x = labelVisualPadding.left; + labelPosition.y = labelVisualPadding.height; + } - // 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); + Property::Map textVisualTransform; + textVisualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, remainingSpaceForText) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, labelPosition ) + .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f,1.0f ) ) // Use absolute size + .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) + .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, visualAnchorPoint ); - mLabel.SetPosition( labelPosition.x, labelPosition.y ); - container.Add( mLabel, remainingSpaceForText ); // Currently a TextLabel is used and size can not be set here. + textVisual.SetTransformAndSize( textVisualTransform, size ); + } } DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout << \n"); @@ -1013,7 +1009,7 @@ void Button::OnRelayout( const Vector2& size, RelayoutContainer& container ) 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 +1046,6 @@ void Button::Pressed() if( mButtonState == UNSELECTED_STATE ) { - ClearTransitionAnimation(); ChangeState( SELECTED_STATE ); OnPressed(); // Notifies the derived class the button has been pressed. } @@ -1062,23 +1057,12 @@ 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 ); @@ -1086,23 +1070,6 @@ void Button::SelectRequiredVisual( Property::Index visualIndex ) 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 -} - void Button::RemoveVisual( Property::Index visualIndex ) { // Use OnButtonVisualRemoval if want button developer to have the option to override removal. @@ -1123,47 +1090,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 ) ); @@ -1260,29 +1186,24 @@ void Button::SetProperty( BaseObject* object, Property::Index index, const Prope 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 ); + GetImplementation( button ).SetLabelText(value.Get< std::string >() ); break; } case Toolkit::Button::Property::LABEL: { // Get a Property::Map from the property if possible. - Property::Map setPropertyMap; - if( value.Get( setPropertyMap ) ) + Property::Map* setPropertyMap = value.GetMap(); + if( setPropertyMap ) { - GetImplementation( button ).SetupLabel( setPropertyMap ); + Property::Map textVisualProperties; + GetImplementation( button ).MergeLabelProperties( *setPropertyMap, textVisualProperties ); + GetImplementation( button ).CreateVisualsForComponent( index, textVisualProperties, DepthIndex::CONTENT ); + GetImplementation( button ).RelayoutRequest(); } break; } - case Toolkit::Button::Property::LABEL_STRUT_LENGTH: - { - GetImplementation( button ).SetLabelStrutLength( value.Get< int >() ); - break; - } - case Toolkit::Button::Property::LABEL_RELATIVE_ALIGNMENT: { Button::Align labelAlignment(END); @@ -1361,6 +1282,24 @@ Property::Value Button::GetProperty( BaseObject* object, Property::Index propert 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 visualProperty; + if ( GetImplementation( button ).GetPropertyMapForVisual( propertyIndex, visualProperty ) ) + { + value = visualProperty; + } + break; + } + case Toolkit::Button::Property::UNSELECTED_COLOR: { value = GetImplementation( button ).GetUnselectedColor(); @@ -1379,19 +1318,6 @@ Property::Value Button::GetProperty( BaseObject* object, Property::Index propert break; } - case Toolkit::Button::Property::LABEL: - { - Property::Map emptyMap; - value = emptyMap; - break; - } - - case Toolkit::Button::Property::LABEL_STRUT_LENGTH: - { - value = GetImplementation( button ).GetLabelStrutLength(); - break; - } - case Toolkit::Button::Property::LABEL_RELATIVE_ALIGNMENT: { const char* alignment = Scripting::GetEnumerationName< Button::Align >( GetImplementation( button ).GetLabelAlignment(), @@ -1437,6 +1363,47 @@ Padding Button::GetForegroundPadding() //////////////////////////////////////////////////////////////////////// // Legacy functions from Tizen 2.4 and 3.0 +// Legacy code needed whilst Color can be set by direct Property setting ( deprecated ) instead of setting a Visual +void Button::SetColor( const Vector4& color, Property::Index visualIndex ) +{ + if ( visualIndex == Toolkit::Button::Property::SELECTED_BACKGROUND_VISUAL ) + { + mSelectedColor = color; + } + else + { + mUnselectedColor = color; + } + + Property::Map map; + map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR; + map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color; + + CreateVisualsForComponent( visualIndex, map, DepthIndex::BACKGROUND ); +} + +const Vector4 Button::GetUnselectedColor() const +{ + return mUnselectedColor; +} + +const Vector4 Button::GetSelectedColor() const +{ + return mSelectedColor; +} + +void Button::SetAnimationTime( float animationTime ) +{ + // Used by deprecated API + mAnimationTime = animationTime; +} + +float Button::GetAnimationTime() const +{ + // Used by deprecated API + return mAnimationTime; +} + void Button::SetLabel( Actor label ) { if ( label ) @@ -1504,7 +1471,8 @@ void Button::SetDisabledSelectedImage( const std::string& filename ) } } -std::string Button::GetUrlForImageVisual( Property::Index index ) +// Used by Deprecated Properties which don't use the Visual Property maps for setting and getting +std::string Button::GetUrlForImageVisual( const Property::Index index ) const { Toolkit::Visual::Base visual = GetVisual( index ); std::string result; @@ -1525,16 +1493,50 @@ std::string Button::GetUrlForImageVisual( Property::Index index ) // Below functions DEPRECATED_1_0.50 - Return empty Actors +namespace +{ +std::string GetUrlFromImage( Image& image ) +{ + ResourceImage resourceImage = ResourceImage::DownCast( image ); + + std::string imageUrl; + + if ( resourceImage ) + { + imageUrl = resourceImage.GetUrl(); + } + return imageUrl; +} + +} // namespace + + +void Button::SetButtonImage( Image image ) +{ + DALI_LOG_WARNING("Button::SetButtonImage @DEPRECATED_1_0.50\n"); + SetUnselectedImage( GetUrlFromImage( image ) ); +} + +void Button::SetSelectedImage( Image image ) +{ + DALI_LOG_WARNING("Button::SetSelectedImage @DEPRECATED_1_0.50\n"); + SetSelectedImage( GetUrlFromImage( image ) ); +} + Actor Button::GetButtonImage() const { - DALI_LOG_WARNING("Button::GetButtonImage @DEPRECATED_1_0.50 Returning empty Actor \n"); - return Actor();; + DALI_LOG_WARNING("Button::GetButtonImage @DEPRECATED_1_0.50\n"); + Actor imageView = Toolkit::ImageView::New( GetUrlForImageVisual( Toolkit::Button::Property::UNSELECTED_VISUAL ) ); + + return imageView; } Actor Button::GetSelectedImage() const { - DALI_LOG_WARNING("Button::GetSelectedImage @DEPRECATED_1_0.50 Returning empty Actor \n"); - return Actor(); + DALI_LOG_WARNING("Button::GetSelectedImage @DEPRECATED_1_0.50\n"); + Actor imageView = Toolkit::ImageView::New( GetUrlForImageVisual( Toolkit::Button::Property::SELECTED_VISUAL ) ); + + return imageView; } } // namespace Internal