From 1223956ada996a7663f727343f86267c184a57db Mon Sep 17 00:00:00 2001 From: Joogab Yun Date: Thu, 20 Sep 2018 19:22:19 +0900 Subject: [PATCH] [Tizen] support match align for system language direciton if matchSystemLanguageDirection property set true, text align direction follow system language direction. Change-Id: Idc1a45057cdc69d310e4c2817960e7c13cf4e48f --- .../dali-toolkit-test-utils/toolkit-text-utils.cpp | 7 +- .../dali-toolkit-internal/utc-Dali-Text-Layout.cpp | 170 +++++++++++++++++++-- .../src/dali-toolkit/utc-Dali-TextLabel.cpp | 18 ++- .../controls/text-controls/text-label-devel.h | 21 +++ .../controls/text-controls/text-editor-impl.cpp | 2 +- .../controls/text-controls/text-field-impl.cpp | 2 +- .../controls/text-controls/text-label-impl.cpp | 17 ++- .../internal/text/layouts/layout-engine.cpp | 33 +++- dali-toolkit/internal/text/layouts/layout-engine.h | 7 +- .../internal/text/layouts/layout-parameters.h | 10 +- dali-toolkit/internal/text/text-controller-impl.h | 4 +- dali-toolkit/internal/text/text-controller.cpp | 21 ++- dali-toolkit/internal/text/text-controller.h | 15 +- dali-toolkit/internal/text/text-model.cpp | 3 +- dali-toolkit/internal/text/text-model.h | 1 + dali-toolkit/internal/visuals/text/text-visual.cpp | 4 +- .../1920x1080/dali-toolkit-default-theme.json | 3 +- .../text-controls/HelloWorld-Default-END.png | Bin 0 -> 3988 bytes .../images/text-controls/HelloWorld-System-END.png | Bin 0 -> 3987 bytes .../text-label.md | 24 +++ 20 files changed, 323 insertions(+), 39 deletions(-) mode change 100644 => 100755 automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp mode change 100644 => 100755 automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp mode change 100644 => 100755 dali-toolkit/devel-api/controls/text-controls/text-label-devel.h mode change 100644 => 100755 dali-toolkit/internal/controls/text-controls/text-label-impl.cpp mode change 100644 => 100755 dali-toolkit/internal/text/layouts/layout-engine.cpp mode change 100644 => 100755 dali-toolkit/internal/text/layouts/layout-engine.h mode change 100644 => 100755 dali-toolkit/internal/text/layouts/layout-parameters.h create mode 100755 docs/content/images/text-controls/HelloWorld-Default-END.png create mode 100755 docs/content/images/text-controls/HelloWorld-System-END.png mode change 100644 => 100755 docs/content/shared-javascript-and-cpp-documentation/text-label.md diff --git a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp index 08f2c63..ccd24b5 100755 --- a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp +++ b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp @@ -307,7 +307,8 @@ void CreateTextModel( const std::string& text, Text::HorizontalAlignment::BEGIN, Text::LineWrap::WORD, outlineWidth, - true ); + true, + false ); Vector& lines = visualModel->mLines; @@ -366,7 +367,9 @@ void CreateTextModel( const std::string& text, characterCount, Text::HorizontalAlignment::BEGIN, lines, - alignmentOffset ); + alignmentOffset, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false ); } } diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp old mode 100644 new mode 100755 index ab15b46..bc9d08b --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp @@ -174,7 +174,8 @@ bool LayoutTextTest( const LayoutTextData& data ) Text::HorizontalAlignment::BEGIN, Text::LineWrap::WORD, outlineWidth, - true ); + true, + false ); layoutParameters.isLastNewParagraph = isLastNewParagraph; @@ -394,7 +395,8 @@ bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data ) Text::HorizontalAlignment::BEGIN, Text::LineWrap::WORD, outlineWidth, - true ); + true, + false ); layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count(); layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin(); @@ -447,6 +449,8 @@ struct AlignData unsigned int numberOfCharacters; unsigned int numberOfLines; float* lineOffsets; + Dali::LayoutDirection::Type layoutDirection; + bool matchSystemLanguageDirection; }; bool AlignTest( const AlignData& data ) @@ -499,7 +503,9 @@ bool AlignTest( const AlignData& data ) data.numberOfCharacters, data.horizontalAlignment, visualModel->mLines, - alignmentOffset ); + alignmentOffset, + data.layoutDirection, + data.matchSystemLanguageDirection ); // Compare results. if( data.numberOfLines != visualModel->mLines.Count() ) @@ -519,7 +525,6 @@ bool AlignTest( const AlignData& data ) return false; } } - return true; } @@ -4237,7 +4242,9 @@ int UtcDaliTextAlign01(void) 0u, 22u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -4356,7 +4363,9 @@ int UtcDaliTextAlign02(void) 22u, 26u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -4475,7 +4484,9 @@ int UtcDaliTextAlign03(void) 48u, 26u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -4594,7 +4605,9 @@ int UtcDaliTextAlign04(void) 0u, 22u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -4713,7 +4726,9 @@ int UtcDaliTextAlign05(void) 22u, 26u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -4832,7 +4847,9 @@ int UtcDaliTextAlign06(void) 48u, 26u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -4951,7 +4968,9 @@ int UtcDaliTextAlign07(void) 0u, 22u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -5070,7 +5089,9 @@ int UtcDaliTextAlign08(void) 22u, 26u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false }; if( !AlignTest( data ) ) @@ -5189,7 +5210,130 @@ int UtcDaliTextAlign09(void) 48u, 26u, 6u, - positions + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false + }; + + if( !AlignTest( data ) ) + { + tet_result(TET_FAIL); + } + + tet_result(TET_PASS); + END_TEST; +} + +int UtcDaliTextAlign10(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextAlign10"); + + // Calculate text alignment. + + const std::string fontLatin( "TizenSans" ); + const std::string fontHebrew( "TizenSansHebrew" ); + const std::string fontArabic( "TizenSansArabic" ); + + // Set a known font description + FontDescriptionRun fontDescriptionRun01; + fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.numberOfCharacters = 12u; + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyDefined = true; + fontDescriptionRun01.weightDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun02; + fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.numberOfCharacters = 10u; + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyDefined = true; + fontDescriptionRun02.weightDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun03; + fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.numberOfCharacters = 14u; + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyDefined = true; + fontDescriptionRun03.weightDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun04; + fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.numberOfCharacters = 12u; + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyDefined = true; + fontDescriptionRun04.weightDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun05; + fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.numberOfCharacters = 12u; + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyDefined = true; + fontDescriptionRun05.weightDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun06; + fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.numberOfCharacters = 14u; + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyDefined = true; + fontDescriptionRun06.weightDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; + + Vector fontDescriptionRuns; + fontDescriptionRuns.PushBack( fontDescriptionRun01 ); + fontDescriptionRuns.PushBack( fontDescriptionRun02 ); + fontDescriptionRuns.PushBack( fontDescriptionRun03 ); + fontDescriptionRuns.PushBack( fontDescriptionRun04 ); + fontDescriptionRuns.PushBack( fontDescriptionRun05 ); + fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + + float positions[] = { -4.f, 0.f, 0.f, 0.f, 0.f, 0.f }; + + Size textArea( 100.f, 300.f ); + AlignData data = + { + "Begin alignment for the first paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::END, + Text::VerticalAlignment::TOP, + 0u, + 22u, + 6u, + positions, + Dali::LayoutDirection::RIGHT_TO_LEFT, + true }; if( !AlignTest( data ) ) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp old mode 100644 new mode 100755 index f19cb12..ffa0a61 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp @@ -1062,6 +1062,22 @@ int UtcDaliToolkitTextlabelEllipsis(void) tet_result(TET_FAIL); } + + label.SetProperty( TextLabel::Property::TEXT, "Hello world" ); + label.SetProperty( DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true ); + label.SetSize( 400.0f, 10.f ); + + try + { + // Render the text. + application.SendNotification(); + application.Render(); + } + catch( ... ) + { + tet_result(TET_FAIL); + } + END_TEST; } @@ -1334,4 +1350,4 @@ int UtcDaliToolkitTextlabelVerticalLineAlignment(void) DALI_TEST_EQUALS( label.GetProperty< int >( DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT ), static_cast< int >( Toolkit::DevelText::VerticalLineAlignment::BOTTOM ), TEST_LOCATION ); END_TEST; -} \ No newline at end of file +} diff --git a/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h old mode 100644 new mode 100755 index 0b16273..ec6b935 --- a/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h @@ -101,6 +101,27 @@ namespace Property * @note The default value is true */ IGNORE_SPACES_AFTER_TEXT, + + /** + * @brief Modifies the default text alignment to match the direction of the system language. + * @details Name "matchSystemLanguageDirection", type (Property::BOLEAN), Read/Write + * @note The default value is false + * + * If MATCH_SYSTEM_LANGUAGE_DIRECTION property set true, the default text alignment to match the direction of the system language. + * + * ex) Current system language direction LTR. + * TextLabel::New("Hello world \n ﻡﺮﺤﺑﺍ. "); + * TextLabel::Property::HORIZONTAL_ALIGNMENT, "END" + * + * | TextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION | + * |----------------------------------------------------------------------- + * | false (default) | true | + * |-----------------------------------|----------------------------------| + * | Hello world | Hello world | + * | ﻡﺮﺤﺑﺍ. | ﻡﺮﺤﺑﺍ. | + * + */ + MATCH_SYSTEM_LANGUAGE_DIRECTION, }; } // namespace Property diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index 94d0f20..af57128 100755 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -1351,7 +1351,7 @@ void TextEditor::OnRelayout( const Vector2& size, RelayoutContainer& container ) mActiveLayer.SetPosition( padding.start, padding.top ); } - const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize ); + const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize, layoutDirection ); if( ( Text::Controller::NONE_UPDATED != updateTextType ) || !mRenderer ) diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 95e4765..d4485ba 100755 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -1397,7 +1397,7 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) mActiveLayer.SetPosition( padding.start, padding.top ); } - const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize ); + const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize, layoutDirection ); if( ( Text::Controller::NONE_UPDATED != updateTextType ) || !mRenderer ) diff --git a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp old mode 100644 new mode 100755 index bb40d00..7a8c283 --- a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp @@ -132,6 +132,7 @@ DALI_DEVEL_PROPERTY_REGISTRATION_READ_ONLY( Toolkit, TextLabel, "textDirection", DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "verticalLineAlignment", INTEGER, VERTICAL_LINE_ALIGNMENT ) DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "textBackground", MAP, BACKGROUND ) DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "ignoreSpacesAfterText", BOOLEAN, IGNORE_SPACES_AFTER_TEXT ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextLabel, "matchSystemLanguageDirection", BOOLEAN, MATCH_SYSTEM_LANGUAGE_DIRECTION ) DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT( Toolkit, TextLabel, "textColor", Color::BLACK, TEXT_COLOR ) DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorRed", TEXT_COLOR_RED, TEXT_COLOR, 0 ) DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION( Toolkit, TextLabel, "textColorGreen", TEXT_COLOR_GREEN, TEXT_COLOR, 1 ) @@ -539,6 +540,11 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr impl.mController->SetIgnoreSpacesAfterText(value.Get< bool >()); break; } + case Toolkit::DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION: + { + impl.mController->SetMatchSystemLanguageDirection(value.Get< bool >()); + break; + } } // Request relayout when text update is needed. It's necessary to call it @@ -842,6 +848,11 @@ Property::Value TextLabel::GetProperty( BaseObject* object, Property::Index inde value = impl.mController->IsIgnoreSpacesAfterText(); break; } + case Toolkit::DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION: + { + value = impl.mController->IsMatchSystemLanguageDirection(); + break; + } } } @@ -962,7 +973,10 @@ void TextLabel::OnRelayout( const Vector2& size, RelayoutContainer& container ) Vector2 contentSize( size.x - ( padding.start + padding.end ), size.y - ( padding.top + padding.bottom ) ); - const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize ); + // Support Right-To-Left + Dali::LayoutDirection::Type layoutDirection = static_cast( Self().GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); + + const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize, layoutDirection ); if( ( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) || mTextUpdateNeeded ) @@ -973,7 +987,6 @@ void TextLabel::OnRelayout( const Vector2& size, RelayoutContainer& container ) TextVisual::EnableRendererUpdate( mVisual ); // Support Right-To-Left of padding - Dali::LayoutDirection::Type layoutDirection = static_cast( Self().GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); if( Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection ) { std::swap( padding.start, padding.end ); diff --git a/dali-toolkit/internal/text/layouts/layout-engine.cpp b/dali-toolkit/internal/text/layouts/layout-engine.cpp old mode 100644 new mode 100755 index 061707a..0c3d9df --- a/dali-toolkit/internal/text/layouts/layout-engine.cpp +++ b/dali-toolkit/internal/text/layouts/layout-engine.cpp @@ -1104,7 +1104,9 @@ struct Engine::Impl Length numberOfCharacters, Text::HorizontalAlignment::Type horizontalAlignment, Vector& lines, - float& alignmentOffset ) + float& alignmentOffset, + Dali::LayoutDirection::Type layoutDirection, + bool matchSystemLanguageDirection ) { const CharacterIndex lastCharacterPlusOne = startIndex + numberOfCharacters; @@ -1132,7 +1134,9 @@ struct Engine::Impl // the box width, line length, and the paragraph's direction. CalculateHorizontalAlignment( size.width, horizontalAlignment, - line ); + line, + layoutDirection, + matchSystemLanguageDirection ); // Updates the alignment offset. alignmentOffset = std::min( alignmentOffset, line.alignmentOffset ); @@ -1141,16 +1145,24 @@ struct Engine::Impl void CalculateHorizontalAlignment( float boxWidth, HorizontalAlignment::Type horizontalAlignment, - LineRun& line ) + LineRun& line, + Dali::LayoutDirection::Type layoutDirection, + bool matchSystemLanguageDirection ) { line.alignmentOffset = 0.f; - const bool isRTL = RTL == line.direction; + bool isRTL = RTL == line.direction; float lineLength = line.width; - HorizontalAlignment::Type alignment = horizontalAlignment; + + // match align for system language direction + if( matchSystemLanguageDirection ) + { + isRTL = layoutDirection == LayoutDirection::RIGHT_TO_LEFT; + } + + // Swap the alignment type if the line is right to left. if( isRTL ) { - // Swap the alignment type if the line is right to left. switch( alignment ) { case HorizontalAlignment::BEGIN: @@ -1169,6 +1181,7 @@ struct Engine::Impl break; } } + } // Calculate the horizontal line offset. @@ -1300,14 +1313,18 @@ void Engine::Align( const Size& size, Length numberOfCharacters, Text::HorizontalAlignment::Type horizontalAlignment, Vector& lines, - float& alignmentOffset ) + float& alignmentOffset, + Dali::LayoutDirection::Type layoutDirection, + bool matchSystemLanguageDirection ) { mImpl->Align( size, startIndex, numberOfCharacters, horizontalAlignment, lines, - alignmentOffset ); + alignmentOffset, + layoutDirection, + matchSystemLanguageDirection ); } void Engine::SetDefaultLineSpacing( float lineSpacing ) diff --git a/dali-toolkit/internal/text/layouts/layout-engine.h b/dali-toolkit/internal/text/layouts/layout-engine.h old mode 100644 new mode 100755 index 66525d1..5e80d8c --- a/dali-toolkit/internal/text/layouts/layout-engine.h +++ b/dali-toolkit/internal/text/layouts/layout-engine.h @@ -21,6 +21,7 @@ // EXTERNAL INCLUDE #include #include +#include // INTERNAL INCLUDE #include @@ -140,13 +141,17 @@ public: * @param[in] horizontalAlignment The horizontal alignment. * @param[in,out] lines The laid-out lines. * @param[out] alignmentOffset The alignment offset. + * @param[in] layoutDirection The direction of the system language. + * @param[in] matchSystemLanguageDirection Whether match align for system language direction or not. */ void Align( const Size& size, CharacterIndex startIndex, Length numberOfCharacters, Text::HorizontalAlignment::Type horizontalAlignment, Vector& lines, - float& alignmentOffset ); + float& alignmentOffset, + Dali::LayoutDirection::Type layoutDirection, + bool matchSystemLanguageDirection ); /** * @brief Sets the default line spacing. diff --git a/dali-toolkit/internal/text/layouts/layout-parameters.h b/dali-toolkit/internal/text/layouts/layout-parameters.h old mode 100644 new mode 100755 index 5a77d86..ecd1f6b --- a/dali-toolkit/internal/text/layouts/layout-parameters.h +++ b/dali-toolkit/internal/text/layouts/layout-parameters.h @@ -60,6 +60,9 @@ struct Parameters * @param[in] totalNumberOfGlyphs The number of glyphs. * @param[in] horizontalAlignment The horizontal alignment. * @param[in] lineWrapMode The text wrap mode. + * @param[in] outlineWidth The outline width. + * @param[in] ignoreSpaceAfterText Whether ignoring spaces after text or not. + * @param[in] matchSystemLanguageDirection Whether match align for system language direction or not.. */ Parameters( const Vector2& boundingBox, const Character* const textBuffer, @@ -75,7 +78,8 @@ struct Parameters Text::HorizontalAlignment::Type horizontalAlignment, Text::LineWrap::Mode lineWrapMode, float outlineWidth, - bool ignoreSpaceAfterText ) + bool ignoreSpaceAfterText, + bool matchSystemLanguageDirection ) : boundingBox( boundingBox ), textBuffer( textBuffer ), lineBreakInfoBuffer( lineBreakInfoBuffer ), @@ -97,7 +101,8 @@ struct Parameters lineWrapMode( lineWrapMode ), outlineWidth( outlineWidth ), isLastNewParagraph( false ), - ignoreSpaceAfterText( ignoreSpaceAfterText ) + ignoreSpaceAfterText( ignoreSpaceAfterText ), + matchSystemLanguageDirection ( matchSystemLanguageDirection ) {} Vector2 boundingBox; ///< The size of the box containing the text. @@ -122,6 +127,7 @@ struct Parameters float outlineWidth; ///< The outline width. bool isLastNewParagraph:1; ///< Whether the last character is a new paragraph character. bool ignoreSpaceAfterText:1; ///< Whether ignoring spaces after text or not. Default is true. + bool matchSystemLanguageDirection:1; ///< Whether match align for system language direction or not. Default is false. }; } // namespace Layout diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index 34601f5..3e50faf 100755 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -329,7 +329,8 @@ struct Controller::Impl mShadowSetByString( false ), mOutlineSetByString( false ), mFontStyleSetByString( false ), - mShouldClearFocusOnEscape( true ) + mShouldClearFocusOnEscape( true ), + mLayoutDirection( LayoutDirection::LEFT_TO_RIGHT ) { mModel = Model::New(); @@ -765,6 +766,7 @@ public: bool mOutlineSetByString:1; ///< Set when outline is set by string (legacy) instead of map bool mFontStyleSetByString:1; ///< Set when font style is set by string (legacy) instead of map bool mShouldClearFocusOnEscape:1; ///< Whether text control should clear key input focus + LayoutDirection::Type mLayoutDirection; ///< Current system language direction }; } // namespace Text diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 033433b..f0b496f 100755 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -417,6 +417,17 @@ void Controller::SetIgnoreSpacesAfterText( bool ignore ) mImpl->mModel->mIgnoreSpacesAfterText = ignore; } +bool Controller::IsMatchSystemLanguageDirection() const +{ + return mImpl->mModel->mMatchSystemLanguageDirection; +} + +void Controller::SetMatchSystemLanguageDirection( bool match ) +{ + mImpl->mModel->mMatchSystemLanguageDirection = match; +} + + void Controller::SetLineWrapMode( Text::LineWrap::Mode lineWrapMode ) { if( lineWrapMode != mImpl->mModel->mLineWrapMode ) @@ -2228,12 +2239,13 @@ void Controller::SetVerticalLineAlignment( Toolkit::DevelText::VerticalLineAlign // public : Relayout. -Controller::UpdateTextType Controller::Relayout( const Size& size ) +Controller::UpdateTextType Controller::Relayout( const Size& size, Dali::LayoutDirection::Type layoutDirection ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::Relayout %p size %f,%f, autoScroll[%s]\n", this, size.width, size.height, mImpl->mIsAutoScrollEnabled ?"true":"false" ); 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() ) @@ -3543,7 +3555,8 @@ bool Controller::DoRelayout( const Size& size, mImpl->mModel->mHorizontalAlignment, mImpl->mModel->mLineWrapMode, outlineWidth, - mImpl->mModel->mIgnoreSpacesAfterText ); + mImpl->mModel->mIgnoreSpacesAfterText, + mImpl->mModel->mMatchSystemLanguageDirection ); // Resize the vector of positions to have the same size than the vector of glyphs. Vector& glyphPositions = mImpl->mModel->mVisualModel->mGlyphPositions; @@ -3661,7 +3674,9 @@ bool Controller::DoRelayout( const Size& size, requestedNumberOfCharacters, mImpl->mModel->mHorizontalAlignment, lines, - mImpl->mModel->mAlignmentOffset ); + mImpl->mModel->mAlignmentOffset, + mImpl->mLayoutDirection, + mImpl->mModel->mMatchSystemLanguageDirection ); viewUpdated = true; } diff --git a/dali-toolkit/internal/text/text-controller.h b/dali-toolkit/internal/text/text-controller.h index 25bb13b..f92a69d 100755 --- a/dali-toolkit/internal/text/text-controller.h +++ b/dali-toolkit/internal/text/text-controller.h @@ -1243,6 +1243,18 @@ public: // Queries & retrieves. */ void SetIgnoreSpacesAfterText( bool ignore ); + /** + * @brief Retrieves matchSystemLanguageDirection value from model + * @return The value of matchSystemLanguageDirection + */ + bool IsMatchSystemLanguageDirection() const; + + /** + * @brief Sets matchSystemLanguageDirection value to model + * @param[in] match The value of matchSystemLanguageDirection for the text + */ + void SetMatchSystemLanguageDirection( bool match ); + public: // Relayout. /** @@ -1250,10 +1262,11 @@ public: // Relayout. * * @note UI Controls are expected to minimize calls to this method e.g. call once after size negotiation. * @param[in] size A the size of a bounding box to layout text within. + * @param[in] layoutDirection The direction of the system language. * * @return Whether the text model or decorations were updated. */ - UpdateTextType Relayout( const Size& size ); + UpdateTextType Relayout( const Size& size, Dali::LayoutDirection::Type layoutDirection = Dali::LayoutDirection::LEFT_TO_RIGHT ); /** * @brief Request a relayout using the ControlInterface. diff --git a/dali-toolkit/internal/text/text-model.cpp b/dali-toolkit/internal/text/text-model.cpp index 65494e5..474b3ae 100755 --- a/dali-toolkit/internal/text/text-model.cpp +++ b/dali-toolkit/internal/text/text-model.cpp @@ -188,7 +188,8 @@ Model::Model() mLineWrapMode( Text::LineWrap::WORD ), mAlignmentOffset( 0.0f ), mElideEnabled( false ), - mIgnoreSpacesAfterText( true ) + mIgnoreSpacesAfterText( true ), + mMatchSystemLanguageDirection( false ) { mLogicalModel = LogicalModel::New(); mVisualModel = VisualModel::New(); diff --git a/dali-toolkit/internal/text/text-model.h b/dali-toolkit/internal/text/text-model.h index 1ea725c..688eac4 100755 --- a/dali-toolkit/internal/text/text-model.h +++ b/dali-toolkit/internal/text/text-model.h @@ -239,6 +239,7 @@ public: float mAlignmentOffset; ///< The alignment offset. bool mElideEnabled:1; ///< Whether the text's elide is enabled. bool mIgnoreSpacesAfterText:1; ///< Whether ignoring spaces after text or not. Default is true. + bool mMatchSystemLanguageDirection:1; ///< Whether match align for system language direction or not. Default is false. }; } // namespace Text diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index b8edc7a..4b3176c 100755 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -634,7 +634,9 @@ void TextVisual::UpdateRenderer() return; } - const Text::Controller::UpdateTextType updateTextType = mController->Relayout( relayoutSize ); + Dali::LayoutDirection::Type layoutDirection = static_cast( control.GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); + + const Text::Controller::UpdateTextType updateTextType = mController->Relayout( relayoutSize, layoutDirection ); if( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) || mRendererUpdateNeeded ) diff --git a/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json b/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json index 43bd4e5..842a568 100644 --- a/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json +++ b/dali-toolkit/styles/1920x1080/dali-toolkit-default-theme.json @@ -67,7 +67,8 @@ "autoScrollLoopCount":2, "autoScrollGap":50, "autoScrollSpeed":80, - "ignoreSpacesAfterText":false + "ignoreSpacesAfterText":false, + "matchSystemLanguageDirection":true }, "TextLabelFontSize0": diff --git a/docs/content/images/text-controls/HelloWorld-Default-END.png b/docs/content/images/text-controls/HelloWorld-Default-END.png new file mode 100755 index 0000000000000000000000000000000000000000..3302d08af2a845798cf08936ed7af4ba32b986f8 GIT binary patch literal 3988 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 literal 0 HcmV?d00001 diff --git a/docs/content/shared-javascript-and-cpp-documentation/text-label.md b/docs/content/shared-javascript-and-cpp-documentation/text-label.md old mode 100644 new mode 100755 index f1c3b77..9b463e4 --- a/docs/content/shared-javascript-and-cpp-documentation/text-label.md +++ b/docs/content/shared-javascript-and-cpp-documentation/text-label.md @@ -89,6 +89,30 @@ label.HorizontalAlignment = "BEGIN"; // "CENTER" or "END" | ![ ](../assets/img/text-controls/LatinEnd.png) ![ ](LatinEnd.png) | ![ ](../assets/img/text-controls/ArabicEnd.png) ![ ](ArabicEnd.png) | + +The text's alignment can be modified to match the direction of the system language. + +If the MATCH_SYSTEM_LANGUAGE_DIRECTION property is set to true then the direction of the text is ignored, instead the text is aligned as the system default language. + +~~~{.cpp} +// C++ + +label.SetProperty( TextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION, true ); +~~~ + +~~~{.js} +// JavaScript + +label.matchSystemLanguageDirection = true; +~~~ + +| | | +|--|--| +| Current system language direction left-to-right | | +| END alignment and MATCH_SYSTEM_LANGUAGE_DIRECTION set to TRUE. | END alignment and MATCH_SYSTEM_LANGUAGE_DIRECTION set to FALSE (default). | +| ![ ](HelloWorld-System-END.png) | ![ ](HelloWorld-Default-END.png) | + + The examples above assume that the TextLabel size greater than the minimum required. The next section provides details about the other size related options. -- 2.7.4