From: Adeel Kazmi Date: Fri, 4 Sep 2015 13:03:04 +0000 (-0700) Subject: Merge "Notify the IMF when backspace/cut empties the TextField" into devel/master X-Git-Tag: dali_1.1.2~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=dcf0eeebe1e683b311b675e93adcc21a0602e671;hp=bcbdc0b7654fb74b6527ee371deb61257abcf7a9 Merge "Notify the IMF when backspace/cut empties the TextField" into devel/master --- diff --git a/build/tizen/dali-toolkit/Makefile.am b/build/tizen/dali-toolkit/Makefile.am index b5ba49a..bd24d22 100644 --- a/build/tizen/dali-toolkit/Makefile.am +++ b/build/tizen/dali-toolkit/Makefile.am @@ -38,6 +38,9 @@ daliimage_DATA = ${dali_toolkit_image_files} dalisounddir = ${dataReadOnlyDir}/toolkit/sounds/ dalisound_DATA = ${dali_toolkit_sound_files} +package_doxy_dir = ../../../doc +include ../../../doc/file.list + # The library lib_LTLIBRARIES = libdali-toolkit.la @@ -155,3 +158,6 @@ publicapitextcontrols_HEADERS = $(public_api_text_controls_header_files) publicapifocusmanager_HEADERS = $(public_api_focus_manager_header_files) publicapirenderingbackend_HEADERS = $(public_api_rendering_backend_header_files) +# package doxygen file (contains doxygen grouping information) +packagedoxydir = $(topleveldir)/doc +packagedoxy_HEADERS = $(package_doxy_files) diff --git a/build/tizen/docs/dali.doxy.in b/build/tizen/docs/dali.doxy.in index 438d79d..3fa2e57 100644 --- a/build/tizen/docs/dali.doxy.in +++ b/build/tizen/docs/dali.doxy.in @@ -758,9 +758,12 @@ WARN_LOGFILE = # Note: If this tag is empty the current directory is searched. INPUT = @DOXYGEN_DOCS_DIR@/content \ + @prefix@/include/dali/doc/dali-core-doc.h \ + @prefix@/include/dali/doc/dali-adaptor-doc.h \ + ../../../../dali-toolkit/doc/dali-toolkit-doc.h \ + @prefix@/include/dali \ ../../../../dali-toolkit/dali-toolkit/public-api \ - ../../../automated-tests/README.md \ - @prefix@/include/dali + ../../../automated-tests/README.md # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 5e69586..9c3d4c8 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -464,7 +464,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr { const Image image = Scripting::NewImage( value ); - if( impl.mDecorator ) + if( impl.mDecorator && image ) { impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, image ); impl.RequestTextRelayout(); @@ -475,7 +475,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr { const Image image = Scripting::NewImage( value ); - if( impl.mDecorator ) + if( impl.mDecorator && image ) { impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, image ); impl.RequestTextRelayout(); @@ -486,7 +486,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr { const Image image = Scripting::NewImage( value ); - if( impl.mDecorator ) + if( impl.mDecorator && image ) { impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, image ); impl.RequestTextRelayout(); @@ -497,7 +497,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr { const Image image = Scripting::NewImage( value ); - if( impl.mDecorator ) + if( impl.mDecorator && image ) { impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, image ); impl.RequestTextRelayout(); @@ -507,7 +507,8 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT: { const Image image = Scripting::NewImage( value ); - if( impl.mDecorator ) + + if( impl.mDecorator && image ) { impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, image ); impl.RequestTextRelayout(); @@ -517,7 +518,8 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT: { const Image image = Scripting::NewImage( value ); - if( impl.mDecorator ) + + if( impl.mDecorator && image ) { impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, image ); impl.RequestTextRelayout(); @@ -827,7 +829,9 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde { if( impl.mDecorator ) { - value = impl.mDecorator->GetBoundingBox(); + Rect boundingBox; + impl.mDecorator->GetBoundingBox( boundingBox ); + value = boundingBox; } break; } @@ -895,7 +899,10 @@ void TextField::OnInitialize() self.TouchedSignal().Connect( this, &TextField::OnTouched ); // Set BoundingBox to stage size if not already set. - if ( mDecorator->GetBoundingBox().IsEmpty() ) + Rect boundingBox; + mDecorator->GetBoundingBox( boundingBox ); + + if( boundingBox.IsEmpty() ) { Vector2 stageSize = Dali::Stage::GetCurrent().GetSize(); mDecorator->SetBoundingBox( Rect( 0.0f, 0.0f, stageSize.width, stageSize.height ) ); diff --git a/dali-toolkit/internal/text/decorator/text-decorator.cpp b/dali-toolkit/internal/text/decorator/text-decorator.cpp index 69ecac3..441d179 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -159,6 +159,16 @@ void LocalToWorldCoordinatesBoundingBox( const Dali::Rect& boundingRectangl originY + boundingRectangle.height ); } +void WorldToLocalCoordinatesBoundingBox( const Dali::Vector4& boundingBox, Dali::Rect& boundingRectangle ) +{ + // Convert to local coordinates and store as a Dali::Rect. + Dali::Vector2 stageSize = Dali::Stage::GetCurrent().GetSize(); + + boundingRectangle.x = boundingBox.x + 0.5f * stageSize.width; + boundingRectangle.y = boundingBox.y + 0.5f * stageSize.height; + boundingRectangle.width = boundingBox.z - boundingBox.x; + boundingRectangle.height = boundingBox.w - boundingBox.y; +} } // end of namespace @@ -202,13 +212,15 @@ struct Decorator::Impl : public ConnectionTracker { HandleImpl() : position(), + size(), lineHeight( 0.0f ), grabDisplacementX( 0.f ), grabDisplacementY( 0.f ), active( false ), visible( false ), pressed( false ), - flipped( false ) + horizontallyFlipped( false ), + verticallyFlipped( false ) { } @@ -217,13 +229,15 @@ struct Decorator::Impl : public ConnectionTracker ImageActor markerActor; Vector2 position; - float lineHeight; ///< Not the handle height - float grabDisplacementX; - float grabDisplacementY; - bool active : 1; - bool visible : 1; - bool pressed : 1; - bool flipped : 1; + Size size; + float lineHeight; ///< Not the handle height + float grabDisplacementX; + float grabDisplacementY; + bool active : 1; + bool visible : 1; + bool pressed : 1; + bool horizontallyFlipped : 1; ///< Whether the handle has been horizontally flipped. + bool verticallyFlipped : 1; ///< Whether the handle has been vertically flipped. }; struct PopupImpl @@ -245,7 +259,7 @@ struct Decorator::Impl : public ConnectionTracker mEnabledPopupButtons( TextSelectionPopup::NONE ), mTextSelectionPopupCallbackInterface( callbackInterface ), mHandleColor( HANDLE_COLOR ), - mBoundingBox( Rect() ), + mBoundingBox(), mHighlightColor( LIGHT_BLUE ), mHighlightPosition( Vector2::ZERO ), mActiveCursor( ACTIVE_CURSOR_NONE ), @@ -263,12 +277,19 @@ struct Decorator::Impl : public ConnectionTracker mDelayCursorBlink( false ), mPrimaryCursorVisible( false ), mSecondaryCursorVisible( false ), - mSwapSelectionHandles( false ), + mFlipSelectionHandlesOnCross( false ), + mFlipLeftSelectionHandleDirection( false ), + mFlipRightSelectionHandleDirection( false ), + mHandlePanning( false ), + mHandleCurrentCrossed( false ), + mHandlePreviousCrossed( false ), mNotifyEndOfScroll( false ) { mQuadVertexFormat[ "aPosition" ] = Property::VECTOR2; mQuadIndexFormat[ "indices" ] = Property::INTEGER; mHighlightMaterial = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) ); + + SetupTouchEvents(); } /** @@ -289,7 +310,7 @@ struct Decorator::Impl : public ConnectionTracker mPrimaryCursorVisible = ( cursor.position.x <= size.width ) && ( cursor.position.x >= 0.f ); if( mPrimaryCursorVisible ) { - Vector2 position = cursor.position; + const Vector2& position = cursor.position; mPrimaryCursor.SetPosition( position.x, position.y ); @@ -314,18 +335,19 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& grabHandle = mHandle[GRAB_HANDLE]; if( grabHandle.active ) { - Vector2 position = grabHandle.position; + const Vector2& position = grabHandle.position; const bool isVisible = ( position.x <= size.width ) && ( position.x >= 0.f ); if( isVisible ) { - SetupTouchEvents(); - CreateGrabHandle(); - grabHandle.actor.SetPosition( position.x - floor( 0.5f * mCursorWidth ), - position.y + grabHandle.lineHeight ); // TODO : Fix for multiline. + // Sets the grab handle position and calculate if it needs to be vertically flipped if it exceeds the boundary box. + SetGrabHandlePosition(); + + // Sets the grab handle image according if it's pressed, flipped, etc. + SetHandleImage( GRAB_HANDLE ); } grabHandle.actor.SetVisible( isVisible ); } @@ -339,30 +361,32 @@ struct Decorator::Impl : public ConnectionTracker HandleImpl& secondary = mHandle[ RIGHT_SELECTION_HANDLE ]; if( primary.active || secondary.active ) { - Vector2 primaryPosition = primary.position; - Vector2 secondaryPosition = secondary.position; + const Vector2& primaryPosition = primary.position; + const Vector2& secondaryPosition = secondary.position; 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 ); // TODO : Fix for multiline. + SetSelectionHandlePosition( LEFT_SELECTION_HANDLE ); + + // Sets the primary handle image according if it's pressed, flipped, etc. + SetHandleImage( LEFT_SELECTION_HANDLE ); SetSelectionHandleMarkerSize( primary ); } if( isSecondaryVisible ) { - secondary.actor.SetPosition( secondaryPosition.x, - secondaryPosition.y + secondary.lineHeight ); // TODO : Fix for multiline. + SetSelectionHandlePosition( RIGHT_SELECTION_HANDLE ); + + // Sets the secondary handle image according if it's pressed, flipped, etc. + SetHandleImage( RIGHT_SELECTION_HANDLE ); SetSelectionHandleMarkerSize( secondary ); } @@ -560,17 +584,11 @@ struct Decorator::Impl : public ConnectionTracker void SetupTouchEvents() { - if ( !mTapDetector ) - { - mTapDetector = TapGestureDetector::New(); - mTapDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnTap ); - } + mTapDetector = TapGestureDetector::New(); + mTapDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnTap ); - if ( !mPanGestureDetector ) - { - mPanGestureDetector = PanGestureDetector::New(); - mPanGestureDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnPan ); - } + mPanGestureDetector = PanGestureDetector::New(); + mPanGestureDetector.DetectedSignal().Connect( this, &Decorator::Impl::OnPan ); } void CreateActiveLayer() @@ -597,7 +615,6 @@ struct Decorator::Impl : public ConnectionTracker { if ( handle.markerActor ) { - handle.markerActor.SetResizePolicy ( ResizePolicy::FIXED, Dimension::HEIGHT ); handle.markerActor.SetSize( 0, handle.lineHeight ); } } @@ -609,7 +626,7 @@ struct Decorator::Impl : public ConnectionTracker { if( !mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] ) { - mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] = ResourceImage::New( DEFAULT_GRAB_HANDLE_IMAGE_RELEASED ); + SetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED, ResourceImage::New( DEFAULT_GRAB_HANDLE_IMAGE_RELEASED ) ); } grabHandle.actor = ImageActor::New( mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED] ); @@ -654,12 +671,14 @@ struct Decorator::Impl : public ConnectionTracker void CreateHandleMarker( HandleImpl& handle, Image& image, HandleType handleType ) { - if ( image) + if ( image ) { handle.markerActor = ImageActor::New( image ); handle.markerActor.SetColor( mHandleColor ); handle.actor.Add( handle.markerActor ); + handle.markerActor.SetResizePolicy ( ResizePolicy::FIXED, Dimension::HEIGHT ); + if ( LEFT_SELECTION_HANDLE == handleType ) { handle.markerActor.SetAnchorPoint( AnchorPoint::BOTTOM_RIGHT ); @@ -684,7 +703,6 @@ struct Decorator::Impl : public ConnectionTracker #endif primary.actor.SetAnchorPoint( AnchorPoint::TOP_RIGHT ); // Change to BOTTOM_RIGHT if Look'n'Feel requires handle above text. primary.actor.SetSortModifier( DECORATION_DEPTH_INDEX ); - primary.flipped = false; primary.actor.SetColor( mHandleColor ); primary.grabArea = Actor::New(); // Area that Grab handle responds to, larger than actual handle so easier to move @@ -719,7 +737,6 @@ struct Decorator::Impl : public ConnectionTracker #endif secondary.actor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); // Change to BOTTOM_LEFT if Look'n'Feel requires handle above text. secondary.actor.SetSortModifier( DECORATION_DEPTH_INDEX ); - secondary.flipped = false; secondary.actor.SetColor( mHandleColor ); secondary.grabArea = Actor::New(); // Area that Grab handle responds to, larger than actual handle so easier to move @@ -746,6 +763,141 @@ struct Decorator::Impl : public ConnectionTracker } } + void CalculateHandleWorldCoordinates( HandleImpl& handle, Vector2& position ) + { + // Get the world position of the active layer + const Vector3 parentWorldPosition = mActiveLayer.GetCurrentWorldPosition(); + + // Get the size of the UI control. + Vector2 targetSize; + mController.GetTargetSize( targetSize ); + + // The grab handle position in world coords. + position.x = parentWorldPosition.x - 0.5f * targetSize.width + handle.position.x; + position.y = parentWorldPosition.y - 0.5f * targetSize.height + handle.position.y + handle.lineHeight; + } + + void SetGrabHandlePosition() + { + // Reference to the grab handle. + HandleImpl& grabHandle = mHandle[GRAB_HANDLE]; + + // The grab handle position in world coords. + Vector2 grabHandleWorldPosition; + CalculateHandleWorldCoordinates( grabHandle, grabHandleWorldPosition ); + + // Check if the grab handle exceeds the boundaries of the decoration box. + // At the moment only the height is checked for the grab handle. + grabHandle.verticallyFlipped = ( grabHandleWorldPosition.y + grabHandle.size.height > mBoundingBox.w ); + + // The grab handle 'y' position in local coords. + // If the grab handle exceeds the bottom of the decoration box, + // set the 'y' position to the top of the line. + // The SetGrabHandleImage() method will change the orientation. + const float yLocalPosition = grabHandle.verticallyFlipped ? grabHandle.position.y : grabHandle.position.y + grabHandle.lineHeight; + + grabHandle.actor.SetPosition( grabHandle.position.x - floor( 0.5f * mCursorWidth ), + yLocalPosition ); // TODO : Fix for multiline. + } + + void SetSelectionHandlePosition( HandleType type ) + { + const bool isPrimaryHandle = LEFT_SELECTION_HANDLE == type; + + // Reference to the selection handle. + HandleImpl& handle = mHandle[type]; + + // Get the world coordinates of the handle position. + Vector2 handleWorldPosition; + CalculateHandleWorldCoordinates( handle, handleWorldPosition ); + + // Whether to flip the handle. + bool flipHandle = isPrimaryHandle ? mFlipLeftSelectionHandleDirection : mFlipRightSelectionHandleDirection; + + // Whether to flip the handles if they are crossed. + bool crossFlip = false; + if( mFlipSelectionHandlesOnCross || !mHandlePanning ) + { + crossFlip = mHandleCurrentCrossed; + } + + // Does not flip if both conditions are true (double flip) + flipHandle = flipHandle != ( crossFlip || mHandlePreviousCrossed ); + + // Check if the selection handle exceeds the boundaries of the decoration box. + const bool exceedsLeftEdge = ( isPrimaryHandle ? !flipHandle : flipHandle ) && ( handleWorldPosition.x - handle.size.width < mBoundingBox.x ); + + const bool exceedsRightEdge = ( isPrimaryHandle ? flipHandle : !flipHandle ) && ( handleWorldPosition.x + handle.size.width > mBoundingBox.z ); + + // Does not flip if both conditions are true (double flip) + flipHandle = flipHandle != ( exceedsLeftEdge || exceedsRightEdge ); + + if( flipHandle ) + { + if( !handle.horizontallyFlipped ) + { + // Change the anchor point to flip the image. + handle.actor.SetAnchorPoint( isPrimaryHandle ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT ); + + handle.horizontallyFlipped = true; + } + } + else + { + if( handle.horizontallyFlipped ) + { + // Reset the anchor point. + handle.actor.SetAnchorPoint( isPrimaryHandle ? AnchorPoint::TOP_RIGHT : AnchorPoint::TOP_LEFT ); + + handle.horizontallyFlipped = false; + } + } + + // Whether to flip the handle vertically. + handle.verticallyFlipped = ( handleWorldPosition.y + handle.size.height > mBoundingBox.w ); + + // The primary selection handle 'y' position in local coords. + // If the handle exceeds the bottom of the decoration box, + // set the 'y' position to the top of the line. + // The SetHandleImage() method will change the orientation. + const float yLocalPosition = handle.verticallyFlipped ? handle.position.y : handle.position.y + handle.lineHeight; + + handle.actor.SetPosition( handle.position.x, + yLocalPosition ); // TODO : Fix for multiline. + } + + void SetHandleImage( HandleType type ) + { + HandleImpl& handle = mHandle[type]; + + HandleType markerType = HANDLE_TYPE_COUNT; + // If the selection handle is flipped it chooses the image of the other selection handle. Does nothing for the grab handle. + if( LEFT_SELECTION_HANDLE == type ) + { + type = handle.horizontallyFlipped ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE; + markerType = handle.horizontallyFlipped ? RIGHT_SELECTION_HANDLE_MARKER : LEFT_SELECTION_HANDLE_MARKER; + } + else if( RIGHT_SELECTION_HANDLE == type ) + { + type = handle.horizontallyFlipped ? LEFT_SELECTION_HANDLE : RIGHT_SELECTION_HANDLE; + markerType = handle.horizontallyFlipped ? LEFT_SELECTION_HANDLE_MARKER : RIGHT_SELECTION_HANDLE_MARKER; + } + + // Chooses between the released or pressed image. It checks whether the pressed image exists. + const HandleImageType imageType = ( handle.pressed ? ( mHandleImages[type][HANDLE_IMAGE_PRESSED] ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED ); + + handle.actor.SetImage( mHandleImages[type][imageType] ); + + if( HANDLE_TYPE_COUNT != markerType ) + { + const HandleImageType markerImageType = ( handle.pressed ? ( mHandleImages[markerType][HANDLE_IMAGE_PRESSED] ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED ) : HANDLE_IMAGE_RELEASED ); + handle.markerActor.SetImage( mHandleImages[markerType][markerImageType] ); + } + + // Whether to flip the handle vertically. + handle.actor.SetOrientation( handle.verticallyFlipped ? ANGLE_180 : ANGLE_0, Vector3::XAXIS ); + } + void CreateHighlight() { if( !mHighlightActor ) @@ -905,6 +1057,8 @@ struct Decorator::Impl : public ConnectionTracker StopScrollTimer(); mController.DecorationEvent( type, HANDLE_PRESSED, x, y ); } + + mHandlePanning = true; } else if( Gesture::Finished == gesture.state || Gesture::Cancelled == gesture.state ) @@ -922,22 +1076,10 @@ struct Decorator::Impl : public ConnectionTracker mController.DecorationEvent( type, HANDLE_RELEASED, x, y ); } - if( GRAB_HANDLE == type ) - { - handle.actor.SetImage( mHandleImages[type][HANDLE_IMAGE_RELEASED] ); - } - else - { - HandleType selectionHandleType = type; - - if( mSwapSelectionHandles != handle.flipped ) - { - selectionHandleType = ( LEFT_SELECTION_HANDLE == type ) ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE; - } - - handle.actor.SetImage( mHandleImages[selectionHandleType][HANDLE_IMAGE_RELEASED] ); - } + handle.actor.SetImage( mHandleImages[type][HANDLE_IMAGE_RELEASED] ); handle.pressed = false; + + mHandlePanning = false; } } @@ -972,22 +1114,14 @@ struct Decorator::Impl : public ConnectionTracker if( TouchPoint::Down == point.state ) { mHandle[GRAB_HANDLE].pressed = true; - Image imagePressed = mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_PRESSED]; - if( imagePressed ) - { - mHandle[GRAB_HANDLE].actor.SetImage( imagePressed ); - } } else if( ( TouchPoint::Up == point.state ) || ( TouchPoint::Interrupted == point.state ) ) { mHandle[GRAB_HANDLE].pressed = false; - Image imageReleased = mHandleImages[GRAB_HANDLE][HANDLE_IMAGE_RELEASED]; - if( imageReleased ) - { - mHandle[GRAB_HANDLE].actor.SetImage( imageReleased ); - } } + + SetHandleImage( GRAB_HANDLE ); } // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area @@ -1002,26 +1136,19 @@ struct Decorator::Impl : public ConnectionTracker { const TouchPoint& point = event.GetPoint(0); - const bool flip = mSwapSelectionHandles != mHandle[LEFT_SELECTION_HANDLE].flipped; if( TouchPoint::Down == point.state ) { mHandle[LEFT_SELECTION_HANDLE].pressed = true; - Image imagePressed = mHandleImages[flip ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED]; - if( imagePressed ) - { - mHandle[LEFT_SELECTION_HANDLE].actor.SetImage( imagePressed ); - } } else if( ( TouchPoint::Up == point.state ) || ( TouchPoint::Interrupted == point.state ) ) { mHandle[LEFT_SELECTION_HANDLE].pressed = false; - Image imageReleased = mHandleImages[flip ? RIGHT_SELECTION_HANDLE : LEFT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED]; - if( imageReleased ) - { - mHandle[LEFT_SELECTION_HANDLE].actor.SetImage( imageReleased ); - } + mHandlePreviousCrossed = mHandleCurrentCrossed; + mHandlePanning = false; } + + SetHandleImage( LEFT_SELECTION_HANDLE ); } // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area @@ -1036,26 +1163,19 @@ struct Decorator::Impl : public ConnectionTracker { const TouchPoint& point = event.GetPoint(0); - const bool flip = mSwapSelectionHandles != mHandle[RIGHT_SELECTION_HANDLE].flipped; if( TouchPoint::Down == point.state ) { - Image imagePressed = mHandleImages[flip ? LEFT_SELECTION_HANDLE : RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED]; mHandle[RIGHT_SELECTION_HANDLE].pressed = true; - if( imagePressed ) - { - mHandle[RIGHT_SELECTION_HANDLE].actor.SetImage( imagePressed ); - } } else if( ( TouchPoint::Up == point.state ) || ( TouchPoint::Interrupted == point.state ) ) { - Image imageReleased = mHandleImages[flip ? LEFT_SELECTION_HANDLE : RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_RELEASED]; mHandle[RIGHT_SELECTION_HANDLE].pressed = false; - if( imageReleased ) - { - mHandle[RIGHT_SELECTION_HANDLE].actor.SetImage( imageReleased ); - } + mHandlePreviousCrossed = mHandleCurrentCrossed; + mHandlePanning = false; } + + SetHandleImage( RIGHT_SELECTION_HANDLE ); } // Consume to avoid pop-ups accidentally closing, when handle is outside of pop-up area @@ -1108,19 +1228,16 @@ struct Decorator::Impl : public ConnectionTracker // Exceeding vertical boundary - Vector4 worldCoordinatesBoundingBox; - LocalToWorldCoordinatesBoundingBox( mBoundingBox, worldCoordinatesBoundingBox ); - float popupHeight = mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT); PropertyNotification verticalExceedNotification = mCopyPastePopup.actor.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y, - OutsideCondition( worldCoordinatesBoundingBox.y + popupHeight * 0.5f, - worldCoordinatesBoundingBox.w - popupHeight * 0.5f ) ); + OutsideCondition( mBoundingBox.y + popupHeight * 0.5f, + mBoundingBox.w - popupHeight * 0.5f ) ); verticalExceedNotification.NotifySignal().Connect( this, &Decorator::Impl::PopUpLeavesVerticalBoundary ); } - void GetConstrainedPopupPosition( Vector3& requiredPopupPosition, Vector3& popupSize, Vector3 anchorPoint, Actor& parent, Rect& boundingBox ) + void GetConstrainedPopupPosition( Vector3& requiredPopupPosition, Vector3& popupSize, Vector3 anchorPoint, Actor& parent, const Vector4& boundingRectangleWorld ) { DALI_ASSERT_DEBUG ( "Popup parent not on stage" && parent.OnStage() ) @@ -1130,10 +1247,6 @@ struct Decorator::Impl : public ConnectionTracker Vector3 popupWorldPosition = parentWorldPositionLeftAnchor + requiredPopupPosition; // Parent World position plus popup local position gives World Position Vector3 popupDistanceFromAnchorPoint = popupSize*anchorPoint; - // Bounding rectangle is supplied as screen coordinates, bounding will be done in world coordinates. - Vector4 boundingRectangleWorld; - LocalToWorldCoordinatesBoundingBox( boundingBox, boundingRectangleWorld ); - // Calculate distance to move popup (in local space) so fits within the boundary float xOffSetToKeepWithinBounds = 0.0f; if( popupWorldPosition.x - popupDistanceFromAnchorPoint.x < boundingRectangleWorld.x ) @@ -1156,41 +1269,14 @@ struct Decorator::Impl : public ConnectionTracker // Prevent pixel mis-alignment by rounding down. requiredPopupPosition.x = static_cast( requiredPopupPosition.x ); requiredPopupPosition.y = static_cast( requiredPopupPosition.y ); - } - void FlipSelectionHandleImages() + void SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image ) { - SetupTouchEvents(); - - CreateSelectionHandles(); - - HandleImpl& leftHandle = mHandle[LEFT_SELECTION_HANDLE]; - HandleImpl& rightHandle = mHandle[RIGHT_SELECTION_HANDLE]; - - // If handle pressed and pressed image exists then use pressed image else stick with released image - const HandleImageType leftImageType = ( leftHandle.pressed && mHandleImages[LEFT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED] ) ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED; - const HandleImageType rightImageType = ( rightHandle.pressed && mHandleImages[RIGHT_SELECTION_HANDLE][HANDLE_IMAGE_PRESSED] ) ? HANDLE_IMAGE_PRESSED : HANDLE_IMAGE_RELEASED; + HandleImpl& handle = mHandle[handleType]; + handle.size = Size( image.GetWidth(), image.GetHeight() ); - const bool leftFlipped = mSwapSelectionHandles != leftHandle.flipped; - const bool rightFlipped = mSwapSelectionHandles != rightHandle.flipped; - - leftHandle.actor.SetImage( leftFlipped ? mHandleImages[RIGHT_SELECTION_HANDLE][leftImageType] : mHandleImages[LEFT_SELECTION_HANDLE][leftImageType] ); - - leftHandle.actor.SetAnchorPoint( leftFlipped ? AnchorPoint::TOP_LEFT : AnchorPoint::TOP_RIGHT ); - - 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] ); - } + mHandleImages[handleType][handleImageType] = image; } void SetScrollThreshold( float threshold ) @@ -1303,7 +1389,7 @@ struct Decorator::Impl : public ConnectionTracker Geometry mQuadGeometry; QuadContainer mHighlightQuadList; ///< Sub-selections that combine to create the complete selection highlight - Rect mBoundingBox; + Vector4 mBoundingBox; ///< The bounding box in world coords. Vector4 mHighlightColor; ///< Color of the highlight Vector2 mHighlightPosition; ///< The position of the highlight actor. @@ -1318,13 +1404,18 @@ struct Decorator::Impl : public ConnectionTracker float mScrollDistance; ///< Distance the text scrolls during a scroll interval. int mTextDepth; ///< The depth used to render the text. - bool mActiveCopyPastePopup : 1; - bool mCursorBlinkStatus : 1; ///< Flag to switch between blink on and blink off. - bool mDelayCursorBlink : 1; ///< Used to avoid cursor blinking when entering text. - 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. - bool mNotifyEndOfScroll : 1; ///< Whether to notify the end of the scroll. + bool mActiveCopyPastePopup : 1; + bool mCursorBlinkStatus : 1; ///< Flag to switch between blink on and blink off. + bool mDelayCursorBlink : 1; ///< Used to avoid cursor blinking when entering text. + bool mPrimaryCursorVisible : 1; ///< Whether the primary cursor is visible. + bool mSecondaryCursorVisible : 1; ///< Whether the secondary cursor is visible. + bool mFlipSelectionHandlesOnCross : 1; ///< Whether to flip the selection handles as soon as they cross. + bool mFlipLeftSelectionHandleDirection : 1; ///< Whether to flip the left selection handle image because of the character's direction. + bool mFlipRightSelectionHandleDirection : 1; ///< Whether to flip the right selection handle image because of the character's direction. + bool mHandlePanning : 1; ///< Whether any of the handles is moving. + bool mHandleCurrentCrossed : 1; ///< Whether the handles are crossed. + bool mHandlePreviousCrossed : 1; ///< Whether the handles where crossed at the last handle touch up. + bool mNotifyEndOfScroll : 1; ///< Whether to notify the end of the scroll. }; DecoratorPtr Decorator::New( ControllerInterface& controller, @@ -1336,12 +1427,12 @@ DecoratorPtr Decorator::New( ControllerInterface& controller, void Decorator::SetBoundingBox( const Rect& boundingBox ) { - mImpl->mBoundingBox = boundingBox; + LocalToWorldCoordinatesBoundingBox( boundingBox, mImpl->mBoundingBox ); } -const Rect& Decorator::GetBoundingBox() const +void Decorator::GetBoundingBox( Rect& boundingBox ) const { - return mImpl->mBoundingBox; + WorldToLocalCoordinatesBoundingBox( mImpl->mBoundingBox, boundingBox ); } void Decorator::Relayout( const Vector2& size ) @@ -1465,6 +1556,11 @@ void Decorator::SetHandleActive( HandleType handleType, bool active ) if( !active ) { + if( ( LEFT_SELECTION_HANDLE == handleType ) || ( RIGHT_SELECTION_HANDLE == handleType ) ) + { + mImpl->mHandlePreviousCrossed = false; + } + // TODO: this is a work-around. // 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. @@ -1476,6 +1572,7 @@ void Decorator::SetHandleActive( HandleType handleType, bool active ) imageActor.SetImage( imageReleased ); } } + } bool Decorator::IsHandleActive( HandleType handleType ) const @@ -1485,7 +1582,7 @@ bool Decorator::IsHandleActive( HandleType handleType ) const void Decorator::SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image ) { - mImpl->mHandleImages[handleType][handleImageType] = image; + mImpl->SetHandleImage( handleType, handleImageType, image ); } Dali::Image Decorator::GetHandleImage( HandleType handleType, HandleImageType handleImageType ) const @@ -1530,11 +1627,16 @@ const Vector2& Decorator::GetPosition( HandleType handleType ) const return mImpl->mHandle[handleType].position; } -void Decorator::SwapSelectionHandlesEnabled( bool enable ) +void Decorator::FlipSelectionHandlesOnCrossEnabled( bool enable ) { - mImpl->mSwapSelectionHandles = enable; + mImpl->mFlipSelectionHandlesOnCross = enable; +} - mImpl->FlipSelectionHandleImages(); +void Decorator::SetSelectionHandleFlipState( bool indicesSwapped, bool left, bool right ) +{ + mImpl->mHandleCurrentCrossed = indicesSwapped; + mImpl->mFlipLeftSelectionHandleDirection = left; + mImpl->mFlipRightSelectionHandleDirection = right; } void Decorator::AddHighlight( float x1, float y1, float x2, float y2 ) diff --git a/dali-toolkit/internal/text/decorator/text-decorator.h b/dali-toolkit/internal/text/decorator/text-decorator.h index 1587703..4e36fa7 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.h +++ b/dali-toolkit/internal/text/decorator/text-decorator.h @@ -179,9 +179,9 @@ public: * @brief Retrieve the bounding box origin and dimensions. * * default is set once control is added to stage, before this the return vector will be Vector4:ZERO - * @return Rect the bounding box origin, width and height + * @param[out] boundingBox The bounding box origin, width and height. */ - const Rect& GetBoundingBox() const; + void GetBoundingBox( Rect& boundingBox ) const; /** * @brief The decorator waits until a relayout before creating actors etc. @@ -397,12 +397,25 @@ public: const Vector2& GetPosition( HandleType handleType ) const; /** - * @brief Swaps the selection handle's images. + * @brief Whether to flip the selection handles as soon as they are crossed. * - * This method is called by the text controller to swap the handles - * when the start index is bigger than the end one. + * By default they flip when the handle is released. + * + * @param[in] enable If @e true the selection handles will flip as soon as they are crossed. + */ + void FlipSelectionHandlesOnCrossEnabled( bool enable ); + + /** + * @brief Sets info to calculate the handle flip state. + * + * Sets the character's direction where the handles are pointing. + * It resets the decorator internal flip state when there is a new selection. + * + * @param[in] indicesSwapped Whether the selection handle indices are swapped (start > end). + * @param[in] left The direction of the character pointed by the primary selection handle. + * @param[in] right The direction of the character pointed by the secondary selection handle. */ - void SwapSelectionHandlesEnabled( bool enable ); + void SetSelectionHandleFlipState( bool indicesSwapped, bool left, bool right ); /** * @brief Adds a quad to the existing selection highlights. diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 5ae3d7f..cff37b1 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -874,9 +874,11 @@ void Controller::Impl::RetrieveSelection( std::string& selectedText, bool delete return; } + const bool handlesCrossed = mEventData->mLeftSelectionPosition > mEventData->mRightSelectionPosition; + //Get start and end position of selection - uint32_t startOfSelectedText = mEventData->mLeftSelectionPosition; - uint32_t lengthOfSelectedText = mEventData->mRightSelectionPosition - startOfSelectedText; + uint32_t startOfSelectedText = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition; + uint32_t lengthOfSelectedText = ( handlesCrossed ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition ) - startOfSelectedText; // Validate the start and end selection points if( ( startOfSelectedText + lengthOfSelectedText ) <= mLogicalModel->mText.Count() ) @@ -895,7 +897,7 @@ void Controller::Impl::RetrieveSelection( std::string& selectedText, bool delete Vector::Iterator last = first + lengthOfSelectedText; currentText.Erase( first, last ); } - mEventData->mPrimaryCursorPosition = mEventData->mLeftSelectionPosition; + mEventData->mPrimaryCursorPosition = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition; mEventData->mScrollAfterDelete = true; mEventData->mDecoratorUpdated = true; } @@ -968,8 +970,16 @@ void Controller::Impl::RepositionSelectionHandles( CharacterIndex selectionStart const LineRun& firstLine = *lines.Begin(); const float height = firstLine.ascender + -firstLine.descender; + const bool isLastCharacter = selectionEnd >= mLogicalModel->mText.Count(); + const bool startDirection = ( ( NULL == modelCharacterDirectionsBuffer ) ? false : *( modelCharacterDirectionsBuffer + selectionStart ) ); + const bool endDirection = ( ( NULL == modelCharacterDirectionsBuffer ) ? false : *( modelCharacterDirectionsBuffer + ( selectionEnd - ( isLastCharacter ? 1u : 0u ) ) ) ); + // Swap the indices if the start is greater than the end. - const bool indicesSwapped = ( selectionStart > selectionEnd ); + const bool indicesSwapped = selectionStart > selectionEnd; + + // Tell the decorator to flip the selection handles if needed. + mEventData->mDecorator->SetSelectionHandleFlipState( indicesSwapped, startDirection, endDirection ); + if( indicesSwapped ) { std::swap( selectionStart, selectionEnd ); @@ -989,9 +999,6 @@ void Controller::Impl::RepositionSelectionHandles( CharacterIndex selectionStart const Length numberOfCharactersEnd = *( charactersPerGlyphBuffer + glyphEnd ); bool splitEndGlyph = ( glyphStart != glyphEnd ) && ( numberOfCharactersEnd > 1u ) && HasLigatureMustBreak( mLogicalModel->GetScript( selectionEndMinusOne ) ); - // Tell the decorator to swap the selection handles if needed. - mEventData->mDecorator->SwapSelectionHandlesEnabled( firstLine.direction != indicesSwapped ); - const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; // Traverse the glyphs. @@ -1076,7 +1083,7 @@ void Controller::Impl::RepositionSelectionHandles( CharacterIndex selectionStart mEventData->mDecorator->SetPosition( RIGHT_SELECTION_HANDLE, secondaryPosition.x, secondaryPosition.y, secondaryCursorInfo.lineHeight ); // Cursor to be positioned at end of selection so if selection interrupted and edit mode restarted the cursor will be at end of selection - mEventData->mPrimaryCursorPosition = (indicesSwapped)?mEventData->mLeftSelectionPosition:mEventData->mRightSelectionPosition; + mEventData->mPrimaryCursorPosition = ( indicesSwapped ) ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition; // Set the flag to update the decorator. mEventData->mDecoratorUpdated = true; diff --git a/dali-toolkit/public-api/accessibility-manager/accessibility-manager.h b/dali-toolkit/public-api/accessibility-manager/accessibility-manager.h index 9f807ac..08ce8ce 100644 --- a/dali-toolkit/public-api/accessibility-manager/accessibility-manager.h +++ b/dali-toolkit/public-api/accessibility-manager/accessibility-manager.h @@ -32,6 +32,10 @@ namespace Internal DALI_INTERNAL { class AccessibilityManager; } +/** + * @addtogroup dali-toolkit-accessibility-manager + * @{ + */ /** * @brief Manages registration of actors in a accessibility focus chain and changing the @@ -750,6 +754,9 @@ public: }; // class AccessibilityManager +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/alignment/alignment.h b/dali-toolkit/public-api/controls/alignment/alignment.h index 1f34eb5..5a9d56c 100644 --- a/dali-toolkit/public-api/controls/alignment/alignment.h +++ b/dali-toolkit/public-api/controls/alignment/alignment.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class Alignment; } +/** + * @addtogroup dali-toolkit-controls-alignment + * @{ + */ /** * @brief Alignment is a container which provides an easy way to align other actors inside its boundary. @@ -229,6 +233,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL Alignment( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/buttons/button.h b/dali-toolkit/public-api/controls/buttons/button.h index 9c0eba0..f5c2701 100644 --- a/dali-toolkit/public-api/controls/buttons/button.h +++ b/dali-toolkit/public-api/controls/buttons/button.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class Button; } +/** + * @addtogroup dali-toolkit-controls-buttons + * @{ + */ /** * @brief Button is a base class for different kind of buttons. @@ -420,6 +424,9 @@ public: // Not intended for application developers DALI_INTERNAL Button( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/buttons/check-box-button.h b/dali-toolkit/public-api/controls/buttons/check-box-button.h index 5798ef3..357c3e1 100644 --- a/dali-toolkit/public-api/controls/buttons/check-box-button.h +++ b/dali-toolkit/public-api/controls/buttons/check-box-button.h @@ -33,6 +33,10 @@ namespace Internal DALI_INTERNAL { class CheckBoxButton; } +/** + * @addtogroup dali-toolkit-controls-buttons + * @{ + */ /** * CheckBoxButton provides a check box button which user can check or uncheck. @@ -106,6 +110,9 @@ public: // Not intended for application developers DALI_INTERNAL CheckBoxButton( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/buttons/push-button.h b/dali-toolkit/public-api/controls/buttons/push-button.h index 0e53a9c..8ebbf58 100644 --- a/dali-toolkit/public-api/controls/buttons/push-button.h +++ b/dali-toolkit/public-api/controls/buttons/push-button.h @@ -35,6 +35,10 @@ namespace Internal DALI_INTERNAL class PushButton; } +/** + * @addtogroup dali-toolkit-controls-buttons + * @{ + */ /** * @brief A PushButton changes its appearance when is pressed and returns to its original when is released. @@ -193,6 +197,9 @@ public: // Not intended for application developers DALI_INTERNAL PushButton( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/buttons/radio-button.h b/dali-toolkit/public-api/controls/buttons/radio-button.h index 20ec386..7c04b42 100644 --- a/dali-toolkit/public-api/controls/buttons/radio-button.h +++ b/dali-toolkit/public-api/controls/buttons/radio-button.h @@ -35,6 +35,10 @@ namespace Internal DALI_INTERNAL class RadioButton; } +/** + * @addtogroup dali-toolkit-controls-buttons + * @{ + */ /** * @brief A RadioButton provides a radio button which two states \e selected or \e unselected. @@ -124,6 +128,9 @@ class DALI_IMPORT_API RadioButton: public Button DALI_INTERNAL RadioButton( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/control-depth-index-ranges.h b/dali-toolkit/public-api/controls/control-depth-index-ranges.h index 1a55cf2..ff5732c 100644 --- a/dali-toolkit/public-api/controls/control-depth-index-ranges.h +++ b/dali-toolkit/public-api/controls/control-depth-index-ranges.h @@ -23,6 +23,11 @@ namespace Dali { namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls + * @{ + */ + enum ControlDepthIndexRanges { BACKGROUND_DEPTH_INDEX = static_cast( -Dali::Layer::TREE_DEPTH_MULTIPLIER * 0.1f ), @@ -30,6 +35,9 @@ enum ControlDepthIndexRanges DECORATION_DEPTH_INDEX = static_cast( Dali::Layer::TREE_DEPTH_MULTIPLIER * 0.1f ) }; +/** + * @} + */ } } diff --git a/dali-toolkit/public-api/controls/control-impl.h b/dali-toolkit/public-api/controls/control-impl.h index 1ce94b7..b8ae6bb 100644 --- a/dali-toolkit/public-api/controls/control-impl.h +++ b/dali-toolkit/public-api/controls/control-impl.h @@ -35,11 +35,15 @@ namespace Dali namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls + * @{ + */ + class StyleManager; namespace Internal { - /** * @brief This is the internal base class for all controls. * @@ -629,6 +633,9 @@ DALI_IMPORT_API const Internal::Control& GetImplementation( const Dali::Toolkit: } // namespace Internal +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/control.h b/dali-toolkit/public-api/controls/control.h index 1e4d74d..35587f9 100644 --- a/dali-toolkit/public-api/controls/control.h +++ b/dali-toolkit/public-api/controls/control.h @@ -40,6 +40,10 @@ namespace Internal { class Control; } +/** + * @addtogroup dali-toolkit-controls + * @{ + */ /** * @brief Control is the base class for all controls. @@ -403,6 +407,9 @@ public: // Templates for Deriving Classes }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/default-controls/solid-color-actor.h b/dali-toolkit/public-api/controls/default-controls/solid-color-actor.h index 23b00e2..6c88108 100644 --- a/dali-toolkit/public-api/controls/default-controls/solid-color-actor.h +++ b/dali-toolkit/public-api/controls/default-controls/solid-color-actor.h @@ -27,7 +27,6 @@ namespace Dali namespace Toolkit { - /** * @brief Creates a Dali::ImageActor with a solid color, optionally it creates a border. * @@ -40,7 +39,6 @@ namespace Toolkit * @return a handle to the new ImageActor */ DALI_IMPORT_API ImageActor CreateSolidColorActor( const Vector4& color, bool border = false, const Vector4& borderColor = Color::WHITE, const unsigned int borderSize = 1 ); - } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h b/dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h index e6a32b8..a2c5ea6 100644 --- a/dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h +++ b/dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h @@ -49,6 +49,10 @@ class GaussianBlurView; class BloomView; } // namespace Internal +/** + * @addtogroup dali-toolkit-controls-gaussian-blur-view + * @{ + */ /** * @@ -274,6 +278,9 @@ public: }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/image-view/image-view.h b/dali-toolkit/public-api/controls/image-view/image-view.h index 821a981..fe6d7b1 100644 --- a/dali-toolkit/public-api/controls/image-view/image-view.h +++ b/dali-toolkit/public-api/controls/image-view/image-view.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class ImageView; } +/** + * @addtogroup dali-toolkit-controls-image-view + * @{ + */ /** * @@ -157,6 +161,9 @@ public: // Not intended for application developers }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h b/dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h index 5da66a5..3f1ad10 100755 --- a/dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h +++ b/dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h @@ -33,6 +33,10 @@ namespace Internal DALI_INTERNAL class ScrollBar; } +/** + * @addtogroup dali-toolkit-controls-scroll-bar + * @{ + */ /** * ScrollBar is a UI component that can be linked to the scrollable objects @@ -323,11 +327,11 @@ public: // Not intended for application developers explicit DALI_INTERNAL ScrollBar( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali -/** - * @} - */ #endif // __DALI_TOOLKIT_SCROLL_BAR_H__ diff --git a/dali-toolkit/public-api/controls/scrollable/item-view/default-item-layout.h b/dali-toolkit/public-api/controls/scrollable/item-view/default-item-layout.h index 6f4eb00..8299d84 100644 --- a/dali-toolkit/public-api/controls/scrollable/item-view/default-item-layout.h +++ b/dali-toolkit/public-api/controls/scrollable/item-view/default-item-layout.h @@ -26,6 +26,10 @@ namespace Dali namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls-item-view + * @{ + */ namespace DefaultItemLayout { @@ -49,6 +53,9 @@ DALI_IMPORT_API ItemLayoutPtr New( Type type ); } // namespace DefaultItemLayout +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/item-view/item-factory.h b/dali-toolkit/public-api/controls/scrollable/item-view/item-factory.h index d018716..84ef7b7 100644 --- a/dali-toolkit/public-api/controls/scrollable/item-view/item-factory.h +++ b/dali-toolkit/public-api/controls/scrollable/item-view/item-factory.h @@ -26,6 +26,10 @@ namespace Dali namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls-item-view + * @{ + */ /** * @brief ItemFactory is for providing actors to ItemView. @@ -77,6 +81,9 @@ public: } }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h b/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h index 39370ac..9302e8a 100644 --- a/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h +++ b/dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h @@ -30,6 +30,10 @@ namespace Dali namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls-item-view + * @{ + */ class ItemLayout; @@ -364,6 +368,9 @@ protected: Impl* mImpl; }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/item-view/item-view-declarations.h b/dali-toolkit/public-api/controls/scrollable/item-view/item-view-declarations.h index 7772d45..7388bfa 100644 --- a/dali-toolkit/public-api/controls/scrollable/item-view/item-view-declarations.h +++ b/dali-toolkit/public-api/controls/scrollable/item-view/item-view-declarations.h @@ -28,6 +28,10 @@ namespace Dali namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls-item-view + * @{ + */ typedef unsigned int ItemId; ///< Unique identity for each item in the view. @@ -44,6 +48,9 @@ typedef ItemContainer::const_iterator ConstItemIter; class ItemView; class ItemLayout; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/item-view/item-view.h b/dali-toolkit/public-api/controls/scrollable/item-view/item-view.h index cb0859d..2790194 100644 --- a/dali-toolkit/public-api/controls/scrollable/item-view/item-view.h +++ b/dali-toolkit/public-api/controls/scrollable/item-view/item-view.h @@ -34,6 +34,10 @@ namespace Internal DALI_INTERNAL { class ItemView; } +/** + * @addtogroup dali-toolkit-controls-item-view + * @{ + */ class ItemFactory; class ItemLayout; @@ -462,6 +466,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL ItemView( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-constraints.h b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-constraints.h index 40a1f45..15a29d6 100644 --- a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-constraints.h +++ b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-constraints.h @@ -31,6 +31,10 @@ class PropertyInput; namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls-scroll-view + * @{ + */ // Constraints //////////////////////////////////////////////////////////////////////////////////// @@ -52,6 +56,9 @@ DALI_IMPORT_API void MoveActorConstraint( Vector3& current, const PropertyInputC */ DALI_IMPORT_API void WrapActorConstraint( Vector3& position, const PropertyInputContainer& inputs ); +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h index 1295861..4af0442 100644 --- a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h +++ b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h @@ -37,6 +37,10 @@ namespace Internal DALI_INTERNAL class ScrollViewEffect; class ScrollViewWobbleEffect; } +/** + * @addtogroup dali-toolkit-controls-scroll-view + * @{ + */ class ScrollView; class ScrollViewEffect; @@ -73,6 +77,9 @@ public: // Not intended for application developers }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h index de7c649..af59f83 100644 --- a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h +++ b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h @@ -34,6 +34,10 @@ namespace Internal DALI_INTERNAL { class ScrollViewPagePathEffect; } +/** + * @addtogroup dali-toolkit-controls-scroll-view + * @{ + */ /** * ScrollView Page Path Effect. @@ -103,6 +107,9 @@ protected: }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h index fb9d5cb..508b3d2 100644 --- a/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h +++ b/dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h @@ -34,6 +34,10 @@ namespace Internal DALI_INTERNAL { class ScrollView; } +/** + * @addtogroup dali-toolkit-controls-scroll-view + * @{ + */ /** * @brief How axes/rotation or scale are clamped @@ -1136,6 +1140,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL ScrollView( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/scrollable/scrollable.h b/dali-toolkit/public-api/controls/scrollable/scrollable.h index b262212..d43a29a 100644 --- a/dali-toolkit/public-api/controls/scrollable/scrollable.h +++ b/dali-toolkit/public-api/controls/scrollable/scrollable.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class Scrollable; } +/** + * @addtogroup dali-toolkit-controls-scrollable + * @{ + */ /** * @brief Base class for derived Scrollables that contains actors that can be scrolled manually @@ -229,6 +233,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL Scrollable( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/table-view/table-view.h b/dali-toolkit/public-api/controls/table-view/table-view.h index c3f0545..eb03b9e 100644 --- a/dali-toolkit/public-api/controls/table-view/table-view.h +++ b/dali-toolkit/public-api/controls/table-view/table-view.h @@ -35,6 +35,10 @@ namespace Internal DALI_INTERNAL { class TableView; } +/** + * @addtogroup dali-toolkit-controls-table-view + * @{ + */ /** * @brief TableView is a layout container for aligning child actors in a grid like layout. @@ -441,6 +445,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL TableView( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/text-controls/text-field.h b/dali-toolkit/public-api/controls/text-controls/text-field.h index 5406361..7b9d11b 100644 --- a/dali-toolkit/public-api/controls/text-controls/text-field.h +++ b/dali-toolkit/public-api/controls/text-controls/text-field.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class TextField; } +/** + * @addtogroup dali-toolkit-controls-text-controls + * @{ + */ /** * @brief A control which provides a single-line editable text field. @@ -201,6 +205,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL TextField( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/controls/text-controls/text-label.h b/dali-toolkit/public-api/controls/text-controls/text-label.h index f882e55..7669b05 100644 --- a/dali-toolkit/public-api/controls/text-controls/text-label.h +++ b/dali-toolkit/public-api/controls/text-controls/text-label.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class TextLabel; } +/** + * @addtogroup dali-toolkit-controls-text-controls + * @{ + */ /** * @brief A control which renders a short text string. @@ -144,6 +148,9 @@ public: // Not intended for application developers explicit DALI_INTERNAL TextLabel( Dali::Internal::CustomActor* internal ); }; +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/enums.h b/dali-toolkit/public-api/enums.h index 5582ba3..ff678a9 100644 --- a/dali-toolkit/public-api/enums.h +++ b/dali-toolkit/public-api/enums.h @@ -23,12 +23,15 @@ namespace Dali { - /** * @brief DALi Toolkit namespace. */ namespace Toolkit { +/** + * @addtogroup dali-toolkit-controls + * @{ + */ /** * @brief Control Orientation namespace. @@ -65,6 +68,9 @@ DALI_IMPORT_API bool IsVertical(ControlOrientation::Type orientation); */ DALI_IMPORT_API bool IsHorizontal(ControlOrientation::Type orientation); +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h b/dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h index 3383a47..3b6b33f 100644 --- a/dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h +++ b/dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h @@ -31,6 +31,10 @@ namespace Internal DALI_INTERNAL { class KeyboardFocusManager; } +/** + * @addtogroup dali-toolkit-focus-manager + * @{ + */ /** * @brief Provides the functionality of handling keyboard navigation @@ -273,6 +277,9 @@ public: // Signals }; // class KeyboardFocusManager +/** + * @} + */ } // namespace Toolkit } // namespace Dali diff --git a/doc/dali-toolkit-doc.h b/doc/dali-toolkit-doc.h new file mode 100644 index 0000000..2cb0f1a --- /dev/null +++ b/doc/dali-toolkit-doc.h @@ -0,0 +1,75 @@ +#ifndef __DALI_TOOLKIT_DOC_H__ +#define __DALI_TOOLKIT_DOC_H__ + +/** + * @defgroup dali DALi + * @ingroup CAPI_UI_FRAMEWORK + * + * @brief DALi is a cross-platform 3D UI Toolkit for embedded systems. + * + * @section dali-overview Overview + * DALi's 3D user interface engine enables you to create rich and high-performance + * UI applications. DALi is based on OpenGL ES 2.0, but provides a clean + * cross-platform C++ framework. + * This means that you can use high-level DALi APIs instead of accessing + * low-level OpenGL APIs directly. + *
    + *
  • DALi Core: This module provides scene graph-based rendering, animation, and event handling.
  • + *
  • DALi Adaptor: This module is a platform adaptation layer.
  • + *
  • DALi Toolkit: This module provides UI components and various effects on top of the dali-core.
  • + *
