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=ad023681c4eac8fda168b7e87f59ca0cd5a05859;hp=e9e0b1a27f155a20b19e42c355dd4d5dea33c257;hb=528aa3699cd51dab5115bca1aaebb65d4bc67c15;hpb=463f354df725674c8f7ecc9b8f00ce7bdd6e2d10 diff --git a/dali-toolkit/internal/text/decorator/text-decorator.cpp b/dali-toolkit/internal/text/decorator/text-decorator.cpp index e9e0b1a..ad02368 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -22,13 +22,13 @@ #include #include #include -#include -#include +#include +#include #include -#include #include #include #include +#include // INTERNAL INCLUDES #include @@ -46,7 +46,7 @@ namespace { const char* VERTEX_SHADER = MAKE_SHADER( attribute mediump vec2 aPosition; -uniform mediump mat4 uMvpMatrix; +uniform highp mat4 uMvpMatrix; void main() { @@ -236,6 +236,9 @@ struct Decorator::Impl : public ConnectionTracker mBoundingBox(), mHighlightColor( LIGHT_BLUE ), mHighlightPosition( Vector2::ZERO ), + mHighlightSize( Vector2::ZERO ), + mControlSize( Vector2::ZERO ), + mHighlightOutlineOffset( 0.f ), mActiveCursor( ACTIVE_CURSOR_NONE ), mCursorBlinkInterval( CURSOR_BLINK_INTERVAL ), mCursorBlinkDuration( 0.0f ), @@ -293,11 +296,11 @@ struct Decorator::Impl : public ConnectionTracker ( cursor.position.y > -Math::MACHINE_EPSILON_1000 ) ); if( mPrimaryCursorVisible ) { - mPrimaryCursor.SetPosition( cursor.position.x, - cursor.position.y ); - mPrimaryCursor.SetSize( Size( mCursorWidth, cursor.cursorHeight ) ); + mPrimaryCursor.SetProperty( Actor::Property::POSITION, Vector2( cursor.position.x, + cursor.position.y ) ); + mPrimaryCursor.SetProperty( Actor::Property::SIZE, Size( mCursorWidth, cursor.cursorHeight ) ); } - mPrimaryCursor.SetVisible( mPrimaryCursorVisible && mCursorBlinkStatus ); + mPrimaryCursor.SetProperty( Actor::Property::VISIBLE, mPrimaryCursorVisible && mCursorBlinkStatus ); } if( mSecondaryCursor ) { @@ -308,11 +311,11 @@ struct Decorator::Impl : public ConnectionTracker ( cursor.position.y > -Math::MACHINE_EPSILON_1000 ) ); if( mSecondaryCursorVisible ) { - mSecondaryCursor.SetPosition( cursor.position.x, - cursor.position.y ); - mSecondaryCursor.SetSize( Size( mCursorWidth, cursor.cursorHeight ) ); + mSecondaryCursor.SetProperty( Actor::Property::POSITION, Vector2( cursor.position.x, + cursor.position.y ) ); + mSecondaryCursor.SetProperty( Actor::Property::SIZE, Size( mCursorWidth, cursor.cursorHeight ) ); } - mSecondaryCursor.SetVisible( mSecondaryCursorVisible && mCursorBlinkStatus ); + mSecondaryCursor.SetProperty( Actor::Property::VISIBLE, mSecondaryCursorVisible && mCursorBlinkStatus ); } // Show or hide the grab handle @@ -343,7 +346,7 @@ struct Decorator::Impl : public ConnectionTracker if( grabHandle.actor ) { - grabHandle.actor.SetVisible( isVisible ); + grabHandle.actor.SetProperty( Actor::Property::VISIBLE, isVisible ); } } else if( grabHandle.actor ) @@ -402,11 +405,11 @@ struct Decorator::Impl : public ConnectionTracker if( primary.actor ) { - primary.actor.SetVisible( primaryVisible ); + primary.actor.SetProperty( Actor::Property::VISIBLE, primaryVisible ); } if( secondary.actor ) { - secondary.actor.SetVisible( secondaryVisible ); + secondary.actor.SetProperty( Actor::Property::VISIBLE, secondaryVisible ); } } @@ -496,7 +499,7 @@ struct Decorator::Impl : public ConnectionTracker if( primaryHandle.active || secondaryHandle.active ) { // The origin of the decorator's coordinate system in world coords. - const Vector3 originWorldCoords = mActiveLayer.GetCurrentWorldPosition() - mActiveLayer.GetCurrentSize() * ACTIVE_LAYER_ANCHOR_POINT; + const Vector3 originWorldCoords = mActiveLayer.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ) - mActiveLayer.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ) * ACTIVE_LAYER_ANCHOR_POINT; if( preferBelow ) { @@ -581,7 +584,7 @@ struct Decorator::Impl : public ConnectionTracker // Check first the horizontal dimension. If is not within the boundaries, it calculates the offset. // The origin of the decorator's coordinate system in world coords. - const Vector3 originWorldCoords = mActiveLayer.GetCurrentWorldPosition() - mActiveLayer.GetCurrentSize() * ACTIVE_LAYER_ANCHOR_POINT; + const Vector3 originWorldCoords = mActiveLayer.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ) - mActiveLayer.GetCurrentProperty< Vector3 >( Actor::Property::SIZE ) * ACTIVE_LAYER_ANCHOR_POINT; // The popup's position in world coords. Vector3 popupPositionWorldCoords = originWorldCoords + mCopyPastePopup.position; @@ -648,7 +651,7 @@ struct Decorator::Impl : public ConnectionTracker mCopyPastePopup.position.x = floorf( mCopyPastePopup.position.x ); mCopyPastePopup.position.y = floorf( mCopyPastePopup.position.y ); - mCopyPastePopup.actor.SetPosition( mCopyPastePopup.position ); + mCopyPastePopup.actor.SetProperty( Actor::Property::POSITION, mCopyPastePopup.position ); mPopupSetNewPosition = false; } @@ -656,8 +659,8 @@ struct Decorator::Impl : public ConnectionTracker { cursor = Control::New(); cursor.SetBackgroundColor( color ); - cursor.SetParentOrigin( ParentOrigin::TOP_LEFT ); - cursor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + cursor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + cursor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); } // Add or Remove cursor(s) from parent @@ -684,7 +687,7 @@ struct Decorator::Impl : public ConnectionTracker { CreateCursor( mPrimaryCursor, mCursor[PRIMARY_CURSOR].color ); #ifdef DECORATOR_DEBUG - mPrimaryCursor.SetName( "PrimaryCursorActor" ); + mPrimaryCursor.SetProperty( Dali::Actor::Property::NAME, "PrimaryCursorActor" ); #endif } @@ -700,7 +703,7 @@ struct Decorator::Impl : public ConnectionTracker { CreateCursor( mSecondaryCursor, mCursor[SECONDARY_CURSOR].color ); #ifdef DECORATOR_DEBUG - mSecondaryCursor.SetName( "SecondaryCursorActor" ); + mSecondaryCursor.SetProperty( Dali::Actor::Property::NAME, "SecondaryCursorActor" ); #endif } @@ -726,11 +729,11 @@ struct Decorator::Impl : public ConnectionTracker // Cursor blinking if ( mPrimaryCursor ) { - mPrimaryCursor.SetVisible( mPrimaryCursorVisible && mCursorBlinkStatus ); + mPrimaryCursor.SetProperty( Actor::Property::VISIBLE, mPrimaryCursorVisible && mCursorBlinkStatus ); } if ( mSecondaryCursor ) { - mSecondaryCursor.SetVisible( mSecondaryCursorVisible && mCursorBlinkStatus ); + mSecondaryCursor.SetProperty( Actor::Property::VISIBLE, mSecondaryCursorVisible && mCursorBlinkStatus ); } mCursorBlinkStatus = !mCursorBlinkStatus; @@ -766,10 +769,10 @@ struct Decorator::Impl : public ConnectionTracker { mActiveLayer = Layer::New(); #ifdef DECORATOR_DEBUG - mActiveLayer.SetName ( "ActiveLayerActor" ); + mActiveLayer.SetProperty( Actor::Property::NAME, "ActiveLayerActor" ); #endif - mActiveLayer.SetParentOrigin( ParentOrigin::CENTER ); + mActiveLayer.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); mActiveLayer.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); // Add the active layer telling the controller it doesn't need clipping. @@ -783,7 +786,7 @@ struct Decorator::Impl : public ConnectionTracker { if( handle.markerActor ) { - handle.markerActor.SetSize( 0, handle.lineHeight ); + handle.markerActor.SetProperty( Actor::Property::SIZE, Vector2( 0, handle.lineHeight ) ); } } @@ -792,39 +795,39 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& grabHandle = mHandle[GRAB_HANDLE]; if( !grabHandle.actor ) { - if( mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] ) + if( mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED].size() ) { grabHandle.actor = ImageView::New( mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] ); GetImpl( grabHandle.actor).SetDepthIndex( DepthIndex::DECORATION ); - grabHandle.actor.SetAnchorPoint( AnchorPoint::TOP_CENTER ); + grabHandle.actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER ); // Area that Grab handle responds to, larger than actual handle so easier to move #ifdef DECORATOR_DEBUG - grabHandle.actor.SetName( "GrabHandleActor" ); + grabHandle.actor.SetProperty( Dali::Actor::Property::NAME, "GrabHandleActor" ); if ( Dali::Internal::gLogFilter->IsEnabledFor( Debug::Verbose ) ) { grabHandle.grabArea = Control::New(); Toolkit::Control control = Toolkit::Control::DownCast( grabHandle.grabArea ); control.SetBackgroundColor( Vector4( 1.0f, 1.0f, 1.0f, 0.5f ) ); - grabHandle.grabArea.SetName( "GrabArea" ); + grabHandle.grabArea.SetProperty( Dali::Actor::Property::NAME, "GrabArea" ); } else { grabHandle.grabArea = Actor::New(); - grabHandle.grabArea.SetName( "GrabArea" ); + grabHandle.grabArea.SetProperty( Dali::Actor::Property::NAME, "GrabArea" ); } #else grabHandle.grabArea = Actor::New(); #endif - grabHandle.grabArea.SetParentOrigin( ParentOrigin::TOP_CENTER ); - grabHandle.grabArea.SetAnchorPoint( AnchorPoint::TOP_CENTER ); + grabHandle.grabArea.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER ); + grabHandle.grabArea.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER ); grabHandle.grabArea.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS ); - grabHandle.grabArea.SetSizeModeFactor( DEFAULT_GRAB_HANDLE_RELATIVE_SIZE ); + grabHandle.grabArea.SetProperty( Actor::Property::SIZE_MODE_FACTOR, DEFAULT_GRAB_HANDLE_RELATIVE_SIZE ); grabHandle.actor.Add( grabHandle.grabArea ); - grabHandle.actor.SetColor( mHandleColor ); + grabHandle.actor.SetProperty( Actor::Property::COLOR, mHandleColor ); - grabHandle.grabArea.TouchSignal().Connect( this, &Decorator::Impl::OnGrabHandleTouched ); + grabHandle.grabArea.TouchedSignal().Connect( this, &Decorator::Impl::OnGrabHandleTouched ); // The grab handle's actor is attached to the tap and long press detectors in order to consume these events. // Note that no callbacks are connected to any signal emitted by the tap and long press detectors. @@ -845,25 +848,25 @@ struct Decorator::Impl : public ConnectionTracker } } - void CreateHandleMarker( HandleImpl& handle, Image& image, HandleType handleType ) + void CreateHandleMarker( HandleImpl& handle, const std::string& image, HandleType handleType ) { - if( image ) + if( image.size() ) { handle.markerActor = ImageView::New( image ); - handle.markerActor.SetColor( mHandleColor ); + handle.markerActor.SetProperty( Actor::Property::COLOR, mHandleColor ); handle.actor.Add( handle.markerActor ); handle.markerActor.SetResizePolicy ( ResizePolicy::FIXED, Dimension::HEIGHT ); if( LEFT_SELECTION_HANDLE == handleType ) { - handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT ); - handle.markerActor.SetParentOrigin( ParentOrigin::TOP_RIGHT ); + handle.markerActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_RIGHT ); + handle.markerActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_RIGHT ); } else if( RIGHT_SELECTION_HANDLE == handleType ) { - handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_LEFT ); - handle.markerActor.SetParentOrigin( ParentOrigin::TOP_LEFT ); + handle.markerActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_LEFT ); + handle.markerActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); } } } @@ -873,26 +876,26 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& primary = mHandle[ LEFT_SELECTION_HANDLE ]; if( !primary.actor ) { - if( mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ) + if( mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED].size() ) { primary.actor = ImageView::New( mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ); #ifdef DECORATOR_DEBUG - primary.actor.SetName("SelectionHandleOne"); + primary.actor.SetProperty( Dali::Actor::Property::NAME,"SelectionHandleOne"); #endif - primary.actor.SetAnchorPoint( AnchorPoint::TOP_RIGHT ); // Change to BOTTOM_RIGHT if Look'n'Feel requires handle above text. + primary.actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_RIGHT ); // Change to BOTTOM_RIGHT if Look'n'Feel requires handle above text. GetImpl( primary.actor ).SetDepthIndex( DepthIndex::DECORATION ); - primary.actor.SetColor( mHandleColor ); + primary.actor.SetProperty( Actor::Property::COLOR, mHandleColor ); primary.grabArea = Actor::New(); // Area that Grab handle responds to, larger than actual handle so easier to move #ifdef DECORATOR_DEBUG - primary.grabArea.SetName("SelectionHandleOneGrabArea"); + primary.grabArea.SetProperty( Dali::Actor::Property::NAME,"SelectionHandleOneGrabArea"); #endif primary.grabArea.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS ); - primary.grabArea.SetParentOrigin( ParentOrigin::TOP_CENTER ); - primary.grabArea.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - primary.grabArea.SetSizeModeFactor( DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE ); + primary.grabArea.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER ); + primary.grabArea.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER ); + primary.grabArea.SetProperty( Actor::Property::SIZE_MODE_FACTOR, DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE ); - primary.grabArea.TouchSignal().Connect( this, &Decorator::Impl::OnHandleOneTouched ); + primary.grabArea.TouchedSignal().Connect( this, &Decorator::Impl::OnHandleOneTouched ); // The handle's actor is attached to the tap and long press detectors in order to consume these events. // Note that no callbacks are connected to any signal emitted by the tap and long press detectors. @@ -917,26 +920,26 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& secondary = mHandle[ RIGHT_SELECTION_HANDLE ]; if( !secondary.actor ) { - if( mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ) + if( mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED].size() ) { secondary.actor = ImageView::New( mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED] ); #ifdef DECORATOR_DEBUG - secondary.actor.SetName("SelectionHandleTwo"); + secondary.actor.SetProperty( Dali::Actor::Property::NAME,"SelectionHandleTwo"); #endif - secondary.actor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); // Change to BOTTOM_LEFT if Look'n'Feel requires handle above text. + secondary.actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); // Change to BOTTOM_LEFT if Look'n'Feel requires handle above text. GetImpl( secondary.actor ).SetDepthIndex( DepthIndex::DECORATION ); - secondary.actor.SetColor( mHandleColor ); + secondary.actor.SetProperty( Actor::Property::COLOR, mHandleColor ); secondary.grabArea = Actor::New(); // Area that Grab handle responds to, larger than actual handle so easier to move #ifdef DECORATOR_DEBUG - secondary.grabArea.SetName("SelectionHandleTwoGrabArea"); + secondary.grabArea.SetProperty( Dali::Actor::Property::NAME,"SelectionHandleTwoGrabArea"); #endif secondary.grabArea.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS ); - secondary.grabArea.SetParentOrigin( ParentOrigin::TOP_CENTER ); - secondary.grabArea.SetAnchorPoint( AnchorPoint::TOP_CENTER ); - secondary.grabArea.SetSizeModeFactor( DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE ); + secondary.grabArea.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER ); + secondary.grabArea.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER ); + secondary.grabArea.SetProperty( Actor::Property::SIZE_MODE_FACTOR, DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE ); - secondary.grabArea.TouchSignal().Connect( this, &Decorator::Impl::OnHandleTwoTouched ); + secondary.grabArea.TouchedSignal().Connect( this, &Decorator::Impl::OnHandleTwoTouched ); // The handle's actor is attached to the tap and long press detectors in order to consume these events. // Note that no callbacks are connected to any signal emitted by the tap and long press detectors. @@ -962,7 +965,7 @@ struct Decorator::Impl : public ConnectionTracker void CalculateHandleWorldCoordinates( HandleImpl& handle, Vector2& position ) { // Gets the world position of the active layer. The active layer is where the handles are added. - const Vector3 parentWorldPosition = mActiveLayer.GetCurrentWorldPosition(); + const Vector3 parentWorldPosition = mActiveLayer.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ); // The grab handle position in world coords. // The active layer's world position is the center of the active layer. The origin of the @@ -977,9 +980,9 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& grabHandle = mHandle[GRAB_HANDLE]; // Transforms the handle position into world coordinates. - // @note This is not the same value as grabHandle.actor.GetCurrentWorldPosition() + // @note This is not the same value as grabHandle.actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ) // as it's transforming the handle's position set by the text-controller and not - // the final position set to the actor. Another difference is the GetCurrentWorldPosition() + // the final position set to the actor. Another difference is the.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ) // retrieves the position of the center of the actor but the handle's position set // by the text controller is not the center of the actor. Vector2 grabHandleWorldPosition; @@ -1000,8 +1003,8 @@ struct Decorator::Impl : public ConnectionTracker if( grabHandle.actor ) { - grabHandle.actor.SetPosition( grabHandle.position.x + floor( 0.5f * mCursorWidth ) + ( mSmoothHandlePanEnabled ? grabHandle.grabDisplacementX : 0.f ), - yLocalPosition + ( mSmoothHandlePanEnabled ? grabHandle.grabDisplacementY : 0.f ) ); + grabHandle.actor.SetProperty( Actor::Property::POSITION, Vector2( grabHandle.position.x + floor( 0.5f * mCursorWidth ) + ( mSmoothHandlePanEnabled ? grabHandle.grabDisplacementX : 0.f ), + yLocalPosition + ( mSmoothHandlePanEnabled ? grabHandle.grabDisplacementY : 0.f ) ) ); } } @@ -1013,9 +1016,9 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& handle = mHandle[type]; // Transforms the handle position into world coordinates. - // @note This is not the same value as handle.actor.GetCurrentWorldPosition() + // @note This is not the same value as handle.actor.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ) // as it's transforming the handle's position set by the text-controller and not - // the final position set to the actor. Another difference is the GetCurrentWorldPosition() + // the final position set to the actor. Another difference is the.GetCurrentProperty< Vector3 >( Actor::Property::WORLD_POSITION ) // retrieves the position of the center of the actor but the handle's position set // by the text controller is not the center of the actor. Vector2 handleWorldPosition; @@ -1064,7 +1067,7 @@ struct Decorator::Impl : public ConnectionTracker if( handle.actor && !handle.horizontallyFlipped ) { // Change the anchor point to flip the image. - handle.actor.SetAnchorPoint( isPrimaryHandle ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT ); + handle.actor.SetProperty( Actor::Property::ANCHOR_POINT, isPrimaryHandle ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT ); handle.horizontallyFlipped = true; } @@ -1074,7 +1077,7 @@ struct Decorator::Impl : public ConnectionTracker if( handle.actor && handle.horizontallyFlipped ) { // Reset the anchor point. - handle.actor.SetAnchorPoint( isPrimaryHandle ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT ); + handle.actor.SetProperty( Actor::Property::ANCHOR_POINT, isPrimaryHandle ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT ); handle.horizontallyFlipped = false; } @@ -1093,8 +1096,8 @@ struct Decorator::Impl : public ConnectionTracker if( handle.actor ) { - handle.actor.SetPosition( handle.position.x + ( mSmoothHandlePanEnabled ? handle.grabDisplacementX : 0.f ), - yLocalPosition + ( mSmoothHandlePanEnabled ? handle.grabDisplacementY : 0.f ) ); + handle.actor.SetProperty( Actor::Property::POSITION, Vector2( handle.position.x + ( mSmoothHandlePanEnabled ? handle.grabDisplacementX : 0.f ), + yLocalPosition + ( mSmoothHandlePanEnabled ? handle.grabDisplacementY : 0.f ) ) ); } } @@ -1118,7 +1121,7 @@ struct Decorator::Impl : public ConnectionTracker // Chooses between the released or pressed image. It checks whether the pressed image exists. if( handle.actor ) { - const HandleImageType imageType = ( handle.pressed ? ( mHandleImages[type][HANDLE_IMAGE_PRESSED] ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED ); + const HandleImageType imageType = ( handle.pressed ? ( mHandleImages[type][HANDLE_IMAGE_PRESSED].size() ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED ); handle.actor.SetImage( mHandleImages[type][imageType] ); } @@ -1127,7 +1130,7 @@ struct Decorator::Impl : public ConnectionTracker { if( handle.markerActor ) { - const HandleImageType markerImageType = ( handle.pressed ? ( mHandleImages[markerType][HANDLE_IMAGE_PRESSED] ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED ); + const HandleImageType markerImageType = ( handle.pressed ? ( mHandleImages[markerType][HANDLE_IMAGE_PRESSED].size() ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED ); handle.markerActor.SetImage( mHandleImages[markerType][markerImageType] ); } } @@ -1135,7 +1138,7 @@ struct Decorator::Impl : public ConnectionTracker // Whether to flip the handle vertically. if( handle.actor ) { - handle.actor.SetOrientation( handle.verticallyFlipped ? ANGLE_180 : ANGLE_0, Vector3::XAXIS ); + handle.actor.SetProperty( Actor::Property::ORIENTATION, Quaternion( handle.verticallyFlipped ? ANGLE_180 : ANGLE_0, Vector3::XAXIS ) ); } } @@ -1145,13 +1148,11 @@ struct Decorator::Impl : public ConnectionTracker { mHighlightActor = Actor::New(); -#ifdef DECORATOR_DEBUG - mHighlightActor.SetName( "HighlightActor" ); -#endif - mHighlightActor.SetParentOrigin( ParentOrigin::TOP_LEFT ); - mHighlightActor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); - mHighlightActor.SetColor( mHighlightColor ); - mHighlightActor.SetColorMode( USE_OWN_COLOR ); + mHighlightActor.SetProperty( Dali::Actor::Property::NAME, "HighlightActor" ); + mHighlightActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT ); + mHighlightActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT ); + mHighlightActor.SetProperty( Actor::Property::COLOR, mHighlightColor ); + mHighlightActor.SetProperty( Actor::Property::COLOR_MODE, USE_OWN_COLOR ); } // Add the highlight box telling the controller it needs clipping. @@ -1163,14 +1164,14 @@ struct Decorator::Impl : public ConnectionTracker if ( mHighlightActor ) { // Sets the position of the highlight actor inside the decorator. - mHighlightActor.SetPosition( mHighlightPosition.x, - mHighlightPosition.y ); + mHighlightActor.SetProperty( Actor::Property::POSITION, Vector2( mHighlightPosition.x + mHighlightOutlineOffset, + mHighlightPosition.y + mHighlightOutlineOffset ) ); const unsigned int numberOfQuads = mHighlightQuadList.Count(); if( 0u != numberOfQuads ) { // Set the size of the highlighted text to the actor. - mHighlightActor.SetSize( mHighlightSize ); + mHighlightActor.SetProperty( Actor::Property::SIZE, mHighlightSize ); // Used to translate the vertices given in decorator's coords to the mHighlightActor's local coords. const float offsetX = mHighlightPosition.x + 0.5f * mHighlightSize.width; @@ -1228,7 +1229,7 @@ struct Decorator::Impl : public ConnectionTracker if( ! mQuadVertices ) { - mQuadVertices = PropertyBuffer::New( mQuadVertexFormat ); + mQuadVertices = VertexBuffer::New( mQuadVertexFormat ); } mQuadVertices.SetData( &vertices[ 0 ], vertices.Size() ); @@ -1258,7 +1259,8 @@ struct Decorator::Impl : public ConnectionTracker void DoPan( HandleImpl& handle, HandleType type, const PanGesture& gesture ) { - if( Gesture::Started == gesture.state ) + GestureState state = gesture.GetState(); + if( GestureState::STARTED == state ) { handle.grabDisplacementX = handle.grabDisplacementY = 0.f; @@ -1266,15 +1268,16 @@ struct Decorator::Impl : public ConnectionTracker handle.globalPosition.y = handle.position.y; } - handle.grabDisplacementX += gesture.displacement.x; - handle.grabDisplacementY += ( handle.verticallyFlipped ? -gesture.displacement.y : gesture.displacement.y ); + const Vector2& displacement = gesture.GetDisplacement(); + handle.grabDisplacementX += displacement.x; + handle.grabDisplacementY += ( handle.verticallyFlipped ? -displacement.y : displacement.y ); const float x = handle.globalPosition.x + handle.grabDisplacementX; const float y = handle.globalPosition.y + handle.grabDisplacementY + 0.5f * handle.lineHeight; const float yVerticallyFlippedCorrected = y - ( handle.verticallyFlippedOnTouch ? handle.lineHeight : 0.f ); - if( ( Gesture::Started == gesture.state ) || - ( Gesture::Continuing == gesture.state ) ) + if( ( GestureState::STARTED == state ) || + ( GestureState::CONTINUING == state ) ) { Vector2 targetSize; mController.GetTargetSize( targetSize ); @@ -1316,8 +1319,8 @@ struct Decorator::Impl : public ConnectionTracker mIsHandlePanning = true; } - else if( ( Gesture::Finished == gesture.state ) || - ( Gesture::Cancelled == gesture.state ) ) + else if( ( GestureState::FINISHED == state ) || + ( GestureState::CANCELLED == state ) ) { if( mScrollTimer && ( mScrollTimer.IsRunning() || mNotifyEndOfScroll ) ) @@ -1362,7 +1365,7 @@ struct Decorator::Impl : public ConnectionTracker } } - bool OnGrabHandleTouched( Actor actor, const TouchData& touch ) + bool OnGrabHandleTouched( Actor actor, const TouchEvent& touch ) { HandleImpl& grabHandle = mHandle[GRAB_HANDLE]; @@ -1385,11 +1388,10 @@ struct Decorator::Impl : public ConnectionTracker SetHandleImage( GRAB_HANDLE ); } - // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area - return true; + return false; } - bool OnHandleOneTouched( Actor actor, const TouchData& touch ) + bool OnHandleOneTouched( Actor actor, const TouchEvent& touch ) { HandleImpl& primarySelectionHandle = mHandle[LEFT_SELECTION_HANDLE]; @@ -1416,11 +1418,10 @@ struct Decorator::Impl : public ConnectionTracker SetHandleImage( LEFT_SELECTION_HANDLE ); } - // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area - return true; + return false; } - bool OnHandleTwoTouched( Actor actor, const TouchData& touch ) + bool OnHandleTwoTouched( Actor actor, const TouchEvent& touch ) { HandleImpl& secondarySelectionHandle = mHandle[RIGHT_SELECTION_HANDLE]; @@ -1447,8 +1448,7 @@ struct Decorator::Impl : public ConnectionTracker SetHandleImage( RIGHT_SELECTION_HANDLE ); } - // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area - return true; + return false; } void HandleResetPosition( PropertyNotification& source ) @@ -1519,7 +1519,7 @@ struct Decorator::Impl : public ConnectionTracker LessThanCondition( mBoundingBox.y + topHeight ) ); // Notifies the change from false to true and from true to false. - mHandleVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleVerticalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1536,7 +1536,7 @@ struct Decorator::Impl : public ConnectionTracker GreaterThanCondition( mBoundingBox.w - bottomHeight ) ); // Notifies the change from false to true and from true to false. - mHandleVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleVerticalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1556,7 +1556,7 @@ struct Decorator::Impl : public ConnectionTracker LessThanCondition( mBoundingBox.y + topHeight ) ); // Notifies the change from false to true and from true to false. - mHandleVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleVerticalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1574,7 +1574,7 @@ struct Decorator::Impl : public ConnectionTracker GreaterThanCondition( mBoundingBox.w - bottomHeight ) ); // Notifies the change from false to true and from true to false. - mHandleVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleVerticalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1592,7 +1592,7 @@ struct Decorator::Impl : public ConnectionTracker LessThanCondition( mBoundingBox.y + topHeight ) ); // Notifies the change from false to true and from true to false. - mHandleVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleVerticalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1606,7 +1606,7 @@ struct Decorator::Impl : public ConnectionTracker GreaterThanCondition( mBoundingBox.w - bottomHeight ) ); // Notifies the change from false to true and from true to false. - mHandleVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleVerticalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1638,7 +1638,7 @@ struct Decorator::Impl : public ConnectionTracker LessThanCondition( mBoundingBox.x + leftWidth ) ); // Notifies the change from false to true and from true to false. - mHandleHorizontalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleHorizontalLessThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleHorizontalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1651,7 +1651,7 @@ struct Decorator::Impl : public ConnectionTracker GreaterThanCondition( mBoundingBox.z - rightWidth ) ); // Notifies the change from false to true and from true to false. - mHandleHorizontalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mHandleHorizontalGreaterThanNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); // Connects the signals with the callbacks. mHandleHorizontalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition ); @@ -1710,7 +1710,7 @@ struct Decorator::Impl : public ConnectionTracker const float popupHeight = mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT ); // Sets the position of the popup below. - mCopyPastePopup.actor.SetY( floorf( CalculateVerticalPopUpPosition( 0.5f * popupHeight, true ) ) ); + mCopyPastePopup.actor.SetProperty( Actor::Property::POSITION_Y, floorf( CalculateVerticalPopUpPosition( 0.5f * popupHeight, true ) ) ); } void PopUpLeavesBottomBoundary( PropertyNotification& source ) @@ -1718,7 +1718,7 @@ struct Decorator::Impl : public ConnectionTracker const float popupHeight = mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT ); // Sets the position of the popup above. - mCopyPastePopup.actor.SetY( floorf( CalculateVerticalPopUpPosition( 0.5f * popupHeight, false ) ) ); + mCopyPastePopup.actor.SetProperty( Actor::Property::POSITION_Y, floorf( CalculateVerticalPopUpPosition( 0.5f * popupHeight, false ) ) ); } void SetUpPopupPositionNotifications( const Vector3& popupHalfSize ) @@ -1747,19 +1747,21 @@ struct Decorator::Impl : public ConnectionTracker GreaterThanCondition( mBoundingBox.w - popupHalfSize.height ) ); // Notifies the change from false to true and from true to false. - mPopupTopExceedNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); - mPopupBottomExceedNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged ); + mPopupTopExceedNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); + mPopupBottomExceedNotification.SetNotifyMode( PropertyNotification::NOTIFY_ON_CHANGED ); mPopupTopExceedNotification.NotifySignal().Connect( this, &Decorator::Impl::PopUpLeavesTopBoundary ); mPopupBottomExceedNotification.NotifySignal().Connect( this, &Decorator::Impl::PopUpLeavesBottomBoundary ); } - void SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image ) + void SetHandleImage( HandleType handleType, HandleImageType handleImageType, const std::string& imageFileName ) { + ImageDimensions dimensions = Dali::GetOriginalImageSize( imageFileName ); + HandleImpl& handle = mHandle[handleType]; - handle.size = Size( image.GetWidth(), image.GetHeight() ); + handle.size = Size( dimensions.GetWidth(), dimensions.GetHeight() ); - mHandleImages[handleType][handleImageType] = image; + mHandleImages[handleType][handleImageType] = imageFileName; } void SetScrollThreshold( float threshold ) @@ -1897,13 +1899,13 @@ struct Decorator::Impl : public ConnectionTracker TextSelectionPopup::Buttons mEnabledPopupButtons; /// Bit mask of currently enabled Popup buttons TextSelectionPopupCallbackInterface& mTextSelectionPopupCallbackInterface; - Image mHandleImages[HANDLE_TYPE_COUNT][HANDLE_IMAGE_TYPE_COUNT]; + std::string mHandleImages[HANDLE_TYPE_COUNT][HANDLE_IMAGE_TYPE_COUNT]; Vector4 mHandleColor; CursorImpl mCursor[CURSOR_COUNT]; HandleImpl mHandle[HANDLE_TYPE_COUNT]; - PropertyBuffer mQuadVertices; + VertexBuffer mQuadVertices; Geometry mQuadGeometry; QuadContainer mHighlightQuadList; ///< Sub-selections that combine to create the complete selection highlight. @@ -1912,6 +1914,7 @@ struct Decorator::Impl : public ConnectionTracker Vector2 mHighlightPosition; ///< The position of the highlight actor. Size mHighlightSize; ///< The size of the highlighted text. Size mControlSize; ///< The control's size. Set by the Relayout. + float mHighlightOutlineOffset; ///< The outline's offset. unsigned int mActiveCursor; unsigned int mCursorBlinkInterval; @@ -2107,11 +2110,11 @@ void Decorator::SetHandleActive( HandleType handleType, bool active ) // The problem is the handle actor does not receive the touch event with the Interrupt // state when the power button is pressed and the application goes to background. mImpl->mHandle[handleType].pressed = false; - Image imageReleased = mImpl->mHandleImages[handleType][HANDLE_IMAGE_RELEASED]; + const bool imageReleased = mImpl->mHandleImages[handleType][HANDLE_IMAGE_RELEASED].size(); ImageView imageView = mImpl->mHandle[handleType].actor; if( imageReleased && imageView ) { - imageView.SetImage( imageReleased ); + imageView.SetImage( mImpl->mHandleImages[handleType][HANDLE_IMAGE_RELEASED] ); } } @@ -2122,12 +2125,12 @@ bool Decorator::IsHandleActive( HandleType handleType ) const return mImpl->mHandle[handleType].active ; } -void Decorator::SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image ) +void Decorator::SetHandleImage( HandleType handleType, HandleImageType handleImageType, const std::string& imageFileName ) { - mImpl->SetHandleImage( handleType, handleImageType, image ); + mImpl->SetHandleImage( handleType, handleImageType, imageFileName ); } -Dali::Image Decorator::GetHandleImage( HandleType handleType, HandleImageType handleImageType ) const +const std::string& Decorator::GetHandleImage( HandleType handleType, HandleImageType handleImageType ) const { return mImpl->mHandleImages[handleType][handleImageType]; } @@ -2199,16 +2202,18 @@ void Decorator::AddHighlight( unsigned int index, const Vector4& quad ) *( mImpl->mHighlightQuadList.Begin() + index ) = quad; } -void Decorator::SetHighLightBox( const Vector2& position, const Size& size ) +void Decorator::SetHighLightBox( const Vector2& position, const Size& size, float outlineOffset ) { mImpl->mHighlightPosition = position; mImpl->mHighlightSize = size; + mImpl->mHighlightOutlineOffset = outlineOffset; } void Decorator::ClearHighlights() { mImpl->mHighlightQuadList.Clear(); mImpl->mHighlightPosition = Vector2::ZERO; + mImpl->mHighlightOutlineOffset = 0.f; } void Decorator::ResizeHighlightQuads( unsigned int numberOfQuads ) @@ -2236,6 +2241,11 @@ bool Decorator::IsHighlightActive() const return mImpl->mIsHighlightBoxActive; } +bool Decorator::IsHighlightVisible() const +{ + return ( mImpl->mHighlightActor && mImpl->mHighlightActor.GetParent() ); +} + void Decorator::SetTextDepth( int textDepth ) { mImpl->mTextDepth = textDepth; @@ -2259,9 +2269,9 @@ void Decorator::SetEnabledPopupButtons( TextSelectionPopup::Buttons& enabledButt { mImpl->mCopyPastePopup.actor = TextSelectionPopup::New( &mImpl->mTextSelectionPopupCallbackInterface ); #ifdef DECORATOR_DEBUG - mImpl->mCopyPastePopup.actor.SetName("mCopyPastePopup"); + mImpl->mCopyPastePopup.actor.SetProperty( Dali::Actor::Property::NAME,"mCopyPastePopup"); #endif - mImpl->mCopyPastePopup.actor.SetAnchorPoint( AnchorPoint::CENTER ); + mImpl->mCopyPastePopup.actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); mImpl->mCopyPastePopup.actor.OnRelayoutSignal().Connect( mImpl, &Decorator::Impl::SetPopupPosition ); // Position popup after size negotiation }