From: Paul Wisbey Date: Wed, 17 Jun 2015 11:08:36 +0000 (-0700) Subject: Merge "TextSelectionToolbar and Style Properties added" into devel/master X-Git-Tag: dali_1.0.45~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=8c18e2ceb273e1db22547264a4466fa565081a29;hp=a7646628bf0d87a7f9e02d8f4db52dea881579c7 Merge "TextSelectionToolbar and Style Properties added" into devel/master --- diff --git a/build/tizen/configure.ac b/build/tizen/configure.ac index 006e192..6fb8b47 100644 --- a/build/tizen/configure.ac +++ b/build/tizen/configure.ac @@ -45,6 +45,12 @@ AC_ARG_ENABLE([debug], [enable_debug=$enableval], [enable_debug=no]) +AC_ARG_ENABLE([i18n], + [AC_HELP_STRING([--enable-i18n], + [Turns on internationalisation])], + [enable_i18n=$enableval], + [enable_i18n=no]) + # option to build JavaScript plugin # configure settings and output # --enable-javascript // enable_javascript = yes @@ -67,8 +73,9 @@ if test "x$enable_debug" = "xno" -a "x$enable_exportall" = "xno"; then DALI_TOOLKIT_CFLAGS="$DALI_TOOLKIT_CFLAGS -fvisibility=hidden -DHIDE_DALI_INTERNALS" fi - - +if test "x$enable_i18n" = "xyes"; then + DALI_TOOLKIT_CFLAGS="$DALI_TOOLKIT_CFLAGS -DDGETTEXT_ENABLED " +fi # Tizen Profile options AC_ARG_ENABLE([profile], diff --git a/build/tizen/dali-toolkit/Makefile.am b/build/tizen/dali-toolkit/Makefile.am index b1d8989..0319ac1 100644 --- a/build/tizen/dali-toolkit/Makefile.am +++ b/build/tizen/dali-toolkit/Makefile.am @@ -101,6 +101,7 @@ develapishadereffectsdir = $(develapidir)/shader-effects develapitransitioneffectsdir = $(develapidir)/transition-effects develapistylingdir = $(develapidir)/styling develapitoolbardir = $(develapicontrolsdir)/tool-bar +develapitextselectionpopupdir = $(develapicontrolsdir)/text-controls # devel headers develapibloomview_HEADERS = $(devel_api_bloom_view_header_files) @@ -120,6 +121,7 @@ develapistyling_HEADERS = $(devel_api_styling_header_files) develapisuperblurview_HEADERS = $(devel_api_super_blur_view_header_files) develapitoolbar_HEADERS = $(devel_api_tool_bar_header_files) develapitransitioneffects_HEADERS = $(devel_api_transition_effects_header_files) +develapitextselectionpopup_HEADERS = $(devel_api_text_selection_popup_header_files) # public api source publicapidir = $(topleveldir)/public-api diff --git a/dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h b/dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h index 2243f2d..69df315 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-selection-popup.h @@ -56,15 +56,18 @@ public: }; /** - * @brief An enumeration of properties belonging to the TextLabel class. + * @brief An enumeration of properties belonging to the TextSelectionPopup class. */ struct Property { enum { - POPUP_MAX_SIZE, ///< name "popup-max-size", The max size the Popup can be, type VECTOR2 - POPUP_BACKGROUND_IMAGE, ///< name "popup-background-image", The image to display for popup background type STRING + POPUP_MAX_SIZE = PROPERTY_START_INDEX, ///< name "popup-max-size", The maximum size the Popup can be, type VECTOR2 + POPUP_MIN_SIZE, ///< name "popup-min-size", The minimum size the Popup can be, type VECTOR2 + OPTION_MAX_SIZE, ///< name "option-max-size", The maximum size an option can be, type VECTOR2 + OPTION_MIN_SIZE, ///< name "option-min-size", The minimum size an option can be, type VECTOR2 + OPTION_DIVIDER_SIZE, ///< name "option-divider-size", The size of the divider between options type VECTOR2 POPUP_CLIPBOARD_BUTTON_ICON_IMAGE, ///< name "popup-clipboard-button-image", The image to use as the popup clipboard icon, type STRING POPUP_CUT_BUTTON_ICON_IMAGE, ///< name "popup-cut-button-image", The image to use as the popup cut icon, type STRING POPUP_COPY_BUTTON_ICON_IMAGE, ///< name "popup-copy-button-image", The image to use as the popup copy icon, type STRING @@ -138,6 +141,6 @@ public: // Not intended for application developers } // namespace Toolkit -} // namepsace Dali +} // namespace Dali #endif // __DALI_TOOLKIT_TEXT_SELECTION_POPUP_H__ diff --git a/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp new file mode 100644 index 0000000..453b12d --- /dev/null +++ b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include + +// INTERNAL INCLUDES +#include + +using namespace Dali; + +namespace Dali +{ + +namespace Toolkit +{ + +TextSelectionToolbar TextSelectionToolbar::New() +{ + return Internal::TextSelectionToolbar::New(); +} + +TextSelectionToolbar::TextSelectionToolbar() +{ +} + +TextSelectionToolbar::TextSelectionToolbar( const TextSelectionToolbar& handle ) +: Control( handle ) +{ +} + +TextSelectionToolbar& TextSelectionToolbar::operator=( const TextSelectionToolbar& handle ) +{ + if( &handle != this ) + { + Control::operator=( handle ); + } + return *this; +} + +TextSelectionToolbar::~TextSelectionToolbar() +{ +} + +void TextSelectionToolbar::AddOption( Actor& option ) +{ + GetImpl(*this).AddOption(option); +} + + +void TextSelectionToolbar::AddDivider( Actor& divider ) +{ + GetImpl(*this).AddDivider( divider ); +} + +void TextSelectionToolbar::ResizeDividers( Size& size ) +{ + GetImpl(*this).ResizeDividers( size ); +} + +TextSelectionToolbar TextSelectionToolbar::DownCast( BaseHandle handle ) +{ + return Control::DownCast(handle); +} + +TextSelectionToolbar::TextSelectionToolbar( Internal::TextSelectionToolbar& implementation ) +: Control(implementation) +{ +} + +TextSelectionToolbar::TextSelectionToolbar( Dali::Internal::CustomActor* internal ) +: Control( internal ) +{ + VerifyCustomActorPointer( internal ); +} + + +} // namespace Toolkit + +} // namespace Dali diff --git a/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h new file mode 100644 index 0000000..31fca5c --- /dev/null +++ b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h @@ -0,0 +1,154 @@ +#ifndef __DALI_TOOLKIT_TEXT_SELECTION_TOOLBAR_H__ +#define __DALI_TOOLKIT_TEXT_SELECTION_TOOLBAR_H__ + +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// INTERNAL INCLUDES +#include + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal DALI_INTERNAL +{ +class TextSelectionToolbar; +} + +/** + * @brief A control which provides a Popup with a number of buttons + * + * The style of the pop can be set through style sheets, this includes the images for the buttons + * A Show and Hide API is provided. + * + * If the buttons exceed the size constraints of the popup then it will offer scrolling. + * + * + */ +class DALI_IMPORT_API TextSelectionToolbar : public Control +{ +public: + + /** + * @brief The start and end property ranges for this control. + */ + enum PropertyRange + { + PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1, + PROPERTY_END_INDEX = PROPERTY_START_INDEX + 1000 ///< Reserve property indices + }; + + /** + * @brief An enumeration of properties belonging to the TextSelectionToolbar class. + */ + struct Property + { + enum + { + MAX_SIZE = PROPERTY_START_INDEX ///< name "popup-max-size", The maximum size the Popup can be, type VECTOR2 + }; + }; + + /** + * Create the TextSelectionToolbar control. + * @return A handle to the TextSelectionToolbar control. + */ + static TextSelectionToolbar New(); + + /** + * @brief Creates an empty handle. + */ + TextSelectionToolbar(); + + /** + * @brief Copy constructor. + * + * @param[in] handle The handle to copy from. + */ + TextSelectionToolbar( const TextSelectionToolbar& handle ); + + /** + * @brief Assignment operator. + * + * @param[in] handle The handle to copy from. + * @return A reference to this. + */ + TextSelectionToolbar& operator=( const TextSelectionToolbar& handle ); + + /** + * @brief Destructor + * + * This is non-virtual since derived Handle types must not contain data or virtual methods. + */ + ~TextSelectionToolbar(); + + + /** + * @brief Add a option to the the Tool bar + * @param[in] option Option actor to add + */ + void AddOption( Actor& option ); + + /** + * @brief Add a divider to the the Tool bar + * @param[in] divider Actor to be used as divider + */ + void AddDivider( Actor& divider ); + + /** + * @brief ResizeDividers + * @param[in] size New size of dividers, provide 0 for height to automatically set height + */ + void ResizeDividers( Size& size ); + + /** + * @brief Downcast a handle to TextSelectionToolbar. + * + * If the BaseHandle points is a TextSelectionToolbar the downcast returns a valid handle. + * If not the returned handle is left empty. + * + * @param[in] handle Handle to an object + * @return handle to a TextSelectionToolbar or an empty handle + */ + static TextSelectionToolbar DownCast( BaseHandle handle ); + +public: // Not intended for application developers + + /** + * @brief Creates a handle using the Toolkit::Internal implementation. + * + * @param[in] implementation The Control implementation. + */ + DALI_INTERNAL TextSelectionToolbar( Internal::TextSelectionToolbar& implementation ); + + /** + * @brief Allows the creation of this Control from an Internal::CustomActor pointer. + * + * @param[in] internal A pointer to the internal CustomActor. + */ + explicit DALI_INTERNAL TextSelectionToolbar( Dali::Internal::CustomActor* internal ); + +}; // Class TextSelectionToolbar + +} // namespace Toolkit + +} // namespace Dali + +#endif // __DALI_TOOLKIT_TEXT_SELECTION_TOOLBAR_H__ diff --git a/dali-toolkit/devel-api/file.list b/dali-toolkit/devel-api/file.list index ae50ba3..d669daf 100755 --- a/dali-toolkit/devel-api/file.list +++ b/dali-toolkit/devel-api/file.list @@ -17,6 +17,7 @@ devel_api_src_files = \ $(devel_api_src_dir)/controls/slider/slider.cpp \ $(devel_api_src_dir)/controls/super-blur-view/super-blur-view.cpp \ $(devel_api_src_dir)/controls/text-controls/text-selection-popup.cpp \ + $(devel_api_src_dir)/controls/text-controls/text-selection-toolbar.cpp \ $(devel_api_src_dir)/controls/tool-bar/tool-bar.cpp \ $(devel_api_src_dir)/focus-manager/keyinput-focus-manager.cpp \ $(devel_api_src_dir)/styling/style-manager.cpp \ @@ -137,8 +138,9 @@ devel_api_shader_effects_header_files = \ devel_api_super_blur_view_header_files = \ $(devel_api_src_dir)/controls/super-blur-view/super-blur-view.h -devel_api_text_selection_popup_header_files = \ - $(devel_api_src_dir)/controls/text-controls/text-selection-popup.h +devel_api_text_controls_header_files = \ + $(devel_api_src_dir)/controls/text-controls/text-selection-popup.h \ + $(devel_api_src_dir)/controls/text-controls/text-selection-toolbar.h devel_api_tool_bar_header_files = \ $(devel_api_src_dir)/controls/tool-bar/tool-bar.h diff --git a/dali-toolkit/images/selection-popup-bg#.png b/dali-toolkit/images/selection-popup-bg#.png new file mode 100755 index 0000000..3eac19f Binary files /dev/null and b/dali-toolkit/images/selection-popup-bg#.png differ diff --git a/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp index d66a70a..be7834a 100644 --- a/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp @@ -28,12 +28,10 @@ #include #include #include +#include #include #include -// todo Move this to adaptor?? -#define GET_LOCALE_TEXT(string) dgettext("elementary", string) - namespace Dali { @@ -45,15 +43,14 @@ namespace Internal namespace { -const Dali::Vector4 DEFAULT_POPUP_BACKGROUND( Dali::Vector4( .20f, 0.29f, 0.44f, 1.0f ) ); -const Dali::Vector4 DEFAULT_POPUP_BACKGROUND_PRESSED( Dali::Vector4( 0.07f, 0.10f, 0.17f, 1.0f ) ); -const Dali::Vector4 DEFAULT_POPUP_LINE_COLOR( Dali::Vector4( 0.36f, 0.45f, 0.59f, 1.0f ) ); +// todo Move this to adaptor?? +#define GET_LOCALE_TEXT(string) dgettext("elementary", string) + +const Dali::Vector4 DEFAULT_POPUP_LINE_COLOR( Dali::Vector4( 0.69f, 0.93f, 0.93f, 1.0f ) ); const Dali::Vector4 DEFAULT_OPTION_ICON( Dali::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); const Dali::Vector4 DEFAULT_OPTION_ICON_PRESSED( Dali::Vector4( 0.5f, 1.0f, 1.0f, 1.0f ) ); -const Dali::Vector4 DEFAULT_OPTION_TEXT( Dali::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); -const Dali::Vector4 DEFAULT_OPTION_TEXT_PRESSED( Dali::Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); -const std::string DEFAULT_POPUP_BACKGROUND_IMAGE( DALI_IMAGE_DIR "popup_bubble_bg.#.png" ); +const std::string DEFAULT_POPUP_BACKGROUND_IMAGE( DALI_IMAGE_DIR "selection-popup-bg#.png" ); const std::string OPTION_ICON_CLIPBOARD( DALI_IMAGE_DIR "copy_paste_icon_clipboard.png" ); const std::string OPTION_ICON_COPY( DALI_IMAGE_DIR "copy_paste_icon_copy.png" ); const std::string OPTION_ICON_CUT( DALI_IMAGE_DIR "copy_paste_icon_cut.png" ); @@ -61,20 +58,27 @@ const std::string OPTION_ICON_PASTE( DALI_IMAGE_DIR "copy_paste_icon_paste.png" const std::string OPTION_ICON_SELECT( DALI_IMAGE_DIR "copy_paste_icon_select.png" ); const std::string OPTION_ICON_SELECT_ALL( DALI_IMAGE_DIR "copy_paste_icon_select_all.png" ); -const Dali::Vector2 DEFAULT_POPUP_MAX_SIZE( 450.0f, 100.0f ); ///< The maximum size of the popup. - -const Dali::Vector2 OPTION_ICON_SIZE( 65.0f, 65.0f ); ///< The size of the icon. const float OPTION_MARGIN_WIDTH( 10.f ); ///< The margin between the right or lefts edge and the text or icon. -const float OPTION_MAX_WIDTH( 110.0f ); ///< The maximum width of the option //todo Make Property -const float OPTION_MIN_WIDTH( 86.0f ); ///< The minimum width of the option. //todo Make Property -const float POPUP_DIVIDER_WIDTH( 3.f ); ///< The size of the divider. -const Dali::Vector2 POPUP_TAIL_SIZE( 20.0f, 16.0f ); ///< The size of the tail. -const float POPUP_TAIL_Y_OFFSET( 5.f ); ///< The y offset of the tail (when its position is on the bottom). -const float POPUP_TAIL_TOP_Y_OFFSET( 3.f ); ///< The y offset of the tail (when its position is on the top). +#ifdef DGETTEXT_ENABLED -const float HIDE_POPUP_ANIMATION_DURATION( 0.2f ); ///< Duration of popup hide animation in seconds. -const float SHOW_POPUP_ANIMATION_DURATION( 0.2f ); ///< Duration of popup show animation in seconds. +#define POPUP_CUT_STRING GET_LOCALE_TEXT("IDS_COM_BODY_CUT") +#define POPUP_COPY_STRING GET_LOCALE_TEXT("IDS_COM_BODY_COPY") +#define POPUP_PASTE_STRING GET_LOCALE_TEXT("IDS_COM_BODY_PASTE") +#define POPUP_SELECT_STRING GET_LOCALE_TEXT("IDS_COM_SK_SELECT") +#define POPUP_SELECT_ALL_STRING GET_LOCALE_TEXT("IDS_COM_BODY_SELECT_ALL") +#define POPUP_CLIPBOARD_STRING GET_LOCALE_TEXT("IDS_COM_BODY_CLIPBOARD") + +#else + +#define POPUP_CUT_STRING "Cut" +#define POPUP_COPY_STRING "Copy" +#define POPUP_PASTE_STRING "Paste" +#define POPUP_SELECT_STRING "Select" +#define POPUP_SELECT_ALL_STRING "Select All" +#define POPUP_CLIPBOARD_STRING "Clipboard" + +#endif const char* const OPTION_SELECT_WORD = "option-select_word"; // "Select Word" popup option. const char* const OPTION_SELECT_ALL("option-select_all"); // "Select All" popup option. @@ -83,14 +87,30 @@ const char* const OPTION_COPY("option-copy"); const char* const OPTION_PASTE("option-paste"); // "Paste" popup option. const char* const OPTION_CLIPBOARD("option-clipboard"); // "Clipboard" popup option. -} // namespace +BaseHandle Create() +{ + return Toolkit::TextSelectionPopup::New(); +} -//// Comparison function for ButtonRequirement Priority -//bool TextSelectionPopup::PriorityCompare( ButtonRequirement const& a, ButtonRequirement const& b ) -//{ -// return a.priority < b.priority; -//} +// Setup properties, signals and actions using the type-registry. +DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionPopup, Toolkit::Control, Create ); + +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-max-size", VECTOR2, POPUP_MAX_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-min-size", VECTOR2, POPUP_MIN_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "option-max-size", VECTOR2, OPTION_MAX_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "option-min-size", VECTOR2, OPTION_MIN_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "option-divider-size", VECTOR2, OPTION_DIVIDER_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-clipboard-button-image", STRING, POPUP_CLIPBOARD_BUTTON_ICON_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-cut-button-image", STRING, POPUP_CUT_BUTTON_ICON_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-copy-button-image", STRING, POPUP_COPY_BUTTON_ICON_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-paste-button-image", STRING, POPUP_PASTE_BUTTON_ICON_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-select-button-image", STRING, POPUP_SELECT_BUTTON_ICON_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionPopup, "popup-select-all-button-image", STRING, POPUP_SELECT_ALL_BUTTON_ICON_IMAGE ) + +DALI_TYPE_REGISTRATION_END() + +} // namespace Dali::Toolkit::TextSelectionPopup TextSelectionPopup::New() { @@ -119,49 +139,63 @@ void TextSelectionPopup::SetProperty( BaseObject* object, Property::Index index, { case Toolkit::TextSelectionPopup::Property::POPUP_MAX_SIZE: { - impl.SetPopupMaxSize( value.Get< Vector2 >() ); + impl.SetDimensionToCustomise( POPUP_MAXIMUM_SIZE, value.Get< Vector2 >() ); break; } - case Toolkit::TextSelectionPopup::Property::POPUP_BACKGROUND_IMAGE: + case Toolkit::TextSelectionPopup::Property::POPUP_MIN_SIZE: { - ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_BACKGROUND, image ); + impl.SetDimensionToCustomise( POPUP_MINIMUM_SIZE, value.Get< Vector2 >() ); + break; + } + case Toolkit::TextSelectionPopup::Property::OPTION_MAX_SIZE: + { + impl.SetDimensionToCustomise( OPTION_MAXIMUM_SIZE, value.Get< Vector2 >() ); + break; + } + case Toolkit::TextSelectionPopup::Property::OPTION_MIN_SIZE: + { + impl.SetDimensionToCustomise( OPTION_MINIMUM_SIZE, value.Get< Vector2>() ); + break; + } + case Toolkit::TextSelectionPopup::Property::OPTION_DIVIDER_SIZE: + { + impl.SetDimensionToCustomise( OPTION_DIVIDER_SIZE, value.Get< Vector2>() ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_CLIPBOARD_BUTTON_ICON_IMAGE: { ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_CLIPBOARD_BUTTON, image ); + impl.SetButtonImage( CLIPBOARD, image ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_CUT_BUTTON_ICON_IMAGE: { ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_CUT_BUTTON_ICON, image ); + impl.SetButtonImage( CUT, image ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_COPY_BUTTON_ICON_IMAGE: { ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_COPY_BUTTON_ICON, image ); + impl.SetButtonImage( COPY, image ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_PASTE_BUTTON_ICON_IMAGE: { ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_PASTE_BUTTON_ICON, image ); + impl.SetButtonImage( PASTE, image ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_BUTTON_ICON_IMAGE: { ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_SELECT_BUTTON_ICON, image ); + impl.SetButtonImage( SELECT, image ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_ALL_BUTTON_ICON_IMAGE: { ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - impl.SetPopupImage( POPUP_SELECT_ALL_BUTTON_ICON, image ); + impl.SetButtonImage( SELECT_ALL, image ); break; } } // switch @@ -182,21 +216,27 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I { case Toolkit::TextSelectionPopup::Property::POPUP_MAX_SIZE: { - value = impl.GetPopupMaxSize(); + value = impl.GetDimensionToCustomise( POPUP_MAXIMUM_SIZE ); break; } - case Toolkit::TextSelectionPopup::Property::POPUP_BACKGROUND_IMAGE: + case Toolkit::TextSelectionPopup::Property::OPTION_MAX_SIZE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_BACKGROUND ) ); - if( image ) - { - value = image.GetUrl(); - } + value = impl.GetDimensionToCustomise( OPTION_MAXIMUM_SIZE ); + break; + } + case Toolkit::TextSelectionPopup::Property::OPTION_MIN_SIZE: + { + value = impl.GetDimensionToCustomise( OPTION_MINIMUM_SIZE ); + break; + } + case Toolkit::TextSelectionPopup::Property::OPTION_DIVIDER_SIZE: + { + value = impl.GetDimensionToCustomise( OPTION_DIVIDER_SIZE ); break; } case Toolkit::TextSelectionPopup::Property::POPUP_CLIPBOARD_BUTTON_ICON_IMAGE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_CLIPBOARD_BUTTON ) ); + ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( CLIPBOARD ) ); if( image ) { value = image.GetUrl(); @@ -205,7 +245,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I } case Toolkit::TextSelectionPopup::Property::POPUP_CUT_BUTTON_ICON_IMAGE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_CUT_BUTTON_ICON ) ); + ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( CUT ) ); if( image ) { value = image.GetUrl(); @@ -214,7 +254,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I } case Toolkit::TextSelectionPopup::Property::POPUP_COPY_BUTTON_ICON_IMAGE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_COPY_BUTTON_ICON ) ); + ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( COPY ) ); if( image ) { value = image.GetUrl(); @@ -223,7 +263,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I } case Toolkit::TextSelectionPopup::Property::POPUP_PASTE_BUTTON_ICON_IMAGE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_PASTE_BUTTON_ICON ) ); + ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( PASTE ) ); if( image ) { value = image.GetUrl(); @@ -232,7 +272,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I } case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_BUTTON_ICON_IMAGE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_SELECT_BUTTON_ICON ) ); + ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( SELECT ) ); if( image ) { value = image.GetUrl(); @@ -241,7 +281,7 @@ Property::Value TextSelectionPopup::GetProperty( BaseObject* object, Property::I } case Toolkit::TextSelectionPopup::Property::POPUP_SELECT_ALL_BUTTON_ICON_IMAGE: { - ResourceImage image = ResourceImage::DownCast( impl.GetPopupImage( POPUP_SELECT_ALL_BUTTON_ICON ) ); + ResourceImage image = ResourceImage::DownCast( impl.GetButtonImage( SELECT_ALL ) ); if( image ) { value = image.GetUrl(); @@ -258,106 +298,160 @@ void TextSelectionPopup::OnInitialize() CreatePopup(); } -void TextSelectionPopup::OnRelayout( const Vector2& size, RelayoutContainer& container ) +void TextSelectionPopup::SetDimensionToCustomise( const PopupCustomisations& settingToCustomise, const Size& dimension ) { + switch( settingToCustomise ) + { + case POPUP_MAXIMUM_SIZE : + { + Actor self = Self(); + mMaxSize = dimension; + if ( mToolbar ) + { + mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, mMaxSize ); + } + break; + } + case POPUP_MINIMUM_SIZE : + { + Actor self = Self(); + mMinSize = dimension; + // Option can not be smaller than this if only one. + break; + } + case OPTION_MAXIMUM_SIZE : + { + mOptionMaxSize = dimension; + // Option max size not currently currently supported + break; + } + case OPTION_MINIMUM_SIZE : + { + mOptionMinSize = dimension; + // Option min size not currently currently supported + break; + } + case OPTION_DIVIDER_SIZE : + { + mOptionDividerSize = dimension; + if ( mToolbar ) + { + // Resize Dividers not currently supported + } + break; + } + } // switch } -void TextSelectionPopup::SetPopupMaxSize( const Size& maxSize ) +Size TextSelectionPopup::GetDimensionToCustomise( const PopupCustomisations& settingToCustomise ) { - mMaxSize = maxSize; -} + switch( settingToCustomise ) + { + case POPUP_MAXIMUM_SIZE : + { + return mMaxSize; + } + case POPUP_MINIMUM_SIZE : + { + return mMinSize; + } + case OPTION_MAXIMUM_SIZE : + { + return mOptionMaxSize; + } + case OPTION_MINIMUM_SIZE : + { + return mOptionMinSize; + } + case OPTION_DIVIDER_SIZE : + { + return mOptionDividerSize; + } + } // switch -const Dali::Vector2& TextSelectionPopup::GetPopupMaxSize() const -{ - return mMaxSize; + return Size::ZERO; } -void TextSelectionPopup::SetPopupImage( PopupParts part, Dali::Image image ) +void TextSelectionPopup::SetButtonImage( Buttons button, Dali::Image image ) { - switch ( part ) - { - case POPUP_BACKGROUND : + switch ( button ) { - mBackgroundImage = image; - } break; - case POPUP_CLIPBOARD_BUTTON : + case CLIPBOARD: { mClipboardIconImage = image; } break; - case POPUP_CUT_BUTTON_ICON : + case CUT : { mCutIconImage = image; } break; - case POPUP_COPY_BUTTON_ICON : + case COPY : { mCopyIconImage = image; } break; - case POPUP_PASTE_BUTTON_ICON : + case PASTE : { mPasteIconImage = image; } break; - case POPUP_SELECT_BUTTON_ICON : + case SELECT : { mSelectIconImage = image; } break; - case POPUP_SELECT_ALL_BUTTON_ICON : + case SELECT_ALL : { mSelectAllIconImage = image; } break; - + default : + { + DALI_ASSERT_DEBUG( "TextSelectionPopup SetPopupImage Unknown Button" ); + } } // switch } -Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part ) +Dali::Image TextSelectionPopup::GetButtonImage( Buttons button ) { - switch ( part ) + switch ( button ) { - case POPUP_BACKGROUND : - { - return mBackgroundImage; - } - break; - case POPUP_CLIPBOARD_BUTTON : + case CLIPBOARD : { return mClipboardIconImage; } break; - case POPUP_CUT_BUTTON_ICON : + case CUT : { return mCutIconImage; } break; - case POPUP_COPY_BUTTON_ICON : + case COPY : { return mCopyIconImage; } break; - case POPUP_PASTE_BUTTON_ICON : + case PASTE : { return mPasteIconImage; } break; - case POPUP_SELECT_BUTTON_ICON : + case SELECT : { return mSelectIconImage; } break; - case POPUP_SELECT_ALL_BUTTON_ICON : + case SELECT_ALL : { return mSelectAllIconImage; } break; default : { - DALI_ASSERT_DEBUG( "Unknown Popup Part" ); + DALI_ASSERT_DEBUG( "TextSelectionPopup GetPopupImage Unknown Button" ); } } // switch @@ -373,66 +467,56 @@ Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part ) { mCutIconImage = ResourceImage::New( OPTION_ICON_CUT ); } - mOrderListOfButtons.push_back( ButtonRequirement( ButtonsCut, mCutOptionPriority, OPTION_CUT, GET_LOCALE_TEXT("IDS_COM_BODY_CUT"), mCutIconImage, true ) ); + mOrderListOfButtons.push_back( ButtonRequirement( CUT, mCutOptionPriority, OPTION_CUT, POPUP_CUT_STRING , mCutIconImage, false ) ); if ( !mCopyIconImage ) { mCopyIconImage = ResourceImage::New( OPTION_ICON_COPY ); } - mOrderListOfButtons.push_back( ButtonRequirement( ButtonsCopy, mCopyOptionPriority, OPTION_COPY, GET_LOCALE_TEXT("IDS_COM_BODY_COPY"), mCopyIconImage, true ) ); + mOrderListOfButtons.push_back( ButtonRequirement( COPY, mCopyOptionPriority, OPTION_COPY, POPUP_COPY_STRING, mCopyIconImage, false ) ); if ( !mPasteIconImage ) { mPasteIconImage = ResourceImage::New( OPTION_ICON_PASTE ); } - mOrderListOfButtons.push_back( ButtonRequirement( ButtonsPaste, mPasteOptionPriority, OPTION_PASTE, GET_LOCALE_TEXT("IDS_COM_BODY_PASTE"), mPasteIconImage, true ) ); + mOrderListOfButtons.push_back( ButtonRequirement( PASTE, mPasteOptionPriority, OPTION_PASTE, POPUP_PASTE_STRING, mPasteIconImage, false ) ); if ( !mSelectIconImage ) mSelectIconImage = ResourceImage::New( OPTION_ICON_SELECT ); - mOrderListOfButtons.push_back( ButtonRequirement( ButtonsSelect, mSelectOptionPriority, OPTION_SELECT_WORD, GET_LOCALE_TEXT("IDS_COM_SK_SELECT"), mSelectIconImage, true ) ); + mOrderListOfButtons.push_back( ButtonRequirement( SELECT, mSelectOptionPriority, OPTION_SELECT_WORD, POPUP_SELECT_STRING, mSelectIconImage, true ) ); if ( !mSelectAllIconImage ) { mSelectAllIconImage = ResourceImage::New( OPTION_ICON_SELECT_ALL ); } - mOrderListOfButtons.push_back( ButtonRequirement( ButtonsSelectAll, mSelectAllOptionPriority, OPTION_SELECT_ALL, GET_LOCALE_TEXT("IDS_COM_BODY_SELECT_ALL"), mSelectAllIconImage, true ) ); + mOrderListOfButtons.push_back( ButtonRequirement( SELECT_ALL, mSelectAllOptionPriority, OPTION_SELECT_ALL, POPUP_SELECT_ALL_STRING, mSelectAllIconImage, true ) ); if ( !mClipboardIconImage ) { mClipboardIconImage = ResourceImage::New( OPTION_ICON_CLIPBOARD ); } - mOrderListOfButtons.push_back( ButtonRequirement( ButtonsClipboard, mClipboardOptionPriority, OPTION_CLIPBOARD, GET_LOCALE_TEXT("IDS_COM_BODY_CLIPBOARD"), mClipboardIconImage, true ) ); + mOrderListOfButtons.push_back( ButtonRequirement( CLIPBOARD, mClipboardOptionPriority, OPTION_CLIPBOARD, POPUP_CLIPBOARD_STRING, mClipboardIconImage, false ) ); // Sort the buttons according their priorities. std::sort( mOrderListOfButtons.begin(), mOrderListOfButtons.end(), TextSelectionPopup::ButtonPriorityCompare() ); } - void TextSelectionPopup::CreateBackground() - { - if ( mBackgroundImage ) - { - SetBackgroundImage ( mBackgroundImage ); - } - - SetBackgroundColor( mBackgroundColor ); - } - - void TextSelectionPopup::AddOption( Dali::Toolkit::TableView& parent, const std::string& name, const std::string& caption, const Image iconImage, bool finalOption, bool showIcons, bool showCaption, std::size_t& indexInTable ) + void TextSelectionPopup::AddOption( const std::string& name, const std::string& caption, const Image iconImage, bool showDivider, bool showIcons, bool showCaption ) { // 1. Create the backgrounds for the popup option both normal and pressed. // Both containers will be added to a button. - Toolkit::TableView optionContainer = Toolkit::TableView::New( (showIcons)?2:1 , 1 ); + Toolkit::TableView optionContainer = Toolkit::TableView::New( (showIcons&showCaption)?2:1 , 1 ); optionContainer.SetDrawMode( DrawMode::OVERLAY ); - optionContainer.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); - optionContainer.SetMinimumSize( Vector2( OPTION_MIN_WIDTH, 0 ) ); + optionContainer.SetFitHeight( 0 ); optionContainer.SetFitWidth( 0 ); - Toolkit::TableView optionPressedContainer = Toolkit::TableView::New( (showIcons)?2:1 , 1 ); + Toolkit::TableView optionPressedContainer = Toolkit::TableView::New( (showIcons&showCaption)?2:1 , 1 ); optionPressedContainer.SetDrawMode( DrawMode::OVERLAY ); - optionPressedContainer.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); - optionPressedContainer.SetMinimumSize( Vector2( OPTION_MIN_WIDTH, 0 ) ); + optionPressedContainer.SetFitHeight( 0 ); optionPressedContainer.SetFitWidth( 0 ); + optionPressedContainer.SetBackgroundColor(Color::RED); //todo member variable + #ifdef DECORATOR_DEBUG optionContainer.SetName("optionContainer"); optionPressedContainer.SetName("optionPressedContainer"); @@ -441,112 +525,83 @@ Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part ) if ( showCaption ) { - Toolkit::TextLabel captionTextLabel = Toolkit::TextLabel::New(); - captionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption ); - optionContainer.SetFitHeight( 0 ); - - Toolkit::TextLabel pressedCaptionTextLabel = Toolkit::TextLabel::New(); - pressedCaptionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption ); - optionPressedContainer.SetFitHeight( 0 ); - - captionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH ); - captionTextLabel.SetMaximumSize( Vector2( OPTION_MAX_WIDTH - 2.f * OPTION_MARGIN_WIDTH , FLT_MAX ) ); //todo FLT_MAX Size negotiation feature needed - - pressedCaptionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::WIDTH ); - pressedCaptionTextLabel.SetMaximumSize( Vector2( OPTION_MAX_WIDTH - 2.f * OPTION_MARGIN_WIDTH , FLT_MAX) ); //todo FLT_MAX Size negotiation feature needed - - optionContainer.AddChild( captionTextLabel, Toolkit::TableView::CellPosition( 1, 0 ) ); // todo Labels need ellipsis or similar - optionPressedContainer.AddChild( pressedCaptionTextLabel, Toolkit::TableView::CellPosition( 1, 0 ) ); // todo Labels need ellipsis or similar + Toolkit::TextLabel captionTextLabel = Toolkit::TextLabel::New(); + captionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption ); + captionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); + + Toolkit::TextLabel pressedCaptionTextLabel = Toolkit::TextLabel::New(); + pressedCaptionTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, caption ); + pressedCaptionTextLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); + + Padding padding; + padding.left = 24.0f; + padding.right = 24.0f; + padding.top = 13.0f; + padding.bottom = 14.0f; + captionTextLabel.SetPadding( padding ); + pressedCaptionTextLabel.SetPadding( padding ); + + optionContainer.AddChild( captionTextLabel, Toolkit::TableView::CellPosition(( showIcons&showCaption)?1:0, 0 ) ); + optionPressedContainer.AddChild( pressedCaptionTextLabel, Toolkit::TableView::CellPosition(( showIcons&showCaption)?1:0, 0 ) ); } + // 3. Create the icons if ( showIcons ) { - // 3. Create the icons ImageActor pressedIcon = ImageActor::New( iconImage ); ImageActor icon = ImageActor::New( iconImage ); - icon.SetName("image-icon-2014"); + icon.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); pressedIcon.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); + icon.SetColor( mIconColor ); pressedIcon.SetColor( mIconPressedColor ); - optionContainer.SetFitHeight( 0 ); - optionPressedContainer.SetFitHeight( 0 ); + + if ( showCaption & showIcons ) + { + optionContainer.SetFitHeight( 1 ); + optionContainer.SetFitWidth( 1 ); + optionPressedContainer.SetFitHeight( 1 ); + optionPressedContainer.SetFitWidth( 1 ); + } + optionContainer.AddChild( icon, Toolkit::TableView::CellPosition( 0, 0 ) ); optionPressedContainer.AddChild( pressedIcon, Toolkit::TableView::CellPosition( 0, 0 ) ); + icon.SetPadding( Padding( 10.0f, 10.0f, 10.0f, 10.0f ) ); pressedIcon.SetPadding( Padding( 10.0f, 10.0f, 10.0f, 10.0f ) ); } - // 5. Create a option. + // 4. Create a option. Toolkit::PushButton option = Toolkit::PushButton::New(); option.SetName( name ); option.SetAnimationTime( 0.0f ); - option.SetSize( OPTION_ICON_SIZE ); + option.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); //option.ClickedSignal().Connect( this, &TextInputPopup::OnButtonPressed ); - // 6. Set the normal option image. + // 5. Set the normal option image. option.SetButtonImage( optionContainer ); - // 7. Set the pressed option image + // 6. Set the pressed option image option.SetSelectedImage( optionPressedContainer ); - // 9 Add option to table view - parent.SetFitWidth( indexInTable ); - parent.AddChild( option, Toolkit::TableView::CellPosition( 0, indexInTable ) ); - indexInTable++; + // 7 Add option to tool bar + mToolbar.AddOption( option ); - // 10. Add the divider - if( !finalOption ) + // 8. Add the divider + if( showDivider ) { - const Size size( POPUP_DIVIDER_WIDTH, 0.0f ); // Height FILL_TO_PARENT + const Size size( mOptionDividerSize.width, 0.0f ); // Height FILL_TO_PARENT ImageActor divider = Toolkit::CreateSolidColorActor( Color::WHITE ); - divider.SetSize( size ); divider.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::HEIGHT ); - parent.SetFitWidth( indexInTable ); - parent.AddChild( divider, Toolkit::TableView::CellPosition( 0, indexInTable ) ); - indexInTable++; + divider.SetColor( mLineColor ); + mToolbar.AddDivider( divider ); } } - void TextSelectionPopup::SetUpPopup() - { - Actor self = Self(); - self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); - - // Create Layer and Stencil. - mStencilLayer = Layer::New(); - mStencilLayer.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); - mStencilLayer.SetParentOrigin( ParentOrigin::CENTER ); - - ImageActor stencil = CreateSolidColorActor( Color::RED ); - stencil.SetDrawMode( DrawMode::STENCIL ); - stencil.SetVisible( true ); - stencil.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); - stencil.SetParentOrigin( ParentOrigin::CENTER ); - - Actor scrollview = Actor::New(); //todo make a scrollview - scrollview.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); - scrollview.SetParentOrigin( ParentOrigin::CENTER ); - - mTableOfButtons.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); - mTableOfButtons.SetFitHeight( 0 ); - mTableOfButtons.SetParentOrigin( ParentOrigin::CENTER ); - - mStencilLayer.Add( stencil ); - mStencilLayer.Add( scrollview ); - scrollview.Add( mTableOfButtons ); - self.Add( mStencilLayer ); - //self.Add ( mTableOfButtons ); - } - - void TextSelectionPopup::AddPopupOptions( bool createTail, bool showIcons, bool showCaptions ) + std::size_t TextSelectionPopup::GetNumberOfEnabledOptions() { - mContentSize = Vector2::ZERO; - - // Add the options into the buttons container. - - // 1. Determine how many buttons are active and should be added to container. std::size_t numberOfOptions = 0u; for( std::vector::const_iterator it = mOrderListOfButtons.begin(), endIt = mOrderListOfButtons.end(); ( it != endIt ); ++it ) { @@ -557,56 +612,59 @@ Dali::Image TextSelectionPopup::GetPopupImage( PopupParts part ) } } - // 2. Iterate list of buttons and add active ones. - std::size_t optionsAdded = 0u; - - numberOfOptions = ( numberOfOptions*2 ) - 1 ; // Last Option does not get a divider so -1 or if only one option then also no divider - - mTableOfButtons = Dali::Toolkit::TableView::New( 1, numberOfOptions ); + return numberOfOptions; + } + void TextSelectionPopup::AddPopupOptionsToToolbar( bool showIcons, bool showCaptions ) + { + // Iterate list of buttons and add active ones to Toolbar + std::size_t numberOfOptionsRequired = GetNumberOfEnabledOptions(); + std::size_t numberOfOptionsAdded = 0u; for( std::vector::const_iterator it = mOrderListOfButtons.begin(), endIt = mOrderListOfButtons.end(); ( it != endIt ); ++it ) { const ButtonRequirement& button( *it ); if ( button.enabled ) { - AddOption( mTableOfButtons, button.name, button.caption, button.icon, optionsAdded == numberOfOptions - 1, showIcons, showCaptions, optionsAdded ); // -1 to ignore the last divider + numberOfOptionsAdded++; + AddOption( button.name, button.caption, button.icon, ( numberOfOptionsAdded < numberOfOptionsRequired ) , showIcons, showCaptions ); } } } void TextSelectionPopup::CreatePopup() { - if ( !mStencilLayer ) + Actor self = Self(); + CreateOrderedListOfPopupOptions(); //todo Currently causes all options to be shown + self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + SetBackgroundImage( NinePatchImage::New( DEFAULT_POPUP_BACKGROUND_IMAGE ) ); + + if ( !mToolbar ) { - CreateOrderedListOfPopupOptions(); //todo Currently causes all options to be shown - CreateBackground(); - AddPopupOptions( true, true, false ); // todo false so not to show Labels until ellipses or similar possible. - SetUpPopup(); + mToolbar = Toolkit::TextSelectionToolbar::New(); + mToolbar.SetParentOrigin( ParentOrigin::CENTER ); + mToolbar.SetProperty( Toolkit::TextSelectionToolbar::Property::MAX_SIZE, mMaxSize ); + self.Add( mToolbar ); + AddPopupOptionsToToolbar( mShowIcons, mShowCaptions ); } - - mStencilLayer.RaiseToTop(); } TextSelectionPopup::TextSelectionPopup() -: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ), - mMaxSize ( DEFAULT_POPUP_MAX_SIZE ), - mVisiblePopUpSize( DEFAULT_POPUP_MAX_SIZE ), - mRequiredPopUpSize( DEFAULT_POPUP_MAX_SIZE ), - mBackgroundColor( DEFAULT_POPUP_BACKGROUND ), - mBackgroundPressedColor( DEFAULT_POPUP_BACKGROUND_PRESSED ), +: Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ), + mToolbar(), + mMaxSize(), + mMinSize(), + mOptionDividerSize( Size( 2.0f, 0.0f) ), mLineColor( DEFAULT_POPUP_LINE_COLOR ), mIconColor( DEFAULT_OPTION_ICON ), mIconPressedColor( DEFAULT_OPTION_ICON_PRESSED ), - mTextColor( DEFAULT_OPTION_TEXT ), - mTextPressedColor( DEFAULT_OPTION_TEXT_PRESSED ), mSelectOptionPriority( 1 ), mSelectAllOptionPriority ( 2 ), mCutOptionPriority ( 3 ), mCopyOptionPriority ( 4 ), mPasteOptionPriority ( 5 ), mClipboardOptionPriority( 6 ), - mShowIcons( true ), - mShowCaptions( false ) + mShowIcons( false ), + mShowCaptions( true ) { } @@ -620,3 +678,5 @@ TextSelectionPopup::~TextSelectionPopup() } // namespace Toolkit } // namespace Dali + + diff --git a/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h b/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h index 892c563..34c2235 100644 --- a/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h @@ -22,6 +22,7 @@ #include #include #include +#include // EXTERNAL INCLUDES #include @@ -38,15 +39,14 @@ namespace Internal namespace { -enum PopupParts + +enum PopupCustomisations { - POPUP_BACKGROUND, - POPUP_CLIPBOARD_BUTTON, - POPUP_CUT_BUTTON_ICON, - POPUP_COPY_BUTTON_ICON, - POPUP_PASTE_BUTTON_ICON, - POPUP_SELECT_BUTTON_ICON, - POPUP_SELECT_ALL_BUTTON_ICON, + POPUP_MAXIMUM_SIZE, + POPUP_MINIMUM_SIZE, + OPTION_MAXIMUM_SIZE, + OPTION_MINIMUM_SIZE, + OPTION_DIVIDER_SIZE }; } // namespace @@ -57,19 +57,19 @@ public: enum Buttons { - ButtonsCut, - ButtonsCopy, - ButtonsPaste, - ButtonsSelect, - ButtonsSelectAll, - ButtonsClipboard, - ButtonsEnumEnd + CUT, + COPY, + PASTE, + SELECT, + SELECT_ALL, + CLIPBOARD, + ENUM_END }; struct ButtonRequirement { ButtonRequirement() - : id( ButtonsEnumEnd ), + : id( ENUM_END ), priority( 0u ), name(), caption(), @@ -106,11 +106,6 @@ public: } }; -// static inline bool ButtonPriorityCompare( ButtonRequirement a, ButtonRequirement b ) -// { -// return a.priority < b.priority ? true : false; -// } - /** * @copydoc Dali::Toollkit::TextSelectionPopup::New() */ @@ -135,81 +130,55 @@ public: */ static Property::Value GetProperty( BaseObject* object, Property::Index index ); - void CreatePopup(); - - void DestroyPopup(); - private: // From Control /** * @copydoc Control::OnInitialize() */ - virtual void OnInitialize(); - -// /** -// * @copydoc Control::GetNaturalSize() -// */ -// virtual Vector3 GetNaturalSize(); -// -// /** -// * @copydoc Control::GetHeightForWidth() -// */ -// virtual float GetHeightForWidth( float width ); + virtual void OnInitialize(); - /** - * @copydoc Control::OnInitialize() - */ - virtual void OnRelayout( const Vector2& size, RelayoutContainer& container ); -// -// /** -// * Received for single & double taps -// */ -// virtual void OnTap( const TapGesture& tap ); -// -// /** -// * @copydoc Text::ControlInterface::RequestTextRelayout() -// */ -// virtual void RequestTextRelayout(); +private: // Implementation /** - * Set max size of Popup - * @param[in] maxSize Size (Vector2) + * @brief Method to set the dimension or dimension constraint on certain aspects of the Popup. + * + * @param[in] settingToCustomise The setting for the PopupCustomisations enum that can be customised + * @param[in] dimension The size to customise with */ - void SetPopupMaxSize( const Size& maxSize ); + void SetDimensionToCustomise( const PopupCustomisations& settingToCustomise, const Size& dimension ); /** - * Get Max size of Popup - * @return Vector2 the max size of the Popup + * @brief Method to get the dimension or dimension constraint on certain aspects of the Popup that was previously customised + * + * @param[in] setting The setting from the PopupCustomisations enum */ - const Dali::Vector2& GetPopupMaxSize() const; + Size GetDimensionToCustomise( const PopupCustomisations& setting ); /** - * @brief Sets the image for the given part of the Popup. + * @brief Sets the image for the given button of the Popup. * - * @param[in] part The part of the pop from the Enum PopupParts + * @param[in] button The button the image should be used for from the Buttons Enum. * @param[in] image The image to use. */ - void SetPopupImage( PopupParts part, Dali::Image image ); + void SetButtonImage( Buttons button, Dali::Image image ); /** - * @brief Retrieves the image of the given part used by the popup + * @brief Retrieves the image of the given button used by the popup * - * @param[in] part The part of the popup - * @return The image used for that part. + * @param[in] button The button to get the image from + * @return The image used for that button. */ - Dali::Image GetPopupImage( PopupParts part ); + Dali::Image GetButtonImage( Buttons button ); void CreateOrderedListOfPopupOptions(); - void CreateBackground(); - - void AddOption( Dali::Toolkit::TableView& parent, const std::string& name, const std::string& caption, const Image iconImage, bool finalOption, bool showIcons, bool showCaption, std::size_t& indexInTable ); + void AddOption( const std::string& name, const std::string& caption, const Image iconImage, bool showDivider, bool showIcons, bool showCaption ); - void SetUpPopup(); + std::size_t GetNumberOfEnabledOptions(); - void AddPopupOptions( bool createTail, bool showIcons, bool showCaptions ); + void AddPopupOptionsToToolbar( bool showIcons, bool showCaptions ); -private: // Implementation + void CreatePopup(); /** * Construct a new TextField. @@ -229,11 +198,12 @@ private: private: // Data - Dali::Toolkit::TableView mTableOfButtons; // Actor which holds all the buttons, sensitivity can be set on buttons via this actor - Layer mStencilLayer; // Layer to enable clipping when buttons exceed popup - // Images to be used by the Popup - Image mBackgroundImage; + Dali::Toolkit::TextSelectionToolbar mToolbar; + + Dali::Toolkit::TableView mTableOfButtons; // Actor which holds all the buttons, sensitivity can be set on buttons via this actor + + // Images to be used by the Popup buttons Image mCutIconImage; Image mCopyIconImage; Image mPasteIconImage; @@ -241,29 +211,18 @@ private: // Data Image mSelectIconImage; Image mSelectAllIconImage; - ImageActor mBackground; // The background popup panel - ImageActor mTail; // The tail for the popup - ImageActor mTailEffect; //todo remove // the tail effect - ImageActor mTailLine; //todo remove // The border/outline around the tail - - Size mMaxSize; // Max size of the Popup - Size mVisiblePopUpSize; // Visible Size of popup excluding content that needs scrolling. - Size mRequiredPopUpSize; // Total size of popup including any invisible margin + Size mMaxSize; // Maximum size of the Popup + Size mMinSize; // Minimum size of the Popup - Vector4 mNinePatchMargins; // Margins between the edge of the cropped image and the nine patch rect (left, right, top, bottom). - - Size mContentSize; // Size of Content (i.e. Buttons) - //Animation mAnimation; // Popup Hide/Show animation. + Size mOptionMaxSize; // Maximum size of an Option button + Size mOptionMinSize; // Minimum size of an Option button + Size mOptionDividerSize; // Size of divider line std::vector mOrderListOfButtons; // List of buttons in the order to be displayed and a flag to indicate if needed. - Vector4 mBackgroundColor; // Color of the background of the text input popup - Vector4 mBackgroundPressedColor; // Color of the option background. Vector4 mLineColor; // Color of the line around the text input popup Vector4 mIconColor; // Color of the popup icon. Vector4 mIconPressedColor; // Color of the popup icon when pressed. - Vector4 mTextColor; // Color of the popup text. - Vector4 mTextPressedColor; // Color of the popup text when pressed. // Priority of Options/Buttons in the Cut and Paste pop-up, higher priority buttons are displayed first, left to right. std::size_t mSelectOptionPriority; // Position of Select Button @@ -305,3 +264,4 @@ inline const Toolkit::Internal::TextSelectionPopup& GetImpl( const Toolkit::Text } // namespace Dali #endif // __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_POPUP_H__ + diff --git a/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp new file mode 100644 index 0000000..4b25f77 --- /dev/null +++ b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include + +// INTERNAL INCLUDES +#include + +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include +#include + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +namespace +{ +const Dali::Vector2 DEFAULT_MAX_SIZE( 400.0f, 65.0f ); ///< The maximum size of the Toolbar. + +} // namespace + +BaseHandle Create() +{ + return Toolkit::TextSelectionToolbar::New(); +} + +// Setup properties, signals and actions using the type-registry. + +DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionToolbar, Toolkit::Control, Create ); + +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "max-size", VECTOR2, MAX_SIZE ) + +DALI_TYPE_REGISTRATION_END() + +Dali::Toolkit::TextSelectionToolbar TextSelectionToolbar::New() +{ + // Create the implementation, temporarily owned by this handle on stack + IntrusivePtr< TextSelectionToolbar > impl = new TextSelectionToolbar(); + + // Pass ownership to CustomActor handle + Dali::Toolkit::TextSelectionToolbar handle( *impl ); + + // Second-phase init of the implementation + // This can only be done after the CustomActor connection has been made... + impl->Initialize(); + + return handle; +} + +void TextSelectionToolbar::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value ) +{ + Toolkit::TextSelectionToolbar selectionPopup = Toolkit::TextSelectionToolbar::DownCast( Dali::BaseHandle( object ) ); + + if( selectionPopup ) + { + TextSelectionToolbar& impl( GetImpl( selectionPopup ) ); + + switch( index ) + { + case Toolkit::TextSelectionToolbar::Property::MAX_SIZE: + { + impl.SetPopupMaxSize( value.Get< Vector2 >() ); + break; + } + + } // switch + } // TextSelectionToolbar +} + +Property::Value TextSelectionToolbar::GetProperty( BaseObject* object, Property::Index index ) +{ + Property::Value value; + + Toolkit::TextSelectionToolbar selectionPopup = Toolkit::TextSelectionToolbar::DownCast( Dali::BaseHandle( object ) ); + + if( selectionPopup ) + { + TextSelectionToolbar& impl( GetImpl( selectionPopup ) ); + + switch( index ) + { + case Toolkit::TextSelectionToolbar::Property::MAX_SIZE: + { + value = impl.GetPopupMaxSize(); + break; + } + } // switch + } + return value; +} + +void TextSelectionToolbar::OnInitialize() +{ + SetUp(); +} + +void TextSelectionToolbar::SetPopupMaxSize( const Size& maxSize ) +{ + mMaxSize = maxSize; +} + +const Dali::Vector2& TextSelectionToolbar::GetPopupMaxSize() const +{ + return mMaxSize; +} + +void TextSelectionToolbar::SetUp() +{ + Actor self = Self(); + self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + + // Create Layer and Stencil. + mStencilLayer = Layer::New(); + mStencilLayer.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + mStencilLayer.SetParentOrigin( ParentOrigin::CENTER ); + mStencilLayer.SetMaximumSize( mMaxSize ); + + ImageActor stencil = CreateSolidColorActor( Color::RED ); + stencil.SetDrawMode( DrawMode::STENCIL ); + stencil.SetVisible( true ); + stencil.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + stencil.SetParentOrigin( ParentOrigin::CENTER ); + + Actor scrollview = Actor::New(); //todo make a scrollview + scrollview.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + scrollview.SetParentOrigin( ParentOrigin::CENTER ); + + // Toolbar needs at least one option, adding further options with increase it's size + mTableOfButtons = Dali::Toolkit::TableView::New( 1, 1 ); + mTableOfButtons.SetFitHeight( 0 ); + mTableOfButtons.SetParentOrigin( ParentOrigin::CENTER ); + + mStencilLayer.Add( stencil ); + mStencilLayer.Add( scrollview ); + scrollview.Add( mTableOfButtons ); + self.Add( mStencilLayer ); + + mStencilLayer.RaiseToTop(); +} + +void TextSelectionToolbar::AddOption( Actor& option ) +{ + mTableOfButtons.AddChild( option, Toolkit::TableView::CellPosition( 0, mIndexInTable ) ); + mTableOfButtons.SetFitWidth( mIndexInTable ); + mIndexInTable++; +} + +void TextSelectionToolbar::AddDivider( Actor& divider ) +{ + AddOption( divider ); + mDividerIndexes.PushBack( mIndexInTable ); +} + +void TextSelectionToolbar::ResizeDividers( Size& size ) +{ + for( unsigned int i = 0; i < mDividerIndexes.Count(); ++i ) + { + Actor divider = mTableOfButtons.GetChildAt( Toolkit::TableView::CellPosition( 0, mDividerIndexes[ i ] ) ); + divider.SetSize( size ); + } + RelayoutRequest(); +} + +TextSelectionToolbar::TextSelectionToolbar() +: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ), + mMaxSize ( DEFAULT_MAX_SIZE ), + mIndexInTable( 0 ), + mDividerIndexes() +{ +} + +TextSelectionToolbar::~TextSelectionToolbar() +{ +} + + +} // namespace Internal + +} // namespace Toolkit + +} // namespace Dali diff --git a/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h new file mode 100644 index 0000000..fb85e95 --- /dev/null +++ b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h @@ -0,0 +1,165 @@ +#ifndef __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__ +#define __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__ + +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// INTERNAL INCLUDES +#include +#include +#include + +// EXTERNAL INCLUDES +#include + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +namespace +{ + +} // namespace + +class TextSelectionToolbar : public Control +{ +public: + + /** + * @copydoc Dali::Toollkit::TextSelectionToolbar::New() + */ + static Toolkit::TextSelectionToolbar New(); + + // Properties + + /** + * @brief Called when a property of an object of this type is set. + * @param[in] object The object whose property is set. + * @param[in] index The property index. + * @param[in] value The new property value. + */ + static void SetProperty( BaseObject* object, Property::Index index, const Property::Value& value ); + + /** + * @brief Called to retrieve a property of an object of this type. + * + * @param[in] object The object whose property is to be retrieved. + * @param[in] index The property index. + * @return The current value of the property. + */ + static Property::Value GetProperty( BaseObject* object, Property::Index index ); + + /** + * @copydoc TextSelectionToolbar::AddOption + */ + void AddOption( Actor& option ); + + /** + * @copydoc TextSelectionToolbar::AddDivider + */ + void AddDivider( Actor& divider ); + + /** + * @copydoc ResizeDividers + */ + void ResizeDividers( Size& size ); + +private: // From Control + + /** + * @copydoc Control::OnInitialize() + */ + virtual void OnInitialize(); + + /** + * @brief Set max size of Popup + * @param[in] maxSize Size (Vector2) + */ + void SetPopupMaxSize( const Size& maxSize ); + + /** + * @brief Get Max size of Popup + * @return Vector2 the max size of the Popup + */ + const Dali::Vector2& GetPopupMaxSize() const; + + /** + * @brief Set up the parts that make the Toolbar + */ + void SetUp(); + +private: // Implementation + + /** + * Construct a new TextField. + */ + TextSelectionToolbar(); + + /** + * A reference counted object may only be deleted by calling Unreference() + */ + virtual ~TextSelectionToolbar(); + +private: + + // Undefined copy constructor and assignment operators + TextSelectionToolbar(const TextSelectionToolbar&); + TextSelectionToolbar& operator=(const TextSelectionToolbar& rhs); + +private: // Data + + Dali::Toolkit::TableView mTableOfButtons; // Actor which holds all the buttons, sensitivity can be set on buttons via this actor + Layer mStencilLayer; // Layer to enable clipping when buttons exceed popup + + Size mMaxSize; // Max size of the Toolbar + unsigned int mIndexInTable; // Index in table to add option + Dali::Vector< unsigned int > mDividerIndexes; // Vector of indexes in the Toolbar that contain dividers. + +}; + +} // namespace Internal + +// Helpers for public-api forwarding methods + +inline Toolkit::Internal::TextSelectionToolbar& GetImpl( Toolkit::TextSelectionToolbar& textSelectionToolbar ) +{ + DALI_ASSERT_ALWAYS( textSelectionToolbar ); + + Dali::RefObject& handle = textSelectionToolbar.GetImplementation(); + + return static_cast(handle); +} + +inline const Toolkit::Internal::TextSelectionToolbar& GetImpl( const Toolkit::TextSelectionToolbar& textSelectionToolbar ) +{ + DALI_ASSERT_ALWAYS( textSelectionToolbar ); + + const Dali::RefObject& handle = textSelectionToolbar.GetImplementation(); + + return static_cast(handle); +} + +} // namespace Toolkit + +} // namespace Dali + +#endif // __DALI_TOOLKIT_INTERNAL_TEXT_SELECTION_TOOLBAR_H__ diff --git a/dali-toolkit/internal/file.list b/dali-toolkit/internal/file.list index c1536f0..f5a9b35 100644 --- a/dali-toolkit/internal/file.list +++ b/dali-toolkit/internal/file.list @@ -46,6 +46,7 @@ toolkit_src_files = \ $(toolkit_src_dir)/controls/text-controls/text-field-impl.cpp \ $(toolkit_src_dir)/controls/text-controls/text-label-impl.cpp \ $(toolkit_src_dir)/controls/text-controls/text-selection-popup-impl.cpp \ + $(toolkit_src_dir)/controls/text-controls/text-selection-toolbar-impl.cpp \ $(toolkit_src_dir)/controls/tool-bar/tool-bar-impl.cpp \ $(toolkit_src_dir)/focus-manager/accessibility-focus-manager-impl.cpp \ $(toolkit_src_dir)/focus-manager/keyboard-focus-manager-impl.cpp \ diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 18d7930..2c59665 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -128,7 +128,7 @@ EventData::EventData( DecoratorPtr decorator ) mDecoratorUpdated( false ), mCursorBlinkEnabled( true ), mGrabHandleEnabled( true ), - mGrabHandlePopupEnabled( false ), + mGrabHandlePopupEnabled( true ), mSelectionEnabled( false ), mHorizontalScrollingEnabled( true ), mVerticalScrollingEnabled( false ), @@ -532,7 +532,7 @@ void Controller::Impl::OnHandleEvent( const Event& event ) if( Event::GRAB_HANDLE_EVENT == event.type ) { - ChangeState ( EventData::EDITING ); + ChangeState ( EventData::GRAB_HANDLE_PANNING ); if( handleNewPosition != mEventData->mPrimaryCursorPosition ) { @@ -542,6 +542,8 @@ void Controller::Impl::OnHandleEvent( const Event& event ) } else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type ) { + ChangeState ( EventData::SELECTION_HANDLE_PANNING ); + if( handleNewPosition != mEventData->mLeftSelectionPosition ) { mEventData->mLeftSelectionPosition = handleNewPosition; @@ -550,6 +552,8 @@ void Controller::Impl::OnHandleEvent( const Event& event ) } else if( Event::RIGHT_SELECTION_HANDLE_EVENT == event.type ) { + ChangeState ( EventData::SELECTION_HANDLE_PANNING ); + if( handleNewPosition != mEventData->mRightSelectionPosition ) { mEventData->mRightSelectionPosition = handleNewPosition; @@ -560,14 +564,12 @@ void Controller::Impl::OnHandleEvent( const Event& event ) else if( ( HANDLE_RELEASED == state ) || ( HANDLE_STOP_SCROLLING == state ) ) { - if( mEventData->mGrabHandlePopupEnabled ) - { - ChangeState( EventData::EDITING_WITH_POPUP ); - } if( Event::GRAB_HANDLE_EVENT == event.type ) { mEventData->mUpdateCursorPosition = true; + ChangeState( EventData::EDITING_WITH_POPUP ); + if( HANDLE_STOP_SCROLLING == state ) { // The event.p2 and event.p3 are in decorator coords. Need to transforms to text coords. @@ -579,6 +581,10 @@ void Controller::Impl::OnHandleEvent( const Event& event ) mEventData->mScrollAfterUpdateCursorPosition = true; } } + else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type || Event::RIGHT_SELECTION_HANDLE_EVENT ) + { + ChangeState( EventData::SELECTING ); + } mEventData->mDecoratorUpdated = true; } else if( HANDLE_SCROLLING == state ) @@ -590,7 +596,16 @@ void Controller::Impl::OnHandleEvent( const Event& event ) ClampHorizontalScroll( actualSize ); - mEventData->mDecoratorUpdated = true; + if( Event::GRAB_HANDLE_EVENT == event.type ) + { + ChangeState( EventData::GRAB_HANDLE_PANNING ); + } + else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type || Event::RIGHT_SELECTION_HANDLE_EVENT ) + { + ChangeState( EventData::SELECTION_HANDLE_PANNING ); + } + + mEventData->mDecoratorUpdated = true; } } @@ -659,6 +674,10 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); + if( mEventData->mGrabHandlePopupEnabled ) + { + mEventData->mDecorator->SetPopupActive( true ); + } mEventData->mDecoratorUpdated = true; } else if( EventData::EDITING == mEventData->mState ) @@ -672,6 +691,10 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + if( mEventData->mGrabHandlePopupEnabled ) + { + mEventData->mDecorator->SetPopupActive( false ); + } mEventData->mDecoratorUpdated = true; } else if( EventData::EDITING_WITH_POPUP == mEventData->mState ) @@ -681,11 +704,14 @@ void Controller::Impl::ChangeState( EventData::State newState ) { mEventData->mDecorator->StartCursorBlink(); } - mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); if( mEventData->mSelectionEnabled ) { - mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); - mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + } + else + { + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); } if( mEventData->mGrabHandlePopupEnabled ) { @@ -693,6 +719,35 @@ void Controller::Impl::ChangeState( EventData::State newState ) } mEventData->mDecoratorUpdated = true; } + else if ( EventData::SELECTION_HANDLE_PANNING == mEventData->mState ) + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_NONE ); + mEventData->mDecorator->StopCursorBlink(); + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); + if( mEventData->mGrabHandlePopupEnabled ) + { + mEventData->mDecorator->SetPopupActive( false ); + } + mEventData->mDecoratorUpdated = true; + } + else if ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY ); + if( mEventData->mCursorBlinkEnabled ) + { + mEventData->mDecorator->StartCursorBlink(); + } + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + if( mEventData->mGrabHandlePopupEnabled ) + { + mEventData->mDecorator->SetPopupActive( false ); + } + mEventData->mDecoratorUpdated = true; + } } } diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index fa502a7..1a797b3 100644 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -100,7 +100,9 @@ struct EventData INACTIVE, SELECTING, EDITING, - EDITING_WITH_POPUP + EDITING_WITH_POPUP, + GRAB_HANDLE_PANNING, + SELECTION_HANDLE_PANNING }; EventData( DecoratorPtr decorator ); diff --git a/dali-toolkit/styles/dali-toolkit-default-theme.json b/dali-toolkit/styles/dali-toolkit-default-theme.json index f850715..fcfae07 100644 --- a/dali-toolkit/styles/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/dali-toolkit-default-theme.json @@ -37,6 +37,12 @@ distributing this software or its derivatives. "font-style":"Regular", "point-size":18 }, + "textselectionpopup": + { + "popup-max-size":[400,100], + "popup-min-size":[100,65], + "background-color":[0.0,0.0,0.0,1.0] + }, "textfield": { "font-family":"HelveticaNeue", diff --git a/dali-toolkit/styles/mobile/dali-toolkit-default-theme.json b/dali-toolkit/styles/mobile/dali-toolkit-default-theme.json index 8deaa50..7c4099e 100644 --- a/dali-toolkit/styles/mobile/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/mobile/dali-toolkit-default-theme.json @@ -84,7 +84,12 @@ distributing this software or its derivatives. { "point-size":10 }, - + "textselectionpopup": + { + "popup-max-size":[400,100], + "popup-min-size":[100,65], + "background-color":[0.0,0.0,0.0,1.0] + }, "scrollview": { "overshoot-effect-color":"B018"