From 0a0b9dc2df798519fa1f8d8bffff9c5c74e967b1 Mon Sep 17 00:00:00 2001 From: Bowon Ryu Date: Fri, 5 Mar 2021 12:53:44 +0900 Subject: [PATCH] [Tizen] fix wrong cursor position in TextField When the placeholder font size is bigger/smaller than default font size, the cursor is positioned incorrectly. this is because mScrollPosition.y is calculated based on layoutSize.height at CalculateVerticalOffset(). (this is not based on cursor height. in issue situation, layoutSize.height is bigger/smaller than defaultFontLineHeight.) This patch prevents the wrong positioning of cursor when the layoutSize.height is bigger/smaller than defaultFontLineHeight. And update the glyphPositions using recalculated offset. This issue only occurs with placeholder + single line text control. (vertical alignment) I hope this modification does not affect the calculation of other texts. So, update the glyphPositions in CalculateVerticalOffset(). Change-Id: I05847bbe5dcce6451c6b24649f80ea945e1ed7ea Signed-off-by: Bowon Ryu --- dali-toolkit/internal/text/text-controller.cpp | 34 ++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 31c1edf..6e9148b 100755 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -2838,12 +2838,28 @@ bool Controller::DoRelayout( const Size& size, void Controller::CalculateVerticalOffset( const Size& controlSize ) { - Size layoutSize = mImpl->mModel->mVisualModel->GetLayoutSize(); + ModelPtr& model = mImpl->mModel; + VisualModelPtr& visualModel = model->mVisualModel; + Size layoutSize = mImpl->mModel->mVisualModel->GetLayoutSize(); + Size oldLayoutSize = layoutSize; + float offsetY = 0.f; + bool needRecalc = false; + float defaultFontLineHeight = mImpl->GetDefaultFontLineHeight(); if( fabsf( layoutSize.height ) < Math::MACHINE_EPSILON_1000 ) { // Get the line height of the default font. - layoutSize.height = mImpl->GetDefaultFontLineHeight(); + layoutSize.height = defaultFontLineHeight; + } + + // Whether the text control is editable + const bool isEditable = NULL != mImpl->mEventData; + if ( isEditable && layoutSize.height != defaultFontLineHeight ) + { + // This code prevents the wrong positioning of cursor when the layout size is bigger/smaller than defaultFontLineHeight. + // This situation occurs when the size of placeholder text is different from the default text. + layoutSize.height = defaultFontLineHeight; + needRecalc = true; } switch( mImpl->mModel->mVerticalAlignment ) @@ -2851,19 +2867,33 @@ void Controller::CalculateVerticalOffset( const Size& controlSize ) case VerticalAlignment::TOP: { mImpl->mModel->mScrollPosition.y = 0.f; + offsetY = 0.f; break; } case VerticalAlignment::CENTER: { mImpl->mModel->mScrollPosition.y = floorf( 0.5f * ( controlSize.height - layoutSize.height ) ); // try to avoid pixel alignment. + if ( needRecalc ) offsetY = floorf( 0.5f * ( layoutSize.height - oldLayoutSize.height ) ); break; } case VerticalAlignment::BOTTOM: { mImpl->mModel->mScrollPosition.y = controlSize.height - layoutSize.height; + if ( needRecalc ) offsetY = layoutSize.height - oldLayoutSize.height; break; } } + + if ( needRecalc ) + { + // Update glyphPositions according to recalculation. + const Length positionCount = visualModel->mGlyphPositions.Count(); + Vector& glyphPositions = visualModel->mGlyphPositions; + for( Length index = 0u; index < positionCount; index++ ) + { + glyphPositions[index].y += offsetY; + } + } } // private : Events. -- 2.7.4