2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "button-impl.h"
22 #include <cstring> // for strcmp
23 #include <dali/devel-api/scripting/enum-helper.h>
24 #include <dali/integration-api/debug.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/images/resource-image.h>
27 #include <dali/public-api/object/type-registry.h>
28 #include <dali/public-api/object/type-registry-helper.h>
29 #include <dali/public-api/size-negotiation/relayout-container.h>
30 #include <dali/devel-api/object/property-helper-devel.h>
31 #include <dali/devel-api/scripting/scripting.h>
34 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
35 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
36 #include <dali-toolkit/public-api/visuals/color-visual-properties.h>
37 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
38 #include <dali-toolkit/devel-api/align-enums.h>
39 #include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
40 #include <dali-toolkit/devel-api/controls/buttons/button-devel.h>
41 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
42 #include <dali-toolkit/devel-api/visuals/text-visual-properties.h>
43 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
45 #if defined(DEBUG_ENABLED)
46 Debug::Filter* gLogButtonFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_BUTTON_CONTROL");
63 // empty handle as we cannot create button (but type registered for clicked signal)
67 // Setup properties, signals and actions using the type-registry.
68 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::Button, Toolkit::Control, Create )
70 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabled", BOOLEAN, DISABLED )
71 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "autoRepeating", BOOLEAN, AUTO_REPEATING )
72 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "initialAutoRepeatingDelay", FLOAT, INITIAL_AUTO_REPEATING_DELAY )
73 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "nextAutoRepeatingDelay", FLOAT, NEXT_AUTO_REPEATING_DELAY )
74 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "togglable", BOOLEAN, TOGGLABLE )
75 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selected", BOOLEAN, SELECTED )
76 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedStateImage", MAP, UNSELECTED_STATE_IMAGE ) // Deprecated property
77 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selectedStateImage", MAP, SELECTED_STATE_IMAGE ) // Deprecated property
78 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "disabledStateImage", MAP, DISABLED_STATE_IMAGE ) // Deprecated property
79 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedColor", VECTOR4, UNSELECTED_COLOR ) // Deprecated property
80 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "selectedColor", VECTOR4, SELECTED_COLOR ) // Deprecated property
81 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "label", MAP, LABEL )
82 DALI_PROPERTY_REGISTRATION( Toolkit, Button, "labelText", STRING, LABEL_TEXT ) // Deprecated property
83 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedVisual", MAP, UNSELECTED_VISUAL )
84 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "selectedVisual", MAP, SELECTED_VISUAL )
85 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "disabledSelectedVisual", MAP, DISABLED_SELECTED_VISUAL )
86 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "disabledUnselectedVisual", MAP, DISABLED_UNSELECTED_VISUAL )
87 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "unselectedBackgroundVisual", MAP, UNSELECTED_BACKGROUND_VISUAL )
88 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "selectedBackgroundVisual", MAP, SELECTED_BACKGROUND_VISUAL )
89 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "disabledUnselectedBackgroundVisual", MAP, DISABLED_UNSELECTED_BACKGROUND_VISUAL )
90 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "disabledSelectedBackgroundVisual", MAP, DISABLED_SELECTED_BACKGROUND_VISUAL )
91 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "labelRelativeAlignment", STRING, LABEL_RELATIVE_ALIGNMENT )
92 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "labelPadding", VECTOR4, LABEL_PADDING )
93 DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, Button, "visualPadding", VECTOR4, VISUAL_PADDING )
96 DALI_SIGNAL_REGISTRATION( Toolkit, Button, "pressed", SIGNAL_PRESSED )
97 DALI_SIGNAL_REGISTRATION( Toolkit, Button, "released", SIGNAL_RELEASED )
98 DALI_SIGNAL_REGISTRATION( Toolkit, Button, "clicked", SIGNAL_CLICKED )
99 DALI_SIGNAL_REGISTRATION( Toolkit, Button, "stateChanged", SIGNAL_STATE_CHANGED )
102 DALI_ACTION_REGISTRATION( Toolkit, Button, "buttonClick", ACTION_BUTTON_CLICK )
104 DALI_TYPE_REGISTRATION_END()
106 DALI_ENUM_TO_STRING_TABLE_BEGIN( ALIGNMENT )
107 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Internal::Button, BEGIN )
108 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Internal::Button, END )
109 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Internal::Button, TOP )
110 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Internal::Button, BOTTOM )
111 DALI_ENUM_TO_STRING_TABLE_END( ALIGNMENT )
113 const Scripting::StringEnum ALIGNMENT_STRING_TABLE[] =
115 { "BEGIN", Button::BEGIN },
116 { "END", Button::END },
117 { "TOP", Button::TOP },
118 { "BOTTOM", Button::BOTTOM },
121 const unsigned int ALIGNMENT_STRING_TABLE_COUNT = sizeof( ALIGNMENT_STRING_TABLE ) / sizeof( ALIGNMENT_STRING_TABLE[0] );
123 const Property::Index GET_VISUAL_INDEX_FOR_STATE[][Button::STATE_COUNT] =
125 { Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, Toolkit::DevelButton::Property::UNSELECTED_VISUAL },
126 { Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, Toolkit::DevelButton::Property::SELECTED_VISUAL },
127 { Toolkit::DevelButton::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL, Toolkit::DevelButton::Property::DISABLED_UNSELECTED_VISUAL },
128 { Toolkit::DevelButton::Property::DISABLED_SELECTED_BACKGROUND_VISUAL, Toolkit::DevelButton::Property::DISABLED_SELECTED_VISUAL }
132 * Checks if given map contains a text string
134 bool MapContainsTextString( Property::Map& map )
137 Property::Value* value = map.Find( Toolkit::TextVisual::Property::TEXT );
140 std::string textString;
141 value->Get( textString );
142 if ( !textString.empty() )
150 } // unnamed namespace
153 : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
154 mAutoRepeatingTimer(),
155 mTextLabelAlignment( END ),
156 mAutoRepeating( false ),
157 mTogglableButton( false ),
158 mTextStringSetFlag( false ),
159 mInitialAutoRepeatingDelay( 0.0f ),
160 mNextAutoRepeatingDelay( 0.0f ),
161 mAnimationTime( 0.0f ),
162 mButtonPressedState( UNPRESSED ),
163 mButtonState( UNSELECTED_STATE ),
164 mPreviousButtonState( mButtonState ),
165 mClickActionPerforming( false )
173 void Button::SetAutoRepeating( bool autoRepeating )
175 mAutoRepeating = autoRepeating;
177 // An autorepeating button can't be a toggle button.
182 SetSelected( false ); // UnSelect before switching off Toggle feature.
184 mTogglableButton = false;
188 bool Button::IsAutoRepeating() const
190 return mAutoRepeating;
193 void Button::SetInitialAutoRepeatingDelay( float initialAutoRepeatingDelay )
195 DALI_ASSERT_DEBUG( initialAutoRepeatingDelay > 0.f );
196 mInitialAutoRepeatingDelay = initialAutoRepeatingDelay;
199 float Button::GetInitialAutoRepeatingDelay() const
201 return mInitialAutoRepeatingDelay;
204 void Button::SetNextAutoRepeatingDelay( float nextAutoRepeatingDelay )
206 DALI_ASSERT_DEBUG( nextAutoRepeatingDelay > 0.f );
207 mNextAutoRepeatingDelay = nextAutoRepeatingDelay;
210 float Button::GetNextAutoRepeatingDelay() const
212 return mNextAutoRepeatingDelay;
215 void Button::SetTogglableButton( bool togglable )
217 mTogglableButton = togglable;
219 // A toggle button can't be an autorepeating button.
222 mAutoRepeating = false;
226 bool Button::IsTogglableButton() const
228 return mTogglableButton;
231 void Button::SetSelected( bool selected )
233 if( mTogglableButton )
235 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SetSelected (%s)\n", (selected?"true":"false") );
237 if ( selected && ( mButtonState != SELECTED_STATE ) )
239 ChangeState( SELECTED_STATE );
241 else if ( !selected && ( mButtonState != UNSELECTED_STATE ) )
243 ChangeState( UNSELECTED_STATE );
248 void Button::SetDisabled( bool disabled )
250 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SetDisabled(%s) state(%d)\n", (disabled)?"disabled":"active", mButtonState );
254 if ( mButtonState == SELECTED_STATE )
256 ChangeState( DISABLED_SELECTED_STATE );
258 else if ( mButtonState == UNSELECTED_STATE )
260 ChangeState( DISABLED_UNSELECTED_STATE );
265 if ( mButtonState == DISABLED_SELECTED_STATE )
267 ChangeState( SELECTED_STATE );
269 else if ( mButtonState == DISABLED_UNSELECTED_STATE )
271 ChangeState( UNSELECTED_STATE );
276 bool Button::IsDisabled() const
278 return ( mButtonState == DISABLED_SELECTED_STATE || mButtonState == DISABLED_UNSELECTED_STATE ) ;
281 bool Button::ValidateState( State requestedState )
283 /* Below tables shows allowed state transitions
284 * Match rows in first column to following columns, if true then transition allowed.
285 * eg UNSELECTED_STATE to DISABLED_UNSELECTED_STATE is true so state transition allowed.
287 to| UNSELECTED_STATE | SELECTED_STATE | DISABLED_UNSELECTED_STATE | DISABLED_SELECTED_STATE |*/
289 bool transitionTable[4][4] = { /* UNSELECTED_STATE*/ { false, true, true, false },
290 /* SELECTED_STATE*/ { true, false, false, true },
291 /* DISABLED_UNSELECTED_STATE*/{ true, true, false, false },
292 /* DISABLED_SELECTED_STATE*/ { false, true, false, false }
295 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::ValidateState ReuestedState:%d, CurrentState:%d, result:%s\n",
296 requestedState, mButtonState, (transitionTable[mButtonState][requestedState])?"change-accepted":"change-denied");
298 return transitionTable[mButtonState][requestedState];
301 void Button::PerformFunctionOnVisualsInState( void(Button::*functionPtr)( Property::Index visualIndex), State state )
303 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::PerformFunctionOnVisualsInState BACKROUND visual(%d) for state (%d)\n",
304 GET_VISUAL_INDEX_FOR_STATE[state][BACKGROUND], state );
305 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::PerformFunctionOnVisualsInState FOREGROUND visuals(%d) for state (%d)\n",
306 GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND], state );
308 (this->*functionPtr)( GET_VISUAL_INDEX_FOR_STATE[state][BACKGROUND] );
309 (this->*functionPtr)( GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND] );
314 void Button::ChangeState( State requestedState )
316 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::ChangeState ReuestedState(%d)\n", requestedState );
318 // Validate State before changing
319 if ( !ValidateState( requestedState ))
321 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::ChangeState ReuestedState(%d) not validated\n", requestedState );
325 // If not on stage the button could have still been set to selected so update state
326 mPreviousButtonState = mButtonState; // Store previous state for visual removal (used when animations ended)
327 mButtonState = requestedState; // Update current state
329 if ( Self().OnStage() )
331 OnStateChange( mButtonState ); // Notify derived buttons
332 PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState );
333 // If animation supported then visual removal should be performed after any transition animation has completed.
334 // If Required Visual is not loaded before current visual is removed then a flickering will be evident.
335 PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState ); // Derived button can override OnButtonVisualRemoval
338 Toolkit::Button handle( GetOwner() );
340 mStateChangedSignal.Emit( handle );
343 bool Button::IsSelected() const
345 bool selected = ( mButtonState == SELECTED_STATE ) || ( mButtonState == DISABLED_SELECTED_STATE );
346 return mTogglableButton && selected;
349 void Button::SetLabelText( const std::string& label )
351 Property::Map labelProperty;
352 labelProperty.Add( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::TEXT)
353 .Add( Toolkit::TextVisual::Property::TEXT, label );
355 Self().SetProperty( Toolkit::Button::Property::LABEL, labelProperty );
358 std::string Button::GetLabelText() const
360 Property::Value value = Self().GetProperty( Toolkit::Button::Property::LABEL );
362 Property::Map *labelProperty = value.GetMap();
364 std::string textLabel;
368 Property::Value* value = labelProperty->Find( Toolkit::TextVisual::Property::TEXT );
369 value->Get( textLabel );
375 void Button::MergeLabelProperties( const Property::Map& inMap, Property::Map& outMap )
377 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties with %d properties\n", inMap.Count() );
380 * Properties for the Label visual could be from a style sheet but after being set the "TEXT" property could be set.
381 * Hence would need to create the Text Visual with the complete merged set of properties.
383 * 1) Find Label Visual
384 * 2) Retrieve current properties ( settings )
385 * 3) Merge with new properties ( settings )
386 * 4) Return new merged map
388 Toolkit::Visual::Base visual = GetVisual( Toolkit::Button::Property::LABEL );
391 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties Visual already exists, retrieving existing map\n");
392 visual.CreatePropertyMap( outMap );
393 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties retrieved %d properties\n", outMap.Count() );
396 outMap.Merge( inMap );
398 // Store if a text string has been supplied.
400 mTextStringSetFlag = MapContainsTextString( outMap );
402 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "MergeLabelProperties now has %d properties\n", outMap.Count() );
405 void Button::SetLabelAlignment( Button::Align labelAlignment)
407 mTextLabelAlignment = labelAlignment;
411 Button::Align Button::GetLabelAlignment()
413 return mTextLabelAlignment;
417 * Create Visual for given index from a property map or url.
418 * 1) Check if value passed in is a url and create visual
419 * 2) Create visual from map if step (1) is false
420 * 3) Register visual with control with false for enable flag. Button will later enable visual when needed ( Button::SelectRequiredVisual )
421 * 4) Unregister visual if empty map was provided. This is the method to remove a visual
424 void Button::CreateVisualsForComponent( Property::Index index, const Property::Value& value, const float visualDepth )
426 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent index(%d)\n", index );
427 Toolkit::VisualFactory visualFactory = Toolkit::VisualFactory::Get();
428 Toolkit::Visual::Base buttonVisual;
430 std::string imageUrl;
431 if( value.Get( imageUrl ) )
433 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent Using image URL(%d)\n", index );
434 if ( !imageUrl.empty() )
436 DALI_ASSERT_DEBUG( index != Toolkit::Button::Property::LABEL && "Creating a Image Visual instead of Text Visual " );
437 buttonVisual = visualFactory.CreateVisual( imageUrl, ImageDimensions() );
442 // if its not a string then get a Property::Map from the property if possible.
443 Property::Map *map = value.GetMap();
444 if( map && !map->Empty() ) // Empty map results in current visual removal.
446 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent Using Map(%d)\n", index );
447 buttonVisual = visualFactory.CreateVisual( *map );
453 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "CreateVisualsForComponent RegisterVisual index(%d) enabled(%s)\n",
454 index, IsVisualEnabled( index )?"true":"false" );
455 buttonVisual.SetDepthIndex( visualDepth );
456 RegisterVisual( index, buttonVisual, IsVisualEnabled( index ) );
460 UnregisterVisual( index );
461 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "CreateVisualsForComponent Visual not created or empty map (clearing visual).(%d)\n", index);
463 PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState );
466 bool Button::GetPropertyMapForVisual( Property::Index visualIndex, Property::Map& retreivedMap ) const
468 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetPropertyMapForVisual visual(%d)\n", visualIndex);
469 bool success = false;
470 Toolkit::Visual::Base visual = GetVisual( visualIndex );
473 visual.CreatePropertyMap( retreivedMap );
476 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetPropertyMapForVisual %s\n", success?"Success":"Failure");
480 bool Button::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
484 Dali::BaseHandle handle( object );
486 Toolkit::Button button = Toolkit::Button::DownCast( handle );
488 DALI_ASSERT_DEBUG( button );
490 if( 0 == strcmp( actionName.c_str(), ACTION_BUTTON_CLICK ) )
492 ret = GetImplementation( button ).DoClickAction( attributes );
498 bool Button::DoClickAction( const Property::Map& attributes )
500 // Prevents the button signals from doing a recursive loop by sending an action
501 // and re-emitting the signals.
502 if( !mClickActionPerforming )
504 mClickActionPerforming = true;
506 if ( !mTogglableButton )
508 mButtonPressedState = DEPRESSED;
511 mClickActionPerforming = false;
519 void Button::ButtonDown()
521 if( mTogglableButton )
523 if ( mButtonState != SELECTED_STATE )
526 mButtonPressedState = TOGGLE_DEPRESSED;
530 mButtonPressedState = DEPRESSED;
536 mButtonPressedState = DEPRESSED;
539 SetUpTimer( mInitialAutoRepeatingDelay );
543 // The pressed signal should be emitted regardless of toggle mode.
544 Toolkit::Button handle( GetOwner() );
545 mPressedSignal.Emit( handle );
548 void Button::ButtonUp()
550 bool emitSignalsForPressAndReleaseAction = false;
552 if( DEPRESSED == mButtonPressedState )
554 if( mTogglableButton ) // Button up will change state
556 emitSignalsForPressAndReleaseAction = OnToggleReleased(); // Derived toggle buttons can override this to provide custom behaviour
560 Released(); // Button up will result in unselected state
563 mAutoRepeatingTimer.Reset();
565 emitSignalsForPressAndReleaseAction = true;
568 else if ( TOGGLE_DEPRESSED == mButtonPressedState )
570 emitSignalsForPressAndReleaseAction = true; // toggle released after being pressed, a click
573 if ( emitSignalsForPressAndReleaseAction )
575 // The clicked and released signals should be emitted regardless of toggle mode.
576 Toolkit::Button handle( GetOwner() );
577 mReleasedSignal.Emit( handle );
578 mClickedSignal.Emit( handle );
582 bool Button::OnToggleReleased()
584 SetSelected( !IsSelected() );
585 mButtonPressedState = UNPRESSED;
590 void Button::OnTouchPointLeave()
592 if( DEPRESSED == mButtonPressedState )
594 if( !mTogglableButton )
600 mAutoRepeatingTimer.Reset();
604 mButtonPressedState = UNPRESSED;
606 // The released signal should be emitted regardless of toggle mode.
607 Toolkit::Button handle( GetOwner() );
608 mReleasedSignal.Emit( handle );
612 void Button::OnTouchPointInterrupted()
617 Toolkit::Button::ButtonSignalType& Button::PressedSignal()
619 return mPressedSignal;
622 Toolkit::Button::ButtonSignalType& Button::ReleasedSignal()
624 return mReleasedSignal;
627 Toolkit::Button::ButtonSignalType& Button::ClickedSignal()
629 return mClickedSignal;
632 Toolkit::Button::ButtonSignalType& Button::StateChangedSignal()
634 return mStateChangedSignal;
637 bool Button::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
639 Dali::BaseHandle handle( object );
641 bool connected( true );
642 Toolkit::Button button = Toolkit::Button::DownCast( handle );
644 if( 0 == strcmp( signalName.c_str(), SIGNAL_PRESSED ) )
646 button.PressedSignal().Connect( tracker, functor );
648 else if( 0 == strcmp( signalName.c_str(), SIGNAL_RELEASED ) )
650 button.ReleasedSignal().Connect( tracker, functor );
652 else if( 0 == strcmp( signalName.c_str(), SIGNAL_CLICKED ) )
654 button.ClickedSignal().Connect( tracker, functor );
656 else if( 0 == strcmp( signalName.c_str(), SIGNAL_STATE_CHANGED ) )
658 button.StateChangedSignal().Connect( tracker, functor );
662 // signalName does not match any signal
669 void Button::OnInitialize()
671 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::OnInitialize\n" );
675 mTapDetector = TapGestureDetector::New();
676 mTapDetector.Attach( self );
677 mTapDetector.DetectedSignal().Connect(this, &Button::OnTap);
679 self.SetKeyboardFocusable( true );
681 self.TouchSignal().Connect( this, &Button::OnTouch );
684 bool Button::OnAccessibilityActivated()
686 return OnKeyboardEnter();
689 bool Button::OnTouch( Actor actor, const TouchData& touch )
692 // Only events are processed when the button is not disabled and the touch event has only
695 if( !IsDisabled() && ( 1 == touch.GetPointCount() ) )
697 switch( touch.GetState( 0 ) )
699 case PointState::DOWN:
709 case PointState::INTERRUPTED:
711 OnTouchPointInterrupted();
714 case PointState::LEAVE:
719 case PointState::MOTION:
720 case PointState::STATIONARY: // FALLTHROUGH
727 else if( 1 < touch.GetPointCount() )
729 OnTouchPointLeave(); // Notification for derived classes.
731 // Sets the button state to the default
732 mButtonPressedState = UNPRESSED;
738 bool Button::OnKeyboardEnter()
740 // When the enter key is pressed, or button is activated, the click action is performed.
741 Property::Map attributes;
742 bool ret = DoClickAction( attributes );
747 void Button::OnStageDisconnection()
749 if( DEPRESSED == mButtonPressedState )
751 if( !mTogglableButton )
757 mAutoRepeatingTimer.Reset();
762 mButtonPressedState = UNPRESSED;
764 Control::OnStageDisconnection(); // Visuals will be set off stage
767 void Button::OnStageConnection( int depth )
769 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::OnStageConnection ptr(%p) \n", this );
770 PerformFunctionOnVisualsInState( &Button::OnButtonVisualRemoval, mPreviousButtonState );
771 SelectRequiredVisual( Toolkit::Button::Property::LABEL );
772 PerformFunctionOnVisualsInState( &Button::SelectRequiredVisual, mButtonState );
773 Control::OnStageConnection( depth ); // Enabled visuals will be put on stage
776 Vector3 Button::GetNaturalSize()
778 Vector3 size = Vector3::ZERO;
780 bool horizontalAlignment = mTextLabelAlignment == BEGIN || mTextLabelAlignment == END; // label and visual side by side
782 // Get natural size of foreground ( largest of the possible visuals )
783 Size largestProvidedVisual;
784 Size labelSize = Size::ZERO;
786 bool foreGroundVisualUsed = false;
788 for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++ )
790 Toolkit::Visual::Base visual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[state][FOREGROUND] );
794 visual.GetNaturalSize( visualSize );
795 largestProvidedVisual.width = std::max(largestProvidedVisual.width, visualSize.width );
796 largestProvidedVisual.height = std::max(largestProvidedVisual.height, visualSize.height );
797 foreGroundVisualUsed = true;
801 if ( !foreGroundVisualUsed ) // If foreground visual not supplied then use the background visual to calculate Natural size
803 for ( int state = Button::UNSELECTED_STATE; state < Button::STATE_COUNT; state++ )
805 Toolkit::Visual::Base visual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[state][BACKGROUND] );
809 visual.GetNaturalSize( visualSize );
810 largestProvidedVisual.width = std::max(largestProvidedVisual.width, visualSize.width );
811 largestProvidedVisual.height = std::max(largestProvidedVisual.height, visualSize.height );
816 // Get horizontal padding total
817 if ( largestProvidedVisual.width > 0 ) // if visual exists
819 size.width += largestProvidedVisual.width + mForegroundPadding.left + mForegroundPadding.right;
821 // Get vertical padding total
822 if ( largestProvidedVisual.height > 0 )
824 size.height += largestProvidedVisual.height + mForegroundPadding.top + mForegroundPadding.bottom;
827 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize visual Size(%f,%f)\n",
828 largestProvidedVisual.width, largestProvidedVisual.height );
830 // Get natural size of label if text has been set
831 if ( mTextStringSetFlag )
833 Toolkit::Visual::Base visual = GetVisual( Toolkit::Button::Property::LABEL );
837 visual.GetNaturalSize( labelSize );
839 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize labelSize(%f,%f) padding(%f,%f)\n",
840 labelSize.width, labelSize.height, mLabelPadding.left + mLabelPadding.right, mLabelPadding.top + mLabelPadding.bottom);
842 labelSize.width += mLabelPadding.left + mLabelPadding.right;
843 labelSize.height += mLabelPadding.top + mLabelPadding.bottom;
845 // Add label size to height or width depending on alignment position
846 if ( horizontalAlignment )
848 size.width += labelSize.width;
849 size.height = std::max(size.height, labelSize.height );
853 size.height += labelSize.height;
854 size.width = std::max(size.width, labelSize.width );
859 if( size.width < 1 && size.height < 1 )
861 // if no image or label then use Control's natural size
862 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "GetNaturalSize Using control natural size\n");
863 size = Control::GetNaturalSize();
866 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "Button GetNaturalSize (%f,%f)\n", size.width, size.height );
871 void Button::OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension )
873 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnSetResizePolicy\n");
878 * Visuals are sized and positioned in this function.
879 * Whilst the control has it's size negotiated it has to size it's visuals explicitly here.
882 void Button::OnRelayout( const Vector2& size, RelayoutContainer& container )
884 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout targetSize(%f,%f) ptr(%p) state[%d]\n", size.width, size.height, this, mButtonState );
886 Toolkit::Visual::Base currentVisual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[mButtonState][FOREGROUND] );
888 Toolkit::Visual::Base currentBackGroundVisual = GetVisual( GET_VISUAL_INDEX_FOR_STATE[mButtonState][BACKGROUND] );
890 // Sizes and padding set to zero, if not present then values will no effect calculations.
891 Vector2 visualPosition = Vector2::ZERO;
892 Vector2 labelPosition = Vector2::ZERO;
893 Size visualSize = Size::ZERO;
894 Padding foregroundVisualPadding = Padding(0.0f, 0.0f, 0.0f, 0.0f );
895 Padding labelVisualPadding = Padding(0.0f, 0.0f, 0.0f, 0.0f );
897 if ( mTextStringSetFlag )
899 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Label padding setting padding:%f,%f,%f,%f\n", mLabelPadding.y, mLabelPadding.x, mLabelPadding.width,mLabelPadding.height );
900 labelVisualPadding = mLabelPadding;
905 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Foreground Visual setting padding:%f,%f,%f,%f\n", mForegroundPadding.y, mForegroundPadding.x, mForegroundPadding.width,mForegroundPadding.height );
906 currentVisual.GetNaturalSize( visualSize );
907 foregroundVisualPadding = mForegroundPadding;
910 Toolkit::Align::Type visualAnchorPoint = Toolkit::Align::TOP_BEGIN;
912 Vector2 visualAndPaddingSize = Vector2( ( foregroundVisualPadding.x + visualSize.width + foregroundVisualPadding.y ),
913 ( foregroundVisualPadding.width + visualSize.height + foregroundVisualPadding.height ));
915 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout visualAndPaddingSize(%f,%f)\n", visualAndPaddingSize.width, visualAndPaddingSize.height);
917 // Text Visual should take all space available after foreground visual size and all padding is considered.
918 // Remaining Space priority, Foreground padding, foreground visual, Text padding then Text visual.
919 Size remainingSpaceForText = Size::ZERO;
921 switch ( mTextLabelAlignment )
925 visualAnchorPoint = Toolkit::Align::TOP_END;
926 visualPosition.x = foregroundVisualPadding.right;
927 visualPosition.y = foregroundVisualPadding.top;
929 labelPosition.x = labelVisualPadding.x;
930 labelPosition.y = labelVisualPadding.top;
932 remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y;
933 remainingSpaceForText.height = size.height - labelVisualPadding.top - labelVisualPadding.bottom;
938 visualAnchorPoint = Toolkit::Align::TOP_BEGIN;
939 visualPosition.x = foregroundVisualPadding.left;
940 visualPosition.y = foregroundVisualPadding.top;
942 labelPosition.x = visualAndPaddingSize.width + labelVisualPadding.x;
943 labelPosition.y = labelVisualPadding.top;
945 remainingSpaceForText.width = size.width - visualAndPaddingSize.width - labelVisualPadding.x - labelVisualPadding.y;
946 remainingSpaceForText.height = size.height - labelVisualPadding.top - labelVisualPadding.bottom;
951 visualAnchorPoint = Toolkit::Align::BOTTOM_END;
952 visualPosition.x = foregroundVisualPadding.left;
953 visualPosition.y = foregroundVisualPadding.bottom;
955 labelPosition.x = labelVisualPadding.left;
956 labelPosition.y = labelVisualPadding.top;
958 remainingSpaceForText.width = size.width - labelVisualPadding.x - labelVisualPadding.y;
959 remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.top - labelVisualPadding.bottom;
965 visualAnchorPoint = Toolkit::Align::TOP_END;
966 visualPosition.x = foregroundVisualPadding.left;
967 visualPosition.y = foregroundVisualPadding.top;
969 labelPosition.x = labelVisualPadding.left;
970 labelPosition.y = visualAndPaddingSize.height + labelVisualPadding.top;
972 remainingSpaceForText.width = size.width - labelVisualPadding.x - labelVisualPadding.y;
973 remainingSpaceForText.height = size.height - visualAndPaddingSize.height - labelVisualPadding.top - labelVisualPadding.bottom;
979 if ( currentBackGroundVisual )
981 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual background size to(%f,%f)\n", size.width, size.height);
983 Property::Map visualTransform;
985 visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, size )
986 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 0.0f, 0.0f, 1.0f, 1.0f) ); // Use relative size
988 currentBackGroundVisual.SetTransformAndSize( visualTransform, size );
993 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Setting visual size to(%f,%f)\n", visualSize.width, visualSize.height);
995 Property::Map visualTransform;
997 visualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, visualSize )
998 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, visualPosition )
999 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f, 1.0f) ) // Use absolute size
1000 .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
1001 .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, visualAnchorPoint );
1003 currentVisual.SetTransformAndSize( visualTransform, size );
1006 if ( mTextStringSetFlag )
1008 Toolkit::Visual::Base textVisual = GetVisual( Toolkit::Button::Property::LABEL ); // No need to search for Label visual if no text set.
1012 if ( !currentVisual )
1014 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout Only Text\n");
1015 labelPosition.x = labelVisualPadding.left;
1016 labelPosition.y = labelVisualPadding.height;
1019 Vector2 preSize = Vector2( static_cast< int >( remainingSpaceForText.x ), static_cast< int >( remainingSpaceForText.y ));
1021 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size(%f,%f) text Position(%f,%f) \n", remainingSpaceForText.width, remainingSpaceForText.height, labelPosition.x, labelPosition.y);
1023 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout text Size -- (%f,%f) text Position(%f,%f) \n", preSize.width, preSize.height, labelPosition.x, labelPosition.y);
1026 Property::Map textVisualTransform;
1027 textVisualTransform.Add( Toolkit::DevelVisual::Transform::Property::SIZE, preSize )
1028 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET, labelPosition )
1029 .Add( Toolkit::DevelVisual::Transform::Property::OFFSET_SIZE_MODE, Vector4( 1.0f, 1.0f, 1.0f,1.0f ) ) // Use absolute size
1030 .Add( Toolkit::DevelVisual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN )
1031 .Add( Toolkit::DevelVisual::Transform::Property::ANCHOR_POINT, visualAnchorPoint );
1033 textVisual.SetTransformAndSize( textVisualTransform, size );
1037 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout selected (%s) \n", IsSelected()?"yes":"no" );
1039 DALI_LOG_INFO( gLogButtonFilter, Debug::General, "OnRelayout << \n");
1042 void Button::OnTap(Actor actor, const TapGesture& tap)
1044 // Prevents Parent getting a tap event
1047 void Button::SetUpTimer( float delay )
1049 mAutoRepeatingTimer = Dali::Timer::New( static_cast<unsigned int>( 1000.f * delay ) );
1050 mAutoRepeatingTimer.TickSignal().Connect( this, &Button::AutoRepeatingSlot );
1051 mAutoRepeatingTimer.Start();
1054 bool Button::AutoRepeatingSlot()
1056 bool consumed = false;
1059 // Restart the autorepeat timer.
1060 SetUpTimer( mNextAutoRepeatingDelay );
1064 Toolkit::Button handle( GetOwner() );
1067 consumed = mReleasedSignal.Emit( handle );
1068 consumed = mClickedSignal.Emit( handle );
1069 consumed |= mPressedSignal.Emit( handle );
1075 void Button::Pressed()
1077 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::Pressed\n" );
1079 if( mButtonState == UNSELECTED_STATE )
1081 ChangeState( SELECTED_STATE );
1082 OnPressed(); // Notifies the derived class the button has been pressed.
1086 void Button::Released()
1088 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::Released\n" );
1090 if( mButtonState == SELECTED_STATE && !mTogglableButton )
1092 ChangeState( UNSELECTED_STATE );
1093 OnReleased(); // // Notifies the derived class the button has been released.
1095 mButtonPressedState = UNPRESSED;
1098 void Button::SelectRequiredVisual( Property::Index visualIndex )
1100 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SelectRequiredVisual index(%d) state(%d)\n", visualIndex, mButtonState );
1102 EnableVisual( visualIndex, true );
1105 void Button::RemoveVisual( Property::Index visualIndex )
1107 // Use OnButtonVisualRemoval if want button developer to have the option to override removal.
1108 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::RemoveVisual index(%d) state(%d)\n", visualIndex, mButtonState );
1110 Toolkit::Visual::Base visual = GetVisual( visualIndex );
1114 EnableVisual( visualIndex, false );
1118 void Button::OnButtonVisualRemoval( Property::Index visualIndex )
1120 // Derived Buttons can over ride this to prevent default removal.
1121 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::OnButtonVisualRemoval index(%d)\n", visualIndex );
1122 RemoveVisual( visualIndex );
1125 void Button::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
1127 Toolkit::Button button = Toolkit::Button::DownCast( Dali::BaseHandle( object ) );
1129 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SetProperty index[%d]\n", index );
1135 case Toolkit::Button::Property::DISABLED:
1137 GetImplementation( button ).SetDisabled( value.Get< bool >() );
1141 case Toolkit::Button::Property::AUTO_REPEATING:
1143 GetImplementation( button ).SetAutoRepeating( value.Get< bool >() );
1147 case Toolkit::Button::Property::INITIAL_AUTO_REPEATING_DELAY:
1149 GetImplementation( button ).SetInitialAutoRepeatingDelay( value.Get< float >() );
1153 case Toolkit::Button::Property::NEXT_AUTO_REPEATING_DELAY:
1155 GetImplementation( button ).SetNextAutoRepeatingDelay( value.Get< float >() );
1159 case Toolkit::Button::Property::TOGGLABLE:
1161 GetImplementation( button ).SetTogglableButton( value.Get< bool >() );
1165 case Toolkit::Button::Property::SELECTED:
1167 GetImplementation( button ).SetSelected( value.Get< bool >() );
1171 case Toolkit::Button::Property::UNSELECTED_STATE_IMAGE: // Legacy Tizen 3.0
1173 GetImplementation( button ).CreateVisualsForComponent( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, value, DepthIndex::BACKGROUND );
1176 case Toolkit::Button::Property::DISABLED_STATE_IMAGE: // Legacy Tizen 3.0
1178 GetImplementation( button ).CreateVisualsForComponent( Toolkit::DevelButton::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL, value, DepthIndex::BACKGROUND );
1181 case Toolkit::Button::Property::SELECTED_STATE_IMAGE: // Legacy Tizen 3.0
1183 GetImplementation( button ).CreateVisualsForComponent( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, value, DepthIndex::BACKGROUND );
1186 case Toolkit::DevelButton::Property::UNSELECTED_VISUAL:
1187 case Toolkit::DevelButton::Property::SELECTED_VISUAL:
1188 case Toolkit::DevelButton::Property::DISABLED_SELECTED_VISUAL:
1189 case Toolkit::DevelButton::Property::DISABLED_UNSELECTED_VISUAL:
1191 GetImplementation( button ).CreateVisualsForComponent( index, value, DepthIndex::CONTENT );
1195 case Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL:
1196 case Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL:
1197 case Toolkit::DevelButton::Property::DISABLED_SELECTED_BACKGROUND_VISUAL:
1198 case Toolkit::DevelButton::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL:
1200 GetImplementation( button ).CreateVisualsForComponent( index , value, DepthIndex::BACKGROUND);
1204 case Toolkit::Button::Property::UNSELECTED_COLOR:
1206 DALI_LOG_WARNING("[%s] Using deprecated Property Button::Property::UNSELECTED_COLOR instead use Button::Property::UNSELECTED_BACKGROUND_VISUAL\n", __FUNCTION__);
1207 GetImplementation( button ).SetColor( value.Get< Vector4 >(), Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL );
1211 case Toolkit::Button::Property::SELECTED_COLOR:
1213 DALI_LOG_WARNING("[%s] Using deprecated Property Button::Property::SELECTED_COLOR instead use Button::Property::SELECTED_BACKGROUND_VISUAL\n", __FUNCTION__);
1214 GetImplementation( button ).SetColor( value.Get< Vector4 >(), Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL );
1218 case Toolkit::Button::Property::LABEL_TEXT:
1220 DALI_LOG_WARNING("[%s] Using deprecated Property Button::Property::LABEL_TEXT instead use Button::Property::LABEL\n", __FUNCTION__);
1221 GetImplementation( button ).SetLabelText(value.Get< std::string >() );
1225 case Toolkit::Button::Property::LABEL:
1227 // Get a Property::Map from the property if possible.
1228 Property::Map* setPropertyMap = value.GetMap();
1229 if( setPropertyMap )
1231 Property::Map textVisualProperties;
1232 GetImplementation( button ).MergeLabelProperties( *setPropertyMap, textVisualProperties );
1233 GetImplementation( button ).CreateVisualsForComponent( index, textVisualProperties, DepthIndex::CONTENT );
1234 GetImplementation( button ).RelayoutRequest();
1239 case Toolkit::DevelButton::Property::LABEL_RELATIVE_ALIGNMENT:
1241 Button::Align labelAlignment(END);
1242 Scripting::GetEnumeration< Button::Align> ( value.Get< std::string >().c_str(),
1243 ALIGNMENT_TABLE, ALIGNMENT_TABLE_COUNT,
1246 GetImplementation( button ).SetLabelAlignment( labelAlignment );
1247 GetImplementation( button ).RelayoutRequest();
1251 case Toolkit::DevelButton::Property::LABEL_PADDING:
1253 Vector4 padding ( value.Get< Vector4 >() );
1254 GetImplementation( button ).SetLabelPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
1258 case Toolkit::DevelButton::Property::VISUAL_PADDING:
1260 Vector4 padding ( value.Get< Vector4 >() );
1261 GetImplementation( button ).SetForegroundPadding( Padding( padding.x, padding.y, padding.z, padding.w ) );
1262 GetImplementation( button ).RelayoutRequest();
1269 Property::Value Button::GetProperty( BaseObject* object, Property::Index propertyIndex )
1271 Property::Value value;
1273 Toolkit::Button button = Toolkit::Button::DownCast( Dali::BaseHandle( object ) );
1277 switch ( propertyIndex )
1279 case Toolkit::Button::Property::DISABLED:
1281 value = GetImplementation( button ).IsDisabled();
1285 case Toolkit::Button::Property::AUTO_REPEATING:
1287 value = GetImplementation( button ).mAutoRepeating;
1291 case Toolkit::Button::Property::INITIAL_AUTO_REPEATING_DELAY:
1293 value = GetImplementation( button ).mInitialAutoRepeatingDelay;
1297 case Toolkit::Button::Property::NEXT_AUTO_REPEATING_DELAY:
1299 value = GetImplementation( button ).mNextAutoRepeatingDelay;
1303 case Toolkit::Button::Property::TOGGLABLE:
1305 value = GetImplementation( button ).mTogglableButton;
1309 case Toolkit::Button::Property::SELECTED:
1311 value = GetImplementation( button ).IsSelected();
1315 case Toolkit::Button::Property::UNSELECTED_STATE_IMAGE:
1317 value = GetImplementation( button ).GetUrlForImageVisual( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL );
1321 case Toolkit::Button::Property::SELECTED_STATE_IMAGE:
1323 value = GetImplementation( button ).GetUrlForImageVisual( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL );
1327 case Toolkit::Button::Property::DISABLED_STATE_IMAGE:
1329 value = GetImplementation( button ).GetUrlForImageVisual( Toolkit::DevelButton::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL );
1333 case Toolkit::DevelButton::Property::UNSELECTED_VISUAL:
1334 case Toolkit::DevelButton::Property::SELECTED_VISUAL:
1335 case Toolkit::DevelButton::Property::DISABLED_SELECTED_VISUAL:
1336 case Toolkit::DevelButton::Property::DISABLED_UNSELECTED_VISUAL:
1337 case Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL:
1338 case Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL:
1339 case Toolkit::DevelButton::Property::DISABLED_SELECTED_BACKGROUND_VISUAL:
1340 case Toolkit::DevelButton::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL:
1341 case Toolkit::Button::Property::LABEL:
1343 Property::Map visualProperty;
1344 if ( GetImplementation( button ).GetPropertyMapForVisual( propertyIndex, visualProperty ) )
1346 value = visualProperty;
1351 case Toolkit::Button::Property::UNSELECTED_COLOR:
1353 value = GetImplementation( button ).GetUnselectedColor();
1357 case Toolkit::Button::Property::SELECTED_COLOR:
1359 value = GetImplementation( button ).GetSelectedColor();
1363 case Toolkit::Button::Property::LABEL_TEXT:
1365 value = GetImplementation( button ).GetLabelText();
1369 case Toolkit::DevelButton::Property::LABEL_RELATIVE_ALIGNMENT:
1371 const char* alignment = Scripting::GetEnumerationName< Button::Align >( GetImplementation( button ).GetLabelAlignment(),
1372 ALIGNMENT_STRING_TABLE,
1373 ALIGNMENT_STRING_TABLE_COUNT );
1376 value = std::string( alignment );
1382 case Toolkit::DevelButton::Property::LABEL_PADDING:
1384 Padding padding = GetImplementation( button ).GetLabelPadding();
1385 value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
1389 case Toolkit::DevelButton::Property::VISUAL_PADDING:
1391 Padding padding = GetImplementation( button ).GetForegroundPadding();
1392 value = Vector4( padding.x, padding.y, padding.top, padding.bottom);
1400 void Button::SetLabelPadding( const Padding& padding)
1402 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SetLabelPadding padding(%f,%f,%f,%f)\n", padding.left, padding.right, padding.bottom, padding.top );
1403 mLabelPadding = Padding( padding.left, padding.right, padding.bottom, padding.top );
1407 Padding Button::GetLabelPadding()
1409 return mLabelPadding;
1412 void Button::SetForegroundPadding( const Padding& padding)
1414 DALI_LOG_INFO( gLogButtonFilter, Debug::Verbose, "Button::SetForegroundPadding padding(%f,%f,%f,%f)\n", padding.left, padding.right, padding.bottom, padding.top );
1415 mForegroundPadding = Padding( padding.left, padding.right, padding.bottom, padding.top );
1419 Padding Button::GetForegroundPadding()
1421 return mForegroundPadding;
1424 ////////////////////////////////////////////////////////////////////////
1425 // Legacy functions from Tizen 2.4 and 3.0
1427 // Legacy code needed whilst Color can be set by direct Property setting ( deprecated ) instead of setting a Visual
1428 void Button::SetColor( const Vector4& color, Property::Index visualIndex )
1430 if ( visualIndex == Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL )
1432 mSelectedColor = color;
1436 mUnselectedColor = color;
1440 map[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::COLOR;
1441 map[ Toolkit::ColorVisual::Property::MIX_COLOR ] = color;
1443 CreateVisualsForComponent( visualIndex, map, DepthIndex::BACKGROUND );
1446 const Vector4 Button::GetUnselectedColor() const
1448 return mUnselectedColor;
1451 const Vector4 Button::GetSelectedColor() const
1453 return mSelectedColor;
1456 void Button::SetAnimationTime( float animationTime )
1458 // Used by deprecated API
1459 mAnimationTime = animationTime;
1462 float Button::GetAnimationTime() const
1464 // Used by deprecated API
1465 return mAnimationTime;
1468 void Button::SetLabel( Actor label )
1472 Property::Value value ="";
1473 value = label.GetProperty(Toolkit::TextLabel::Property::TEXT);
1475 SetLabelText( value.Get<std::string>() );
1479 void Button::SetUnselectedImage( const std::string& filename )
1481 SetBackgroundImage( filename );
1484 void Button::SetBackgroundImage( const std::string& filename )
1486 if( !filename.empty() )
1488 CreateVisualsForComponent( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, filename, DepthIndex::BACKGROUND );
1492 UnregisterVisual( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL );
1496 void Button::SetSelectedImage( const std::string& filename )
1498 SetSelectedBackgroundImage( filename );
1501 void Button::SetSelectedBackgroundImage( const std::string& filename )
1503 if( !filename.empty() )
1505 CreateVisualsForComponent( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL, filename, DepthIndex::BACKGROUND );
1509 UnregisterVisual( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL );
1513 void Button::SetDisabledBackgroundImage( const std::string& filename )
1515 if( !filename.empty() )
1517 CreateVisualsForComponent( Toolkit::DevelButton::Property::DISABLED_UNSELECTED_BACKGROUND_VISUAL, filename, DepthIndex::BACKGROUND );
1521 void Button::SetDisabledImage( const std::string& filename )
1523 if( !filename.empty() )
1525 CreateVisualsForComponent( Toolkit::DevelButton::Property::DISABLED_UNSELECTED_VISUAL, filename, DepthIndex::CONTENT );
1529 void Button::SetDisabledSelectedImage( const std::string& filename )
1531 if( !filename.empty() )
1533 CreateVisualsForComponent( Toolkit::DevelButton::Property::DISABLED_SELECTED_VISUAL, filename, DepthIndex::CONTENT );
1537 // Used by Deprecated Properties which don't use the Visual Property maps for setting and getting
1538 std::string Button::GetUrlForImageVisual( const Property::Index index ) const
1540 Toolkit::Visual::Base visual = GetVisual( index );
1545 Dali::Property::Map retreivedMap;
1546 visual.CreatePropertyMap( retreivedMap );
1547 Property::Value* value = retreivedMap.Find( Toolkit::ImageVisual::Property::URL, Property::STRING );
1550 result = value->Get<std::string>();
1557 // Below functions DEPRECATED_1_0.50 - Return empty Actors
1561 std::string GetUrlFromImage( Image& image )
1563 ResourceImage resourceImage = ResourceImage::DownCast( image );
1565 std::string imageUrl;
1567 if ( resourceImage )
1569 imageUrl = resourceImage.GetUrl();
1577 void Button::SetButtonImage( Image image )
1579 DALI_LOG_WARNING("Button::SetButtonImage @DEPRECATED_1_0.50\n");
1580 SetUnselectedImage( GetUrlFromImage( image ) );
1583 void Button::SetSelectedImage( Image image )
1585 DALI_LOG_WARNING("Button::SetSelectedImage @DEPRECATED_1_0.50\n");
1586 SetSelectedImage( GetUrlFromImage( image ) );
1589 Actor Button::GetButtonImage() const
1591 DALI_LOG_WARNING("Button::GetButtonImage @DEPRECATED_1_0.50\n");
1592 Actor imageView = Toolkit::ImageView::New( GetUrlForImageVisual( Toolkit::DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL ) );
1597 Actor Button::GetSelectedImage() const
1599 DALI_LOG_WARNING("Button::GetSelectedImage @DEPRECATED_1_0.50\n");
1600 Actor imageView = Toolkit::ImageView::New( GetUrlForImageVisual( Toolkit::DevelButton::Property::SELECTED_BACKGROUND_VISUAL ) );
1605 } // namespace Internal
1607 } // namespace Toolkit