X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller.cpp;h=e0c63c86ed70ff882dc3de30e4eca82558d284e2;hp=6c1bf75027c7abaa578b5b23aec31581b567c004;hb=f7afcaf3b5cd7cd9aa3c937b680a525ecbbc8332;hpb=8a313bb71bb0d1b443e2b5d7f383155433d385e0 diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 6c1bf75..e0c63c8 100755 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -65,7 +65,7 @@ const char * const PLACEHOLDER_ELLIPSIS = "ellipsis"; float ConvertToEven( float value ) { int intValue(static_cast( value )); - return static_cast(intValue % 2 == 0) ? intValue : (intValue + 1); + return static_cast( intValue + ( intValue & 1 ) ); } } // namespace @@ -361,6 +361,9 @@ void Controller::SetMultiLineEnabled( bool enable ) mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true; mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | layoutOperations ); + // Need to recalculate natural size + mImpl->mRecalculateNaturalSize = true; + mImpl->RequestRelayout(); } } @@ -432,6 +435,11 @@ void Controller::SetLayoutDirection( Dali::LayoutDirection::Type layoutDirection mImpl->mLayoutDirection = layoutDirection; } +bool Controller::IsShowingRealText() const +{ + return mImpl->IsShowingRealText(); +} + void Controller::SetLineWrapMode( Text::LineWrap::Mode lineWrapMode ) { @@ -519,6 +527,16 @@ bool Controller::IsGrabHandleEnabled() const return mImpl->mEventData->mGrabHandleEnabled; } +void Controller::SetGrabHandlePopupEnabled(bool enabled) +{ + mImpl->mEventData->mGrabHandlePopupEnabled = enabled; +} + +bool Controller::IsGrabHandlePopupEnabled() const +{ + return mImpl->mEventData->mGrabHandlePopupEnabled; +} + // public : Update void Controller::SetText( const std::string& text ) @@ -553,7 +571,8 @@ void Controller::SetText( const std::string& text ) mImpl->mModel->mVisualModel->SetTextColor( mImpl->mTextColor ); MarkupProcessData markupProcessData( mImpl->mModel->mLogicalModel->mColorRuns, - mImpl->mModel->mLogicalModel->mFontDescriptionRuns ); + mImpl->mModel->mLogicalModel->mFontDescriptionRuns, + mImpl->mModel->mLogicalModel->mEmbeddedItems ); Length textSize = 0u; const uint8_t* utf8 = NULL; @@ -1238,14 +1257,14 @@ const Vector4& Controller::GetOutlineColor() const return mImpl->mModel->mVisualModel->GetOutlineColor(); } -void Controller::SetOutlineWidth( unsigned int width ) +void Controller::SetOutlineWidth( uint16_t width ) { mImpl->mModel->mVisualModel->SetOutlineWidth( width ); mImpl->RequestRelayout(); } -unsigned int Controller::GetOutlineWidth() const +uint16_t Controller::GetOutlineWidth() const { return mImpl->mModel->mVisualModel->GetOutlineWidth(); } @@ -1337,7 +1356,7 @@ void Controller::SetInputColor( const Vector4& color ) mImpl->mEventData->mInputStyle.textColor = color; mImpl->mEventData->mInputStyle.isDefaultColor = false; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) { const bool handlesCrossed = mImpl->mEventData->mLeftSelectionPosition > mImpl->mEventData->mRightSelectionPosition; @@ -1384,7 +1403,7 @@ void Controller::SetInputFontFamily( const std::string& fontFamily ) mImpl->mEventData->mInputStyle.familyName = fontFamily; mImpl->mEventData->mInputStyle.isFamilyDefined = true; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) { CharacterIndex startOfSelectedText = 0u; Length lengthOfSelectedText = 0u; @@ -1443,7 +1462,7 @@ void Controller::SetInputFontWeight( FontWeight weight ) mImpl->mEventData->mInputStyle.weight = weight; mImpl->mEventData->mInputStyle.isWeightDefined = true; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) { CharacterIndex startOfSelectedText = 0u; Length lengthOfSelectedText = 0u; @@ -1509,7 +1528,7 @@ void Controller::SetInputFontWidth( FontWidth width ) mImpl->mEventData->mInputStyle.width = width; mImpl->mEventData->mInputStyle.isWidthDefined = true; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) { CharacterIndex startOfSelectedText = 0u; Length lengthOfSelectedText = 0u; @@ -1575,7 +1594,7 @@ void Controller::SetInputFontSlant( FontSlant slant ) mImpl->mEventData->mInputStyle.slant = slant; mImpl->mEventData->mInputStyle.isSlantDefined = true; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) { CharacterIndex startOfSelectedText = 0u; Length lengthOfSelectedText = 0u; @@ -1641,7 +1660,7 @@ void Controller::SetInputFontPointSize( float size ) mImpl->mEventData->mInputStyle.size = size; mImpl->mEventData->mInputStyle.isSizeDefined = true; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) { CharacterIndex startOfSelectedText = 0u; Length lengthOfSelectedText = 0u; @@ -2250,7 +2269,6 @@ Controller::UpdateTextType Controller::Relayout( const Size& size, Dali::LayoutD UpdateTextType updateTextType = NONE_UPDATED; - mImpl->mLayoutDirection = layoutDirection; if( ( size.width < Math::MACHINE_EPSILON_1000 ) || ( size.height < Math::MACHINE_EPSILON_1000 ) ) { if( 0u != mImpl->mModel->mVisualModel->mGlyphPositions.Count() ) @@ -2318,6 +2336,22 @@ Controller::UpdateTextType Controller::Relayout( const Size& size, Dali::LayoutD mImpl->mTextUpdateInfo.mCharacterIndex = 0u; } + if( mImpl->mModel->mMatchSystemLanguageDirection && mImpl->mLayoutDirection != layoutDirection ) + { + // Clear the update info. This info will be set the next time the text is updated. + mImpl->mTextUpdateInfo.mClearAll = true; + // Apply modifications to the model + // Shape the text again is needed because characters like '()[]{}' have to be mirrored and the glyphs generated again. + mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | + GET_GLYPH_METRICS | + SHAPE_TEXT | + UPDATE_DIRECTION | + LAYOUT | + BIDI_INFO | + REORDER ); + mImpl->mLayoutDirection = layoutDirection; + } + // Make sure the model is up-to-date before layouting. ProcessModifyEvents(); bool updated = mImpl->UpdateModel( mImpl->mOperationsPending ); @@ -2328,6 +2362,7 @@ Controller::UpdateTextType Controller::Relayout( const Size& size, Dali::LayoutD mImpl->mOperationsPending, layoutSize ) || updated; + if( updated ) { updateTextType = MODEL_UPDATED; @@ -2588,9 +2623,9 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) // This branch avoids calling the InsertText() method of the 'else' branch which can delete selected text. } - else if( Dali::DALI_KEY_SHIFT_LEFT == keyCode ) + else if( ( Dali::DALI_KEY_SHIFT_LEFT == keyCode ) || ( Dali::DALI_KEY_SHIFT_RIGHT == keyCode ) ) { - // DALI_KEY_SHIFT_LEFT is the key code for the Left Shift. It's sent (by the InputMethodContext?) when the predictive text is enabled + // DALI_KEY_SHIFT_LEFT or DALI_KEY_SHIFT_RIGHT is the key code for Shift. It's sent (by the InputMethodContext?) when the predictive text is enabled // and a character is typed after the type of a upper case latin character. // Do nothing. @@ -2606,20 +2641,26 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p keyString %s\n", this, keyString.c_str() ); - // InputMethodContext is no longer handling key-events - mImpl->ClearPreEditFlag(); + if( !keyString.empty() ) + { + // InputMethodContext is no longer handling key-events + mImpl->ClearPreEditFlag(); - InsertText( keyString, COMMIT ); - textChanged = true; + InsertText( keyString, COMMIT ); + + textChanged = true; + + // Will request for relayout. + relayoutNeeded = true; + } - // Will request for relayout. - relayoutNeeded = true; } if ( ( mImpl->mEventData->mState != EventData::INTERRUPTED ) && ( mImpl->mEventData->mState != EventData::INACTIVE ) && ( !isNullKey ) && ( Dali::DALI_KEY_SHIFT_LEFT != keyCode ) && + ( Dali::DALI_KEY_SHIFT_RIGHT != keyCode ) && ( Dali::DALI_KEY_VOLUME_UP != keyCode ) && ( Dali::DALI_KEY_VOLUME_DOWN != keyCode ) ) { @@ -2788,6 +2829,32 @@ void Controller::LongPressEvent( Gesture::State state, float x, float y ) } } +void Controller::SelectEvent( float x, float y, bool selectAll ) +{ + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SelectEvent\n" ); + + if( NULL != mImpl->mEventData ) + { + if( selectAll ) + { + Event event( Event::SELECT_ALL ); + mImpl->mEventData->mEventQueue.push_back( event ); + } + else + { + Event event( Event::SELECT ); + event.p2.mFloat = x; + event.p3.mFloat = y; + mImpl->mEventData->mEventQueue.push_back( event ); + } + + mImpl->mEventData->mCheckScrollAmount = true; + mImpl->mEventData->mIsLeftHandleSelected = true; + mImpl->mEventData->mIsRightHandleSelected = true; + mImpl->RequestRelayout(); + } +} + InputMethodContext::CallbackData Controller::OnInputMethodContextEvent( InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent ) { // Whether the text needs to be relaid-out. @@ -3201,14 +3268,14 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ mImpl->mModel->mLogicalModel->RetrieveStyle( styleIndex, style ); // Whether to add a new text color run. - const bool addColorRun = ( style.textColor != mImpl->mEventData->mInputStyle.textColor ); + const bool addColorRun = ( style.textColor != mImpl->mEventData->mInputStyle.textColor ) && !mImpl->mEventData->mInputStyle.isDefaultColor; // Whether to add a new font run. - const bool addFontNameRun = style.familyName != mImpl->mEventData->mInputStyle.familyName; - const bool addFontWeightRun = style.weight != mImpl->mEventData->mInputStyle.weight; - const bool addFontWidthRun = style.width != mImpl->mEventData->mInputStyle.width; - const bool addFontSlantRun = style.slant != mImpl->mEventData->mInputStyle.slant; - const bool addFontSizeRun = style.size != mImpl->mEventData->mInputStyle.size; + const bool addFontNameRun = ( style.familyName != mImpl->mEventData->mInputStyle.familyName ) && mImpl->mEventData->mInputStyle.isFamilyDefined; + const bool addFontWeightRun = ( style.weight != mImpl->mEventData->mInputStyle.weight ) && mImpl->mEventData->mInputStyle.isWeightDefined; + const bool addFontWidthRun = ( style.width != mImpl->mEventData->mInputStyle.width ) && mImpl->mEventData->mInputStyle.isWidthDefined; + const bool addFontSlantRun = ( style.slant != mImpl->mEventData->mInputStyle.slant ) && mImpl->mEventData->mInputStyle.isSlantDefined; + const bool addFontSizeRun = ( style.size != mImpl->mEventData->mInputStyle.size ) && mImpl->mEventData->mInputStyle.isSizeDefined ; // Add style runs. if( addColorRun ) @@ -3601,12 +3668,15 @@ bool Controller::DoRelayout( const Size& size, } // Update the visual model. + bool isAutoScrollEnabled = mImpl->mIsAutoScrollEnabled; Size newLayoutSize; viewUpdated = mImpl->mLayoutEngine.LayoutText( layoutParameters, glyphPositions, mImpl->mModel->mVisualModel->mLines, newLayoutSize, - elideTextEnabled ); + elideTextEnabled, + isAutoScrollEnabled ); + mImpl->mIsAutoScrollEnabled = isAutoScrollEnabled; viewUpdated = viewUpdated || ( newLayoutSize != layoutSize ); @@ -3833,32 +3903,6 @@ void Controller::TextDeletedEvent() mImpl->mOperationsPending = ALL_OPERATIONS; } -void Controller::SelectEvent( float x, float y, bool selectAll ) -{ - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SelectEvent\n" ); - - if( NULL != mImpl->mEventData ) - { - if( selectAll ) - { - Event event( Event::SELECT_ALL ); - mImpl->mEventData->mEventQueue.push_back( event ); - } - else - { - Event event( Event::SELECT ); - event.p2.mFloat = x; - event.p3.mFloat = y; - mImpl->mEventData->mEventQueue.push_back( event ); - } - - mImpl->mEventData->mCheckScrollAmount = true; - mImpl->mEventData->mIsLeftHandleSelected = true; - mImpl->mEventData->mIsRightHandleSelected = true; - mImpl->RequestRelayout(); - } -} - bool Controller::DeleteEvent( int keyCode ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p KeyCode : %d \n", this, keyCode ); @@ -3917,6 +3961,9 @@ void Controller::ResetText() // Reset buffers. mImpl->mModel->mLogicalModel->mText.Clear(); + // Reset the embedded images buffer. + mImpl->mModel->mLogicalModel->ClearEmbeddedImages(); + // We have cleared everything including the placeholder-text mImpl->PlaceholderCleared();