[Tizen] fix wrong cursor position in TextField 97/254597/1 accepted/tizen/6.0/unified/20210307.214530 submit/tizen_6.0/20210305.052634
authorBowon Ryu <bowon.ryu@samsung.com>
Fri, 5 Mar 2021 03:53:44 +0000 (12:53 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Fri, 5 Mar 2021 03:56:53 +0000 (12:56 +0900)
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 <bowon.ryu@samsung.com>
dali-toolkit/internal/text/text-controller.cpp

index 31c1edf..6e9148b 100755 (executable)
@@ -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<Vector2>& glyphPositions = visualModel->mGlyphPositions;
+    for( Length index = 0u; index < positionCount; index++ )
+    {
+      glyphPositions[index].y += offsetY;
+    }
+  }
 }
 
 // private : Events.