GetCursorPosition( mEventData->mPrimaryCursorPosition,
cursorInfo );
- if( mEventData->mScrollAfterUpdatePosition )
+ // Scroll first the text after delete ...
+ if( mEventData->mScrollAfterDelete )
{
- ScrollToMakePositionVisible( cursorInfo.primaryPosition );
- mEventData->mScrollAfterUpdatePosition = false;
+ ScrollTextToMatchCursor( cursorInfo );
}
- else if( mEventData->mScrollAfterDelete )
+
+ // ... then, text can be scrolled to make the cursor visible.
+ if( mEventData->mScrollAfterUpdatePosition )
{
- ScrollTextToMatchCursor( cursorInfo );
- mEventData->mScrollAfterDelete = false;
+ ScrollToMakePositionVisible( cursorInfo.primaryPosition );
}
+ mEventData->mScrollAfterUpdatePosition = false;
+ mEventData->mScrollAfterDelete = false;
UpdateCursorPosition( cursorInfo );
mEventData->mUpdateLeftSelectionPosition = true;
mEventData->mUpdateRightSelectionPosition = true;
+ mEventData->mUpdateCursorPosition = false;
mEventData->mScrollAfterUpdatePosition = ( mEventData->mLeftSelectionPosition != mEventData->mRightSelectionPosition );
}
// Scroll after delete.
mEventData->mPrimaryCursorPosition = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition;
- mEventData->mScrollAfterDelete = true;
}
- // Udpade the cursor position and the decorator.
- // Scroll after the position is updated if is not scrolling after delete.
- mEventData->mUpdateCursorPosition = true;
- mEventData->mScrollAfterUpdatePosition = !mEventData->mScrollAfterDelete;
mEventData->mDecoratorUpdated = true;
}
}
void Controller::Impl::ScrollToMakePositionVisible( const Vector2& position )
{
+ const float cursorWidth = mEventData->mDecorator ? mEventData->mDecorator->GetCursorWidth() : 0.f;
+
// position is in actor's coords.
- const float positionEnd = position.x + ( mEventData->mDecorator ? mEventData->mDecorator->GetCursorWidth() : 0.f );
+ const float positionEnd = position.x + cursorWidth;
// Transform the position to decorator coords.
const float alignment = IsShowingRealText() ? mAlignmentOffset.x : 0.f;
mEventData->mScrollPosition.x = currentCursorPosition.x - cursorInfo.primaryPosition.x - mAlignmentOffset.x;
ClampHorizontalScroll( mVisualModel->GetLayoutSize() );
+
+ // Makes the new cursor position visible if needed.
+ ScrollToMakePositionVisible( cursorInfo.primaryPosition );
}
void Controller::Impl::RequestRelayout()
// Cursor position retreat
oldCursorIndex = cursorIndex;
+ mImpl->mEventData->mScrollAfterDelete = true;
+
DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::RemoveText %p removed %d\n", this, numberOfCharacters );
removed = true;
}
// Apply modifications to the model; TODO - Optimize this
mImpl->mOperationsPending = ALL_OPERATIONS;
-
- // Queue a cursor reposition event; this must wait until after DoRelayout()
- if( EventData::IsEditingState( mImpl->mEventData->mState ) )
- {
- mImpl->mEventData->mUpdateCursorPosition = true;
- mImpl->mEventData->mScrollAfterUpdatePosition = true;
- }
}
void Controller::TextDeletedEvent()
// Apply modifications to the model; TODO - Optimize this
mImpl->mOperationsPending = ALL_OPERATIONS;
-
- // Queue a cursor reposition event; this must wait until after DoRelayout()
- mImpl->mEventData->mUpdateCursorPosition = true;
- if( 0u != mImpl->mLogicalModel->mText.Count() )
- {
- mImpl->mEventData->mScrollAfterDelete = true;
- }
}
bool Controller::DoRelayout( const Size& size,
// TODO: At the moment the underline runs are only for pre-edit.
mImpl->mVisualModel->mUnderlineRuns.Clear();
- Vector<Character> utf32Characters;
- Length characterCount( 0u );
+ // Keep the current number of characters.
+ const Length currentNumberOfCharacters = mImpl->IsShowingRealText() ? mImpl->mLogicalModel->mText.Count() : 0u;
- // Remove the previous IMF pre-edit (predicitive text)
- if( mImpl->mEventData->mPreEditFlag &&
- ( 0u != mImpl->mEventData->mPreEditLength ) )
+ // Remove the previous IMF pre-edit.
+ if( mImpl->mEventData->mPreEditFlag && ( 0u != mImpl->mEventData->mPreEditLength ) )
{
- const CharacterIndex offset = mImpl->mEventData->mPrimaryCursorPosition - mImpl->mEventData->mPreEditStartPosition;
-
- removedPrevious = RemoveText( -static_cast<int>( offset ),
+ removedPrevious = RemoveText( -static_cast<int>( mImpl->mEventData->mPrimaryCursorPosition - mImpl->mEventData->mPreEditStartPosition ),
mImpl->mEventData->mPreEditLength,
DONT_UPDATE_INPUT_STYLE );
}
else
{
- // Remove the previous Selection
+ // Remove the previous Selection.
removedPrevious = RemoveSelectedText();
}
+ Vector<Character> utf32Characters;
+ Length characterCount = 0u;
+
if( !text.empty() )
{
// Convert text into UTF-32
DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Inserted %d characters, new size %d new cursor %d\n", maxSizeOfNewText, mImpl->mLogicalModel->mText.Count(), mImpl->mEventData->mPrimaryCursorPosition );
}
+ const Length numberOfCharacters = mImpl->IsShowingRealText() ? mImpl->mLogicalModel->mText.Count() : 0u;
+
if( ( 0u == mImpl->mLogicalModel->mText.Count() ) &&
mImpl->IsPlaceholderAvailable() )
{
{
// Queue an inserted event
mImpl->QueueModifyEvent( ModifyEvent::TEXT_INSERTED );
+
+ mImpl->mEventData->mUpdateCursorPosition = true;
+ if( numberOfCharacters < currentNumberOfCharacters )
+ {
+ mImpl->mEventData->mScrollAfterDelete = true;
+ }
+ else
+ {
+ mImpl->mEventData->mScrollAfterUpdatePosition = true;
+ }
}
if( maxLengthReached )
else
{
ShowPlaceholderText();
- mImpl->mEventData->mUpdateCursorPosition = true;
}
+
+ mImpl->mEventData->mUpdateCursorPosition = true;
+ mImpl->mEventData->mScrollAfterDelete = true;
+
mImpl->RequestRelayout();
mImpl->mControlInterface.TextChanged();
break;
else
{
ShowPlaceholderText();
- mImpl->mEventData->mUpdateCursorPosition = true;
}
+ mImpl->mEventData->mUpdateCursorPosition = true;
+ mImpl->mEventData->mScrollAfterDelete = true;
}
requestRelayout = true;
break;
else
{
ShowPlaceholderText();
- mImpl->mEventData->mUpdateCursorPosition = true;
}
+ mImpl->mEventData->mUpdateCursorPosition = true;
+ mImpl->mEventData->mScrollAfterDelete = true;
}
return removed;