From 5a9aa7085f35cfbf116c8941d7fecdf19ebc9791 Mon Sep 17 00:00:00 2001 From: Bowon Ryu Date: Tue, 21 Dec 2021 20:10:38 +0900 Subject: [PATCH] Fix text cursor position issue When the size or direction of text is changed, all decorator elements should be updated. Change-Id: Ib2fb61f684801c5743762df67e8e6d53399c8098 Signed-off-by: Bowon Ryu --- .../src/dali-toolkit/utc-Dali-TextField.cpp | 6 ++++++ .../internal/text/text-controller-relayouter.cpp | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index d1a04e9..a6e2668 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -3565,6 +3565,12 @@ int UtcDaliTextFieldSelectWholeText(void) application.SendNotification(); application.Render(); + // Even if resize, selection should remain. + textField.SetProperty( Actor::Property::SIZE, Vector2( 150.f, 50.f ) ); + + application.SendNotification(); + application.Render(); + // Should be 2 children, the stencil and the layer DALI_TEST_EQUALS( 2u, textField.GetChildCount(), TEST_LOCATION ); diff --git a/dali-toolkit/internal/text/text-controller-relayouter.cpp b/dali-toolkit/internal/text/text-controller-relayouter.cpp index 34e7053..c9a4fb0 100644 --- a/dali-toolkit/internal/text/text-controller-relayouter.cpp +++ b/dali-toolkit/internal/text/text-controller-relayouter.cpp @@ -397,8 +397,11 @@ Controller::UpdateTextType Controller::Relayouter::Relayout(Controller& controll textUpdateInfo.mCharacterIndex = 0u; } + bool layoutDirectionChanged = false; if(impl.mLayoutDirection != layoutDirection) { + // Flag to indicate that the layout direction has changed. + layoutDirectionChanged = true; // Clear the update info. This info will be set the next time the text is updated. textUpdateInfo.mClearAll = true; // Apply modifications to the model @@ -449,13 +452,25 @@ Controller::UpdateTextType Controller::Relayouter::Relayout(Controller& controll if(isEditable) { - if(newSize) + if(newSize || layoutDirectionChanged) { - // If there is a new size, the scroll position needs to be clamped. + // If there is a new size or layout direction is changed, the scroll position needs to be clamped. impl.ClampHorizontalScroll(layoutSize); // Update the decorator's positions is needed if there is a new size. impl.mEventData->mDecorator->UpdatePositions(model->mScrollPosition - offset); + + // All decorator elements need to be updated. + if(EventData::IsEditingState(impl.mEventData->mState)) + { + impl.mEventData->mScrollAfterUpdatePosition = true; + impl.mEventData->mUpdateCursorPosition = true; + impl.mEventData->mUpdateGrabHandlePosition = true; + } + else if(impl.mEventData->mState == EventData::SELECTING) + { + impl.mEventData->mUpdateHighlightBox = true; + } } // Move the cursor, grab handle etc. -- 2.7.4