X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-label-impl.cpp;h=52f9c2918aaac601c5e8328d4f7f50d12111b41c;hp=aeb2a5e07c6f68c17a8841f2b33385e23a3e3707;hb=HEAD;hpb=3a21819d16da9366a0c40039a4abe87d8684385c diff --git a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp index aeb2a5e..5af0fe1 100644 --- a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,7 @@ #include #include #include +#include #include #include @@ -70,7 +72,7 @@ const unsigned int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::DevelText::DEFAULT * The alignment depends on the alignment value of the text label (Use Text::VerticalAlignment enumerations). */ const float VERTICAL_ALIGNMENT_TABLE[Text::VerticalAlignment::BOTTOM + 1] = -{ + { 0.0f, // VerticalAlignment::TOP 0.5f, // VerticalAlignment::CENTER 1.0f // VerticalAlignment::BOTTOM @@ -88,7 +90,7 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT #endif const Scripting::StringEnum AUTO_SCROLL_STOP_MODE_TABLE[] = -{ + { {"IMMEDIATE", Toolkit::TextLabel::AutoScrollStopMode::IMMEDIATE}, {"FINISH_LOOP", Toolkit::TextLabel::AutoScrollStopMode::FINISH_LOOP}, }; @@ -143,6 +145,9 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "characterSpacing DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "relativeLineSize", FLOAT, RELATIVE_LINE_SIZE ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "anchorColor", VECTOR4, ANCHOR_COLOR ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "anchorClickedColor", VECTOR4, ANCHOR_CLICKED_COLOR ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "removeFrontInset", BOOLEAN, REMOVE_FRONT_INSET ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "removeBackInset", BOOLEAN, REMOVE_BACK_INSET ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "cutout", BOOLEAN, CUTOUT ) 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) @@ -589,6 +594,31 @@ void TextLabel::SetProperty(BaseObject* object, Property::Index index, const Pro } break; } + case Toolkit::DevelTextLabel::Property::REMOVE_FRONT_INSET: + { + const bool remove = value.Get(); + impl.mController->SetRemoveFrontInset(remove); + break; + } + case Toolkit::DevelTextLabel::Property::REMOVE_BACK_INSET: + { + const bool remove = value.Get(); + impl.mController->SetRemoveBackInset(remove); + break; + } + case Toolkit::DevelTextLabel::Property::CUTOUT: + { + const bool cutout = value.Get(); + + impl.mController->SetTextCutout(cutout); + + // 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; + } } // Request relayout when text update is needed. It's necessary to call it @@ -863,6 +893,21 @@ Property::Value TextLabel::GetProperty(BaseObject* object, Property::Index index value = impl.mController->GetAnchorClickedColor(); break; } + case Toolkit::DevelTextLabel::Property::REMOVE_FRONT_INSET: + { + value = impl.mController->IsRemoveFrontInset(); + break; + } + case Toolkit::DevelTextLabel::Property::REMOVE_BACK_INSET: + { + value = impl.mController->IsRemoveBackInset(); + break; + } + case Toolkit::DevelTextLabel::Property::CUTOUT: + { + value = impl.mController->IsTextCutout(); + break; + } } } @@ -919,7 +964,7 @@ void TextLabel::OnInitialize() propertyMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::TEXT); mVisual = Toolkit::VisualFactory::Get().CreateVisual(propertyMap); - DevelControl::RegisterVisual(*this, Toolkit::TextLabel::Property::TEXT, mVisual); + DevelControl::RegisterVisual(*this, Toolkit::TextLabel::Property::TEXT, mVisual, DepthIndex::CONTENT); TextVisual::SetAnimatableTextColorProperty(mVisual, Toolkit::TextLabel::Property::TEXT_COLOR); @@ -943,6 +988,11 @@ void TextLabel::OnInitialize() self.LayoutDirectionChangedSignal().Connect(this, &TextLabel::OnLayoutDirectionChanged); + if(Dali::Adaptor::IsAvailable()) + { + Dali::Adaptor::Get().LocaleChangedSignal().Connect(this, &TextLabel::OnLocaleChanged); + } + Layout::Engine& engine = mController->GetLayoutEngine(); engine.SetCursorWidth(0u); // Do not layout space for the cursor. @@ -1050,6 +1100,49 @@ void TextLabel::OnPropertySet(Property::Index index, const Property::Value& prop CommonTextUtils::SynchronizeTextAnchorsInParent(Self(), mController, mAnchorActors); break; } + case Toolkit::Control::Property::BACKGROUND: + { + const Vector4 backgroundColor = propertyValue.Get(); + + if(mController->IsTextCutout()) + { + DevelControl::EnableVisual(*this, Toolkit::Control::Property::BACKGROUND, false); + mController->SetBackgroundWithCutoutEnabled(true); + mController->SetBackgroundColorWithCutout(backgroundColor); + } + + break; + } + case Toolkit::DevelTextLabel::Property::CUTOUT: + { + const bool cutoutEnabled = propertyValue.Get(); + + if(cutoutEnabled) + { + Vector4 backgroundColor = Vector4::ZERO; + + const Property::Map backgroundMap = Self().GetProperty(Toolkit::Control::Property::BACKGROUND).Get(); + Property::Value* backgroundValue = backgroundMap.Find(ColorVisual::Property::MIX_COLOR); + if(backgroundValue) + { + backgroundColor = backgroundValue->Get(); + } + + DevelControl::EnableVisual(*this, Toolkit::Control::Property::BACKGROUND, false); + mController->SetBackgroundWithCutoutEnabled(true); + mController->SetBackgroundColorWithCutout(backgroundColor); + } + else + { + DevelControl::EnableVisual(*this, Toolkit::Control::Property::BACKGROUND, true); + + Property::Map backgroundMapSet; + mController->SetBackgroundWithCutoutEnabled(false); + } + + TextVisual::SetRequireRender(mVisual, cutoutEnabled); + break; + } default: { Control::OnPropertySet(index, propertyValue); // up call to control for non-handled properties @@ -1076,10 +1169,13 @@ void TextLabel::OnSceneDisconnection() mLastAutoScrollEnabled = false; } - const Toolkit::TextLabel::AutoScrollStopMode::Type stopMode = mTextScroller->GetStopMode(); - mTextScroller->SetStopMode(Toolkit::TextLabel::AutoScrollStopMode::IMMEDIATE); - mTextScroller->StopScrolling(); - mTextScroller->SetStopMode(stopMode); + if(mTextScroller->IsScrolling()) + { + const Toolkit::TextLabel::AutoScrollStopMode::Type stopMode = mTextScroller->GetStopMode(); + mTextScroller->SetStopMode(Toolkit::TextLabel::AutoScrollStopMode::IMMEDIATE); + mTextScroller->StopScrolling(); + mTextScroller->SetStopMode(stopMode); + } } Control::OnSceneDisconnection(); } @@ -1088,6 +1184,12 @@ void TextLabel::OnRelayout(const Vector2& size, RelayoutContainer& container) { DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel::OnRelayout\n"); + if(mTextScroller && mTextScroller->IsStop()) + { + // When auto scroll is playing, it triggers a relayout only when an update is absolutely necessary. + return; + } + Actor self = Self(); Extents padding; @@ -1156,6 +1258,8 @@ void TextLabel::OnRelayout(const Vector2& size, RelayoutContainer& container) visualTransformOffset.x = roundf(padding.start + alignmentOffset.x); visualTransformOffset.y = roundf(padding.top + alignmentOffset.y); + mController->SetVisualTransformOffset(visualTransformOffset); + Property::Map visualTransform; visualTransform.Add(Toolkit::Visual::Transform::Property::SIZE, layoutSize) .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) @@ -1254,17 +1358,27 @@ void TextLabel::ScrollingFinished() { // Pure Virtual from TextScroller Interface DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel::ScrollingFinished\n"); + mController->SetAutoScrollEnabled(false); + RequestTextRelayout(); +} + +void TextLabel::OnLayoutDirectionChanged(Actor actor, LayoutDirection::Type type) +{ + mController->ChangedLayoutDirection(); +} - if(mController->IsAutoScrollEnabled() || !mController->IsMultiLineEnabled()) +void TextLabel::OnLocaleChanged(std::string locale) +{ + if(mLocale != locale) { - mController->SetAutoScrollEnabled(false); - RequestTextRelayout(); + mLocale = locale; + mController->ResetFontAndStyleData(); } } -void TextLabel::OnLayoutDirectionChanged(Actor actor, LayoutDirection::Type type) +std::string TextLabel::GetLocale() { - mController->ChangedLayoutDirection(); + return mLocale; } void TextLabel::EmitTextFitChangedSignal() @@ -1280,6 +1394,7 @@ void TextLabel::OnAccessibilityStatusChanged() TextLabel::TextLabel(ControlBehaviour additionalBehaviour) : Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT | additionalBehaviour)), + mLocale(std::string()), mRenderingBackend(DEFAULT_RENDERING_BACKEND), mTextUpdateNeeded(false), mLastAutoScrollEnabled(false) @@ -1346,6 +1461,26 @@ bool TextLabel::IsTextFitArrayEnabled() const return mController->IsTextFitArrayEnabled(); } +void TextLabel::SetRemoveFrontInset(bool remove) +{ + mController->SetRemoveFrontInset(remove); +} + +bool TextLabel::IsRemoveFrontInset() const +{ + return mController->IsRemoveFrontInset(); +} + +void TextLabel::SetRemoveBackInset(bool remove) +{ + mController->SetRemoveBackInset(remove); +} + +bool TextLabel::IsRemoveBackInset() const +{ + return mController->IsRemoveBackInset(); +} + std::string TextLabel::TextLabelAccessible::GetNameRaw() const { return GetWholeText();