DALI_TEST_CHECK( !textSelectionPopup );
- textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+ textSelectionPopup = TextSelectionPopup::New( NULL );
DALI_TEST_CHECK( textSelectionPopup );
END_TEST;
ToolkitTestApplication application;
TextSelectionPopup textSelectionPopup;
- textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+ textSelectionPopup = TextSelectionPopup::New( NULL );
TextSelectionPopup copy( textSelectionPopup );
DALI_TEST_CHECK( copy == textSelectionPopup );
{
ToolkitTestApplication application;
TextSelectionPopup textSelectionPopup;
- textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+ textSelectionPopup = TextSelectionPopup::New( NULL );
TextSelectionPopup copy;
copy = textSelectionPopup;
{
ToolkitTestApplication application;
TextSelectionPopup textSelectionPopup;
- textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+ textSelectionPopup = TextSelectionPopup::New( NULL );
TextSelectionPopup cast = TextSelectionPopup::DownCast( textSelectionPopup );
namespace Toolkit
{
-TextSelectionPopup TextSelectionPopup::New( Buttons enabledButtons,
- TextSelectionPopupCallbackInterface* callbackInterface )
+TextSelectionPopup TextSelectionPopup::New( TextSelectionPopupCallbackInterface* callbackInterface )
{
- return Internal::TextSelectionPopup::New( enabledButtons,
- callbackInterface );
+ return Internal::TextSelectionPopup::New( callbackInterface );
}
TextSelectionPopup::TextSelectionPopup()
return Control::DownCast<TextSelectionPopup, Internal::TextSelectionPopup>(handle);
}
+void TextSelectionPopup::EnableButtons( Toolkit::TextSelectionPopup::Buttons buttonsToEnable )
+{
+ GetImpl(*this).EnableButtons( buttonsToEnable );
+}
+
void TextSelectionPopup::RaiseAbove( Layer target )
{
GetImpl(*this).RaiseAbove( target );
GetImpl(*this).ShowPopup();
}
+void TextSelectionPopup::HidePopup()
+{
+ GetImpl(*this).HidePopup();
+}
+
TextSelectionPopup::TextSelectionPopup( Internal::TextSelectionPopup& implementation )
: Control(implementation)
{
POPUP_DIVIDER_COLOR, ///< name "popup-divider-color", The color of the divider between options, type VECTOR4
POPUP_ICON_COLOR, ///< name "popup-icon-color", The color of the icons (if supplied), type VECTOR4
POPUP_PRESSED_COLOR, ///< name "popup-pressed-color", The color of the option when pressed, type VECTOR4
- POPUP_PRESSED_IMAGE ///< name "popup-pressed-image", The image to use for the option when pressed, type STRING
+ POPUP_PRESSED_IMAGE, ///< name "popup-pressed-image", The image to use for the option when pressed, type STRING
+ POPUP_FADE_IN_DURATION, ///< name "popup-fade-in-duration", The duration of the fade-in animation, type FLOAT
+ POPUP_FADE_OUT_DURATION, ///< name "popup-fade-out-duration", The duration of the fade-out animation, type FLOAT
};
};
/**
- * Create the TextSelectionPopup control with the given set of buttons.
- * @param[in] enabledButtons The given set of buttons to enable
+ * Create the TextSelectionPopup control.
* @param[in] callbackInterface The text popup callback interface which receives the button click callbacks.
* @return A handle to the TextSelectionPopup control.
*/
- static TextSelectionPopup New( Buttons enabledButtons,
- TextSelectionPopupCallbackInterface* callbackInterface );
+ static TextSelectionPopup New( TextSelectionPopupCallbackInterface* callbackInterface );
/**
* @brief Creates an empty handle.
static TextSelectionPopup DownCast( BaseHandle handle );
/**
+ * @brief Specify which buttons to show in Popup
+ * @param[in] buttonsToEnable Buttons to enable
+ */
+ void EnableButtons( Toolkit::TextSelectionPopup::Buttons buttonsToEnable );
+
+ /**
* @brief Raises the toolbar's layer above the given @e target layer.
*
* @param[in] target The layer to get above of.
void RaiseAbove( Layer target );
/**
- * @brief Show the Popup
+ * @brief Show the Popup if not being shown
*/
void ShowPopup();
+ /**
+ * @brief Hide the Popup if shown
+ */
+ void HidePopup();
+
public: // Not intended for application developers
/**
GetImpl(*this).AddOption(option);
}
-
void TextSelectionToolbar::AddDivider( Actor& divider )
{
GetImpl(*this).AddDivider( divider );
{
enum
{
- MAX_SIZE = PROPERTY_START_INDEX ///< name "popup-max-size", The maximum size the Popup can be, type VECTOR2
+ MAX_SIZE = PROPERTY_START_INDEX ///< name "max-size", The maximum size the Popup can be, type VECTOR2
};
};
#include <dali-toolkit/public-api/controls/text-controls/text-label.h>
// EXTERNAL INCLUDES
+#include <dali/public-api/animation/animation.h>
#include <dali/public-api/images/nine-patch-image.h>
#include <dali/public-api/images/resource-image.h>
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/math/vector4.h>
#include <dali/devel-api/object/type-registry-helper.h>
+
#include <libintl.h>
#include <cfloat>
BaseHandle Create()
{
- return Toolkit::TextSelectionPopup::New( Toolkit::TextSelectionPopup::NONE, NULL );
+ return Toolkit::TextSelectionPopup::New( NULL );
}
// Setup properties, signals and actions using the type-registry.
DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-icon-color", VECTOR4, POPUP_ICON_COLOR )
DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-pressed-color", VECTOR4, POPUP_PRESSED_COLOR )
DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-pressed-image", STRING, POPUP_PRESSED_IMAGE )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-fade-in-duration", FLOAT, POPUP_FADE_IN_DURATION )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-fade-out-duration", FLOAT, POPUP_FADE_OUT_DURATION )
DALI_TYPE_REGISTRATION_END()
} // namespace
-Dali::Toolkit::TextSelectionPopup TextSelectionPopup::New( Toolkit::TextSelectionPopup::Buttons buttonsToEnable,
- TextSelectionPopupCallbackInterface* callbackInterface )
+Dali::Toolkit::TextSelectionPopup TextSelectionPopup::New( TextSelectionPopupCallbackInterface* callbackInterface )
{
// Create the implementation, temporarily owned by this handle on stack
IntrusivePtr< TextSelectionPopup > impl = new TextSelectionPopup( callbackInterface );
// Pass ownership to CustomActor handle
Dali::Toolkit::TextSelectionPopup handle( *impl );
- impl->mEnabledButtons = buttonsToEnable;
// Second-phase init of the implementation
// This can only be done after the CustomActor connection has been made...
impl->Initialize();
impl.SetPressedImage( value.Get< std::string >() );
break;
}
+ case Toolkit::TextSelectionPopup::Property::POPUP_FADE_IN_DURATION:
+ {
+ impl.mFadeInDuration = value.Get < float >();
+ break;
+ }
+ case Toolkit::TextSelectionPopup::Property::POPUP_FADE_OUT_DURATION:
+ {
+ impl.mFadeOutDuration = value.Get < float >();
+ break;
+ }
} // switch
} // TextSelectionPopup
}
value = impl.GetPressedImage();
break;
}
+ case Toolkit::TextSelectionPopup::Property::POPUP_FADE_IN_DURATION:
+ {
+ value = impl.mFadeInDuration;
+ break;
+ }
+ case Toolkit::TextSelectionPopup::Property::POPUP_FADE_OUT_DURATION:
+ {
+ value = impl.mFadeOutDuration;
+ break;
+ }
} // switch
}
return value;
}
+void TextSelectionPopup::EnableButtons( Toolkit::TextSelectionPopup::Buttons buttonsToEnable )
+{
+ mEnabledButtons = buttonsToEnable;
+ mButtonsChanged = true;
+}
+
void TextSelectionPopup::RaiseAbove( Layer target )
{
if( mToolbar )
void TextSelectionPopup::ShowPopup()
{
- AddPopupOptionsToToolbar( mShowIcons, mShowCaptions );
+ if ( !mPopupShowing || mButtonsChanged )
+ {
+ Actor self = Self();
+ AddPopupOptionsToToolbar( mShowIcons, mShowCaptions );
+
+ Animation animation = Animation::New( mFadeInDuration );
+ animation.AnimateTo( Property(self, Actor::Property::COLOR_ALPHA), 1.0f );
+ animation.Play();
+ mPopupShowing = true;
+ }
+}
+
+void TextSelectionPopup::HidePopup()
+{
+ if ( mPopupShowing )
+ {
+ mPopupShowing = false;
+ Actor self = Self();
+ Animation animation = Animation::New( mFadeOutDuration );
+ animation.AnimateTo( Property(self, Actor::Property::COLOR_ALPHA), 0.0f );
+ animation.FinishedSignal().Connect( this, &TextSelectionPopup::HideAnimationFinished );
+ animation.Play();
+ }
}
void TextSelectionPopup::OnInitialize()
{
- CreatePopup();
+ Actor self = Self();
+ self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
+ self.SetProperty( Actor::Property::COLOR_ALPHA, 0.0f );
}
void TextSelectionPopup::OnStageConnection( int depth )
// TextSelectionToolbar::OnStageConnection() will set the depths of all the popup's components.
}
+void TextSelectionPopup::HideAnimationFinished( Animation& animation )
+{
+ Actor self = Self();
+ if ( !mPopupShowing ) // During the Hide/Fade animation there could be a call to Show the Popup again, mPopupShowing will be true in this case.
+ {
+ UnparentAndReset( self ); // Popup needs to be shown so do not unparent
+ }
+}
+
bool TextSelectionPopup::OnCutButtonPressed( Toolkit::Button button )
{
if( mCallbackInterface )
{
case POPUP_MAXIMUM_SIZE :
{
+ mPopupMaxSize = dimension;
if ( mToolbar )
{
mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, dimension );
{
case POPUP_MAXIMUM_SIZE :
{
- return mToolbar.GetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE ).Get< Vector2 >();
+ if ( mToolbar )
+ {
+ return mToolbar.GetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE ).Get< Vector2 >();
+ }
+ else
+ {
+ return mPopupMaxSize;
+ }
}
case OPTION_MAXIMUM_SIZE :
{
void TextSelectionPopup::AddPopupOptionsToToolbar( bool showIcons, bool showCaptions )
{
+ CreateOrderedListOfPopupOptions();
+
+ mButtonsChanged = false;
+ UnparentAndReset( mToolbar);
+
+ if( !mToolbar )
+ {
+ Actor self = Self();
+ mToolbar = Toolkit::TextSelectionToolbar::New();
+ if ( mPopupMaxSize != Vector2::ZERO ) // If PopupMaxSize property set then apply to Toolbar. Toolbar currently is not retriving this from json
+ {
+ mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, mPopupMaxSize );
+ }
+ mToolbar.SetParentOrigin( ParentOrigin::CENTER );
+#ifdef DECORATOR_DEBUG
+ mToolbar.SetName("TextSelectionToolbar");
+#endif
+ self.Add( mToolbar );
+ }
+
// Iterate list of buttons and add active ones to Toolbar
std::size_t numberOfOptionsRequired = GetNumberOfEnabledOptions();
std::size_t numberOfOptionsAdded = 0u;
}
}
- void TextSelectionPopup::CreatePopup()
- {
- Actor self = Self();
- CreateOrderedListOfPopupOptions();
- self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
-
- if( !mToolbar )
- {
- mToolbar = Toolkit::TextSelectionToolbar::New();
- mToolbar.SetParentOrigin( ParentOrigin::CENTER );
- self.Add( mToolbar );
- }
- }
-
TextSelectionPopup::TextSelectionPopup( TextSelectionPopupCallbackInterface* callbackInterface )
: Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ),
mToolbar(),
+ mPopupMaxSize(),
+ mOptionMaxSize(),
+ mOptionMinSize(),
mOptionDividerSize(),
mEnabledButtons( Toolkit::TextSelectionPopup::NONE ),
mCallbackInterface( callbackInterface ),
mCopyOptionPriority ( 3 ),
mPasteOptionPriority ( 5 ),
mClipboardOptionPriority( 6 ),
+ mFadeInDuration(0.0f),
+ mFadeOutDuration(0.0f),
mShowIcons( false ),
- mShowCaptions( true )
+ mShowCaptions( true ),
+ mPopupShowing( false ),
+ mButtonsChanged( false )
{
}
/**
* @brief New constructor with provided buttons to enable.
- * @param[in] buttonsToEnable bit mask of buttons to enable
* @param[in] callbackInterface The text popup callback interface which receives the button click callbacks.
* @return A handle to the TextSelectionPopup control.
*/
- static Toolkit::TextSelectionPopup New( Toolkit::TextSelectionPopup::Buttons buttonsToEnable,
- TextSelectionPopupCallbackInterface* callbackInterface );
+ static Toolkit::TextSelectionPopup New( TextSelectionPopupCallbackInterface* callbackInterface );
// Properties
static Property::Value GetProperty( BaseObject* object, Property::Index index );
/**
+ * @copydoc Toolkit::EnableButtons
+ */
+ void EnableButtons( Toolkit::TextSelectionPopup::Buttons buttonsToEnable );
+
+ /**
* @copydoc Toolkit::TextSelectionPopup::RaiseAbove()
*/
void RaiseAbove( Layer target );
*/
void ShowPopup();
+ /**
+ * @copydoc Toolkiut::TextSelectionPopup::HidePopup()
+ */
+ void HidePopup();
+
private: // From Control
/**
private: // Implementation
+ void HideAnimationFinished( Animation& animation );
+
/**
* @brief When the cut button is pressed.
* @param[in] button the button pressed
void AddPopupOptionsToToolbar( bool showIcons, bool showCaptions );
- void CreatePopup();
-
/**
* Construct a new TextField.
*/
Image mSelectIconImage;
Image mSelectAllIconImage;
+ Size mPopupMaxSize; // Maximum size of the Popup
Size mOptionMaxSize; // Maximum size of an Option button
Size mOptionMinSize; // Minimum size of an Option button
Size mOptionDividerSize; // Size of divider line
std::size_t mCopyOptionPriority; // Position of Copy button
std::size_t mPasteOptionPriority; // Position of Paste button
std::size_t mClipboardOptionPriority; // Position of Clipboard button
+ float mFadeInDuration; // Duration of the animation to fade in the Popup
+ float mFadeOutDuration; // Duration of the animation to fade out the Popup
bool mShowIcons:1; // Flag to show icons
bool mShowCaptions:1; // Flag to show text captions
+ bool mPopupShowing:1; // Flag to indicate Popup showing
+ bool mButtonsChanged:1; // Flag to indicate the Popup Buttons have changed
};
}
TextSelectionToolbar::TextSelectionToolbar()
-: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ),
+: Control( ControlBehaviour( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ) ),
mMaxSize (),
mIndexInTable( 0 ),
mDividerIndexes()
if( mActiveCopyPastePopup )
{
- if( !mCopyPastePopup.actor.GetParent() )
- {
- mActiveLayer.Add( mCopyPastePopup.actor );
- }
-
- mCopyPastePopup.actor.RaiseAbove( mActiveLayer );
+ ShowPopup();
}
else
{
if( mCopyPastePopup.actor )
{
- mCopyPastePopup.actor.Unparent();
+ mCopyPastePopup.actor.HidePopup();
}
}
}
DeterminePositionPopup();
}
+ void ShowPopup()
+ {
+ if ( !mCopyPastePopup.actor )
+ {
+ return;
+ }
+
+ if( !mCopyPastePopup.actor.GetParent() )
+ {
+ mActiveLayer.Add( mCopyPastePopup.actor );
+ }
+
+ mCopyPastePopup.actor.RaiseAbove( mActiveLayer );
+ mCopyPastePopup.actor.ShowPopup();
+ }
+
void DeterminePositionPopup()
{
if ( !mActiveCopyPastePopup )
void PopupRelayoutComplete( Actor actor )
{
// Size negotiation for CopyPastePopup complete so can get the size and constrain position within bounding box.
- mCopyPastePopup.actor.OnRelayoutSignal().Disconnect( this, &Decorator::Impl::PopupRelayoutComplete );
DeterminePositionPopup();
}
{
mImpl->mEnabledPopupButtons = enabledButtonsBitMask;
- UnparentAndReset( mImpl->mCopyPastePopup.actor );
- mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( mImpl->mEnabledPopupButtons,
- &mImpl->mTextSelectionPopupCallbackInterface );
+ if ( !mImpl->mCopyPastePopup.actor )
+ {
+ mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( &mImpl->mTextSelectionPopupCallbackInterface );
#ifdef DECORATOR_DEBUG
- mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup");
+ mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup");
#endif
- mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER );
- mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl, &Decorator::Impl::PopupRelayoutComplete ); // Position popup after size negotiation
-
- if( mImpl->mActiveLayer )
- {
- mImpl->mActiveLayer.Add( mImpl->mCopyPastePopup.actor );
- mImpl->mCopyPastePopup.actor.ShowPopup();
+ mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER );
+ mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl, &Decorator::Impl::PopupRelayoutComplete ); // Position popup after size negotiation
}
+
+ mImpl->mCopyPastePopup.actor.EnableButtons( mImpl->mEnabledPopupButtons );
}
TextSelectionPopup::Buttons& Decorator::GetEnabledPopupButtons()
"popup-pressed-color":[0.24,0.72,0.8,0.11],
"background-image": {
"filename": "{DALI_IMAGE_DIR}selection-popup-bg.9.png"
- }
+ },
+ "popup-fade-in-duration":0.25,
+ "popup-fade-out-duration":0.25
},
"scrollview":
{
"popup-pressed-color":[0.24,0.72,0.8,0.11],
"background-image": {
"filename": "{DALI_IMAGE_DIR}selection-popup-bg.9.png"
- }
+ },
+ "popup-fade-in-duration":0.25,
+ "popup-fade-out-duration":0.25
},
"scrollview":
{