1 /* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http:www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H 18 19 #include <string> 20 21 #include "base/utils/utf_helper.h" 22 #include "core/components/common/layout/constants.h" 23 #include "core/components/common/properties/color.h" 24 #include "core/components_ng/layout/layout_property.h" 25 #include "core/components_ng/pattern/symbol/constants.h" 26 #include "core/components_ng/pattern/symbol/symbol_effect_options.h" 27 #include "core/components_ng/pattern/symbol/symbol_source_info.h" 28 #include "core/components_ng/pattern/text/text_styles.h" 29 #include "core/components_ng/property/property.h" 30 #include "core/components_v2/inspector/utils.h" 31 #include "frameworks/core/components_ng/pattern/text/advanced_text_layout_property.h" 32 33 namespace OHOS::Ace::NG { 34 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(group, name, type, changeFlag) \ 35 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_GET(group, name, type) \ 36 void Update##name(const type& value) \ 37 { \ 38 auto& groupProperty = GetOrCreate##group(); \ 39 if (groupProperty->Check##name(value)) { \ 40 return; \ 41 } \ 42 groupProperty->Update##name(value); \ 43 UpdatePropertyChangeFlag(changeFlag); \ 44 propNeedReCreateParagraph_ = true; \ 45 } 46 47 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(name, type, changeFlag) \ 48 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_GET(name, type) \ 49 public: \ 50 void Update##name(const type& value) \ 51 { \ 52 if (prop##name##_.has_value()) { \ 53 if (NearEqual(prop##name##_.value(), value)) { \ 54 return; \ 55 } \ 56 } \ 57 prop##name##_ = value; \ 58 UpdatePropertyChangeFlag(changeFlag); \ 59 propNeedReCreateParagraph_ = true; \ 60 } 61 62 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_IN_ADVANCE_PROPS(name, type, changeFlag) \ 63 public: \ 64 std::optional<type> Get##name() const \ 65 { \ 66 CHECK_NULL_RETURN(advancedTextLayoutProperty_, std::nullopt); \ 67 return advancedTextLayoutProperty_->Get##name(); \ 68 } \ 69 bool Has##name() const \ 70 { \ 71 CHECK_NULL_RETURN(advancedTextLayoutProperty_, false); \ 72 return advancedTextLayoutProperty_->Get##name().has_value(); \ 73 } \ 74 const type& Get##name##Value() const \ 75 { \ 76 return advancedTextLayoutProperty_->Get##name().value(); \ 77 } \ 78 const type& Get##name##Value(const type& defaultValue) const \ 79 { \ 80 if (!Has##name()) { \ 81 return defaultValue; \ 82 } \ 83 return advancedTextLayoutProperty_->Get##name().value(); \ 84 } \ 85 std::optional<type> Clone##name() const \ 86 { \ 87 CHECK_NULL_RETURN(advancedTextLayoutProperty_, std::nullopt); \ 88 return advancedTextLayoutProperty_->Get##name(); \ 89 } \ 90 void Reset##name() \ 91 { \ 92 CHECK_NULL_VOID(advancedTextLayoutProperty_); \ 93 return advancedTextLayoutProperty_->Reset##name(); \ 94 } \ 95 void Update##name(const type& value) \ 96 { \ 97 if (!advancedTextLayoutProperty_) { \ 98 advancedTextLayoutProperty_ = AceType::MakeRefPtr<AdvancedTextLayoutProperty>(); \ 99 } \ 100 CHECK_NULL_VOID(advancedTextLayoutProperty_); \ 101 if (Has##name()) { \ 102 if (NearEqual(Get##name##Value(), value)) { \ 103 return; \ 104 } \ 105 } \ 106 advancedTextLayoutProperty_->Set##name(value); \ 107 UpdatePropertyChangeFlag(changeFlag); \ 108 propNeedReCreateParagraph_ = true; \ 109 } 110 111 class InspectorFilter; 112 113 struct TextMarqueeOptions { 114 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStart, bool); 115 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStep, double); 116 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeLoop, int32_t); 117 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeDirection, MarqueeDirection); 118 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeDelay, int32_t); 119 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeFadeout, bool); 120 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStartPolicy, MarqueeStartPolicy); 121 }; 122 123 class ACE_EXPORT TextLayoutProperty : public LayoutProperty { 124 DECLARE_ACE_TYPE(TextLayoutProperty, LayoutProperty); 125 126 public: 127 TextLayoutProperty() = default; 128 129 ~TextLayoutProperty() override = default; 130 Clone()131 RefPtr<LayoutProperty> Clone() const override 132 { 133 auto value = MakeRefPtr<TextLayoutProperty>(); 134 Clone(value); 135 value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this)); 136 value->propSymbolSourceInfo_ = CloneSymbolSourceInfo(); 137 return value; 138 } 139 Reset()140 void Reset() override 141 { 142 LayoutProperty::Reset(); 143 ResetFontStyle(); 144 ResetTextLineStyle(); 145 ResetContent(); 146 ResetSymbolSourceInfo(); 147 ResetAdaptFontSizeStep(); 148 ResetTextMarqueeOptions(); 149 ResetCursorColor(); 150 ResetSelectedBackgroundColor(); 151 ResetTextColorFlagByUser(); 152 propNeedReCreateParagraph_ = true; 153 } 154 155 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override; 156 157 void FromJson(const std::unique_ptr<JsonValue>& json) override; 158 159 ACE_DEFINE_PROPERTY_GROUP(FontStyle, FontStyle); 160 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE); 161 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 162 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextShadow, std::vector<Shadow>, PROPERTY_UPDATE_MEASURE); 163 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE); 164 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE); 165 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, VariableFontWeight, int32_t, PROPERTY_UPDATE_MEASURE); 166 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE); 167 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE); 168 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 169 FontStyle, TextDecoration, std::vector<TextDecoration>, PROPERTY_UPDATE_MEASURE); 170 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationColor, Color, PROPERTY_UPDATE_MEASURE); 171 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationStyle, TextDecorationStyle, PROPERTY_UPDATE_MEASURE); 172 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextCase, TextCase, PROPERTY_UPDATE_MEASURE); 173 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMinFontSize, Dimension, PROPERTY_UPDATE_MEASURE); 174 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMaxFontSize, Dimension, PROPERTY_UPDATE_MEASURE); 175 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, LetterSpacing, Dimension, PROPERTY_UPDATE_MEASURE); 176 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, EnableVariableFontWeight, bool, PROPERTY_UPDATE_MEASURE); 177 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, LineThicknessScale, float, PROPERTY_UPDATE_MEASURE); 178 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP( 179 FontForegroudGradiantColor, FontForegroudGradiantColor, PROPERTY_UPDATE_MEASURE); 180 ACE_DEFINE_PROPERTY_GROUP(TextLineStyle, TextLineStyle); 181 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineHeight, Dimension, PROPERTY_UPDATE_MEASURE); 182 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineSpacing, Dimension, PROPERTY_UPDATE_MEASURE); 183 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, IsOnlyBetweenLines, bool, PROPERTY_UPDATE_MEASURE); 184 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, OptimizeTrailingSpace, bool, PROPERTY_UPDATE_MEASURE); 185 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextBaseline, TextBaseline, PROPERTY_UPDATE_MEASURE); 186 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, BaselineOffset, Dimension, PROPERTY_UPDATE_MEASURE); 187 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextAlign, TextAlign, PROPERTY_UPDATE_MEASURE); 188 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextVerticalAlign, TextVerticalAlign, PROPERTY_UPDATE_MEASURE); 189 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextOverflow, TextOverflow, PROPERTY_UPDATE_MEASURE); 190 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, EllipsisMode, EllipsisMode, PROPERTY_UPDATE_MEASURE); 191 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, MaxLines, uint32_t, PROPERTY_UPDATE_MEASURE); 192 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, AllowScale, bool, PROPERTY_UPDATE_MEASURE); 193 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 194 TextLineStyle, HeightAdaptivePolicy, TextHeightAdaptivePolicy, PROPERTY_UPDATE_MEASURE); 195 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextIndent, Dimension, PROPERTY_UPDATE_MEASURE); 196 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, WordBreak, WordBreak, PROPERTY_UPDATE_MEASURE); 197 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineBreakStrategy, LineBreakStrategy, PROPERTY_UPDATE_MEASURE); 198 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, HalfLeading, bool, PROPERTY_UPDATE_MEASURE_SELF); 199 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, ParagraphSpacing, Dimension, PROPERTY_UPDATE_MEASURE_SELF); 200 201 ACE_DEFINE_PROPERTY_GROUP(TextMarqueeOptions, TextMarqueeOptions); 202 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeStart, bool, PROPERTY_UPDATE_RENDER); 203 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeStep, double, PROPERTY_UPDATE_RENDER); 204 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeLoop, int32_t, PROPERTY_UPDATE_RENDER); 205 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 206 TextMarqueeOptions, TextMarqueeDirection, MarqueeDirection, PROPERTY_UPDATE_RENDER); 207 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeDelay, int32_t, PROPERTY_UPDATE_RENDER); 208 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeFadeout, bool, PROPERTY_UPDATE_RENDER); 209 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 210 TextMarqueeOptions, TextMarqueeStartPolicy, MarqueeStartPolicy, PROPERTY_UPDATE_RENDER); 211 212 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(EnableAutoSpacing, bool, PROPERTY_UPDATE_MEASURE); 213 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(Content, std::u16string, PROPERTY_UPDATE_MEASURE); 214 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(ColorShaderStyle, Color, PROPERTY_UPDATE_MEASURE); 215 216 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(TextEffectStrategy, TextEffectStrategy, PROPERTY_UPDATE_MEASURE_SELF); 217 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextFlipDirection, TextFlipDirection, PROPERTY_UPDATE_NORMAL); 218 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextFlipEnableBlur, bool, PROPERTY_UPDATE_NORMAL); 219 ACE_DEFINE_TEXT_PROPERTY_ITEM_IN_ADVANCE_PROPS(GradientShaderStyle, Gradient, PROPERTY_UPDATE_MEASURE); 220 221 public: UpdateContent(const std::string & value)222 void UpdateContent(const std::string& value) 223 { 224 UpdateContent(UtfUtils::Str8DebugToStr16(value)); 225 } 226 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CopyOption, CopyOptions, PROPERTY_UPDATE_MEASURE); 227 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(AdaptFontSizeStep, Dimension, PROPERTY_UPDATE_MEASURE_SELF); 228 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CursorColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 229 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectedBackgroundColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 230 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextSelectableMode, TextSelectableMode, PROPERTY_UPDATE_MEASURE_SELF); 231 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsAnimationNeeded, bool, PROPERTY_UPDATE_NORMAL); 232 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlDefualtColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 233 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlHoverColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 234 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlPressedColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 235 236 // symbol 237 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(SymbolSourceInfo, SymbolSourceInfo, PROPERTY_UPDATE_MEASURE); 238 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 239 FontStyle, SymbolColorList, std::vector<Color>, PROPERTY_UPDATE_MEASURE_SELF); 240 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 241 FontStyle, SymbolType, SymbolType, PROPERTY_UPDATE_MEASURE_SELF); 242 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 243 FontStyle, SymbolRenderingStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF); 244 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, SymbolEffectStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF); 245 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 246 FontStyle, SymbolEffectOptions, SymbolEffectOptions, PROPERTY_UPDATE_MEASURE_SELF); 247 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SymbolShadow, SymbolShadow, PROPERTY_UPDATE_MEASURE_SELF); 248 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShaderStyle, std::vector<SymbolGradient>, PROPERTY_UPDATE_MEASURE_SELF); 249 250 // fontscale 251 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, MinFontScale, float, PROPERTY_UPDATE_MEASURE); 252 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, MaxFontScale, float, PROPERTY_UPDATE_MEASURE); 253 GetTextDecorationFirst()254 TextDecoration GetTextDecorationFirst() const 255 { 256 auto decorations = GetTextDecoration(); 257 if (!decorations.has_value()) { 258 return TextDecoration::NONE; 259 } 260 return decorations.value().size() > 0 ? 261 decorations.value()[0] : TextDecoration::NONE; 262 } 263 264 // for XTS inspector InspectorGetTextFont()265 std::string InspectorGetTextFont() const 266 { 267 TextStyle font; 268 if (GetFontFamily().has_value()) { 269 font.SetFontFamilies(GetFontFamily().value()); 270 } 271 if (GetFontSize().has_value()) { 272 font.SetFontSize(GetFontSize().value()); 273 } 274 if (GetItalicFontStyle().has_value()) { 275 font.SetFontStyle(GetItalicFontStyle().value()); 276 } 277 if (GetFontWeight().has_value()) { 278 font.SetFontWeight(GetFontWeight().value()); 279 } 280 return V2::GetTextStyleInJson(font); 281 } 282 std::string GetCopyOptionString() const; 283 UpdateTextColorByRender(const Color & value)284 void UpdateTextColorByRender(const Color &value) 285 { 286 auto& groupProperty = GetOrCreateFontStyle(); 287 if (groupProperty->CheckTextColor(value)) { 288 return; 289 } 290 groupProperty->UpdateTextColor(value); 291 UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER); 292 } 293 OnPropertyChangeMeasure()294 void OnPropertyChangeMeasure() override 295 { 296 propNeedReCreateParagraph_ = true; 297 } 298 GetIsLoopAnimation()299 bool GetIsLoopAnimation() const 300 { 301 return isLoopAnimation_; 302 } 303 SetIsLoopAnimation(bool isLoopAnimation)304 void SetIsLoopAnimation(bool isLoopAnimation) 305 { 306 isLoopAnimation_ = isLoopAnimation; 307 } 308 309 // Used to mark whether a paragraph needs to be recreated for Measure. 310 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_GET(NeedReCreateParagraph, bool); 311 312 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextColorFlagByUser, bool, PROPERTY_UPDATE_NORMAL); 313 314 std::string GetTextMarqueeOptionsString() const; 315 void UpdateMarqueeOptionsFromJson(const std::unique_ptr<JsonValue>& json); 316 317 protected: Clone(RefPtr<LayoutProperty> property)318 void Clone(RefPtr<LayoutProperty> property) const override 319 { 320 auto value = DynamicCast<TextLayoutProperty>(property); 321 value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this)); 322 value->propFontStyle_ = CloneFontStyle(); 323 value->propTextLineStyle_ = CloneTextLineStyle(); 324 value->propContent_ = CloneContent(); 325 value->propAdaptFontSizeStep_ = CloneAdaptFontSizeStep(); 326 value->propTextMarqueeOptions_ = CloneTextMarqueeOptions(); 327 value->propCursorColor_ = CloneCursorColor(); 328 value->propSelectedBackgroundColor_ = CloneSelectedBackgroundColor(); 329 value->propNeedReCreateParagraph_ = true; 330 } 331 332 private: 333 ACE_DISALLOW_COPY_AND_MOVE(TextLayoutProperty); 334 335 bool isLoopAnimation_ = false; 336 RefPtr<AdvancedTextLayoutProperty> advancedTextLayoutProperty_; 337 }; 338 } // namespace OHOS::Ace::NG 339 340 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H 341