X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fdecorator%2Ftext-decorator.cpp;h=6bc65c5dcca942fb93f12b96469279b9cabeed2a;hb=c8bceb828f2e65e82dd0f22bdb964ab7e04882a0;hp=e92866bf82024e63182463c0d0d653cb043294d3;hpb=385a58a746d2481d4725b3018e6ebf5949aab6ee;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/decorator/text-decorator.cpp b/dali-toolkit/internal/text/decorator/text-decorator.cpp index e92866b..6bc65c5 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -81,7 +81,7 @@ const char* DEFAULT_SELECTION_HANDLE_TWO( DALI_IMAGE_DIR "text-input-selection-h const Dali::Vector3 DEFAULT_GRAB_HANDLE_RELATIVE_SIZE( 1.5f, 2.0f, 1.0f ); const Dali::Vector3 DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE( 1.5f, 1.5f, 1.0f ); -const Dali::Vector4 LIGHT_BLUE( 0.07f, 0.41f, 0.59f, 1.0f ); // The text highlight color. +const Dali::Vector4 LIGHT_BLUE( (0xb2 / 255.0f), (0xeb / 255.0f), (0xf2 / 255.0f), 0.5f ); // The text highlight color. const unsigned int CURSOR_BLINK_INTERVAL = 500u; // Cursor blink interval const float TO_MILLISECONDS = 1000.f; @@ -209,9 +209,9 @@ struct Decorator::Impl : public ConnectionTracker bool flipped : 1; }; - Impl( Dali::Toolkit::Internal::Control& parent, Observer& observer ) - : mTextControlParent( parent ), - mObserver( observer ), + Impl( ControllerInterface& controller ) + : mController( controller ), + mEnabledPopupButtons( TextSelectionPopup::NONE ), mBoundingBox( Rect() ), mHighlightColor( LIGHT_BLUE ), mActiveCursor( ACTIVE_CURSOR_NONE ), @@ -225,7 +225,8 @@ struct Decorator::Impl : public ConnectionTracker mActiveCopyPastePopup( false ), mCursorBlinkStatus( true ), mPrimaryCursorVisible( false ), - mSecondaryCursorVisible( false ) + mSecondaryCursorVisible( false ), + mSwapSelectionHandles( false ) { } @@ -319,15 +320,65 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& secondary = mHandle[ RIGHT_SELECTION_HANDLE ]; if( primary.active || secondary.active ) { - SetupTouchEvents(); + Vector2 primaryPosition = primary.position; + Vector2 secondaryPosition = secondary.position; - CreateSelectionHandles(); + if( LEFT_SELECTION_HANDLE == mHandleScrolling ) + { + if( mScrollDirection == SCROLL_RIGHT ) + { + primaryPosition.x = 0.f; + } + else + { + primaryPosition.x = size.width; + } + } + else if( RIGHT_SELECTION_HANDLE == mHandleScrolling ) + { + if( mScrollDirection == SCROLL_RIGHT ) + { + secondaryPosition.x = 0.f; + } + else + { + secondaryPosition.x = size.width; + } + } + + const bool isPrimaryVisible = ( primaryPosition.x <= size.width ) && ( primaryPosition.x >= 0.f ); + const bool isSecondaryVisible = ( secondaryPosition.x <= size.width ) && ( secondaryPosition.x >= 0.f ); + + if( isPrimaryVisible || isSecondaryVisible ) + { + SetupTouchEvents(); + + CreateSelectionHandles(); + + if( isPrimaryVisible ) + { + primary.actor.SetPosition( primaryPosition.x, + primaryPosition.y + primary.lineHeight ); - primary.actor.SetPosition( primary.position.x, - primary.position.y + primary.lineHeight ); + const bool flip = mSwapSelectionHandles ^ primary.flipped; + primary.actor.SetImage( flip ? mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] : mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ); - secondary.actor.SetPosition( secondary.position.x, - secondary.position.y + secondary.lineHeight ); + primary.actor.SetAnchorPoint( flip ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT ); + } + + if( isSecondaryVisible ) + { + secondary.actor.SetPosition( secondaryPosition.x, + secondaryPosition.y + secondary.lineHeight ); + + const bool flip = mSwapSelectionHandles ^ secondary.flipped; + + secondary.actor.SetImage( ( mSwapSelectionHandles ^ secondary.flipped ) ? mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] : mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ); + secondary.actor.SetAnchorPoint( flip ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT ); + } + } + primary.actor.SetVisible( isPrimaryVisible ); + secondary.actor.SetVisible( isSecondaryVisible ); CreateHighlight(); UpdateHighlight(); @@ -343,7 +394,7 @@ struct Decorator::Impl : public ConnectionTracker { if ( !mCopyPastePopup ) { - mCopyPastePopup = TextSelectionPopup::New(); + mCopyPastePopup = TextSelectionPopup::New( mEnabledPopupButtons ); #ifdef DECORATOR_DEBUG mCopyPastePopup.SetName("mCopyPastePopup"); #endif @@ -368,8 +419,7 @@ struct Decorator::Impl : public ConnectionTracker mHandle[ GRAB_HANDLE ].position += scrollOffset; mHandle[ LEFT_SELECTION_HANDLE ].position += scrollOffset; mHandle[ RIGHT_SELECTION_HANDLE ].position += scrollOffset; - - // TODO Highlight box?? + mHighlightPosition += scrollOffset; } void PopUpRelayoutComplete( Actor actor ) @@ -474,8 +524,6 @@ struct Decorator::Impl : public ConnectionTracker { if( !mActiveLayer ) { - Actor parent = mTextControlParent.Self(); - mActiveLayer = Layer::New(); #ifdef DECORATOR_DEBUG mActiveLayer.SetName ( "ActiveLayerActor" ); @@ -485,7 +533,8 @@ struct Decorator::Impl : public ConnectionTracker mActiveLayer.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); mActiveLayer.SetPositionInheritanceMode( USE_PARENT_POSITION ); - parent.Add( mActiveLayer ); + // Add the active layer telling the controller it doesn't need clipping. + mController.AddDecoration( mActiveLayer, false ); } mActiveLayer.RaiseToTop(); @@ -623,11 +672,12 @@ struct Decorator::Impl : public ConnectionTracker mHighlightMeshActor.SetName( "HighlightMeshActor" ); #endif mHighlightMeshActor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - mHighlightMeshActor.SetPosition( 0.0f, 0.0f, DISPLAYED_HIGHLIGHT_Z_OFFSET ); - Actor parent = mTextControlParent.Self(); - parent.Add( mHighlightMeshActor ); + // Add the highlight box telling the controller it needs clipping. + mController.AddDecoration( mHighlightMeshActor, true ); } + + mHighlightMeshActor.SetPosition( mHighlightPosition.x, mHighlightPosition.y, DISPLAYED_HIGHLIGHT_Z_OFFSET ); } void UpdateHighlight() @@ -746,13 +796,16 @@ struct Decorator::Impl : public ConnectionTracker if( Gesture::Started == gesture.state || Gesture::Continuing == gesture.state ) { + Vector2 targetSize; + mController.GetTargetSize( targetSize ); + if( x < mScrollThreshold ) { mScrollDirection = SCROLL_RIGHT; mHandleScrolling = type; StartScrollTimer(); } - else if( x > mTextControlParent.Self().GetTargetSize().width - mScrollThreshold ) + else if( x > targetSize.width - mScrollThreshold ) { mScrollDirection = SCROLL_LEFT; mHandleScrolling = type; @@ -762,7 +815,7 @@ struct Decorator::Impl : public ConnectionTracker { mHandleScrolling = HANDLE_TYPE_COUNT; StopScrollTimer(); - mObserver.HandleEvent( type, HANDLE_PRESSED, x, y ); + mController.DecorationEvent( type, HANDLE_PRESSED, x, y ); } } else if( Gesture::Finished == gesture.state || @@ -772,11 +825,11 @@ struct Decorator::Impl : public ConnectionTracker { mHandleScrolling = HANDLE_TYPE_COUNT; StopScrollTimer(); - mObserver.HandleEvent( type, HANDLE_STOP_SCROLLING, x, y ); + mController.DecorationEvent( type, HANDLE_STOP_SCROLLING, x, y ); } else { - mObserver.HandleEvent( type, HANDLE_RELEASED, x, y ); + mController.DecorationEvent( type, HANDLE_RELEASED, x, y ); } handle.actor.SetImage( mHandleImages[type][HANDLE_IMAGE_RELEASED] ); } @@ -992,17 +1045,16 @@ struct Decorator::Impl : public ConnectionTracker { if( HANDLE_TYPE_COUNT != mHandleScrolling ) { - mObserver.HandleEvent( mHandleScrolling, - HANDLE_SCROLLING, - mScrollDirection == SCROLL_RIGHT ? mScrollDistance : -mScrollDistance, - 0.f ); + mController.DecorationEvent( mHandleScrolling, + HANDLE_SCROLLING, + mScrollDirection == SCROLL_RIGHT ? mScrollDistance : -mScrollDistance, + 0.f ); } return true; } - Internal::Control& mTextControlParent; - Observer& mObserver; + ControllerInterface& mController; TapGestureDetector mTapDetector; PanGestureDetector mPanGestureDetector; @@ -1014,6 +1066,7 @@ struct Decorator::Impl : public ConnectionTracker ImageActor mSecondaryCursor; MeshActor mHighlightMeshActor; ///< Mesh Actor to display highlight TextSelectionPopup mCopyPastePopup; + TextSelectionPopup::Buttons mEnabledPopupButtons; /// Bit mask of currently enabled Popup buttons Image mHandleImages[HANDLE_TYPE_COUNT][HANDLE_IMAGE_TYPE_COUNT]; Image mCursorImage; @@ -1024,6 +1077,7 @@ struct Decorator::Impl : public ConnectionTracker CursorImpl mCursor[CURSOR_COUNT]; HandleImpl mHandle[HANDLE_TYPE_COUNT]; QuadContainer mHighlightQuadList; ///< Sub-selections that combine to create the complete selection highlight + Vector2 mHighlightPosition; ///< The position of the highlight actor. Rect mBoundingBox; Vector4 mHighlightColor; ///< Color of the highlight @@ -1042,11 +1096,12 @@ struct Decorator::Impl : public ConnectionTracker bool mCursorBlinkStatus : 1; ///< Flag to switch between blink on and blink off. bool mPrimaryCursorVisible : 1; ///< Whether the primary cursor is visible. bool mSecondaryCursorVisible : 1; ///< Whether the secondary cursor is visible. + bool mSwapSelectionHandles : 1; ///< Whether to swap the selection handle images. }; -DecoratorPtr Decorator::New( Internal::Control& parent, Observer& observer ) +DecoratorPtr Decorator::New( ControllerInterface& controller ) { - return DecoratorPtr( new Decorator(parent, observer) ); + return DecoratorPtr( new Decorator(controller) ); } void Decorator::SetBoundingBox( const Rect& boundingBox ) @@ -1198,6 +1253,16 @@ void Decorator::GetPosition( HandleType handleType, float& x, float& y, float& h height = handle.lineHeight; } +const Vector2& Decorator::GetPosition( HandleType handleType ) const +{ + return mImpl->mHandle[handleType].position; +} + +void Decorator::SwapSelectionHandlesEnabled( bool enable ) +{ + mImpl->mSwapSelectionHandles = enable; +} + void Decorator::AddHighlight( float x1, float y1, float x2, float y2 ) { mImpl->mHighlightQuadList.push_back( QuadCoordinates(x1, y1, x2, y2) ); @@ -1206,6 +1271,7 @@ void Decorator::AddHighlight( float x1, float y1, float x2, float y2 ) void Decorator::ClearHighlights() { mImpl->mHighlightQuadList.clear(); + mImpl->mHighlightPosition = Vector2::ZERO; } void Decorator::SetHighlightColor( const Vector4& color ) @@ -1228,6 +1294,16 @@ bool Decorator::IsPopupActive() const return mImpl->mActiveCopyPastePopup ; } +void Decorator::SetEnabledPopupButtons( TextSelectionPopup::Buttons& enabledButtonsBitMask ) +{ + mImpl->mEnabledPopupButtons = enabledButtonsBitMask; +} + +TextSelectionPopup::Buttons& Decorator::GetEnabledPopupButtons() +{ + return mImpl->mEnabledPopupButtons; +} + /** Scroll **/ void Decorator::SetScrollThreshold( float threshold ) @@ -1255,10 +1331,10 @@ Decorator::~Decorator() delete mImpl; } -Decorator::Decorator( Dali::Toolkit::Internal::Control& parent, Observer& observer ) +Decorator::Decorator( ControllerInterface& controller ) : mImpl( NULL ) { - mImpl = new Decorator::Impl( parent, observer ); + mImpl = new Decorator::Impl( controller ); } } // namespace Text