Text Decorator - Set positions in Control coords. 71/38571/5
authorVictor Cebollada <v.cebollada@samsung.com>
Tue, 21 Apr 2015 15:36:49 +0000 (16:36 +0100)
committerVictor Cebollada <v.cebollada@samsung.com>
Wed, 22 Apr 2015 15:53:04 +0000 (16:53 +0100)
Change-Id: I2417c24e4b5035e821ed7b311723a856973823a0
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
dali-toolkit/internal/controls/text-controls/text-field-impl.cpp
dali-toolkit/internal/text/decorator/text-decorator.cpp
dali-toolkit/internal/text/decorator/text-decorator.h
dali-toolkit/internal/text/text-controller-impl.cpp

index 286bc33..48ee476 100644 (file)
@@ -451,14 +451,9 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container )
   if( mController->Relayout( size ) ||
       !mRenderer )
   {
   if( mController->Relayout( size ) ||
       !mRenderer )
   {
-    const Vector2& scrollPosition = mController->GetScrollPosition();
-    const Vector2& alignmentOffset = mController->GetAlignmentOffset();
-
-    Vector2 offset = scrollPosition + alignmentOffset;
-
     if( mDecorator )
     {
     if( mDecorator )
     {
-      mDecorator->Relayout( size, offset );
+      mDecorator->Relayout( size );
     }
 
     if( !mRenderer )
     }
 
     if( !mRenderer )
@@ -482,6 +477,8 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container )
 
     if( mRenderableActor )
     {
 
     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
       mRenderableActor.SetPosition( offset.x, offset.y );
 
       // Make sure the actor is parented correctly with/without clipping
index c324edc..6ae1821 100644 (file)
@@ -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.
    */
    * 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();
   {
     // TODO - Remove this if nothing is active
     CreateActiveLayer();
@@ -217,14 +217,14 @@ struct Decorator::Impl : public ConnectionTracker
     CreateCursors();
     if( mPrimaryCursor )
     {
     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 )
     {
       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 ) );
     }
 
       mSecondaryCursor.SetSize( Size( 1.0f, mCursor[SECONDARY_CURSOR].cursorHeight ) );
     }
 
@@ -235,8 +235,8 @@ struct Decorator::Impl : public ConnectionTracker
 
       CreateGrabHandle();
 
 
       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 )
     {
     }
     else if( mGrabHandle )
     {
@@ -251,12 +251,12 @@ struct Decorator::Impl : public ConnectionTracker
       CreateSelectionHandles();
 
       SelectionHandleImpl& primary = mSelectionHandle[ PRIMARY_SELECTION_HANDLE ];
       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 ];
 
       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();
 
       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.
   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<int>& Decorator::GetBoundingBox() const
   return mImpl->mBoundingBox;
 }
 
   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 **/
 }
 
 /** Cursor **/
index 9f2c693..a5f329a 100644 (file)
@@ -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.
    * @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.
 
   /**
    * @brief Sets which of the cursors are active.
index 4f90795..07e647c 100644 (file)
@@ -257,8 +257,8 @@ void Controller::Impl::OnTapEvent( const Event& event )
   {
     ChangeState( EventData::EDITING );
 
   {
     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 );
 
     mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition,
                                                                 yPosition );
@@ -288,6 +288,7 @@ void Controller::Impl::OnPanEvent( const Event& event )
       Gesture::Continuing == state )
   {
     const Vector2& actualSize = mVisualModel->GetActualSize();
       Gesture::Continuing == state )
   {
     const Vector2& actualSize = mVisualModel->GetActualSize();
+    const Vector2 currentScroll = mEventData->mScrollPosition;
 
     if( mEventData->mHorizontalScrollingEnabled )
     {
 
     if( mEventData->mHorizontalScrollingEnabled )
     {
@@ -328,6 +329,11 @@ void Controller::Impl::OnPanEvent( const Event& event )
         mEventData->mScrollPosition.y = 0.f;
       }
     }
         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 )
   {
 
   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();
 
 
     UpdateCursorPosition();
 
@@ -384,18 +390,18 @@ void Controller::Impl::RepositionSelectionHandles( float visualX, float visualY
 
   if( count )
   {
 
   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<LineRun>& lines = mVisualModel->mLines;
     float height = lines.Count() ? lines[0].ascender + -lines[0].descender : 0.0f;
 
 
     // TODO - multi-line selection
     const Vector<LineRun>& 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->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;
   }
 
     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];
   // 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 );
 
   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 );
 
                                        cursorInfo.primaryCursorHeight,
                                        cursorInfo.lineHeight );
 
@@ -835,8 +837,8 @@ void Controller::Impl::UpdateCursorPosition()
   {
     mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_BOTH );
     mEventData->mDecorator->SetPosition( SECONDARY_CURSOR,
   {
     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 );
   }
                                          cursorInfo.secondaryCursorHeight,
                                          cursorInfo.lineHeight );
   }