X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fdecorator%2Ftext-decorator.cpp;h=5c45bf391b328635b94c6fc693ff60683abcc3b1;hp=43867b4bf02b8b64205a92ffaf40ca362fbef846;hb=c3abed661c5047b5e9a52e51ccd8381c95899017;hpb=d15b9def82b922ae3013ea250e4f6fe260417a79 diff --git a/dali-toolkit/internal/text/decorator/text-decorator.cpp b/dali-toolkit/internal/text/decorator/text-decorator.cpp index 43867b4..5c45bf3 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -20,39 +20,21 @@ // EXTERNAL INCLUDES #include -#include + #include -#include #include -#include -#include #include -#include -#include #include #include -#include #include -#include -#include -#include #include -#include -#include #include -#include #include -#include // INTERNAL INCLUDES -#include #include -#include -#include #include -#include -#include #ifdef DEBUG_ENABLED #define DECORATOR_DEBUG @@ -105,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. @@ -232,6 +212,7 @@ struct Decorator::Impl : public ConnectionTracker ImageActor actor; Actor grabArea; + ImageActor markerActor; Vector2 position; float lineHeight; ///< Not the handle height @@ -273,6 +254,7 @@ struct Decorator::Impl : public ConnectionTracker mScrollThreshold( SCROLL_THRESHOLD ), mScrollSpeed( SCROLL_SPEED ), mScrollDistance( SCROLL_DISTANCE ), + mTextDepth( 0u ), mActiveCopyPastePopup( false ), mCursorBlinkStatus( true ), mPrimaryCursorVisible( false ), @@ -281,7 +263,7 @@ struct Decorator::Impl : public ConnectionTracker mNotifyEndOfScroll( false ) { mQuadVertexFormat[ "aPosition" ] = Property::VECTOR2; - mQuadIndexFormat[ "indices" ] = Property::UNSIGNED_INTEGER; + mQuadIndexFormat[ "indices" ] = Property::INTEGER; mHighlightMaterial = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) ); } @@ -296,6 +278,7 @@ struct Decorator::Impl : public ConnectionTracker // Show or hide the cursors CreateCursors(); + if( mPrimaryCursor ) { const CursorImpl& cursor = mCursor[PRIMARY_CURSOR]; @@ -338,7 +321,7 @@ struct Decorator::Impl : public ConnectionTracker CreateGrabHandle(); grabHandle.actor.SetPosition( position.x, - position.y + grabHandle.lineHeight ); + position.y + grabHandle.lineHeight ); // TODO : Fix for multiline. } grabHandle.actor.SetVisible( isVisible ); } @@ -367,13 +350,17 @@ struct Decorator::Impl : public ConnectionTracker if( isPrimaryVisible ) { primary.actor.SetPosition( primaryPosition.x, - primaryPosition.y + primary.lineHeight ); + primaryPosition.y + primary.lineHeight ); // TODO : Fix for multiline. + + SetSelectionHandleMarkerSize( primary ); } if( isSecondaryVisible ) { secondary.actor.SetPosition( secondaryPosition.x, - secondaryPosition.y + secondary.lineHeight ); + secondaryPosition.y + secondary.lineHeight ); // TODO : Fix for multiline. + + SetSelectionHandleMarkerSize( secondary ); } } primary.actor.SetVisible( isPrimaryVisible ); @@ -400,18 +387,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(); } } } @@ -427,6 +409,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 ) @@ -461,7 +459,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(); } @@ -585,6 +582,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]; @@ -635,16 +641,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 ) { - mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] = ResourceImage::New( DEFAULT_SELECTION_HANDLE_ONE_RELEASED ); + handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT ); + handle.markerActor.SetParentOrigin( ParentOrigin::TOP_RIGHT ); } + else if ( RIGHT_SELECTION_HANDLE == handleType ) + { + 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"); @@ -668,6 +690,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() ) @@ -678,11 +702,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"); @@ -706,6 +725,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() ) @@ -803,24 +824,25 @@ struct Decorator::Impl : public ConnectionTracker mQuadVertices.SetData( &vertices[ 0 ] ); mQuadIndices.SetData( &indices[ 0 ] ); - mQuadGeometry = Geometry::New(); - mQuadGeometry.AddVertexBuffer( mQuadVertices ); - mQuadGeometry.SetIndexBuffer( mQuadIndices ); - - if( mHighlightRenderer ) + if( !mQuadGeometry ) { - mHighlightRenderer.SetGeometry( mQuadGeometry ); + mQuadGeometry = Geometry::New(); + mQuadGeometry.AddVertexBuffer( mQuadVertices ); } - else + mQuadGeometry.SetIndexBuffer( mQuadIndices ); + + if( !mHighlightRenderer ) { mHighlightRenderer = Dali::Renderer::New( mQuadGeometry, mHighlightMaterial ); mHighlightActor.AddRenderer( mHighlightRenderer ); } - - mHighlightActor.SetPosition( mHighlightPosition.x, - mHighlightPosition.y ); } + mHighlightActor.SetPosition( mHighlightPosition.x, + mHighlightPosition.y ); + + mHighlightQuadList.clear(); + mHighlightRenderer.SetDepthIndex( mTextDepth - 2u ); // text is rendered at mTextDepth and text's shadow at mTextDepth -1u. } } @@ -1147,6 +1169,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 ) @@ -1513,19 +1544,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.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()