X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-selection-toolbar-impl.cpp;h=0cb62af7ae31e01559536dca1353785c3307e0bb;hp=4b25f773f8c1f488f6f99c589a0e207f781fe040;hb=2f705dd3525531584ee46d9a7fc9f23331909c10;hpb=8c18e2ceb273e1db22547264a4466fa565081a29 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 4b25f77..0cb62af 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -18,17 +18,17 @@ // CLASS HEADER #include -// INTERNAL INCLUDES -#include - // EXTERNAL INCLUDES -#include +#include +#include #include #include -#include -#include -#include -#include +#include +#include + +// INTERNAL INCLUDES +#include +#include namespace Dali { @@ -41,9 +41,8 @@ namespace Internal namespace { -const Dali::Vector2 DEFAULT_MAX_SIZE( 400.0f, 65.0f ); ///< The maximum size of the Toolbar. -} // namespace +const Dali::Vector2 DEFAULT_SCROLL_BAR_PADDING( 8.0f, 6.0f ); BaseHandle Create() { @@ -54,10 +53,16 @@ BaseHandle Create() DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionToolbar, Toolkit::Control, Create ); -DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "max-size", VECTOR2, MAX_SIZE ) +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() +} // namespace + Dali::Toolkit::TextSelectionToolbar TextSelectionToolbar::New() { // Create the implementation, temporarily owned by this handle on stack @@ -88,7 +93,35 @@ void TextSelectionToolbar::SetProperty( BaseObject* object, Property::Index inde impl.SetPopupMaxSize( value.Get< Vector2 >() ); break; } - + case Toolkit::TextSelectionToolbar::Property::ENABLE_OVERSHOOT: + { + if( !impl.mScrollView ) + { + impl.mScrollView = Toolkit::ScrollView::New(); + } + 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. + Property::Map setPropertyMap; + if( value.Get( setPropertyMap ) ) + { + impl.ConfigureScrollview( setPropertyMap ); + } + break; + } } // switch } // TextSelectionToolbar } @@ -110,6 +143,21 @@ Property::Value TextSelectionToolbar::GetProperty( BaseObject* object, Property: value = impl.GetPopupMaxSize(); break; } + case Toolkit::TextSelectionToolbar::Property::ENABLE_OVERSHOOT: + { + 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; @@ -120,9 +168,27 @@ void TextSelectionToolbar::OnInitialize() SetUp(); } +void TextSelectionToolbar::OnRelayout( const Vector2& size, RelayoutContainer& container ) +{ + 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 ) { mMaxSize = maxSize; + if (mScrollView && mToolbarLayer ) + { + mScrollView.SetMaximumSize( mMaxSize ); + mToolbarLayer.SetMaximumSize( mMaxSize ); + } } const Dali::Vector2& TextSelectionToolbar::GetPopupMaxSize() const @@ -130,38 +196,94 @@ const Dali::Vector2& TextSelectionToolbar::GetPopupMaxSize() const return mMaxSize; } +void TextSelectionToolbar::SetUpScrollView() +{ + mScrollView.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + mScrollView.SetParentOrigin( ParentOrigin::CENTER_LEFT ); + mScrollView.SetAnchorPoint( AnchorPoint::CENTER_LEFT ); + + mScrollView.SetScrollingDirection( PanGestureDetector::DIRECTION_HORIZONTAL, Degree( 40.0f ) ); + mScrollView.SetAxisAutoLock( true ); + mScrollView.ScrollStartedSignal().Connect( this, &TextSelectionToolbar::OnScrollStarted ); + mScrollView.ScrollCompletedSignal().Connect( this, &TextSelectionToolbar::OnScrollCompleted ); + + mRulerX = new DefaultRuler(); // IntrusivePtr which is unreferenced when ScrollView is destroyed. + + RulerPtr rulerY = new DefaultRuler(); // IntrusivePtr which is unreferenced when ScrollView is destroyed. + rulerY->Disable(); + mScrollView.SetRulerY( rulerY ); + + mScrollView.SetOvershootEnabled( true ); +} + 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 ); + self.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); - 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 ); + // Create Layer to house the toolbar. + mToolbarLayer = Layer::New(); + mToolbarLayer.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + mToolbarLayer.SetAnchorPoint( AnchorPoint::CENTER ); + mToolbarLayer.SetParentOrigin( ParentOrigin::CENTER ); - Actor scrollview = Actor::New(); //todo make a scrollview - scrollview.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); - scrollview.SetParentOrigin( ParentOrigin::CENTER ); + if( !mScrollView ) + { + mScrollView = Toolkit::ScrollView::New(); + } + SetUpScrollView(); - // Toolbar needs at least one option, adding further options with increase it's size + // Toolbar must start with 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 ); + mTableOfButtons.SetParentOrigin( ParentOrigin::CENTER_LEFT ); + mTableOfButtons.SetAnchorPoint( AnchorPoint::CENTER_LEFT ); + + mScrollView.Add( mTableOfButtons ); + mToolbarLayer.Add( mScrollView ); + + self.Add( mToolbarLayer ); +} + +void TextSelectionToolbar::SetUpScrollBar( bool enable ) +{ + if( enable ) + { + if( ! mScrollBar ) + { + Toolkit::ImageView indicator = Toolkit::ImageView::New(); + indicator.SetParentOrigin( ParentOrigin::TOP_LEFT ); + indicator.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + indicator.SetStyleName( "TextSelectionScrollIndicator" ); + + mScrollBar = Toolkit::ScrollBar::New( Toolkit::ScrollBar::Horizontal ); + mScrollBar.SetName( "Text popup scroll bar" ); + mScrollBar.SetStyleName( "TextSelectionScrollBar" ); + 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.SetScrollIndicator( indicator ); + mScrollBar.GetPanGestureDetector().DetachAll(); + mScrollView.Add( mScrollBar ); + } + } + else + { + UnparentAndReset( mScrollBar ); + } +} - mStencilLayer.Add( stencil ); - mStencilLayer.Add( scrollview ); - scrollview.Add( mTableOfButtons ); - self.Add( mStencilLayer ); +void TextSelectionToolbar::OnScrollStarted( const Vector2& position ) +{ + mTableOfButtons.SetSensitive( false ); +} - mStencilLayer.RaiseToTop(); +void TextSelectionToolbar::OnScrollCompleted( const Vector2& position ) +{ + mTableOfButtons.SetSensitive( true ); } void TextSelectionToolbar::AddOption( Actor& option ) @@ -174,7 +296,7 @@ void TextSelectionToolbar::AddOption( Actor& option ) void TextSelectionToolbar::AddDivider( Actor& divider ) { AddOption( divider ); - mDividerIndexes.PushBack( mIndexInTable ); + mDividerIndexes.PushBack( mIndexInTable - 1u ); } void TextSelectionToolbar::ResizeDividers( Size& size ) @@ -187,9 +309,51 @@ void TextSelectionToolbar::ResizeDividers( Size& size ) RelayoutRequest(); } +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. + for( unsigned int i = 0, mapCount = properties.Count(); i < mapCount; ++i ) + { + const StringValuePair& propertyPair( properties.GetPair( i ) ); + + // Convert the property string to a property index. + Property::Index setPropertyIndex = mScrollView.GetPropertyIndex( propertyPair.first ); + if( setPropertyIndex != Property::INVALID_INDEX ) + { + // If the conversion worked, we have a valid property index, + // Set the property to the new value. + mScrollView.SetProperty( setPropertyIndex, propertyPair.second ); + } + } + + RelayoutRequest(); +} + +const Vector2& TextSelectionToolbar::GetScrollBarPadding() const +{ + return mScrollBarPadding; +} + TextSelectionToolbar::TextSelectionToolbar() -: Control( ControlBehaviour( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) ), - mMaxSize ( DEFAULT_MAX_SIZE ), +: Control( ControlBehaviour( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ) ), + mMaxSize (), + mScrollBarPadding( DEFAULT_SCROLL_BAR_PADDING ), mIndexInTable( 0 ), mDividerIndexes() { @@ -197,9 +361,9 @@ TextSelectionToolbar::TextSelectionToolbar() TextSelectionToolbar::~TextSelectionToolbar() { + mRulerX.Reset(); } - } // namespace Internal } // namespace Toolkit