Text Selection Popup Fade-in/Fade-out animation 40/45040/8
authorAgnelo Vaz <agnelo.vaz@samsung.com>
Thu, 30 Jul 2015 17:44:43 +0000 (18:44 +0100)
committerAgnelo Vaz <agnelo.vaz@samsung.com>
Tue, 4 Aug 2015 14:05:32 +0000 (15:05 +0100)
* Popup creation refactor to keep track of enabled buttons during animation show/hides and prevent reconstruction when Relayout occurs but not change in Popup.
* popup-fade-in-duration Property added.
* Popup fades from 0 to 100 opacity
* 2.4 Core_VI-qHD_REF State Toast opacity duration is 250md from 0-100. Popup follows Toast guideline.
* Toolbar Property Name fix

- Toolbar not getting MAX_SIZE from json file so TextSelectionPopup is storing max size and applying to Toolbar

Change-Id: Ied0972b8c809b7a3c9dcda2dd77ae2ca35c89382
Signed-off-by: Agnelo Vaz <agnelo.vaz@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-TextSelectionPopup.cpp
dali-toolkit/devel-api/controls/text-controls/text-selection-popup.cpp
dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h
dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp
dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h
dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp
dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h
dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp
dali-toolkit/internal/text/decorator/text-decorator.cpp
dali-toolkit/styles/480x800/dali-toolkit-default-theme.json
dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json

index 7aeb471..f6f9730 100644 (file)
@@ -41,7 +41,7 @@ int UtcDaliToolkitTextSelectionPopupNewP(void)
 
   DALI_TEST_CHECK( !textSelectionPopup );
 
 
   DALI_TEST_CHECK( !textSelectionPopup );
 
-  textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+  textSelectionPopup = TextSelectionPopup::New( NULL );
 
   DALI_TEST_CHECK( textSelectionPopup );
   END_TEST;
 
   DALI_TEST_CHECK( textSelectionPopup );
   END_TEST;
@@ -61,7 +61,7 @@ int UtcDaliToolkitTextSelectionPopupCopyConstructorP(void)
   ToolkitTestApplication application;
   TextSelectionPopup textSelectionPopup;
 
   ToolkitTestApplication application;
   TextSelectionPopup textSelectionPopup;
 
-  textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+  textSelectionPopup = TextSelectionPopup::New( NULL );
   TextSelectionPopup copy( textSelectionPopup );
 
   DALI_TEST_CHECK( copy == textSelectionPopup );
   TextSelectionPopup copy( textSelectionPopup );
 
   DALI_TEST_CHECK( copy == textSelectionPopup );
