2 * Copyright (c) 2014 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.
20 #include "push-button-impl.h"
28 #include "push-button-default-painter-impl.h"
30 #include <dali-toolkit/public-api/controls/text-view/text-view.h>
38 const Property::Index PushButton::PROPERTY_AUTO_REPEATING = Internal::Button::BUTTON_PROPERTY_END_INDEX + 1;
39 const Property::Index PushButton::PROPERTY_INITIAL_AUTO_REPEATING_DELAY = Internal::Button::BUTTON_PROPERTY_END_INDEX + 2;
40 const Property::Index PushButton::PROPERTY_NEXT_AUTO_REPEATING_DELAY = Internal::Button::BUTTON_PROPERTY_END_INDEX + 3;
41 const Property::Index PushButton::PROPERTY_TOGGLABLE = Internal::Button::BUTTON_PROPERTY_END_INDEX + 4;
42 const Property::Index PushButton::PROPERTY_TOGGLE = Internal::Button::BUTTON_PROPERTY_END_INDEX + 5;
43 const Property::Index PushButton::PROPERTY_NORMAL_STATE_ACTOR = Internal::Button::BUTTON_PROPERTY_END_INDEX + 6;
44 const Property::Index PushButton::PROPERTY_PRESSED_STATE_ACTOR = Internal::Button::BUTTON_PROPERTY_END_INDEX + 7;
45 const Property::Index PushButton::PROPERTY_DIMMED_STATE_ACTOR = Internal::Button::BUTTON_PROPERTY_END_INDEX + 8;
46 const Property::Index PushButton::PROPERTY_LABEL_ACTOR = Internal::Button::BUTTON_PROPERTY_END_INDEX + 9;
56 return Toolkit::PushButton::New();
59 TypeRegistration typeRegistration( typeid(Toolkit::PushButton), typeid(Toolkit::Button), Create );
61 SignalConnectorType signalConnector1( typeRegistration, Toolkit::PushButton::SIGNAL_TOGGLED , &PushButton::DoConnectSignal );
62 SignalConnectorType signalConnector2( typeRegistration, Toolkit::PushButton::SIGNAL_PRESSED , &PushButton::DoConnectSignal );
63 SignalConnectorType signalConnector3( typeRegistration, Toolkit::PushButton::SIGNAL_RELEASED, &PushButton::DoConnectSignal );
65 TypeAction action1( typeRegistration, Toolkit::PushButton::ACTION_PUSH_BUTTON_CLICK, &PushButton::DoAction );
67 PropertyRegistration property1( typeRegistration, "auto-repeating", Toolkit::PushButton::PROPERTY_AUTO_REPEATING, Property::BOOLEAN, &PushButton::SetProperty, &PushButton::GetProperty );
68 PropertyRegistration property2( typeRegistration, "initial-auto-repeating-delay", Toolkit::PushButton::PROPERTY_INITIAL_AUTO_REPEATING_DELAY, Property::FLOAT, &PushButton::SetProperty, &PushButton::GetProperty );
69 PropertyRegistration property3( typeRegistration, "next-auto-repeating-delay", Toolkit::PushButton::PROPERTY_NEXT_AUTO_REPEATING_DELAY, Property::FLOAT, &PushButton::SetProperty, &PushButton::GetProperty );
70 PropertyRegistration property4( typeRegistration, "togglable", Toolkit::PushButton::PROPERTY_TOGGLABLE, Property::BOOLEAN, &PushButton::SetProperty, &PushButton::GetProperty );
71 PropertyRegistration property5( typeRegistration, "toggle", Toolkit::PushButton::PROPERTY_TOGGLE, Property::BOOLEAN, &PushButton::SetProperty, &PushButton::GetProperty );
72 PropertyRegistration property6( typeRegistration, "normal-state-actor", Toolkit::PushButton::PROPERTY_NORMAL_STATE_ACTOR, Property::MAP, &PushButton::SetProperty, &PushButton::GetProperty );
73 PropertyRegistration property7( typeRegistration, "pressed-state-actor", Toolkit::PushButton::PROPERTY_PRESSED_STATE_ACTOR, Property::MAP, &PushButton::SetProperty, &PushButton::GetProperty );
74 PropertyRegistration property8( typeRegistration, "dimmed-state-actor", Toolkit::PushButton::PROPERTY_DIMMED_STATE_ACTOR, Property::MAP, &PushButton::SetProperty, &PushButton::GetProperty );
75 PropertyRegistration property9( typeRegistration, "label-actor", Toolkit::PushButton::PROPERTY_LABEL_ACTOR, Property::MAP, &PushButton::SetProperty, &PushButton::GetProperty );
77 } // unnamed namespace
82 const unsigned int INITIAL_AUTOREPEATING_DELAY( 0.15f );
83 const unsigned int NEXT_AUTOREPEATING_DELAY( 0.05f );
85 // Helper function used to cast a ButtonPainter to PushButtonDefaultPainter
86 PushButtonDefaultPainterPtr GetPushButtonPainter( Dali::Toolkit::Internal::ButtonPainterPtr painter )
88 return static_cast<PushButtonDefaultPainter*>( painter.Get() );
91 } // unnamed namespace
93 Dali::Toolkit::PushButton PushButton::New()
95 // Create the implementation, temporarily owned on stack
96 IntrusivePtr< PushButton > internalPushButton = new PushButton();
98 // Pass ownership to CustomActor
99 Dali::Toolkit::PushButton pushButton( *internalPushButton );
101 // Second-phase init of the implementation
102 // This can only be done after the CustomActor connection has been made...
103 internalPushButton->Initialize();
108 void PushButton::SetAutoRepeating( bool autoRepeating )
110 mAutoRepeating = autoRepeating;
112 // An autorepeating button can't be a toggle button.
115 mToggleButton = false;
118 // Emit a signal is not wanted, only change the appearance.
119 Toolkit::PushButton handle( GetOwner() );
120 GetPushButtonPainter( mPainter )->Toggled( handle );
125 // Notifies the painter.
126 GetPushButtonPainter( mPainter )->SetAutoRepeating( mAutoRepeating );
129 bool PushButton::IsAutoRepeating() const
131 return mAutoRepeating;
134 void PushButton::SetInitialAutoRepeatingDelay( float initialAutoRepeatingDelay )
136 DALI_ASSERT_ALWAYS( initialAutoRepeatingDelay > 0.f );
137 mInitialAutoRepeatingDelay = initialAutoRepeatingDelay;
140 float PushButton::GetInitialAutoRepeatingDelay() const
142 return mInitialAutoRepeatingDelay;
145 void PushButton::SetNextAutoRepeatingDelay( float nextAutoRepeatingDelay )
147 DALI_ASSERT_ALWAYS( nextAutoRepeatingDelay > 0.f );
148 mNextAutoRepeatingDelay = nextAutoRepeatingDelay;
151 float PushButton::GetNextAutoRepeatingDelay() const
153 return mNextAutoRepeatingDelay;
156 void PushButton::SetToggleButton( bool toggle )
158 mToggleButton = toggle;
160 // A toggle button can't be an autorepeating button.
163 mAutoRepeating = false;
165 // Notifies the painter.
166 GetPushButtonPainter( mPainter )->SetAutoRepeating( mAutoRepeating );
170 bool PushButton::IsToggleButton() const
172 return mToggleButton;
175 void PushButton::SetToggled( bool toggle )
177 if( !mDimmed && mToggleButton && ( toggle != mToggled ) )
181 Toolkit::PushButton handle( GetOwner() );
183 // Notifies the painter the button has been toggled.
184 GetPushButtonPainter( mPainter )->Toggled( handle );
187 mToggledSignalV2.Emit( handle, mToggled );
191 bool PushButton::IsToggled() const
193 return mToggleButton && mToggled;
196 void PushButton::SetButtonImage( Image image )
198 SetButtonImage( ImageActor::New( image ) );
201 void PushButton::SetButtonImage( Actor image )
203 Toolkit::PushButton handle( GetOwner() );
204 GetPushButtonPainter( mPainter )->SetButtonImage( handle, image );
207 Actor& PushButton::GetButtonImage()
212 Actor PushButton::GetButtonImage() const
217 void PushButton::SetBackgroundImage( Image image )
219 SetBackgroundImage( ImageActor::New( image ) );
222 void PushButton::SetBackgroundImage( Actor image )
224 Toolkit::PushButton handle( GetOwner() );
225 GetPushButtonPainter( mPainter )->SetBackgroundImage( handle, image );
228 Actor& PushButton::GetBackgroundImage()
230 return mBackgroundImage;
233 Actor PushButton::GetBackgroundImage() const
235 return mBackgroundImage;
238 void PushButton::SetPressedImage( Image image )
240 SetPressedImage( ImageActor::New( image ) );
243 void PushButton::SetPressedImage( Actor image )
245 Toolkit::PushButton handle( GetOwner() );
246 GetPushButtonPainter( mPainter )->SetPressedImage( handle, image );
249 Actor& PushButton::GetPressedImage()
251 return mPressedImage;
254 Actor PushButton::GetPressedImage() const
256 return mPressedImage;
259 void PushButton::SetDimmedBackgroundImage( Image image )
261 SetDimmedBackgroundImage( ImageActor::New( image ) );
264 void PushButton::SetDimmedBackgroundImage( Actor image )
266 Toolkit::PushButton handle( GetOwner() );
267 GetPushButtonPainter( mPainter )->SetDimmedBackgroundImage( handle, image );
270 Actor& PushButton::GetDimmedBackgroundImage()
272 return mDimmedBackgroundImage;
275 Actor PushButton::GetDimmedBackgroundImage() const
277 return mDimmedBackgroundImage;
280 void PushButton::SetDimmedImage( Image image )
282 SetDimmedImage( ImageActor::New( image ) );
285 void PushButton::SetDimmedImage( Actor image )
287 Toolkit::PushButton handle( GetOwner() );
288 GetPushButtonPainter( mPainter )->SetDimmedImage( handle, image );
291 Actor& PushButton::GetDimmedImage()
296 Actor PushButton::GetDimmedImage() const
301 void PushButton::SetLabelText( const std::string& text )
303 Toolkit::TextView textView ( Toolkit::TextView::New( text ) );
304 textView.SetWidthExceedPolicy( Toolkit::TextView::ShrinkToFit ); // Make sure our text always fits inside the button
305 SetLabelText( textView );
308 void PushButton::SetLabelText( Actor text )
310 Toolkit::PushButton handle( GetOwner() );
311 GetPushButtonPainter( mPainter )->SetLabelText( handle, text );
314 Actor& PushButton::GetLabel()
319 Actor PushButton::GetLabelText() const
324 Actor& PushButton::GetFadeOutBackgroundImage()
326 return mFadeOutBackgroundImage;
329 Actor& PushButton::GetFadeOutButtonImage()
331 return mFadeOutButtonImage;
334 Toolkit::PushButton::ToggledSignalV2& PushButton::ToggledSignal()
336 return mToggledSignalV2;
339 Toolkit::PushButton::PressedSignalV2& PushButton::PressedSignal()
341 return mPressedSignalV2;
344 Toolkit::PushButton::ReleasedSignalV2& PushButton::ReleasedSignal()
346 return mReleasedSignalV2;
349 bool PushButton::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
351 Dali::BaseHandle handle( object );
353 bool connected( true );
354 Toolkit::PushButton button = Toolkit::PushButton::DownCast(handle);
356 if( Toolkit::PushButton::SIGNAL_TOGGLED == signalName )
358 button.ToggledSignal().Connect( tracker, functor );
360 else if( Toolkit::PushButton::SIGNAL_PRESSED == signalName )
362 button.PressedSignal().Connect( tracker, functor );
364 else if( Toolkit::PushButton::SIGNAL_RELEASED == signalName )
366 button.ReleasedSignal().Connect( tracker, functor );
370 // signalName does not match any signal
377 void PushButton::SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
379 Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
383 PushButton& pushButtonImpl( GetImplementation( pushButton ) );
385 switch ( propertyIndex )
387 case Toolkit::PushButton::PROPERTY_AUTO_REPEATING:
389 pushButtonImpl.SetAutoRepeating( value.Get< bool >() );
393 case Toolkit::PushButton::PROPERTY_INITIAL_AUTO_REPEATING_DELAY:
395 pushButtonImpl.SetInitialAutoRepeatingDelay( value.Get< float >() );
399 case Toolkit::PushButton::PROPERTY_NEXT_AUTO_REPEATING_DELAY:
401 pushButtonImpl.SetNextAutoRepeatingDelay( value.Get< float >() );
405 case Toolkit::PushButton::PROPERTY_TOGGLABLE:
407 pushButtonImpl.SetToggleButton( value.Get< bool >() );
411 case Toolkit::PushButton::PROPERTY_TOGGLE:
413 pushButtonImpl.SetToggled( value.Get< bool >() );
417 case Toolkit::PushButton::PROPERTY_NORMAL_STATE_ACTOR:
419 pushButtonImpl.SetButtonImage( Scripting::NewActor( value.Get< Property::Map >() ) );
423 case Toolkit::PushButton::PROPERTY_PRESSED_STATE_ACTOR:
425 pushButtonImpl.SetPressedImage( Scripting::NewActor( value.Get< Property::Map >() ) );
429 case Toolkit::PushButton::PROPERTY_DIMMED_STATE_ACTOR:
431 pushButtonImpl.SetDimmedImage( Scripting::NewActor( value.Get< Property::Map >() ) );
435 case Toolkit::PushButton::PROPERTY_LABEL_ACTOR:
437 pushButtonImpl.SetLabelText( Scripting::NewActor( value.Get< Property::Map >() ) );
444 Property::Value PushButton::GetProperty( BaseObject* object, Property::Index propertyIndex )
446 Property::Value value;
448 Toolkit::PushButton pushButton = Toolkit::PushButton::DownCast( Dali::BaseHandle( object ) );
452 PushButton& pushButtonImpl( GetImplementation( pushButton ) );
454 switch ( propertyIndex )
456 case Toolkit::PushButton::PROPERTY_AUTO_REPEATING:
458 value = pushButtonImpl.mAutoRepeating;
462 case Toolkit::PushButton::PROPERTY_INITIAL_AUTO_REPEATING_DELAY:
464 value = pushButtonImpl.mInitialAutoRepeatingDelay;
468 case Toolkit::PushButton::PROPERTY_NEXT_AUTO_REPEATING_DELAY:
470 value = pushButtonImpl.mNextAutoRepeatingDelay;
474 case Toolkit::PushButton::PROPERTY_TOGGLABLE:
476 value = pushButtonImpl.mToggleButton;
480 case Toolkit::PushButton::PROPERTY_TOGGLE:
482 value = pushButtonImpl.mToggled;
486 case Toolkit::PushButton::PROPERTY_NORMAL_STATE_ACTOR:
489 Scripting::CreatePropertyMap( pushButtonImpl.mButtonImage, map );
494 case Toolkit::PushButton::PROPERTY_PRESSED_STATE_ACTOR:
497 Scripting::CreatePropertyMap( pushButtonImpl.mPressedImage, map );
502 case Toolkit::PushButton::PROPERTY_DIMMED_STATE_ACTOR:
505 Scripting::CreatePropertyMap( pushButtonImpl.mDimmedImage, map );
510 case Toolkit::PushButton::PROPERTY_LABEL_ACTOR:
513 Scripting::CreatePropertyMap( pushButtonImpl.mLabel, map );
523 void PushButton::OnButtonInitialize()
525 // Push button requires the Leave event.
527 root.SetLeaveRequired( true );
530 void PushButton::OnButtonDown()
534 Toolkit::PushButton handle( GetOwner() );
536 // Notifies the painter the button has been pressed.
537 GetPushButtonPainter( mPainter )->Pressed( handle );
541 SetUpTimer( mInitialAutoRepeatingDelay );
545 mPressedSignalV2.Emit( handle );
549 void PushButton::OnButtonUp()
551 if( ButtonDown == mState )
555 mToggled = !mToggled;
557 Toolkit::PushButton handle( GetOwner() );
559 // Notifies the painter the button has been toggled.
560 GetPushButtonPainter( mPainter )->Toggled( handle );
563 mToggledSignalV2.Emit( handle, mToggled );
567 Toolkit::PushButton handle( GetOwner() );
569 // Notifies the painter the button has been clicked.
570 GetPushButtonPainter( mPainter )->Released( handle );
571 GetPushButtonPainter( mPainter )->Clicked( handle );
575 mAutoRepeatingTimer.Reset();
579 mReleasedSignalV2.Emit( handle );
580 mClickedSignalV2.Emit( handle );
585 void PushButton::OnTouchPointLeave()
587 if( ButtonDown == mState )
591 Toolkit::PushButton handle( GetOwner() );
593 // Notifies the painter the button has been released.
594 GetPushButtonPainter( mPainter )->Released( handle );
598 mAutoRepeatingTimer.Reset();
602 mReleasedSignalV2.Emit( handle );
607 void PushButton::OnTouchPointInterrupted()
612 void PushButton::OnAnimationTimeSet( float animationTime )
614 GetPushButtonPainter( mPainter )->SetAnimationTime( animationTime );
617 float PushButton::OnAnimationTimeRequested() const
619 return GetPushButtonPainter( mPainter )->GetAnimationTime();
622 PushButton::PushButton()
624 mAutoRepeating( false ),
625 mInitialAutoRepeatingDelay( INITIAL_AUTOREPEATING_DELAY ),
626 mNextAutoRepeatingDelay( NEXT_AUTOREPEATING_DELAY ),
627 mToggleButton( false ),
628 mAutoRepeatingTimer(),
630 mClickActionPerforming(false)
632 // Creates specific painter.
633 mPainter = PushButtonDefaultPainterPtr( new PushButtonDefaultPainter() );
636 PushButton::~PushButton()
638 if( mAutoRepeatingTimer )
640 mAutoRepeatingTimer.Reset();
646 void PushButton::SetUpTimer( float delay )
648 mAutoRepeatingTimer = Dali::Timer::New( static_cast<unsigned int>( 1000.f * delay ) );
649 mAutoRepeatingTimer.TickSignal().Connect( this, &PushButton::AutoRepeatingSlot );
650 mAutoRepeatingTimer.Start();
653 bool PushButton::AutoRepeatingSlot()
655 bool consumed = false;
658 // Restart the autorepeat timer.
659 SetUpTimer( mNextAutoRepeatingDelay );
661 Toolkit::PushButton handle( GetOwner() );
663 // Notifies the painter the button has been pressed.
664 GetPushButtonPainter( mPainter )->Pressed( handle );
667 consumed = mReleasedSignalV2.Emit( handle );
668 consumed |= mClickedSignalV2.Emit( handle );
669 consumed |= mPressedSignalV2.Emit( handle );
675 void PushButton::OnActivated()
677 // When the button is activated, it performs the click action
678 std::vector<Property::Value> attributes;
679 DoClickAction(attributes);
682 void PushButton::DoClickAction(const PropertyValueContainer& attributes)
684 // Prevents the button signals from doing a recursive loop by sending an action
685 // and re-emitting the signals.
686 if(!mClickActionPerforming)
688 mClickActionPerforming = true;
692 mClickActionPerforming = false;
696 bool PushButton::DoAction(BaseObject* object, const std::string& actionName, const std::vector<Property::Value>& attributes)
700 Dali::BaseHandle handle(object);
702 Toolkit::PushButton button = Toolkit::PushButton::DownCast(handle);
704 DALI_ASSERT_ALWAYS(button);
706 if(Toolkit::PushButton::ACTION_PUSH_BUTTON_CLICK == actionName)
708 GetImplementation(button).DoClickAction(attributes);
715 } // namespace Internal
717 } // namespace Toolkit