+ break;
+ }
+ case Toolkit::TextLabel::Property::FONT_FAMILY:
+ {
+ const std::string& fontFamily = value.Get<std::string>();
+
+ DALI_LOG_INFO(gLogFilter, Debug::Verbose, "TextLabel::SetProperty Property::FONT_FAMILY newFont(%s)\n", fontFamily.c_str());
+ impl.mController->SetDefaultFontFamily(fontFamily);
+ break;
+ }
+ case Toolkit::TextLabel::Property::FONT_STYLE:
+ {
+ SetFontStyleProperty(impl.mController, value, Text::FontStyle::DEFAULT);
+ break;
+ }
+ case Toolkit::TextLabel::Property::POINT_SIZE:
+ {
+ const float pointSize = value.Get<float>();
+
+ if(!Equals(impl.mController->GetDefaultFontSize(Text::Controller::POINT_SIZE), pointSize))
+ {
+ impl.mController->SetDefaultFontSize(pointSize, Text::Controller::POINT_SIZE);
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::MULTI_LINE:
+ {
+ impl.mController->SetMultiLineEnabled(value.Get<bool>());
+ break;
+ }
+ case Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT:
+ {
+ Text::HorizontalAlignment::Type alignment(static_cast<Text::HorizontalAlignment::Type>(-1)); // Set to invalid value to ensure a valid mode does get set
+ if(Text::GetHorizontalAlignmentEnumeration(value, alignment))
+ {
+ impl.mController->SetHorizontalAlignment(alignment);
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT:
+ {
+ Toolkit::Text::VerticalAlignment::Type alignment(static_cast<Text::VerticalAlignment::Type>(-1)); // Set to invalid value to ensure a valid mode does get set
+ if(Text::GetVerticalAlignmentEnumeration(value, alignment))
+ {
+ impl.mController->SetVerticalAlignment(alignment);
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::ENABLE_MARKUP:
+ {
+ const bool enableMarkup = value.Get<bool>();
+ impl.mController->SetMarkupProcessorEnabled(enableMarkup);
+
+ if(impl.mController->HasAnchors())
+ {
+ // Forward input events to controller
+ impl.EnableGestureDetection(static_cast<GestureType::Value>(GestureType::TAP));
+ }
+ else
+ {
+ impl.DisableGestureDetection(static_cast<GestureType::Value>(GestureType::TAP));
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::ENABLE_AUTO_SCROLL:
+ {
+ const bool enableAutoScroll = value.Get<bool>();
+ // If request to auto scroll is the same as current state then do nothing.
+ if(enableAutoScroll != impl.mController->IsAutoScrollEnabled())
+ {
+ // If request is disable (false) and auto scrolling is enabled then need to stop it
+ if(enableAutoScroll == false)
+ {
+ if(impl.mTextScroller)
+ {
+ impl.mTextScroller->StopScrolling();
+ }
+ }
+ // If request is enable (true) then start autoscroll as not already running
+ else
+ {
+ impl.mController->SetAutoScrollEnabled(enableAutoScroll);
+ }
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::AUTO_SCROLL_STOP_MODE:
+ {
+ Text::TextScrollerPtr textScroller = impl.GetTextScroller();
+ Toolkit::TextLabel::AutoScrollStopMode::Type stopMode = textScroller->GetStopMode();
+ if(Scripting::GetEnumerationProperty<Toolkit::TextLabel::AutoScrollStopMode::Type>(value,
+ AUTO_SCROLL_STOP_MODE_TABLE,
+ AUTO_SCROLL_STOP_MODE_TABLE_COUNT,
+ stopMode))
+ {
+ textScroller->SetStopMode(stopMode);
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::AUTO_SCROLL_SPEED:
+ {
+ impl.GetTextScroller()->SetSpeed(value.Get<int>());
+ break;
+ }
+ case Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_COUNT:
+ {
+ impl.GetTextScroller()->SetLoopCount(value.Get<int>());
+ break;
+ }
+ case Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_DELAY:
+ {
+ impl.GetTextScroller()->SetLoopDelay(value.Get<float>());
+ break;
+ }
+ case Toolkit::TextLabel::Property::AUTO_SCROLL_GAP:
+ {
+ impl.GetTextScroller()->SetGap(value.Get<float>());
+ break;
+ }
+ case Toolkit::TextLabel::Property::LINE_SPACING:
+ {
+ const float lineSpacing = value.Get<float>();
+ impl.mTextUpdateNeeded = impl.mController->SetDefaultLineSpacing(lineSpacing) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::TextLabel::Property::UNDERLINE:
+ {
+ impl.mTextUpdateNeeded = SetUnderlineProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::TextLabel::Property::SHADOW:
+ {
+ impl.mTextUpdateNeeded = SetShadowProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::TextLabel::Property::EMBOSS:
+ {
+ impl.mTextUpdateNeeded = SetEmbossProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::TextLabel::Property::OUTLINE:
+ {
+ impl.mTextUpdateNeeded = SetOutlineProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::TextLabel::Property::PIXEL_SIZE:
+ {
+ const float pixelSize = value.Get<float>();
+ DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize);
+
+ if(!Equals(impl.mController->GetDefaultFontSize(Text::Controller::PIXEL_SIZE), pixelSize))
+ {
+ impl.mController->SetDefaultFontSize(pixelSize, Text::Controller::PIXEL_SIZE);
+ }
+ break;
+ }
+ case Toolkit::TextLabel::Property::ELLIPSIS:
+ {
+ const bool ellipsis = value.Get<bool>();
+ DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis);
+
+ impl.mController->SetTextElideEnabled(ellipsis);
+ break;
+ }
+ case Toolkit::TextLabel::Property::LINE_WRAP_MODE:
+ {
+ Text::LineWrap::Mode lineWrapMode(static_cast<Text::LineWrap::Mode>(-1)); // Set to invalid value to ensure a valid mode does get set
+ if(GetLineWrapModeEnumeration(value, lineWrapMode))
+ {
+ DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel %p LineWrap::MODE %d\n", impl.mController.Get(), lineWrapMode);
+ impl.mController->SetLineWrapMode(lineWrapMode);
+ }
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT:
+ {
+ if(impl.mController->GetTextModel())
+ {
+ DevelText::VerticalLineAlignment::Type alignment = static_cast<DevelText::VerticalLineAlignment::Type>(value.Get<int>());
+
+ impl.mController->SetVerticalLineAlignment(alignment);
+
+ // Property doesn't affect the layout, only Visual must be updated
+ TextVisual::EnableRendererUpdate(impl.mVisual);
+
+ // No need to trigger full re-layout. Instead call UpdateRenderer() directly
+ TextVisual::UpdateRenderer(impl.mVisual);
+ }
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::BACKGROUND:
+ {
+ impl.mTextUpdateNeeded = SetBackgroundProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::IGNORE_SPACES_AFTER_TEXT:
+ {
+ impl.mController->SetIgnoreSpacesAfterText(value.Get<bool>());
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
+ {
+ impl.mController->SetMatchLayoutDirection(value.Get<bool>() ? DevelText::MatchLayoutDirection::LOCALE : DevelText::MatchLayoutDirection::CONTENTS);
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::TEXT_FIT:
+ {
+ ParseTextFitProperty(impl.mController, value.GetMap());
+ impl.mController->SetTextFitChanged(true);
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::MIN_LINE_SIZE:
+ {
+ const float lineSize = value.Get<float>();
+ impl.mTextUpdateNeeded = impl.mController->SetDefaultLineSize(lineSize) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::FONT_SIZE_SCALE:
+ {
+ const float scale = value.Get<float>();
+ DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel %p FONT_SIZE_SCALE %f\n", impl.mController.Get(), scale);
+
+ if(!Equals(impl.mController->GetFontSizeScale(), scale))
+ {
+ impl.mController->SetFontSizeScale(scale);
+ }
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::ENABLE_FONT_SIZE_SCALE:
+ {
+ const bool enableFontSizeScale = value.Get<bool>();
+ if(!Equals(impl.mController->IsFontSizeScaleEnabled(), enableFontSizeScale))
+ {
+ impl.mController->SetFontSizeScaleEnabled(enableFontSizeScale);
+ }
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::ELLIPSIS_POSITION:
+ {
+ DevelText::EllipsisPosition::Type ellipsisPositionType(static_cast<DevelText::EllipsisPosition::Type>(-1)); // Set to invalid value to ensure a valid mode does get set
+ if(GetEllipsisPositionTypeEnumeration(value, ellipsisPositionType))
+ {
+ DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel %p EllipsisPosition::Type %d\n", impl.mController.Get(), ellipsisPositionType);
+ impl.mController->SetEllipsisPosition(ellipsisPositionType);
+ }
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::STRIKETHROUGH:
+ {
+ impl.mTextUpdateNeeded = SetStrikethroughProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded;
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::CHARACTER_SPACING:
+ {
+ const float characterSpacing = value.Get<float>();
+ impl.mController->SetCharacterSpacing(characterSpacing);
+ break;
+ }
+ case Toolkit::DevelTextLabel::Property::RELATIVE_LINE_SIZE:
+ {
+ const float relativeLineSize = value.Get<float>();
+ DALI_LOG_INFO(gLogFilter, Debug::Verbose, "TextLabel %p RELATIVE_LINE_SIZE %f\n", impl.mController.Get(), relativeLineSize);
+
+ impl.mController->SetRelativeLineSize(relativeLineSize);
+ break;
+ }
+ }
+
+ // Request relayout when text update is needed. It's necessary to call it
+ // as changing the property not via UI interaction brings no effect if only
+ // the mTextUpdateNeeded is changed.
+ if(impl.mTextUpdateNeeded)
+ {
+ // need to request relayout as size of text may have changed
+ impl.RequestTextRelayout();
+ }