@@ -85,7 +85,7 @@ int UtcDaliToolkitTextSelectionPopupAssignmentOperatorP(void)
 {
   ToolkitTestApplication application;
   TextSelectionPopup textSelectionPopup;
 {
   ToolkitTestApplication application;
   TextSelectionPopup textSelectionPopup;
-  textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+  textSelectionPopup = TextSelectionPopup::New(  NULL );
   TextSelectionPopup copy;
   copy = textSelectionPopup;
 
   TextSelectionPopup copy;
   copy = textSelectionPopup;
 
@@ -97,7 +97,7 @@ int UtcDaliToolkitTextSelectionPopupDownCastP(void)
 {
   ToolkitTestApplication application;
   TextSelectionPopup textSelectionPopup;
 {
   ToolkitTestApplication application;
   TextSelectionPopup textSelectionPopup;
-  textSelectionPopup = TextSelectionPopup::New( TextSelectionPopup::COPY, NULL );
+  textSelectionPopup = TextSelectionPopup::New( NULL );
 
   TextSelectionPopup cast = TextSelectionPopup::DownCast( textSelectionPopup );
 
 
   TextSelectionPopup cast = TextSelectionPopup::DownCast( textSelectionPopup );
 
index 4b9f548..28a5819 100644 (file)
@@ -29,11 +29,9 @@ namespace Dali
 namespace Toolkit
 {
 
 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()
 }
 
 TextSelectionPopup::TextSelectionPopup()
@@ -63,6 +61,11 @@ TextSelectionPopup TextSelectionPopup::DownCast( BaseHandle handle )
   return Control::DownCast<TextSelectionPopup, Internal::TextSelectionPopup>(handle);
 }
 
   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 );
 void TextSelectionPopup::RaiseAbove( Layer target )
 {
   GetImpl(*this).RaiseAbove( target );
@@ -73,6 +76,11 @@ void TextSelectionPopup::ShowPopup()
   GetImpl(*this).ShowPopup();
 }
 
   GetImpl(*this).ShowPopup();
 }
 
+void TextSelectionPopup::HidePopup()
+{
+  GetImpl(*this).HidePopup();
+}
+
 TextSelectionPopup::TextSelectionPopup( Internal::TextSelectionPopup& implementation )
 : Control(implementation)
 {
 TextSelectionPopup::TextSelectionPopup( Internal::TextSelectionPopup& implementation )
 : Control(implementation)
 {
index fd473ad..4eec4c1 100644 (file)
@@ -89,18 +89,18 @@ public:
       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_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.
    */
    * @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.
 
   /**
    * @brief Creates an empty handle.
@@ -141,6 +141,12 @@ public:
   static TextSelectionPopup DownCast( BaseHandle 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.
    * @brief Raises the toolbar's layer above the given @e target layer.
    *
    * @param[in] target The layer to get above of.
@@ -148,10 +154,15 @@ public:
   void RaiseAbove( Layer target );
 
   /**
   void RaiseAbove( Layer target );
 
   /**
-   * @brief Show the Popup
+   * @brief Show the Popup if not being shown
    */
   void ShowPopup();
 
    */
   void ShowPopup();
 
+  /**
+   * @brief Hide the Popup if shown
+   */
+  void HidePopup();
+
 public: // Not intended for application developers
 
   /**
 public: // Not intended for application developers
 
   /**
index df103cf..46c32c8 100644 (file)
@@ -61,7 +61,6 @@ void TextSelectionToolbar::AddOption( Actor& option )
   GetImpl(*this).AddOption(option);
 }
 
   GetImpl(*this).AddOption(option);
 }
 
-
 void TextSelectionToolbar::AddDivider( Actor& divider )
 {
   GetImpl(*this).AddDivider( divider );
 void TextSelectionToolbar::AddDivider( Actor& divider )
 {
   GetImpl(*this).AddDivider( divider );
index d0c5976..2fbf611 100644 (file)
@@ -62,7 +62,7 @@ public:
   {
     enum
     {
   {
     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
     };
   };
 
     };
   };
 
index bc54dca..0c47877 100644 (file)
 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
 
 // EXTERNAL INCLUDES
 #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 <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>
 
 #include <libintl.h>
 #include <cfloat>
 
@@ -79,7 +81,7 @@ const char* const OPTION_CLIPBOARD("option-clipboard");
 
 BaseHandle Create()
 {
 
 BaseHandle Create()
 {
-  return Toolkit::TextSelectionPopup::New( Toolkit::TextSelectionPopup::NONE, NULL );
+  return Toolkit::TextSelectionPopup::New( NULL );
 }
 
 // Setup properties, signals and actions using the type-registry.
 }
 
 // Setup properties, signals and actions using the type-registry.
@@ -101,14 +103,15 @@ DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-divider-color",
 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-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_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 );
 {
    // Create the implementation, temporarily owned by this handle on stack
   IntrusivePtr< TextSelectionPopup > impl = new TextSelectionPopup( callbackInterface );
@@ -116,7 +119,6 @@ Dali::Toolkit::TextSelectionPopup TextSelectionPopup::New( Toolkit::TextSelectio
   // Pass ownership to CustomActor handle
   Dali::Toolkit::TextSelectionPopup handle( *impl );
 
   // 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();
   // Second-phase init of the implementation
   // This can only be done after the CustomActor connection has been made...
   impl->Initialize();
@@ -210,6 +212,16 @@ void TextSelectionPopup::SetProperty( BaseObject* object, Property::Index index,
         impl.SetPressedImage( value.Get< std::string >() );
         break;
       }
         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
 }
     } // switch
   } // TextSelectionPopup
 }
@@ -305,11 +317,27 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I
         value = impl.GetPressedImage();
         break;
       }
         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;
 }
 
     } // switch
   }
   return value;
 }
 
+void TextSelectionPopup::EnableButtons( Toolkit::TextSelectionPopup::Buttons buttonsToEnable )
+{
+  mEnabledButtons = buttonsToEnable;
+  mButtonsChanged = true;
+}
+
 void TextSelectionPopup::RaiseAbove( Layer target )
 {
   if( mToolbar )
 void TextSelectionPopup::RaiseAbove( Layer target )
 {
   if( mToolbar )
@@ -320,12 +348,36 @@ void TextSelectionPopup::RaiseAbove( Layer target )
 
 void TextSelectionPopup::ShowPopup()
 {
 
 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()
 {
 }
 
 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 )
 }
 
 void TextSelectionPopup::OnStageConnection( int depth )
@@ -336,6 +388,15 @@ void TextSelectionPopup::OnStageConnection( int depth )
   // TextSelectionToolbar::OnStageConnection() will set the depths of all the popup's components.
 }
 
   // 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 )
 bool TextSelectionPopup::OnCutButtonPressed( Toolkit::Button button )
 {
   if( mCallbackInterface )
@@ -402,6 +463,7 @@ void TextSelectionPopup::SetDimensionToCustomise( const PopupCustomisations& set
   {
     case POPUP_MAXIMUM_SIZE :
     {
   {
     case POPUP_MAXIMUM_SIZE :
     {
+      mPopupMaxSize = dimension;
       if ( mToolbar )
       {
         mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, dimension );
       if ( mToolbar )
       {
         mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, dimension );
@@ -438,7 +500,14 @@ Size TextSelectionPopup::GetDimensionToCustomise( const PopupCustomisations& set
   {
     case POPUP_MAXIMUM_SIZE :
     {
   {
     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 :
     {
     }
     case OPTION_MAXIMUM_SIZE :
     {
@@ -677,6 +746,26 @@ std::string TextSelectionPopup::GetPressedImage() const
 
  void TextSelectionPopup::AddPopupOptionsToToolbar( bool showIcons, bool showCaptions )
  {
 
  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;
    // Iterate list of buttons and add active ones to Toolbar
    std::size_t numberOfOptionsRequired =  GetNumberOfEnabledOptions();
    std::size_t numberOfOptionsAdded = 0u;
@@ -691,23 +780,12 @@ std::string TextSelectionPopup::GetPressedImage() const
    }
  }
 
    }
  }
 
- 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(),
 TextSelectionPopup::TextSelectionPopup( TextSelectionPopupCallbackInterface* callbackInterface )
 : Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ),
   mToolbar(),
+  mPopupMaxSize(),
+  mOptionMaxSize(),
+  mOptionMinSize(),
   mOptionDividerSize(),
   mEnabledButtons( Toolkit::TextSelectionPopup::NONE ),
   mCallbackInterface( callbackInterface ),
   mOptionDividerSize(),
   mEnabledButtons( Toolkit::TextSelectionPopup::NONE ),
   mCallbackInterface( callbackInterface ),
@@ -720,8 +798,12 @@ TextSelectionPopup::TextSelectionPopup( TextSelectionPopupCallbackInterface* cal
   mCopyOptionPriority ( 3 ),
   mPasteOptionPriority ( 5 ),
   mClipboardOptionPriority( 6 ),
   mCopyOptionPriority ( 3 ),
   mPasteOptionPriority ( 5 ),
   mClipboardOptionPriority( 6 ),
+  mFadeInDuration(0.0f),
+  mFadeOutDuration(0.0f),
   mShowIcons( false ),
   mShowIcons( false ),
-  mShowCaptions( true )
+  mShowCaptions( true ),
+  mPopupShowing( false ),
+  mButtonsChanged( false )
 {
 }
 
 {
 }
 
index 8e0141a..e4cef74 100644 (file)
@@ -97,12 +97,10 @@ public:
 
   /**
    * @brief New constructor with provided buttons to enable.
 
   /**
    * @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.
    */
    * @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
 
 
   // Properties
 
@@ -124,6 +122,11 @@ public:
   static Property::Value GetProperty( BaseObject* object, Property::Index index );
 
   /**
   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 );
    * @copydoc Toolkit::TextSelectionPopup::RaiseAbove()
    */
   void RaiseAbove( Layer target );
@@ -133,6 +136,11 @@ public:
    */
   void ShowPopup();
 
    */
   void ShowPopup();
 
+  /**
+   * @copydoc Toolkiut::TextSelectionPopup::HidePopup()
+   */
+  void HidePopup();
+
 private: // From Control
 
   /**
 private: // From Control
 
   /**
@@ -147,6 +155,8 @@ private: // From Control
 
 private: // Implementation
 
 
 private: // Implementation
 
+  void HideAnimationFinished( Animation& animation );
+
   /**
    * @brief When the cut button is pressed.
    * @param[in] button the button pressed
   /**
    * @brief When the cut button is pressed.
    * @param[in] button the button pressed
@@ -242,8 +252,6 @@ private: // Implementation
 
   void AddPopupOptionsToToolbar(  bool showIcons, bool showCaptions );
 
 
   void AddPopupOptionsToToolbar(  bool showIcons, bool showCaptions );
 
-  void CreatePopup();
-
   /**
    * Construct a new TextField.
    */
   /**
    * Construct a new TextField.
    */
@@ -275,6 +283,7 @@ private: // Data
   Image mSelectIconImage;
   Image mSelectAllIconImage;
 
   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
   Size mOptionMaxSize;                  // Maximum size of an Option button
   Size mOptionMinSize;                  // Minimum size of an Option button
   Size mOptionDividerSize;              // Size of divider line
@@ -296,9 +305,13 @@ private: // Data
   std::size_t mCopyOptionPriority;      // Position of Copy button
   std::size_t mPasteOptionPriority;     // Position of Paste button
   std::size_t mClipboardOptionPriority; // Position of Clipboard button
   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 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
 
 };
 
 
 };
 
index 78d8f5f..eb6efe4 100644 (file)
@@ -255,7 +255,7 @@ void TextSelectionToolbar::RaiseAbove( Layer target )
 }
 
 TextSelectionToolbar::TextSelectionToolbar()
 }
 
 TextSelectionToolbar::TextSelectionToolbar()