+ * + * @defgroup dali-toolkit DALi Toolkit + * @ingroup dali + * + * @brief This module provides UI components and various effects on top of the dali-core. + * + * @{ + * @defgroup dali-toolkit-accessibility-manager Accessibility Manager + * @brief AccessibilityManager manages a accessibility focus chain. + + * @defgroup dali-toolkit-controls Controls + * @brief Controls are interactive components for layouting the user interface. + + * @{ + * @defgroup dali-toolkit-controls-alignment Alignment + * @brief Alignment is a container which provides an easy way to align other actors inside its boundary. + + * @defgroup dali-toolkit-controls-buttons Buttons + * @brief Button is a small object on UI that you can press. + + * @defgroup dali-toolkit-controls-gaussian-blur-view Gaussian Blur View + * @brief GaussianBlurView provides a render process that blurs an image. + + * @defgroup dali-toolkit-controls-image-view Image View + * @brief ImageView is a control displying an image. + + * @defgroup dali-toolkit-controls-scroll-bar Scroll Bar + * @brief ScrollBar control. + + * @defgroup dali-toolkit-controls-scrollable Scrollable + * @brief Scrollable container controls. + + * @{ + * @defgroup dali-toolkit-controls-item-view Item View + * @brief ItemView class is a scrollable container that can contain many items. + + * @defgroup dali-toolkit-controls-scroll-view Scroll View + * @brief ScrollView class provides scrollable view which contains actors and can be scrolled automatically or manually by panning. + + * @} + * @defgroup dali-toolkit-controls-table-view Table View + * @brief TableView class is a layout container for aligning child actors in a grid like layout. + + * @defgroup dali-toolkit-controls-text-controls Text Controls + * @brief Controls for displaying text or text input. + + * @} + * @defgroup dali-toolkit-focus-manager Focus Manager + * @brief Classes for handling keyboard navigation and maintaining the two dimensional keyboard focus chain. + + * @} + */ + + +#endif /* __DALI_TOOLKIT_DOC_H__ */ diff --git a/doc/file.list b/doc/file.list new file mode 100644 index 0000000..f9681c1 --- /dev/null +++ b/doc/file.list @@ -0,0 +1,3 @@ +package_doxy_files = \ + $(package_doxy_dir)/dali-toolkit-doc.h +