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/symbol_effect_options.h" 26 #include "core/components_ng/pattern/symbol/symbol_source_info.h" 27 #include "core/components_ng/pattern/text/text_styles.h" 28 #include "core/components_ng/property/property.h" 29 #include "core/components_v2/inspector/utils.h" 30 #include "core/components_ng/pattern/symbol/constants.h" 31 32 namespace OHOS::Ace::NG { 33 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(group, name, type, changeFlag) \ 34 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_GET(group, name, type) \ 35 void Update##name(const type& value) \ 36 { \ 37 auto& groupProperty = GetOrCreate##group(); \ 38 if (groupProperty->Check##name(value)) { \ 39 return; \ 40 } \ 41 groupProperty->Update##name(value); \ 42 UpdatePropertyChangeFlag(changeFlag); \ 43 propNeedReCreateParagraph_ = true; \ 44 } 45 46 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(name, type, changeFlag) \ 47 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_GET(name, type) \ 48 public: \ 49 void Update##name(const type& value) \ 50 { \ 51 if (prop##name##_.has_value()) { \ 52 if (NearEqual(prop##name##_.value(), value)) { \ 53 return; \ 54 } \ 55 } \ 56 prop##name##_ = value; \ 57 UpdatePropertyChangeFlag(changeFlag); \ 58 propNeedReCreateParagraph_ = true; \ 59 } 60 61 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(group, groupItem, name, type, changeFlag) \ 62 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM_GET(group, groupItem, name, type) \ 63 void Update##name(const type& value) \ 64 { \ 65 auto& groupProperty = GetOrCreate##group(); \ 66 if (groupProperty->Check##groupItem(value)) { \ 67 return; \ 68 } \ 69 groupProperty->Update##groupItem(value); \ 70 UpdatePropertyChangeFlag(changeFlag); \ 71 propNeedReCreateParagraph_ = true; \ 72 } 73 74 class InspectorFilter; 75 76 struct TextMarqueeOptions { 77 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStart, bool); 78 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStep, double); 79 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeLoop, int32_t); 80 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeDirection, MarqueeDirection); 81 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeDelay, int32_t); 82 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeFadeout, bool); 83 ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStartPolicy, MarqueeStartPolicy); 84 }; 85 86 class ACE_EXPORT TextLayoutProperty : public LayoutProperty { 87 DECLARE_ACE_TYPE(TextLayoutProperty, LayoutProperty); 88 89 public: 90 TextLayoutProperty() = default; 91 92 ~TextLayoutProperty() override = default; 93 Clone()94 RefPtr<LayoutProperty> Clone() const override 95 { 96 auto value = MakeRefPtr<TextLayoutProperty>(); 97 Clone(value); 98 value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this)); 99 value->propSymbolSourceInfo_ = CloneSymbolSourceInfo(); 100 return value; 101 } 102 Reset()103 void Reset() override 104 { 105 LayoutProperty::Reset(); 106 ResetFontStyle(); 107 ResetTextLineStyle(); 108 ResetContent(); 109 ResetSymbolSourceInfo(); 110 ResetAdaptFontSizeStep(); 111 ResetTextMarqueeOptions(); 112 ResetCursorColor(); 113 ResetSelectedBackgroundColor(); 114 ResetTextColorFlagByUser(); 115 } 116 117 void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override; 118 119 void ToJsonValueForOption(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const; 120 121 void FromJson(const std::unique_ptr<JsonValue>& json) override; 122 123 ACE_DEFINE_PROPERTY_GROUP(FontStyle, FontStyle); 124 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE); 125 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 126 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextShadow, std::vector<Shadow>, PROPERTY_UPDATE_MEASURE); 127 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE); 128 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE); 129 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, VariableFontWeight, int32_t, PROPERTY_UPDATE_MEASURE); 130 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE); 131 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE); 132 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecoration, TextDecoration, PROPERTY_UPDATE_MEASURE); 133 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationColor, Color, PROPERTY_UPDATE_MEASURE); 134 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 135 FontStyle, TextDecorationStyle, TextDecorationStyle, PROPERTY_UPDATE_MEASURE); 136 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextCase, TextCase, PROPERTY_UPDATE_MEASURE); 137 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMinFontSize, Dimension, PROPERTY_UPDATE_MEASURE); 138 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMaxFontSize, Dimension, PROPERTY_UPDATE_MEASURE); 139 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, LetterSpacing, Dimension, PROPERTY_UPDATE_MEASURE); 140 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, EnableVariableFontWeight, bool, PROPERTY_UPDATE_MEASURE); 141 ACE_DEFINE_PROPERTY_GROUP(TextLineStyle, TextLineStyle); 142 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineHeight, Dimension, PROPERTY_UPDATE_MEASURE); 143 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineSpacing, Dimension, PROPERTY_UPDATE_MEASURE); 144 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextBaseline, TextBaseline, PROPERTY_UPDATE_MEASURE); 145 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, BaselineOffset, Dimension, PROPERTY_UPDATE_MEASURE); 146 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextAlign, TextAlign, PROPERTY_UPDATE_MEASURE); 147 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextOverflow, TextOverflow, PROPERTY_UPDATE_MEASURE); 148 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, EllipsisMode, EllipsisMode, PROPERTY_UPDATE_MEASURE); 149 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, MaxLines, uint32_t, PROPERTY_UPDATE_MEASURE); 150 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, AllowScale, bool, PROPERTY_UPDATE_MEASURE); 151 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 152 TextLineStyle, HeightAdaptivePolicy, TextHeightAdaptivePolicy, PROPERTY_UPDATE_MEASURE); 153 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextIndent, Dimension, PROPERTY_UPDATE_MEASURE); 154 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, WordBreak, WordBreak, PROPERTY_UPDATE_MEASURE); 155 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 156 TextLineStyle, LineBreakStrategy, LineBreakStrategy, PROPERTY_UPDATE_MEASURE); 157 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, HalfLeading, bool, PROPERTY_UPDATE_MEASURE_SELF); 158 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, ParagraphSpacing, Dimension, PROPERTY_UPDATE_MEASURE_SELF); 159 160 ACE_DEFINE_PROPERTY_GROUP(TextMarqueeOptions, TextMarqueeOptions); 161 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeStart, bool, PROPERTY_UPDATE_RENDER); 162 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeStep, double, PROPERTY_UPDATE_RENDER); 163 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeLoop, int32_t, PROPERTY_UPDATE_RENDER); 164 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 165 TextMarqueeOptions, TextMarqueeDirection, MarqueeDirection, PROPERTY_UPDATE_RENDER); 166 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeDelay, int32_t, PROPERTY_UPDATE_RENDER); 167 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeFadeout, bool, PROPERTY_UPDATE_RENDER); 168 ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP( 169 TextMarqueeOptions, TextMarqueeStartPolicy, MarqueeStartPolicy, PROPERTY_UPDATE_RENDER); 170 171 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(Content, std::u16string, PROPERTY_UPDATE_MEASURE); 172 public: UpdateContent(const std::string & value)173 void UpdateContent(const std::string& value) 174 { 175 UpdateContent(UtfUtils::Str8DebugToStr16(value)); 176 } 177 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CopyOption, CopyOptions, PROPERTY_UPDATE_MEASURE); 178 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(AdaptFontSizeStep, Dimension, PROPERTY_UPDATE_MEASURE_SELF); 179 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CursorColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 180 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectedBackgroundColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 181 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextSelectableMode, TextSelectableMode, PROPERTY_UPDATE_MEASURE_SELF); 182 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsAnimationNeeded, bool, PROPERTY_UPDATE_NORMAL); 183 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlDefualtColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 184 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlHoverColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 185 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlPressedColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 186 187 // placeholder 188 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(Placeholder, std::u16string, PROPERTY_UPDATE_MEASURE); 189 ACE_DEFINE_PROPERTY_GROUP(PlaceholderFontStyle, FontStyle); 190 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM( 191 PlaceholderFontStyle, FontSize, PlaceholderFontSize, Dimension, PROPERTY_UPDATE_MEASURE); 192 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM( 193 PlaceholderFontStyle, TextColor, PlaceholderTextColor, Color, PROPERTY_UPDATE_MEASURE_SELF); 194 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM( 195 PlaceholderFontStyle, ItalicFontStyle, PlaceholderItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE); 196 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM( 197 PlaceholderFontStyle, FontWeight, PlaceholderFontWeight, FontWeight, PROPERTY_UPDATE_MEASURE); 198 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM( 199 PlaceholderFontStyle, FontFamily, PlaceholderFontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE); 200 201 // symbol 202 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(SymbolSourceInfo, SymbolSourceInfo, PROPERTY_UPDATE_MEASURE); 203 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 204 FontStyle, SymbolColorList, std::vector<Color>, PROPERTY_UPDATE_MEASURE_SELF); 205 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 206 FontStyle, SymbolType, SymbolType, PROPERTY_UPDATE_MEASURE_SELF); 207 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 208 FontStyle, SymbolRenderingStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF); 209 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, SymbolEffectStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF); 210 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP( 211 FontStyle, SymbolEffectOptions, SymbolEffectOptions, PROPERTY_UPDATE_MEASURE_SELF); 212 // fontscale 213 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, MinFontScale, float, PROPERTY_UPDATE_MEASURE); 214 ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, MaxFontScale, float, PROPERTY_UPDATE_MEASURE); 215 216 // for XTS inspector InspectorGetTextFont()217 std::string InspectorGetTextFont() const 218 { 219 TextStyle font; 220 if (GetFontFamily().has_value()) { 221 font.SetFontFamilies(GetFontFamily().value()); 222 } 223 if (GetFontSize().has_value()) { 224 font.SetFontSize(GetFontSize().value()); 225 } 226 if (GetItalicFontStyle().has_value()) { 227 font.SetFontStyle(GetItalicFontStyle().value()); 228 } 229 if (GetFontWeight().has_value()) { 230 font.SetFontWeight(GetFontWeight().value()); 231 } 232 return V2::GetTextStyleInJson(font); 233 } 234 std::string GetCopyOptionString() const; 235 UpdateTextColorByRender(const Color & value)236 void UpdateTextColorByRender(const Color &value) 237 { 238 auto& groupProperty = GetOrCreateFontStyle(); 239 if (groupProperty->CheckTextColor(value)) { 240 return; 241 } 242 groupProperty->UpdateTextColor(value); 243 UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER); 244 propNeedReCreateParagraph_ = true; 245 } 246 OnPropertyChangeMeasure()247 void OnPropertyChangeMeasure() override 248 { 249 propNeedReCreateParagraph_ = true; 250 } 251 GetIsLoopAnimation()252 bool GetIsLoopAnimation() const 253 { 254 return isLoopAnimation_; 255 } 256 SetIsLoopAnimation(bool isLoopAnimation)257 void SetIsLoopAnimation(bool isLoopAnimation) 258 { 259 isLoopAnimation_ = isLoopAnimation; 260 } 261 262 // Used to mark whether a paragraph needs to be recreated for Measure. 263 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_GET(NeedReCreateParagraph, bool); 264 265 ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextColorFlagByUser, bool, PROPERTY_UPDATE_NORMAL); 266 267 std::string GetTextMarqueeOptionsString() const; 268 void UpdateMarqueeOptionsFromJson(const std::unique_ptr<JsonValue>& json); 269 270 protected: Clone(RefPtr<LayoutProperty> property)271 void Clone(RefPtr<LayoutProperty> property) const override 272 { 273 auto value = DynamicCast<TextLayoutProperty>(property); 274 value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this)); 275 value->propFontStyle_ = CloneFontStyle(); 276 value->propTextLineStyle_ = CloneTextLineStyle(); 277 value->propContent_ = CloneContent(); 278 value->propAdaptFontSizeStep_ = CloneAdaptFontSizeStep(); 279 value->propTextMarqueeOptions_ = CloneTextMarqueeOptions(); 280 value->propCursorColor_ = CloneCursorColor(); 281 value->propSelectedBackgroundColor_ = CloneSelectedBackgroundColor(); 282 value->propNeedReCreateParagraph_ = true; 283 } 284 285 private: 286 ACE_DISALLOW_COPY_AND_MOVE(TextLayoutProperty); 287 288 bool isLoopAnimation_ = false; 289 }; 290 } // namespace OHOS::Ace::NG 291 292 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H 293