-: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ),
+: Control( ControlBehaviour( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ) ),
   mMaxSize (),
   mIndexInTable( 0 ),
   mDividerIndexes()
   mMaxSize (),
   mIndexInTable( 0 ),
   mDividerIndexes()
index ed67d72..380d97b 100644 (file)
@@ -384,18 +384,13 @@ struct Decorator::Impl : public ConnectionTracker
 
     if( mActiveCopyPastePopup )
     {
 
     if( mActiveCopyPastePopup )
     {
-      if( !mCopyPastePopup.actor.GetParent() )
-      {
-        mActiveLayer.Add( mCopyPastePopup.actor );
-      }
-
-      mCopyPastePopup.actor.RaiseAbove( mActiveLayer );
+      ShowPopup();
     }
     else
     {
       if( mCopyPastePopup.actor )
       {
     }
     else
     {
       if( mCopyPastePopup.actor )
       {
-        mCopyPastePopup.actor.Unparent();
+        mCopyPastePopup.actor.HidePopup();
       }
     }
   }
       }
     }
   }
@@ -411,6 +406,22 @@ struct Decorator::Impl : public ConnectionTracker
     DeterminePositionPopup();
   }
 
     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 DeterminePositionPopup()
   {
     if ( !mActiveCopyPastePopup )
@@ -445,7 +456,6 @@ struct Decorator::Impl : public ConnectionTracker
   void PopupRelayoutComplete( Actor actor )
   {
     // Size negotiation for CopyPastePopup complete so can get the size and constrain position within bounding box.
   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();
   }
 
     DeterminePositionPopup();
   }
@@ -1498,20 +1508,17 @@ void Decorator::SetEnabledPopupButtons( TextSelectionPopup::Buttons& enabledButt
 {
    mImpl->mEnabledPopupButtons = enabledButtonsBitMask;
 
 {
    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
 #ifdef DECORATOR_DEBUG
-   mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup");
+     mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup");
 #endif
 #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()
 }
 
 TextSelectionPopup::Buttons& Decorator::GetEnabledPopupButtons()
index 8a0d1ee..384c27b 100644 (file)
@@ -98,7 +98,9 @@ distributing this software or its derivatives.
       "popup-pressed-color":[0.24,0.72,0.8,0.11],
       "background-image": {
         "filename": "{DALI_IMAGE_DIR}selection-popup-bg.9.png"
       "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":
     {
     },
     "scrollview":
     {
index d9d86e5..2577e14 100644 (file)
@@ -98,7 +98,9 @@ distributing this software or its derivatives.
       "popup-pressed-color":[0.24,0.72,0.8,0.11],
       "background-image": {
         "filename": "{DALI_IMAGE_DIR}selection-popup-bg.9.png"
       "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":
     {
     },
     "scrollview":
     {