From: Victor Cebollada Date: Wed, 10 Jun 2015 15:14:28 +0000 (+0100) Subject: Fix the text scroll when deleting text. X-Git-Tag: dali_1.0.45~12^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=c5867682354d37755781047add02d85e46078a47 Fix the text scroll when deleting text. Change-Id: I0c5b5983686402412c136ed913f09e73c0cd350b Signed-off-by: Victor Cebollada --- diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 35c43b0..18d7930 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -135,7 +135,8 @@ EventData::EventData( DecoratorPtr decorator ) mUpdateCursorPosition( false ), mUpdateLeftSelectionPosition( false ), mUpdateRightSelectionPosition( false ), - mScrollAfterUpdateCursorPosition( false ) + mScrollAfterUpdateCursorPosition( false ), + mScrollAfterDelete( false ) {} EventData::~EventData() @@ -201,6 +202,12 @@ bool Controller::Impl::ProcessInputEvents() mEventData->mDecoratorUpdated = true; mEventData->mUpdateCursorPosition = false; } + else if( mEventData->mScrollAfterDelete ) + { + ScrollTextToMatchCursor(); + mEventData->mDecoratorUpdated = true; + mEventData->mScrollAfterDelete = false; + } else if( mEventData->mUpdateLeftSelectionPosition ) { UpdateSelectionHandle( LEFT_SELECTION_HANDLE ); @@ -1247,6 +1254,57 @@ void Controller::Impl::ScrollToMakeCursorVisible() // TODO : calculate the vertical scroll. } +void Controller::Impl::ScrollTextToMatchCursor() +{ + // Get the current cursor position in decorator coords. + const Vector2& currentCursorPosition = mEventData->mDecorator->GetPosition( PRIMARY_CURSOR ); + + // Calculate the new cursor position. + CursorInfo cursorInfo; + GetCursorPosition( mEventData->mPrimaryCursorPosition, + cursorInfo ); + + // Calculate the offset to match the cursor position before the character was deleted. + mEventData->mScrollPosition.x = currentCursorPosition.x - cursorInfo.primaryPosition.x - mAlignmentOffset.x; + + ClampHorizontalScroll( mVisualModel->GetActualSize() ); + bool updateCursorPosition = true; + + const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; + const Vector2 cursorPosition = cursorInfo.primaryPosition + offset; + + if( updateCursorPosition ) + { + // Sets the cursor position. + mEventData->mDecorator->SetPosition( PRIMARY_CURSOR, + cursorPosition.x, + cursorPosition.y, + cursorInfo.primaryCursorHeight, + cursorInfo.lineHeight ); + + // Sets the grab handle position. + mEventData->mDecorator->SetPosition( GRAB_HANDLE, + cursorPosition.x, + cursorPosition.y, + cursorInfo.lineHeight ); + + if( cursorInfo.isSecondaryCursor ) + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_BOTH ); + mEventData->mDecorator->SetPosition( SECONDARY_CURSOR, + cursorInfo.secondaryPosition.x + offset.x, + cursorInfo.secondaryPosition.y + offset.y, + cursorInfo.secondaryCursorHeight, + cursorInfo.lineHeight ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Secondary cursor position: %f,%f\n", cursorInfo.secondaryPosition.x + offset.x, cursorInfo.secondaryPosition.y + offset.y ); + } + else + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY ); + } + } +} + void Controller::Impl::RequestRelayout() { mControlInterface.RequestTextRelayout(); diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index ab2764c..fa502a7 100644 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -146,6 +146,7 @@ struct EventData bool mUpdateLeftSelectionPosition : 1; ///< True if the visual position of the left selection handle must be recalculated. bool mUpdateRightSelectionPosition : 1; ///< True if the visual position of the right selection handle must be recalculated. bool mScrollAfterUpdateCursorPosition : 1; ///< Whether to scroll after the cursor position is updated. + bool mScrollAfterDelete : 1; ///< Whether to scroll after delete characters. }; struct ModifyEvent @@ -394,10 +395,17 @@ struct Controller::Impl /** * @brief Scrolls the text to make the cursor visible. * - * This method is called after inserting, deleting or moving the cursor with the keypad. + * This method is called after inserting text or moving the cursor with the keypad. */ void ScrollToMakeCursorVisible(); + /** + * @brief Scrolls the text to make the cursor visible. + * + * This method is called after deleting text. + */ + void ScrollTextToMatchCursor(); + ControlInterface& mControlInterface; ///< Reference to the text controller. LogicalModelPtr mLogicalModel; ///< Pointer to the logical model. VisualModelPtr mVisualModel; ///< Pointer to the visual model. diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index d584c73..589a018 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -772,8 +772,7 @@ void Controller::TextDeletedEvent() REORDER ); // Queue a cursor reposition event; this must wait until after DoRelayout() - mImpl->mEventData->mUpdateCursorPosition = true; - mImpl->mEventData->mScrollAfterUpdateCursorPosition = true; + mImpl->mEventData->mScrollAfterDelete = true; } bool Controller::DoRelayout( const Size& size, @@ -1114,6 +1113,9 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) int keyCode = keyEvent.keyCode; const std::string& keyString = keyEvent.keyPressed; + // Hide the grab handle. + mImpl->mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); + // Pre-process to separate modifying events from non-modifying input events. if( Dali::DALI_KEY_ESCAPE == keyCode ) {