* 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();
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 )
{
- 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 ) );
}
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 )
{
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 ];
- 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();
}
}
+ 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.
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 **/
{
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 );
Gesture::Continuing == state )
{
const Vector2& actualSize = mVisualModel->GetActualSize();
+ const Vector2 currentScroll = mEventData->mScrollPosition;
if( mEventData->mHorizontalScrollingEnabled )
{
mEventData->mScrollPosition.y = 0.f;
}
}
+
+ if( mEventData->mDecorator )
+ {
+ mEventData->mDecorator->UpdatePositions( mEventData->mScrollPosition - currentScroll );
+ }
}
}
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();
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;
- 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->AddHighlight( primaryX, 0.0f, secondaryX, height );
+ mEventData->mDecorator->AddHighlight( primaryX, mEventData->mScrollPosition.y, secondaryX, height + mEventData->mScrollPosition.y );
}
}
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];
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 );
{
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 );
}