1 /*
2 * Copyright (c) 2022 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 #include "core/components_ng/pattern/text/span_model_ng.h"
17
18 #include "base/geometry/dimension.h"
19 #include "core/components/common/layout/constants.h"
20 #include "core/components/common/properties/alignment.h"
21 #include "core/components/common/properties/text_style.h"
22 #include "core/components_ng/base/frame_node.h"
23 #include "core/components_ng/base/view_stack_processor.h"
24 #include "core/components_ng/pattern/text/span_node.h"
25 #include "core/components_ng/pattern/text/text_pattern.h"
26 #include "core/components_v2/inspector/inspector_constants.h"
27
28 #define ACE_UPDATE_SPAN_PROPERTY(name, value, flag) \
29 do { \
30 auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode()); \
31 CHECK_NULL_VOID(spanNode); \
32 spanNode->Update##name(value); \
33 spanNode->AddPropertyInfo(flag); \
34 } while (false)
35 #define ACE_UPDATE_NODE_SPAN_PROPERTY(name, value, flag, frameNode) \
36 do { \
37 auto spanNode = AceType::DynamicCast<SpanNode>(frameNode); \
38 CHECK_NULL_VOID(spanNode); \
39 spanNode->Update##name(value); \
40 spanNode->AddPropertyInfo(flag); \
41 } while (false)
42 #define ACE_RESET_NODE_SPAN_PROPERTY(name, flag, frameNode) \
43 do { \
44 auto spanNode = AceType::DynamicCast<SpanNode>(frameNode); \
45 CHECK_NULL_VOID(spanNode); \
46 if (spanNode->Has##name()) { \
47 spanNode->MarkTextDirty(); \
48 } \
49 spanNode->Reset##name(); \
50 spanNode->ResetPropertyInfo(flag); \
51 } while (false)
52 namespace OHOS::Ace::NG {
53
Create(const std::string & content)54 void SpanModelNG::Create(const std::string& content)
55 {
56 auto* stack = ViewStackProcessor::GetInstance();
57 auto nodeId = stack->ClaimNodeId();
58 auto spanNode = SpanNode::GetOrCreateSpanNode(nodeId);
59 stack->Push(spanNode);
60
61 ACE_UPDATE_SPAN_PROPERTY(Content, content, PropertyInfo::NONE);
62 }
63
CreateSpanNode(int32_t nodeId,const std::string & content)64 RefPtr<SpanNode> SpanModelNG::CreateSpanNode(int32_t nodeId, const std::string& content)
65 {
66 auto spanNode = SpanNode::CreateSpanNode(nodeId);
67 CHECK_NULL_RETURN(spanNode, nullptr);
68 spanNode->UpdateContent(content);
69 spanNode->AddPropertyInfo(PropertyInfo::NONE);
70 return spanNode;
71 }
72
SetFont(const Font & value)73 void SpanModelNG::SetFont(const Font& value)
74 {
75 if (value.fontSize.has_value()) {
76 SetFontSize(value.fontSize.value());
77 }
78 if (value.fontWeight.has_value()) {
79 SetFontWeight(value.fontWeight.value());
80 }
81 if (!value.fontFamilies.empty()) {
82 SetFontFamily(value.fontFamilies);
83 }
84 if (value.fontStyle.has_value()) {
85 SetItalicFontStyle(value.fontStyle.value());
86 }
87 }
88
SetFontSize(const Dimension & value)89 void SpanModelNG::SetFontSize(const Dimension& value)
90 {
91 ACE_UPDATE_SPAN_PROPERTY(FontSize, value, PropertyInfo::FONTSIZE);
92 }
93
SetTextColor(const Color & value)94 void SpanModelNG::SetTextColor(const Color& value)
95 {
96 auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
97 CHECK_NULL_VOID(spanNode);
98 spanNode->UpdateSpanTextColor(value);
99 spanNode->AddPropertyInfo(PropertyInfo::FONTCOLOR);
100 }
101
SetItalicFontStyle(Ace::FontStyle value)102 void SpanModelNG::SetItalicFontStyle(Ace::FontStyle value)
103 {
104 ACE_UPDATE_SPAN_PROPERTY(ItalicFontStyle, value, PropertyInfo::FONTSTYLE);
105 }
106
SetFontWeight(Ace::FontWeight value)107 void SpanModelNG::SetFontWeight(Ace::FontWeight value)
108 {
109 ACE_UPDATE_SPAN_PROPERTY(FontWeight, value, PropertyInfo::FONTWEIGHT);
110 auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
111 CHECK_NULL_VOID(spanNode);
112 spanNode->UpdateUserFontWeight(true);
113 }
114
SetFontFamily(const std::vector<std::string> & value)115 void SpanModelNG::SetFontFamily(const std::vector<std::string>& value)
116 {
117 ACE_UPDATE_SPAN_PROPERTY(FontFamily, value, PropertyInfo::FONTFAMILY);
118 }
119
SetTextDecoration(Ace::TextDecoration value)120 void SpanModelNG::SetTextDecoration(Ace::TextDecoration value)
121 {
122 ACE_UPDATE_SPAN_PROPERTY(TextDecoration, value, PropertyInfo::TEXTDECORATION);
123 }
124
SetTextDecorationStyle(Ace::TextDecorationStyle value)125 void SpanModelNG::SetTextDecorationStyle(Ace::TextDecorationStyle value)
126 {
127 ACE_UPDATE_SPAN_PROPERTY(TextDecorationStyle, value, PropertyInfo::NONE);
128 }
129
SetTextDecorationColor(const Color & value)130 void SpanModelNG::SetTextDecorationColor(const Color& value)
131 {
132 ACE_UPDATE_SPAN_PROPERTY(TextDecorationColor, value, PropertyInfo::NONE);
133 }
134
SetTextCase(Ace::TextCase value)135 void SpanModelNG::SetTextCase(Ace::TextCase value)
136 {
137 ACE_UPDATE_SPAN_PROPERTY(TextCase, value, PropertyInfo::TEXTCASE);
138 }
139
SetTextShadow(const std::vector<Shadow> & value)140 void SpanModelNG::SetTextShadow(const std::vector<Shadow>& value)
141 {
142 ACE_UPDATE_SPAN_PROPERTY(TextShadow, value, PropertyInfo::TEXTSHADOW);
143 }
144
SetTextShadow(UINode * uiNode,const std::vector<Shadow> & value)145 void SpanModelNG::SetTextShadow(UINode* uiNode, const std::vector<Shadow>& value)
146 {
147 ACE_UPDATE_NODE_SPAN_PROPERTY(TextShadow, value, PropertyInfo::TEXTSHADOW, uiNode);
148 }
149
ResetTextShadow(UINode * uiNode)150 void SpanModelNG::ResetTextShadow(UINode *uiNode)
151 {
152 ACE_RESET_NODE_SPAN_PROPERTY(TextShadow, PropertyInfo::TEXTSHADOW, uiNode);
153 }
154
SetLetterSpacing(const Dimension & value)155 void SpanModelNG::SetLetterSpacing(const Dimension& value)
156 {
157 ACE_UPDATE_SPAN_PROPERTY(LetterSpacing, value, PropertyInfo::LETTERSPACE);
158 }
159
SetBaselineOffset(const Dimension & value)160 void SpanModelNG::SetBaselineOffset(const Dimension& value)
161 {
162 ACE_UPDATE_SPAN_PROPERTY(BaselineOffset, value, PropertyInfo::BASELINE_OFFSET);
163 }
164
SetLineHeight(const Dimension & value)165 void SpanModelNG::SetLineHeight(const Dimension& value)
166 {
167 ACE_UPDATE_SPAN_PROPERTY(LineHeight, value, PropertyInfo::LINEHEIGHT);
168 }
169
SetOnClick(std::function<void (BaseEventInfo * info)> && click)170 void SpanModelNG::SetOnClick(std::function<void(BaseEventInfo* info)>&& click)
171 {
172 auto clickFunc = [func = std::move(click)](GestureEvent& info) { func(&info); };
173 ACE_UPDATE_SPAN_PROPERTY(OnClickEvent, std::move(clickFunc), PropertyInfo::NONE);
174 }
175
SetOnClick(UINode * uiNode,GestureEventFunc && click)176 void SpanModelNG::SetOnClick(UINode* uiNode, GestureEventFunc&& click)
177 {
178 ACE_UPDATE_NODE_SPAN_PROPERTY(OnClickEvent, std::move(click), PropertyInfo::NONE, uiNode);
179 }
180
ClearOnClick()181 void SpanModelNG::ClearOnClick()
182 {
183 ACE_UPDATE_SPAN_PROPERTY(OnClickEvent, nullptr, PropertyInfo::NONE);
184 }
185
ClearOnClick(UINode * uiNode)186 void SpanModelNG::ClearOnClick(UINode* uiNode)
187 {
188 ACE_UPDATE_NODE_SPAN_PROPERTY(OnClickEvent, nullptr, PropertyInfo::NONE, uiNode);
189 }
190
SetAccessibilityText(const std::string & text)191 void SpanModelNG::SetAccessibilityText(const std::string& text)
192 {
193 auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
194 CHECK_NULL_VOID(spanNode);
195 auto spanItem = spanNode->GetSpanItem();
196 CHECK_NULL_VOID(spanItem);
197 CHECK_NULL_VOID(spanItem->accessibilityProperty);
198 spanItem->accessibilityProperty->SetAccessibilityText(text);
199 }
200
SetAccessibilityDescription(const std::string & description)201 void SpanModelNG::SetAccessibilityDescription(const std::string& description)
202 {
203 auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
204 CHECK_NULL_VOID(spanNode);
205 auto spanItem = spanNode->GetSpanItem();
206 CHECK_NULL_VOID(spanItem);
207 CHECK_NULL_VOID(spanItem->accessibilityProperty);
208 spanItem->accessibilityProperty->SetAccessibilityDescription(description);
209 }
210
SetAccessibilityImportance(const std::string & importance)211 void SpanModelNG::SetAccessibilityImportance(const std::string& importance)
212 {
213 auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
214 CHECK_NULL_VOID(spanNode);
215 auto spanItem = spanNode->GetSpanItem();
216 CHECK_NULL_VOID(spanItem);
217 CHECK_NULL_VOID(spanItem->accessibilityProperty);
218 spanItem->accessibilityProperty->SetAccessibilityLevel(importance);
219 }
220
InitSpan(UINode * uiNode,const std::string & content)221 void SpanModelNG::InitSpan(UINode* uiNode, const std::string& content)
222 {
223 ACE_UPDATE_NODE_SPAN_PROPERTY(Content, content, PropertyInfo::NONE, uiNode);
224 }
225
SetFontWeight(UINode * uiNode,FontWeight value)226 void SpanModelNG::SetFontWeight(UINode* uiNode, FontWeight value)
227 {
228 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
229 CHECK_NULL_VOID(spanNode);
230 spanNode->UpdateFontWeight(value);
231 spanNode->AddPropertyInfo(PropertyInfo::FONTWEIGHT);
232 spanNode->UpdateUserFontWeight(true);
233 }
234
ResetFontWeight(UINode * uiNode)235 void SpanModelNG::ResetFontWeight(UINode *uiNode)
236 {
237 ACE_RESET_NODE_SPAN_PROPERTY(FontWeight, PropertyInfo::FONTWEIGHT, uiNode);
238 }
239
SetTextCase(UINode * uiNode,TextCase value)240 void SpanModelNG::SetTextCase(UINode* uiNode, TextCase value)
241 {
242 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
243 CHECK_NULL_VOID(spanNode);
244 spanNode->UpdateTextCase(value);
245 spanNode->AddPropertyInfo(PropertyInfo::TEXTCASE);
246 }
247
ResetTextCase(UINode * uiNode)248 void SpanModelNG::ResetTextCase(UINode *uiNode)
249 {
250 ACE_RESET_NODE_SPAN_PROPERTY(TextCase, PropertyInfo::TEXTCASE, uiNode);
251 }
252
SetItalicFontStyle(UINode * uiNode,Ace::FontStyle value)253 void SpanModelNG::SetItalicFontStyle(UINode* uiNode, Ace::FontStyle value)
254 {
255 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
256 CHECK_NULL_VOID(spanNode);
257 spanNode->UpdateItalicFontStyle(value);
258 spanNode->AddPropertyInfo(PropertyInfo::FONTSTYLE);
259 }
260
ResetItalicFontStyle(UINode * uiNode)261 void SpanModelNG::ResetItalicFontStyle(UINode *uiNode)
262 {
263 ACE_RESET_NODE_SPAN_PROPERTY(ItalicFontStyle, PropertyInfo::FONTSTYLE, uiNode);
264 }
265
SetLineHeight(UINode * uiNode,const Dimension & value)266 void SpanModelNG::SetLineHeight(UINode* uiNode, const Dimension& value)
267 {
268 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
269 CHECK_NULL_VOID(spanNode);
270 spanNode->UpdateLineHeight(value);
271 spanNode->AddPropertyInfo(PropertyInfo::LINEHEIGHT);
272 }
273
ResetLineHeight(UINode * uiNode)274 void SpanModelNG::ResetLineHeight(UINode* uiNode)
275 {
276 ACE_RESET_NODE_SPAN_PROPERTY(LineHeight, PropertyInfo::LINEHEIGHT, uiNode);
277 }
278
SetFontSize(UINode * uiNode,const Dimension & value)279 void SpanModelNG::SetFontSize(UINode* uiNode, const Dimension& value)
280 {
281 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
282 CHECK_NULL_VOID(spanNode);
283 spanNode->UpdateFontSize(value);
284 spanNode->AddPropertyInfo(PropertyInfo::FONTSIZE);
285 }
286
ResetFontSize(UINode * uiNode)287 void SpanModelNG::ResetFontSize(UINode *uiNode)
288 {
289 ACE_RESET_NODE_SPAN_PROPERTY(FontSize, PropertyInfo::FONTSIZE, uiNode);
290 }
291
SetFontFamily(UINode * uiNode,const std::vector<std::string> & value)292 void SpanModelNG::SetFontFamily(UINode* uiNode, const std::vector<std::string>& value)
293 {
294 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
295 CHECK_NULL_VOID(spanNode);
296 spanNode->UpdateFontFamily(value);
297 spanNode->AddPropertyInfo(PropertyInfo::FONTFAMILY);
298 }
299
ResetFontFamily(UINode * uiNode)300 void SpanModelNG::ResetFontFamily(UINode *uiNode)
301 {
302 ACE_RESET_NODE_SPAN_PROPERTY(FontFamily, PropertyInfo::FONTFAMILY, uiNode);
303 }
304
SetTextDecoration(UINode * uiNode,TextDecoration value)305 void SpanModelNG::SetTextDecoration(UINode* uiNode, TextDecoration value)
306 {
307 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
308 CHECK_NULL_VOID(spanNode);
309 spanNode->UpdateTextDecoration(value);
310 spanNode->AddPropertyInfo(PropertyInfo::TEXTDECORATION);
311 }
312
ResetTextDecoration(UINode * uiNode)313 void SpanModelNG::ResetTextDecoration(UINode *uiNode)
314 {
315 ACE_RESET_NODE_SPAN_PROPERTY(TextDecoration, PropertyInfo::TEXTDECORATION, uiNode);
316 }
317
SetTextDecorationStyle(UINode * uiNode,TextDecorationStyle value)318 void SpanModelNG::SetTextDecorationStyle(UINode* uiNode, TextDecorationStyle value)
319 {
320 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
321 CHECK_NULL_VOID(spanNode);
322 spanNode->UpdateTextDecorationStyle(value);
323 spanNode->AddPropertyInfo(PropertyInfo::NONE);
324 }
325
ResetTextDecorationStyle(UINode * uiNode)326 void SpanModelNG::ResetTextDecorationStyle(UINode *uiNode)
327 {
328 ACE_RESET_NODE_SPAN_PROPERTY(TextDecorationStyle, PropertyInfo::NONE, uiNode);
329 }
330
SetTextDecorationColor(UINode * uiNode,const Color & value)331 void SpanModelNG::SetTextDecorationColor(UINode* uiNode, const Color& value)
332 {
333 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
334 CHECK_NULL_VOID(spanNode);
335 spanNode->UpdateTextDecorationColor(value);
336 spanNode->AddPropertyInfo(PropertyInfo::NONE);
337 }
338
ResetTextDecorationColor(UINode * uiNode)339 void SpanModelNG::ResetTextDecorationColor(UINode *uiNode)
340 {
341 ACE_RESET_NODE_SPAN_PROPERTY(TextDecorationColor, PropertyInfo::NONE, uiNode);
342 }
343
SetTextColor(UINode * uiNode,const Color & value)344 void SpanModelNG::SetTextColor(UINode* uiNode, const Color& value)
345 {
346 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
347 CHECK_NULL_VOID(spanNode);
348 spanNode->UpdateSpanTextColor(value);
349 spanNode->AddPropertyInfo(PropertyInfo::FONTCOLOR);
350 }
351
ResetTextColor(UINode * uiNode)352 void SpanModelNG::ResetTextColor(UINode *uiNode)
353 {
354 ACE_RESET_NODE_SPAN_PROPERTY(TextColor, PropertyInfo::FONTCOLOR, uiNode);
355 }
356
SetLetterSpacing(UINode * uiNode,const Dimension & value)357 void SpanModelNG::SetLetterSpacing(UINode* uiNode, const Dimension& value)
358 {
359 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
360 CHECK_NULL_VOID(spanNode);
361 spanNode->UpdateLetterSpacing(value);
362 spanNode->AddPropertyInfo(PropertyInfo::LETTERSPACE);
363 }
364
ResetLetterSpacing(UINode * uiNode)365 void SpanModelNG::ResetLetterSpacing(UINode *uiNode)
366 {
367 ACE_RESET_NODE_SPAN_PROPERTY(LetterSpacing, PropertyInfo::LETTERSPACE, uiNode);
368 }
369
SetBaselineOffset(UINode * uiNode,const Dimension & value)370 void SpanModelNG::SetBaselineOffset(UINode* uiNode, const Dimension& value)
371 {
372 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
373 CHECK_NULL_VOID(spanNode);
374 spanNode->UpdateBaselineOffset(value);
375 spanNode->AddPropertyInfo(PropertyInfo::BASELINE_OFFSET);
376 }
377
SetFont(UINode * uiNode,const Font & value)378 void SpanModelNG::SetFont(UINode* uiNode, const Font& value)
379 {
380 if (value.fontSize.has_value()) {
381 SetFontSize(uiNode, value.fontSize.value());
382 }
383 if (value.fontWeight.has_value()) {
384 SetFontWeight(uiNode, value.fontWeight.value());
385 }
386 if (!value.fontFamilies.empty()) {
387 SetFontFamily(uiNode, value.fontFamilies);
388 }
389 if (value.fontStyle.has_value()) {
390 SetItalicFontStyle(uiNode, value.fontStyle.value());
391 }
392 }
393
ResetFont(UINode * uiNode)394 void SpanModelNG::ResetFont(UINode *uiNode)
395 {
396 ResetFontSize(uiNode);
397 ResetFontWeight(uiNode);
398 ResetFontFamily(uiNode);
399 ResetItalicFontStyle(uiNode);
400 }
401
CreateContainSpan()402 void SpanModelNG::CreateContainSpan()
403 {
404 auto* stack = ViewStackProcessor::GetInstance();
405 auto nodeId = stack->ClaimNodeId();
406 auto spanNode = ContainerSpanNode::GetOrCreateSpanNode(nodeId);
407 stack->Push(spanNode);
408 }
409
SetTextBackgroundStyle(const TextBackgroundStyle & style)410 void SpanModelNG::SetTextBackgroundStyle(const TextBackgroundStyle& style)
411 {
412 auto baseSpan = AceType::DynamicCast<BaseSpan>(ViewStackProcessor::GetInstance()->GetMainElementNode());
413 CHECK_NULL_VOID(baseSpan);
414 baseSpan->SetTextBackgroundStyle(style);
415 }
416
SetTextBackgroundStyle(UINode * uiNode,const TextBackgroundStyle & style)417 void SpanModelNG::SetTextBackgroundStyle(UINode* uiNode, const TextBackgroundStyle& style)
418 {
419 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
420 CHECK_NULL_VOID(spanNode);
421 spanNode->SetTextBackgroundStyle(style);
422 }
423
SetTextBackgroundStyleByBaseSpan(UINode * uiNode,const TextBackgroundStyle & style)424 void SpanModelNG::SetTextBackgroundStyleByBaseSpan(UINode* uiNode, const TextBackgroundStyle& style)
425 {
426 auto spanNode = AceType::DynamicCast<BaseSpan>(uiNode);
427 CHECK_NULL_VOID(spanNode);
428 spanNode->SetTextBackgroundStyle(style);
429 }
430
GetContent(UINode * uiNode)431 std::string SpanModelNG::GetContent(UINode* uiNode)
432 {
433 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
434 CHECK_NULL_RETURN(spanNode, "");
435 auto spanItem = spanNode->GetSpanItem();
436 CHECK_NULL_RETURN(spanItem, "");
437 return spanItem->GetSpanContent();
438 }
439
GetTextDecoration(UINode * uiNode)440 Ace::TextDecoration SpanModelNG::GetTextDecoration(UINode* uiNode)
441 {
442 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
443 CHECK_NULL_RETURN(spanNode, TextDecoration::NONE);
444 return spanNode->GetTextDecoration().value_or(TextDecoration::NONE);
445 }
446
GetTextDecorationColor(UINode * uiNode)447 Color SpanModelNG::GetTextDecorationColor(UINode* uiNode)
448 {
449 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
450 CHECK_NULL_RETURN(spanNode, Color::BLACK);
451 return spanNode->GetTextDecorationColor().value_or(Color::BLACK);
452 }
453
GetTextDecorationStyle(UINode * uiNode)454 Ace::TextDecorationStyle SpanModelNG::GetTextDecorationStyle(UINode* uiNode)
455 {
456 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
457 CHECK_NULL_RETURN(spanNode, TextDecorationStyle::SOLID);
458 return spanNode->GetTextDecorationStyle().value_or(TextDecorationStyle::SOLID);
459 }
460
GetDefaultTextStyle()461 TextStyle SpanModelNG::GetDefaultTextStyle()
462 {
463 TextStyle textStyle;
464 auto pipelineContext = PipelineBase::GetCurrentContextSafely();
465 CHECK_NULL_RETURN(pipelineContext, textStyle);
466 auto textTheme = pipelineContext->GetTheme<TextTheme>();
467 CHECK_NULL_RETURN(textTheme, textStyle);
468 return textTheme->GetTextStyle();
469 }
470
GetFontColor(UINode * uiNode)471 Color SpanModelNG::GetFontColor(UINode* uiNode)
472 {
473 auto defaultColor = GetDefaultTextStyle().GetTextColor();
474 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
475 CHECK_NULL_RETURN(spanNode, defaultColor);
476 return spanNode->GetTextColor().value_or(defaultColor);
477 }
478
GetFontSize(UINode * uiNode)479 Dimension SpanModelNG::GetFontSize(UINode* uiNode)
480 {
481 const Dimension& defaultFontSize = GetDefaultTextStyle().GetFontSize();
482 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
483 CHECK_NULL_RETURN(spanNode, defaultFontSize);
484 return spanNode->GetFontSize().value_or(defaultFontSize);
485 }
486
GetFontStyle(UINode * uiNode)487 Ace::FontStyle SpanModelNG::GetFontStyle(UINode* uiNode)
488 {
489 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
490 CHECK_NULL_RETURN(spanNode, Ace::FontStyle::NORMAL);
491 return spanNode->GetItalicFontStyle().value_or(Ace::FontStyle::NORMAL);
492 }
493
GetFontWeight(UINode * uiNode)494 FontWeight SpanModelNG::GetFontWeight(UINode* uiNode)
495 {
496 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
497 CHECK_NULL_RETURN(spanNode, FontWeight::NORMAL);
498 return spanNode->GetFontWeight().value_or(FontWeight::NORMAL);
499 }
500
GetTextLineHeight(UINode * uiNode)501 Dimension SpanModelNG::GetTextLineHeight(UINode* uiNode)
502 {
503 Dimension defaultLineHeight(0);
504 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
505 CHECK_NULL_RETURN(spanNode, Dimension(0));
506 return spanNode->GetLineHeight().value_or(defaultLineHeight);
507 }
508
GetTextCase(UINode * uiNode)509 Ace::TextCase SpanModelNG::GetTextCase(UINode* uiNode)
510 {
511 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
512 CHECK_NULL_RETURN(spanNode, TextCase::NORMAL);
513 return spanNode->GetTextCase().value_or(TextCase::NORMAL);
514 }
515
GetLetterSpacing(UINode * uiNode)516 Dimension SpanModelNG::GetLetterSpacing(UINode* uiNode)
517 {
518 Dimension defaultLetterSpacing(0);
519 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
520 CHECK_NULL_RETURN(spanNode, defaultLetterSpacing);
521 return spanNode->GetLetterSpacing().value_or(defaultLetterSpacing);
522 }
523
GetBaselineOffset(UINode * uiNode)524 Dimension SpanModelNG::GetBaselineOffset(UINode* uiNode)
525 {
526 Dimension defaultBaselineOffset(0);
527 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
528 CHECK_NULL_RETURN(spanNode, defaultBaselineOffset);
529 return spanNode->GetBaselineOffset().value_or(defaultBaselineOffset);
530 }
531
GetSpanTextBackgroundStyle(UINode * uiNode)532 TextBackgroundStyle SpanModelNG::GetSpanTextBackgroundStyle(UINode* uiNode)
533 {
534 TextBackgroundStyle backgroundStyle;
535 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
536 CHECK_NULL_RETURN(spanNode, backgroundStyle);
537 return spanNode->GetTextBackgroundStyle().value_or(backgroundStyle);
538 }
539
GetTextShadow(UINode * uiNode)540 std::vector<Shadow> SpanModelNG::GetTextShadow(UINode* uiNode)
541 {
542 std::vector<Shadow> defaultShadow;
543 CHECK_NULL_RETURN(uiNode, defaultShadow);
544 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
545 CHECK_NULL_RETURN(spanNode, defaultShadow);
546 return spanNode->GetTextShadow().value_or(defaultShadow);
547 }
548
SetAccessibilityText(UINode * uiNode,const std::string & text)549 void SpanModelNG::SetAccessibilityText(UINode* uiNode, const std::string& text)
550 {
551 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
552 CHECK_NULL_VOID(spanNode);
553 auto spanItem = spanNode->GetSpanItem();
554 CHECK_NULL_VOID(spanItem);
555 CHECK_NULL_VOID(spanItem->accessibilityProperty);
556 spanItem->accessibilityProperty->SetAccessibilityText(text);
557 }
558
SetAccessibilityDescription(UINode * uiNode,const std::string & description)559 void SpanModelNG::SetAccessibilityDescription(UINode* uiNode, const std::string& description)
560 {
561 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
562 CHECK_NULL_VOID(spanNode);
563 auto spanItem = spanNode->GetSpanItem();
564 CHECK_NULL_VOID(spanItem);
565 CHECK_NULL_VOID(spanItem->accessibilityProperty);
566 spanItem->accessibilityProperty->SetAccessibilityDescription(description);
567 }
568
SetAccessibilityImportance(UINode * uiNode,const std::string & importance)569 void SpanModelNG::SetAccessibilityImportance(UINode* uiNode, const std::string& importance)
570 {
571 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
572 CHECK_NULL_VOID(spanNode);
573 auto spanItem = spanNode->GetSpanItem();
574 CHECK_NULL_VOID(spanItem);
575 CHECK_NULL_VOID(spanItem->accessibilityProperty);
576 spanItem->accessibilityProperty->SetAccessibilityLevel(importance);
577 }
578
GetSpanFontFamily(UINode * uiNode)579 std::vector<std::string> SpanModelNG::GetSpanFontFamily(UINode* uiNode)
580 {
581 auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
582 std::vector<std::string> value;
583 CHECK_NULL_RETURN(spanNode, value);
584 return spanNode->GetFontFamily().value_or(value);
585 }
586 } // namespace OHOS::Ace::NG
587