From 48ce7053cae43576126273091e0a865e5a87aea6 Mon Sep 17 00:00:00 2001 From: Victor Cebollada Date: Tue, 21 Apr 2015 16:36:49 +0100 Subject: [PATCH 1/1] Text Decorator - Set positions in Control coords. Change-Id: I2417c24e4b5035e821ed7b311723a856973823a0 Signed-off-by: Victor Cebollada --- .../controls/text-controls/text-field-impl.cpp | 9 ++--- .../internal/text/decorator/text-decorator.cpp | 41 +++++++++++++++------- .../internal/text/decorator/text-decorator.h | 10 ++++-- .../internal/text/text-controller-impl.cpp | 40 +++++++++++---------- 4 files changed, 60 insertions(+), 40 deletions(-) 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 286bc33..48ee476 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -451,14 +451,9 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) if( mController->Relayout( size ) || !mRenderer ) { - const Vector2& scrollPosition = mController->GetScrollPosition(); - const Vector2& alignmentOffset = mController->GetAlignmentOffset(); - - Vector2 offset = scrollPosition + alignmentOffset; - if( mDecorator ) { - mDecorator->Relayout( size, offset ); + mDecorator->Relayout( size ); } if( !mRenderer ) @@ -482,6 +477,8 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) if( mRenderableActor ) { + const Vector2 offset = mController->GetScrollPosition() + mController->GetAlignmentOffset(); + mRenderableActor.SetPosition( offset.x, offset.y ); // Make sure the actor is parented correctly with/without clipping diff --git a/dali-toolkit/internal/text/decorator/text-decorator.cpp b/dali-toolkit/internal/text/decorator/text-decorator.cpp index c324edc..6ae1821 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.cpp +++ b/dali-toolkit/internal/text/decorator/text-decorator.cpp @@ -208,7 +208,7 @@ struct Decorator::Impl : public ConnectionTracker * Relayout of the decorations owned by the decorator. * @param[in] size The Size of the UI control the decorator is adding it's decorations to. */ - void Relayout( const Vector2& size, const Vector2& scrollPosition ) + void Relayout( const Vector2& size ) { // TODO - Remove this if nothing is active CreateActiveLayer(); @@ -217,14 +217,14 @@ struct Decorator::Impl : public ConnectionTracker CreateCursors(); if( mPrimaryCursor ) { - mPrimaryCursor.SetPosition( mCursor[PRIMARY_CURSOR].position.x + scrollPosition.x, - mCursor[PRIMARY_CURSOR].position.y + scrollPosition.y ); + mPrimaryCursor.SetPosition( mCursor[PRIMARY_CURSOR].position.x, + mCursor[PRIMARY_CURSOR].position.y ); mPrimaryCursor.SetSize( Size( 1.0f, mCursor[PRIMARY_CURSOR].cursorHeight ) ); } if( mSecondaryCursor ) { - mSecondaryCursor.SetPosition( mCursor[SECONDARY_CURSOR].position.x + scrollPosition.x, - mCursor[SECONDARY_CURSOR].position.y + scrollPosition.y ); + mSecondaryCursor.SetPosition( mCursor[SECONDARY_CURSOR].position.x, + mCursor[SECONDARY_CURSOR].position.y ); mSecondaryCursor.SetSize( Size( 1.0f, mCursor[SECONDARY_CURSOR].cursorHeight ) ); } @@ -235,8 +235,8 @@ struct Decorator::Impl : public ConnectionTracker CreateGrabHandle(); - mGrabHandle.SetPosition( mCursor[PRIMARY_CURSOR].position.x + scrollPosition.x, - mCursor[PRIMARY_CURSOR].position.y + mCursor[PRIMARY_CURSOR].lineHeight + scrollPosition.y ); + mGrabHandle.SetPosition( mCursor[PRIMARY_CURSOR].position.x, + mCursor[PRIMARY_CURSOR].position.y + mCursor[PRIMARY_CURSOR].lineHeight ); } else if( mGrabHandle ) { @@ -251,12 +251,12 @@ struct Decorator::Impl : public ConnectionTracker CreateSelectionHandles(); SelectionHandleImpl& primary = mSelectionHandle[ PRIMARY_SELECTION_HANDLE ]; - primary.actor.SetPosition( primary.position.x + scrollPosition.x, - primary.position.y + primary.lineHeight + scrollPosition.y ); + primary.actor.SetPosition( primary.position.x, + primary.position.y + primary.lineHeight ); SelectionHandleImpl& secondary = mSelectionHandle[ SECONDARY_SELECTION_HANDLE ]; - secondary.actor.SetPosition( secondary.position.x + scrollPosition.x, - secondary.position.y + secondary.lineHeight + scrollPosition.y ); + secondary.actor.SetPosition( secondary.position.x, + secondary.position.y + secondary.lineHeight ); CreateHighlight(); UpdateHighlight(); @@ -290,6 +290,16 @@ struct Decorator::Impl : public ConnectionTracker } } + void UpdatePositions( const Vector2& scrollOffset ) + { + mCursor[PRIMARY_CURSOR].position += scrollOffset; + mCursor[SECONDARY_CURSOR].position += scrollOffset; + mSelectionHandle[ PRIMARY_SELECTION_HANDLE ].position += scrollOffset; + mSelectionHandle[ SECONDARY_SELECTION_HANDLE ].position += scrollOffset; + + // TODO Highlight box?? + } + void PopUpRelayoutComplete( Actor actor ) { // Size negotiation for CopyPastePopup complete so can get the size and constrain position within bounding box. @@ -837,9 +847,14 @@ const Rect& Decorator::GetBoundingBox() const return mImpl->mBoundingBox; } -void Decorator::Relayout( const Vector2& size, const Vector2& scrollPosition ) +void Decorator::Relayout( const Vector2& size ) +{ + mImpl->Relayout( size ); +} + +void Decorator::UpdatePositions( const Vector2& scrollOffset ) { - mImpl->Relayout( size, scrollPosition ); + mImpl->UpdatePositions( scrollOffset ); } /** Cursor **/ diff --git a/dali-toolkit/internal/text/decorator/text-decorator.h b/dali-toolkit/internal/text/decorator/text-decorator.h index 9f2c693..a5f329a 100644 --- a/dali-toolkit/internal/text/decorator/text-decorator.h +++ b/dali-toolkit/internal/text/decorator/text-decorator.h @@ -167,9 +167,15 @@ public: * @brief The decorator waits until a relayout before creating actors etc. * * @param[in] size The size of the parent control after size-negotiation. - * @param[in] scrollPosition The cursor, grab-handle positions etc. should be offset by this. */ - void Relayout( const Dali::Vector2& size, const Vector2& scrollPosition ); + void Relayout( const Dali::Vector2& size ); + + /** + * @brief Updates the decorator's actor positions after scrolling. + * + * @param[in] scrollOffset The scroll offset. + */ + void UpdatePositions( const Vector2& scrollOffset ); /** * @brief Sets which of the cursors are active. diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 4f90795..07e647c 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -257,8 +257,8 @@ void Controller::Impl::OnTapEvent( const Event& event ) { ChangeState( EventData::EDITING ); - const float xPosition = event.p2.mFloat - mAlignmentOffset.x; - const float yPosition = event.p3.mFloat - mAlignmentOffset.y; + const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; + const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, yPosition ); @@ -288,6 +288,7 @@ void Controller::Impl::OnPanEvent( const Event& event ) Gesture::Continuing == state ) { const Vector2& actualSize = mVisualModel->GetActualSize(); + const Vector2 currentScroll = mEventData->mScrollPosition; if( mEventData->mHorizontalScrollingEnabled ) { @@ -328,6 +329,11 @@ void Controller::Impl::OnPanEvent( const Event& event ) mEventData->mScrollPosition.y = 0.f; } } + + if( mEventData->mDecorator ) + { + mEventData->mDecorator->UpdatePositions( mEventData->mScrollPosition - currentScroll ); + } } } @@ -343,11 +349,11 @@ void Controller::Impl::OnGrabHandleEvent( const Event& event ) if( GRAB_HANDLE_PRESSED == state ) { - float xPosition = event.p2.mFloat + mEventData->mScrollPosition.x; - float yPosition = event.p3.mFloat + mEventData->mScrollPosition.y; + // The event.p2 and event.p3 are in decorator coords. Need to transforms to text coords. + const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; + const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; - mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, - yPosition ); + mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, yPosition ); UpdateCursorPosition(); @@ -384,18 +390,18 @@ void Controller::Impl::RepositionSelectionHandles( float visualX, float visualY if( count ) { - float primaryX = positions[0].x; - float secondaryX = positions[count-1].x + glyphs[count-1].width; + float primaryX = positions[0].x + mEventData->mScrollPosition.x; + float secondaryX = positions[count-1].x + glyphs[count-1].width + mEventData->mScrollPosition.x; // TODO - multi-line selection const Vector& lines = mVisualModel->mLines; float height = lines.Count() ? lines[0].ascender + -lines[0].descender : 0.0f; - mEventData->mDecorator->SetPosition( PRIMARY_SELECTION_HANDLE, primaryX, 0.0f, height ); - mEventData->mDecorator->SetPosition( SECONDARY_SELECTION_HANDLE, secondaryX, 0.0f, height ); + mEventData->mDecorator->SetPosition( PRIMARY_SELECTION_HANDLE, primaryX, mEventData->mScrollPosition.y, height ); + mEventData->mDecorator->SetPosition( SECONDARY_SELECTION_HANDLE, secondaryX, mEventData->mScrollPosition.y, height ); mEventData->mDecorator->ClearHighlights(); - mEventData->mDecorator->AddHighlight( primaryX, 0.0f, secondaryX, height ); + mEventData->mDecorator->AddHighlight( primaryX, mEventData->mScrollPosition.y, secondaryX, height + mEventData->mScrollPosition.y ); } } @@ -507,10 +513,6 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, return logicalIndex; } - // Transform to visual model coords - visualX -= mEventData->mScrollPosition.x; - visualY -= mEventData->mScrollPosition.y; - // Find which line is closest const LineIndex lineIndex = GetClosestLine( visualY ); const LineRun& line = mVisualModel->mLines[lineIndex]; @@ -826,8 +828,8 @@ void Controller::Impl::UpdateCursorPosition() cursorInfo ); mEventData->mDecorator->SetPosition( PRIMARY_CURSOR, - cursorInfo.primaryPosition.x, - cursorInfo.primaryPosition.y, + cursorInfo.primaryPosition.x + mEventData->mScrollPosition.x + mAlignmentOffset.x, + cursorInfo.primaryPosition.y + mEventData->mScrollPosition.y + mAlignmentOffset.y, cursorInfo.primaryCursorHeight, cursorInfo.lineHeight ); @@ -835,8 +837,8 @@ void Controller::Impl::UpdateCursorPosition() { mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_BOTH ); mEventData->mDecorator->SetPosition( SECONDARY_CURSOR, - cursorInfo.secondaryPosition.x, - cursorInfo.secondaryPosition.y, + cursorInfo.secondaryPosition.x + mEventData->mScrollPosition.x + mAlignmentOffset.x, + cursorInfo.secondaryPosition.y + mEventData->mScrollPosition.y + mAlignmentOffset.y, cursorInfo.secondaryCursorHeight, cursorInfo.lineHeight ); } -- 2.7.4