Change-Id: I2417c24e4b5035e821ed7b311723a856973823a0
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
if( mController->Relayout( size ) ||
!mRenderer )
{
if( mController->Relayout( size ) ||
!mRenderer )
{
- const Vector2& scrollPosition = mController->GetScrollPosition();
- const Vector2& alignmentOffset = mController->GetAlignmentOffset();
-
- Vector2 offset = scrollPosition + alignmentOffset;
-
- mDecorator->Relayout( size, offset );
+ mDecorator->Relayout( size );
+ 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
* 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();
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 ) );
}
- 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 )
{
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();
+ 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.
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 );
* @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.
{
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 );
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 )
{
mEventData->mScrollPosition.y = 0.f;
}
}
mEventData->mScrollPosition.y = 0.f;
}
}
+
+ if( mEventData->mDecorator )
+ {
+ mEventData->mDecorator->UpdatePositions( mEventData->mScrollPosition - currentScroll );
+ }
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 );
- 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 );
- // 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];
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 );
{
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 );
}