From 26cf38abf480059f0365527c32bce88c8a950d50 Mon Sep 17 00:00:00 2001 From: Victor Cebollada Date: Tue, 7 Feb 2017 17:07:14 +0000 Subject: [PATCH] Added scroll-bar to text selection toolbar Change-Id: I93f87fcb2471c85ef251a3b396130677b0a7e070 Signed-off-by: Victor Cebollada --- .../text-controls/text-selection-toolbar.h | 2 + .../controls/scroll-bar/scroll-bar-impl.cpp | 1 + .../scrollable/scroll-view/scroll-view-impl.cpp | 57 +++++++++++++----- .../scrollable/scroll-view/scroll-view-impl.h | 4 ++ .../text-controls/text-selection-toolbar-impl.cpp | 69 ++++++++++++++++++++++ .../text-controls/text-selection-toolbar-impl.h | 23 +++++++- .../1920x1080/dali-toolkit-default-theme.json | 7 +++ .../styles/480x800/dali-toolkit-default-theme.json | 7 +++ .../720x1280/dali-toolkit-default-theme.json | 7 +++ 9 files changed, 162 insertions(+), 15 deletions(-) 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 index 0a3b941..26d81a4 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h @@ -64,6 +64,8 @@ public: { MAX_SIZE = PROPERTY_START_INDEX, ///< name "maxSize", The maximum size the Popup can be, type VECTOR2 ENABLE_OVERSHOOT, ///< name "enableOvershoot", Whether the overshoot image is enabled, type BOOLEAN + ENABLE_SCROLL_BAR, ///< name "enableScrollBar", Whether the scroll-bar is enabled, type BOOLEAN + SCROLL_BAR_PADDING, ///< name "scrollBarPadding", The padding used to position the scroll bar, type VECTOR2 SCROLL_VIEW, ///< name "scrollView", Properties to set on scroll view type Property::Map }; }; diff --git a/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp b/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp index ddf5738..e3564df 100755 --- a/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp +++ b/dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp @@ -235,6 +235,7 @@ void ScrollBar::CreateDefaultIndicatorActor() indicator.SetParentOrigin( ParentOrigin::TOP_LEFT ); indicator.SetAnchorPoint( AnchorPoint::TOP_LEFT ); indicator.SetStyleName( "ScrollBarIndicator" ); + indicator.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR ); SetScrollIndicator(indicator); } diff --git a/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp b/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp index 3330f13..069d5b6 100644 --- a/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp +++ b/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp @@ -658,7 +658,8 @@ ScrollView::ScrollView() mAlterChild(false), mDefaultMaxOvershoot(true), mCanScrollHorizontal(true), - mCanScrollVertical(true) + mCanScrollVertical(true), + mTransientScrollBar(true) { } @@ -1960,24 +1961,33 @@ void ScrollView::OnChildAdd(Actor& child) ScrollBase::OnChildAdd( child ); Dali::Toolkit::ScrollBar scrollBar = Dali::Toolkit::ScrollBar::DownCast(child); - if(scrollBar) + if( scrollBar ) { - mInternalActor.Add(scrollBar); - if(scrollBar.GetScrollDirection() == Toolkit::ScrollBar::Horizontal) + mScrollBar = scrollBar; + scrollBar.SetName("ScrollBar"); + + mInternalActor.Add( scrollBar ); + if( scrollBar.GetScrollDirection() == Toolkit::ScrollBar::Horizontal ) { - scrollBar.SetScrollPropertySource(Self(), - Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_X, - Toolkit::Scrollable::Property::SCROLL_POSITION_MIN_X, - Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_MAX_X, - Toolkit::ScrollView::Property::SCROLL_DOMAIN_SIZE_X); + scrollBar.SetScrollPropertySource( Self(), + Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_X, + Toolkit::Scrollable::Property::SCROLL_POSITION_MIN_X, + Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_MAX_X, + Toolkit::ScrollView::Property::SCROLL_DOMAIN_SIZE_X ); } else { - scrollBar.SetScrollPropertySource(Self(), - Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_Y, - Toolkit::Scrollable::Property::SCROLL_POSITION_MIN_Y, - Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y, - Toolkit::ScrollView::Property::SCROLL_DOMAIN_SIZE_Y); + scrollBar.SetScrollPropertySource( Self(), + Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_Y, + Toolkit::Scrollable::Property::SCROLL_POSITION_MIN_Y, + Toolkit::ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y, + Toolkit::ScrollView::Property::SCROLL_DOMAIN_SIZE_Y ); + } + + if( mTransientScrollBar ) + { + scrollBar.SetVisible( false ); + scrollBar.HideIndicator(); } } else if(mAlterChild) @@ -2476,6 +2486,19 @@ void ScrollView::OnPan( const PanGesture& gesture ) self.SetProperty( Toolkit::ScrollView::Property::START_PAGE_POSITION, Vector3(gesture.position.x, gesture.position.y, 0.0f) ); UpdateMainInternalConstraint(); + Toolkit::ScrollBar scrollBar = mScrollBar.GetHandle(); + if( scrollBar && mTransientScrollBar ) + { + Vector3 size = Self().GetCurrentSize(); + const Toolkit::RulerDomain& rulerDomainX = mRulerX->GetDomain(); + const Toolkit::RulerDomain& rulerDomainY = mRulerY->GetDomain(); + + if( ( rulerDomainX.max > size.width ) || ( rulerDomainY.max > size.height ) ) + { + scrollBar.SetVisible( true ); + scrollBar.ShowIndicator(); + } + } break; } @@ -2510,6 +2533,12 @@ void ScrollView::OnPan( const PanGesture& gesture ) { mScrollMainInternalPrePositionConstraint.Remove(); } + + Toolkit::ScrollBar scrollBar = mScrollBar.GetHandle(); + if( scrollBar && mTransientScrollBar ) + { + scrollBar.HideIndicator(); + } } else { diff --git a/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h b/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h index 9a16624..485d508 100644 --- a/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h +++ b/dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h @@ -22,9 +22,11 @@ #include #include #include +#include // INTERNAL INCLUDES #include +#include #include #include #include @@ -937,6 +939,7 @@ private: Constraint mScrollMainInternalPrePositionMaxConstraint; ScrollOvershootIndicatorPtr mOvershootIndicator; + WeakHandle mScrollBar; Toolkit::ScrollView::SnapStartedSignalType mSnapStartedSignal; @@ -954,6 +957,7 @@ private: bool mDefaultMaxOvershoot:1; ///< Whether to use default max overshoot or application defined one bool mCanScrollHorizontal:1; ///< Local value of our property to check against bool mCanScrollVertical:1; ///< Local value of our property to check against + bool mTransientScrollBar:1; ///< True if scroll-bar should be automatically show/hidden during/after panning }; } // namespace Internal 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 index cdd2226..317dbf9 100644 --- a/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp @@ -42,6 +42,8 @@ namespace Internal namespace { +const Dali::Vector2 DEFAULT_SCROLL_BAR_PADDING( 8.0f, 6.0f ); + BaseHandle Create() { return Toolkit::TextSelectionToolbar::New(); @@ -53,6 +55,8 @@ DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionToolbar, Toolkit::Control, C DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "maxSize", VECTOR2, MAX_SIZE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "enableOvershoot", BOOLEAN, ENABLE_OVERSHOOT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "enableScrollBar", BOOLEAN, ENABLE_SCROLL_BAR ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "scrollBarPadding", VECTOR2, SCROLL_BAR_PADDING ) DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "scrollView", MAP, SCROLL_VIEW ) DALI_TYPE_REGISTRATION_END() @@ -98,6 +102,16 @@ void TextSelectionToolbar::SetProperty( BaseObject* object, Property::Index inde impl.mScrollView.SetOvershootEnabled( value.Get< bool >() ); break; } + case Toolkit::TextSelectionToolbar::Property::ENABLE_SCROLL_BAR: + { + impl.SetUpScrollBar( value.Get< bool >() ); + break; + } + case Toolkit::TextSelectionToolbar::Property::SCROLL_BAR_PADDING: + { + impl.SetScrollBarPadding( value.Get< Vector2 >() ); + break; + } case Toolkit::TextSelectionToolbar::Property::SCROLL_VIEW: { // Get a Property::Map from the property if possible. @@ -134,6 +148,16 @@ Property::Value TextSelectionToolbar::GetProperty( BaseObject* object, Property: value = impl.mScrollView.IsOvershootEnabled(); break; } + case Toolkit::TextSelectionToolbar::Property::ENABLE_SCROLL_BAR: + { + value = impl.mScrollBar ? true : false; + break; + } + case Toolkit::TextSelectionToolbar::Property::SCROLL_BAR_PADDING: + { + value = impl.GetScrollBarPadding(); + break; + } } // switch } return value; @@ -149,6 +173,12 @@ void TextSelectionToolbar::OnRelayout( const Vector2& size, RelayoutContainer& c float width = std::max ( mTableOfButtons.GetNaturalSize().width, size.width ); mRulerX->SetDomain( RulerDomain( 0.0, width, true ) ); mScrollView.SetRulerX( mRulerX ); + + if( mScrollBar ) + { + float barWidth = std::min( mTableOfButtons.GetNaturalSize().width, size.width ) - 2.f * mScrollBarPadding.x; + mScrollBar.SetSize( Vector2( 0.0f, barWidth ) ); + } } void TextSelectionToolbar::SetPopupMaxSize( const Size& maxSize ) @@ -216,6 +246,29 @@ void TextSelectionToolbar::SetUp() self.Add( mToolbarLayer ); } +void TextSelectionToolbar::SetUpScrollBar( bool enable ) +{ + if( enable ) + { + if( ! mScrollBar ) + { + mScrollBar = Toolkit::ScrollBar::New( Toolkit::ScrollBar::Horizontal ); + mScrollBar.SetName( "Text popup scroll bar" ); + mScrollBar.SetParentOrigin( ParentOrigin::BOTTOM_LEFT ); + mScrollBar.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + mScrollBar.SetPosition( mScrollBarPadding.x, -mScrollBarPadding.y ); + mScrollBar.SetResizePolicy( Dali::ResizePolicy::FIT_TO_CHILDREN, Dali::Dimension::WIDTH ); + mScrollBar.SetOrientation( Quaternion( Radian( 1.5f * Math::PI ), Vector3::ZAXIS ) ); + mScrollBar.GetPanGestureDetector().DetachAll(); + mScrollView.Add( mScrollBar ); + } + } + else + { + UnparentAndReset( mScrollBar ); + } +} + void TextSelectionToolbar::OnScrollStarted( const Vector2& position ) { mTableOfButtons.SetSensitive( false ); @@ -254,6 +307,17 @@ void TextSelectionToolbar::RaiseAbove( Layer target ) mToolbarLayer.RaiseAbove( target ); } +void TextSelectionToolbar::SetScrollBarPadding( const Vector2& padding ) +{ + mScrollBarPadding = padding; + if( mScrollBar ) + { + mScrollBar.SetPosition( mScrollBarPadding.x, -mScrollBarPadding.y ); + } + + RelayoutRequest(); +} + void TextSelectionToolbar::ConfigureScrollview( const Property::Map& properties ) { // Set any properties specified for the label by iterating through all property key-value pairs. @@ -274,10 +338,15 @@ void TextSelectionToolbar::ConfigureScrollview( const Property::Map& properties RelayoutRequest(); } +const Vector2& TextSelectionToolbar::GetScrollBarPadding() const +{ + return mScrollBarPadding; +} TextSelectionToolbar::TextSelectionToolbar() : Control( ControlBehaviour( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ) ), mMaxSize (), + mScrollBarPadding( DEFAULT_SCROLL_BAR_PADDING ), mIndexInTable( 0 ), mDividerIndexes() { 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 index d44daf0..f5908bb 100644 --- a/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h @@ -21,6 +21,7 @@ // INTERNAL INCLUDES #include #include +#include #include #include @@ -84,6 +85,18 @@ public: */ void RaiseAbove( Layer target ); + /** + * Sets the scroll bar padding. + * + * @param[in] padding The padding value. + */ + void SetScrollBarPadding( const Vector2& padding ); + + /** + * @return The padding value. + */ + const Vector2& GetScrollBarPadding() const; + private: // From Control /** @@ -126,6 +139,13 @@ private: // Implementation void SetUp(); /** + * @brief Enable or disable the scroll-bar + * + * @param[in] enable True if the scroll-bar is required + */ + void SetUpScrollBar( bool enable ); + + /** * Toolbar has started to scroll * @param[in] position current scroll view position */ @@ -158,11 +178,12 @@ private: // Data Layer mToolbarLayer; ///< The layer used to house the toolbar. Toolkit::TableView mTableOfButtons; ///< Actor which holds all the buttons, sensitivity can be set on buttons via this actor Toolkit::ScrollView mScrollView; ///< Provides scrolling of Toolbar when content does not fit. + Toolkit::ScrollBar mScrollBar; ///< An horizontal scroll bar for the text's popup options. RulerPtr mRulerX; ///< Ruler to clamp horizontal scrolling. Updates on Relayout Size mMaxSize; ///< Max size of the Toolbar + Vector2 mScrollBarPadding; ///< The padding used to position the scroll indicator. 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 diff --git a/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json b/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json index 88c1483..6aeaded 100644 --- a/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json @@ -151,6 +151,7 @@ "TextSelectionToolbar": { "enableOvershoot":true, + "enableScrollBar":true, "scrollView": { "overshootAnimationSpeed":360.0, @@ -169,6 +170,12 @@ "overshootAnimationSpeed":960.0, "overshootSize":[1920.0,130.0] }, + "ScrollBar": + { + "indicatorShowDuration":0.25, + "indicatorHideDuration":0.25, + "color":[0.0,0.72,0.9,0.7] + }, "TextEditor": { "pointSize":120, diff --git a/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json b/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json index 9c5f800..6e1c7f1 100644 --- a/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/480x800/dali-toolkit-default-theme.json @@ -150,6 +150,7 @@ "TextSelectionToolbar": { "enableOvershoot":true, + "enableScrollBar":true, "scrollView": { "overshootAnimationSpeed":120.0, @@ -168,6 +169,12 @@ "overshootAnimationSpeed":120.0, "overshootSize":[480.0,42.0] }, + "ScrollBar": + { + "indicatorShowDuration":0.25, + "indicatorHideDuration":0.25, + "color":[0.0,0.72,0.9,0.7] + }, "TextEditor": { "pointSize":18, diff --git a/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json b/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json index 6b3a131..d846c0f 100644 --- a/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json @@ -124,6 +124,7 @@ "TextSelectionToolbar": { "enableOvershoot":true, + "enableScrollBar":true, "scrollView": { "overshootAnimationSpeed":360.0, @@ -142,6 +143,12 @@ "overshootAnimationSpeed":360.0, "overshootSize":[720.0,130.0] }, + "ScrollBar": + { + "indicatorShowDuration":0.25, + "indicatorHideDuration":0.25, + "color":[0.0,0.72,0.9,0.7] + }, "TextEditor": { "pointSize":18, -- 2.7.4