X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fdecorator%2Ftext-decorator.cpp;h=c4d0a6826403028b0cfce2fadf07b28edf6dfa7e;hb=8b0f3363d69bce8369695d37ad6a3c5d244d696c;hp=ed67d72480a5c04f4ac961d91926eabf8b928319;hpb=b766a879a8f8b55a7017847894a2f1bc7edd83d8;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 ed67d72..c4d0a68 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -87,8 +87,6 @@ namespace { const char* DEFAULT_GRAB_HANDLE_IMAGE_RELEASED( DALI_IMAGE_DIR "cursor_handler_center.png" ); -const char* DEFAULT_SELECTION_HANDLE_ONE_RELEASED( DALI_IMAGE_DIR "selection_handle_left.png" ); -const char* DEFAULT_SELECTION_HANDLE_TWO_RELEASED( DALI_IMAGE_DIR "selection_handle_right.png" ); const int DEFAULT_POPUP_OFFSET( -100.0f ); // Vertical offset of Popup from cursor or handles position. @@ -109,6 +107,8 @@ const float SCROLL_THRESHOLD = 10.f; const float SCROLL_SPEED = 300.f; const float SCROLL_DISTANCE = SCROLL_SPEED * SCROLL_TICK_INTERVAL * TO_SECONDS; +const float CURSOR_WIDTH = 1.f; + /** * structure to hold coordinates of each quad, which will make up the mesh. */ @@ -214,6 +214,7 @@ struct Decorator::Impl : public ConnectionTracker ImageActor actor; Actor grabArea; + ImageActor markerActor; Vector2 position; float lineHeight; ///< Not the handle height @@ -250,6 +251,7 @@ struct Decorator::Impl : public ConnectionTracker mActiveCursor( ACTIVE_CURSOR_NONE ), mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ), mCursorBlinkDuration( 0.0f ), + mCursorWidth( CURSOR_WIDTH ), mHandleScrolling( HANDLE_TYPE_COUNT ), mScrollDirection( SCROLL_NONE ), mScrollThreshold( SCROLL_THRESHOLD ), @@ -290,7 +292,7 @@ struct Decorator::Impl : public ConnectionTracker mPrimaryCursor.SetPosition( position.x, position.y ); - mPrimaryCursor.SetSize( Size( 1.0f, cursor.cursorHeight ) ); + mPrimaryCursor.SetSize( Size( mCursorWidth, cursor.cursorHeight ) ); } mPrimaryCursor.SetVisible( mPrimaryCursorVisible ); } @@ -302,7 +304,7 @@ struct Decorator::Impl : public ConnectionTracker { mSecondaryCursor.SetPosition( cursor.position.x, cursor.position.y ); - mSecondaryCursor.SetSize( Size( 1.0f, cursor.cursorHeight ) ); + mSecondaryCursor.SetSize( Size( mCursorWidth, cursor.cursorHeight ) ); } mSecondaryCursor.SetVisible( mSecondaryCursorVisible ); } @@ -322,7 +324,7 @@ struct Decorator::Impl : public ConnectionTracker CreateGrabHandle(); grabHandle.actor.SetPosition( position.x, - grabHandle.lineHeight ); // TODO : Fix for multiline. + position.y + grabHandle.lineHeight ); // TODO : Fix for multiline. } grabHandle.actor.SetVisible( isVisible ); } @@ -351,13 +353,17 @@ struct Decorator::Impl : public ConnectionTracker if( isPrimaryVisible ) { primary.actor.SetPosition( primaryPosition.x, - primary.lineHeight ); // TODO : Fix for multiline. + primaryPosition.y + primary.lineHeight ); // TODO : Fix for multiline. + + SetSelectionHandleMarkerSize( primary ); } if( isSecondaryVisible ) { secondary.actor.SetPosition( secondaryPosition.x, - secondary.lineHeight ); // TODO : Fix for multiline. + secondaryPosition.y + secondary.lineHeight ); // TODO : Fix for multiline. + + SetSelectionHandleMarkerSize( secondary ); } } primary.actor.SetVisible( isPrimaryVisible ); @@ -384,18 +390,13 @@ struct Decorator::Impl : public ConnectionTracker if( mActiveCopyPastePopup ) { - if( !mCopyPastePopup.actor.GetParent() ) - { - mActiveLayer.Add( mCopyPastePopup.actor ); - } - - mCopyPastePopup.actor.RaiseAbove( mActiveLayer ); + ShowPopup(); } else { if( mCopyPastePopup.actor ) { - mCopyPastePopup.actor.Unparent(); + mCopyPastePopup.actor.HidePopup(); } } } @@ -411,6 +412,22 @@ struct Decorator::Impl : public ConnectionTracker DeterminePositionPopup(); } + void ShowPopup() + { + if ( !mCopyPastePopup.actor ) + { + return; + } + + if( !mCopyPastePopup.actor.GetParent() ) + { + mActiveLayer.Add( mCopyPastePopup.actor ); + } + + mCopyPastePopup.actor.RaiseAbove( mActiveLayer ); + mCopyPastePopup.actor.ShowPopup(); + } + void DeterminePositionPopup() { if ( !mActiveCopyPastePopup ) @@ -445,7 +462,6 @@ struct Decorator::Impl : public ConnectionTracker void PopupRelayoutComplete( Actor actor ) { // Size negotiation for CopyPastePopup complete so can get the size and constrain position within bounding box. - mCopyPastePopup.actor.OnRelayoutSignal().Disconnect( this, &Decorator::Impl::PopupRelayoutComplete ); DeterminePositionPopup(); } @@ -569,6 +585,15 @@ struct Decorator::Impl : public ConnectionTracker mActiveLayer.RaiseToTop(); } + void SetSelectionHandleMarkerSize( HandleImpl& handle ) + { + if ( handle.markerActor ) + { + handle.markerActor.SetResizePolicy ( ResizePolicy::FIXED, Dimension::HEIGHT ); + handle.markerActor.SetSize( 0, handle.lineHeight ); + } + } + void CreateGrabHandle() { HandleImpl& grabHandle = mHandle[GRAB_HANDLE]; @@ -619,16 +644,32 @@ struct Decorator::Impl : public ConnectionTracker } } - void CreateSelectionHandles() + void CreateHandleMarker( HandleImpl& handle, Image& image, HandleType handleType ) { - HandleImpl& primary = mHandle[ LEFT_SELECTION_HANDLE ]; - if( !primary.actor ) + if ( image) { - if( !mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ) + handle.markerActor = ImageActor::New( image ); + handle.markerActor.SetColor( mHandleColor ); + handle.actor.Add( handle.markerActor ); + + if ( LEFT_SELECTION_HANDLE == handleType ) + { + handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT ); + handle.markerActor.SetParentOrigin( ParentOrigin::TOP_RIGHT ); + } + else if ( RIGHT_SELECTION_HANDLE == handleType ) { - mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] = ResourceImage::New( DEFAULT_SELECTION_HANDLE_ONE_RELEASED ); + handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_LEFT ); + handle.markerActor.SetParentOrigin( ParentOrigin::TOP_LEFT ); } + } + } + void CreateSelectionHandles() + { + HandleImpl& primary = mHandle[ LEFT_SELECTION_HANDLE ]; + if( !primary.actor ) + { primary.actor = ImageActor::New( mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ); #ifdef DECORATOR_DEBUG primary.actor.SetName("SelectionHandleOne"); @@ -652,6 +693,8 @@ struct Decorator::Impl : public ConnectionTracker primary.grabArea.TouchedSignal().Connect( this, &Decorator::Impl::OnHandleOneTouched ); primary.actor.Add( primary.grabArea ); + + CreateHandleMarker( primary, mHandleImages[LEFT_SELECTION_HANDLE_MARKER][HANDLE_IMAGE_RELEASED], LEFT_SELECTION_HANDLE ); } if( !primary.actor.GetParent() ) @@ -662,11 +705,6 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& secondary = mHandle[ RIGHT_SELECTION_HANDLE ]; if( !secondary.actor ) { - if( !mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ) - { - mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] = ResourceImage::New( DEFAULT_SELECTION_HANDLE_TWO_RELEASED ); - } - secondary.actor = ImageActor::New( mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ); #ifdef DECORATOR_DEBUG secondary.actor.SetName("SelectionHandleTwo"); @@ -690,6 +728,8 @@ struct Decorator::Impl : public ConnectionTracker secondary.grabArea.TouchedSignal().Connect( this, &Decorator::Impl::OnHandleTwoTouched ); secondary.actor.Add( secondary.grabArea ); + + CreateHandleMarker( secondary, mHandleImages[RIGHT_SELECTION_HANDLE_MARKER][HANDLE_IMAGE_RELEASED], RIGHT_SELECTION_HANDLE ); } if( !secondary.actor.GetParent() ) @@ -1132,6 +1172,15 @@ struct Decorator::Impl : public ConnectionTracker rightHandle.actor.SetImage( rightFlipped ? mHandleImages[LEFT_SELECTION_HANDLE][rightImageType] : mHandleImages[RIGHT_SELECTION_HANDLE][rightImageType] ); rightHandle.actor.SetAnchorPoint( rightFlipped ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT ); + + if ( leftHandle.markerActor ) + { + leftHandle.markerActor.SetImage( leftFlipped ? mHandleImages[RIGHT_SELECTION_HANDLE_MARKER][leftImageType] : mHandleImages[LEFT_SELECTION_HANDLE_MARKER][leftImageType] ); + } + if ( rightHandle.markerActor ) + { + rightHandle.markerActor.SetImage( rightFlipped ? mHandleImages[LEFT_SELECTION_HANDLE_MARKER][rightImageType] : mHandleImages[RIGHT_SELECTION_HANDLE_MARKER][rightImageType] ); + } } void SetScrollThreshold( float threshold ) @@ -1251,6 +1300,7 @@ struct Decorator::Impl : public ConnectionTracker unsigned int mActiveCursor; unsigned int mCursorBlinkInterval; float mCursorBlinkDuration; + float mCursorWidth; ///< The width of the cursors in pixels. HandleType mHandleScrolling; ///< The handle which is scrolling. ScrollDirection mScrollDirection; ///< The direction of the scroll. float mScrollThreshold; ///< Defines a square area inside the control, close to the edge. A cursor entering this area will trigger scroll events. @@ -1378,6 +1428,16 @@ float Decorator::GetCursorBlinkDuration() const return mImpl->mCursorBlinkDuration; } +void Decorator::SetCursorWidth( int width ) +{ + mImpl->mCursorWidth = static_cast( width ); +} + +int Decorator::GetCursorWidth() const +{ + return static_cast( mImpl->mCursorWidth ); +} + /** Handles **/ void Decorator::SetHandleActive( HandleType handleType, bool active ) @@ -1498,20 +1558,17 @@ void Decorator::SetEnabledPopupButtons( TextSelectionPopup::Buttons& enabledButt { mImpl->mEnabledPopupButtons = enabledButtonsBitMask; - UnparentAndReset( mImpl->mCopyPastePopup.actor ); - mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( mImpl->mEnabledPopupButtons, - &mImpl->mTextSelectionPopupCallbackInterface ); + if ( !mImpl->mCopyPastePopup.actor ) + { + mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( &mImpl->mTextSelectionPopupCallbackInterface ); #ifdef DECORATOR_DEBUG - mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup"); + mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup"); #endif - mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER ); - mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl, &Decorator::Impl::PopupRelayoutComplete ); // Position popup after size negotiation - - if( mImpl->mActiveLayer ) - { - mImpl->mActiveLayer.Add( mImpl->mCopyPastePopup.actor ); - mImpl->mCopyPastePopup.actor.ShowPopup(); + mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER ); + mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl, &Decorator::Impl::PopupRelayoutComplete ); // Position popup after size negotiation } + + mImpl->mCopyPastePopup.actor.EnableButtons( mImpl->mEnabledPopupButtons ); } TextSelectionPopup::Buttons& Decorator::GetEnabledPopupButtons()