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 #include "core/components_ng/pattern/progress/progress_model_ng.h"
17 
18 #include "base/geometry/dimension.h"
19 #include "core/components/progress/progress_component.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/base/view_stack_processor.h"
22 #include "core/components_ng/pattern/pattern.h"
23 #include "core/components_ng/pattern/progress/progress_date.h"
24 #include "core/components_ng/pattern/progress/progress_pattern.h"
25 #include "core/components_ng/pattern/text/text_layout_property.h"
26 #include "core/components_ng/pattern/text/text_pattern.h"
27 #include "core/components_v2/inspector/inspector_constants.h"
28 
29 namespace OHOS::Ace::NG {
Create(double min,double value,double cachedValue,double max,NG::ProgressType type)30 void ProgressModelNG::Create(double min, double value, double cachedValue, double max, NG::ProgressType type)
31 {
32     auto* stack = ViewStackProcessor::GetInstance();
33     auto nodeId = stack->ClaimNodeId();
34     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::PROGRESS_ETS_TAG, nodeId);
35     auto frameNode = FrameNode::GetOrCreateFrameNode(
36         V2::PROGRESS_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ProgressPattern>(); });
37     stack->Push(frameNode);
38 
39     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Value, value);
40     frameNode->OnAccessibilityEvent(AccessibilityEventType::COMPONENT_CHANGE);
41     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, MaxValue, max);
42     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ProgressType, type);
43     ACE_UPDATE_LAYOUT_PROPERTY(ProgressLayoutProperty, Type, type);
44     auto pipeline = PipelineBase::GetCurrentContext();
45     CHECK_NULL_VOID(pipeline);
46     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
47         return;
48     }
49     auto progressFocusNode = frameNode->GetFocusHub();
50     CHECK_NULL_VOID(progressFocusNode);
51     if (type == ProgressType::CAPSULE) {
52         progressFocusNode->SetFocusable(true);
53     } else {
54         progressFocusNode->SetFocusable(false);
55     }
56 
57     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeInputEventHub();
58     CHECK_NULL_VOID(eventHub);
59     auto pattern = frameNode->GetPattern<ProgressPattern>();
60     CHECK_NULL_VOID(pattern);
61     if (type == ProgressType::CAPSULE) {
62         if (frameNode->GetChildren().empty()) {
63             auto textNode = FrameNode::CreateFrameNode(
64                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
65             textNode->SetInternal();
66             textNode->MountToParent(frameNode);
67         }
68         auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
69         CHECK_NULL_VOID(textHost);
70         SetTextDefaultStyle(textHost, value, max);
71         textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
72         eventHub->SetHoverEffect(HoverEffectType::SCALE);
73     } else {
74         if (!frameNode->GetChildren().empty()) {
75             frameNode->RemoveChildAtIndex(0);
76         }
77         eventHub->SetHoverEffect(HoverEffectType::NONE);
78     }
79 }
80 
CreateFrameNode(int32_t nodeId,double value,double max,NG::ProgressType type)81 RefPtr<FrameNode> ProgressModelNG::CreateFrameNode(int32_t nodeId, double value, double max, NG::ProgressType type)
82 {
83     auto frameNode = FrameNode::CreateFrameNode(V2::PROGRESS_ETS_TAG, nodeId, AceType::MakeRefPtr<ProgressPattern>());
84     CHECK_NULL_RETURN(frameNode, nullptr);
85     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
86     progressPaintProperty->UpdateValue(value);
87     progressPaintProperty->UpdateMaxValue(max);
88     progressPaintProperty->UpdateProgressType(type);
89     auto progressLayoutProperty = frameNode->GetLayoutProperty<NG::ProgressLayoutProperty>();
90     progressLayoutProperty->UpdateType(type);
91     return frameNode;
92 }
93 
SetValue(double value)94 void ProgressModelNG::SetValue(double value)
95 {
96     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
97     CHECK_NULL_VOID(frameNode);
98     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
99     CHECK_NULL_VOID(progressPaintProperty);
100     auto maxValue = progressPaintProperty->GetMaxValue();
101     if (value > maxValue) {
102         value = maxValue.value_or(0);
103     }
104     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Value, value);
105     auto pattern = frameNode->GetPattern<ProgressPattern>();
106     CHECK_NULL_VOID(pattern);
107     if (!pattern->IsTextFromUser()) {
108         SetText(std::nullopt);
109     }
110 }
111 
SetColor(const Color & value)112 void ProgressModelNG::SetColor(const Color& value)
113 {
114     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Color, value);
115 }
116 
SetGradientColor(const Gradient & value)117 void ProgressModelNG::SetGradientColor(const Gradient& value)
118 {
119     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColor, value);
120 }
121 
SetBackgroundColor(const Color & value)122 void ProgressModelNG::SetBackgroundColor(const Color& value)
123 {
124     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BackgroundColor, value);
125 }
126 
SetStrokeWidth(const Dimension & value)127 void ProgressModelNG::SetStrokeWidth(const Dimension& value)
128 {
129     ACE_UPDATE_LAYOUT_PROPERTY(ProgressLayoutProperty, StrokeWidth, value);
130 }
131 
SetScaleCount(int32_t value)132 void ProgressModelNG::SetScaleCount(int32_t value)
133 {
134     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ScaleCount, value);
135 }
136 
SetScaleWidth(const Dimension & value)137 void ProgressModelNG::SetScaleWidth(const Dimension& value)
138 {
139     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ScaleWidth, value);
140 }
141 
SetBorderColor(const Color & value)142 void ProgressModelNG::SetBorderColor(const Color& value)
143 {
144     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
145     CHECK_NULL_VOID(frameNode);
146     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
147     CHECK_NULL_VOID(progressPaintProperty);
148     auto progressType = progressPaintProperty->GetProgressTypeValue();
149     if (progressType == ProgressType::CAPSULE) {
150         ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BorderColor, value);
151     }
152 }
153 
SetBorderWidth(const Dimension & value)154 void ProgressModelNG::SetBorderWidth(const Dimension& value)
155 {
156     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BorderWidth, value);
157 }
158 
SetSweepingEffect(bool value)159 void ProgressModelNG::SetSweepingEffect(bool value)
160 {
161     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableScanEffect, value);
162 }
163 
SetFontSize(const Dimension & value)164 void ProgressModelNG::SetFontSize(const Dimension& value)
165 {
166     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
167     CHECK_NULL_VOID(frameNode);
168     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
169     CHECK_NULL_VOID(textHost);
170     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
171     CHECK_NULL_VOID(textLayoutProperty);
172     textLayoutProperty->UpdateFontSize(value);
173     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
174     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, TextSize, value);
175 }
176 
SetFontColor(const Color & value)177 void ProgressModelNG::SetFontColor(const Color& value)
178 {
179     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
180     CHECK_NULL_VOID(frameNode);
181     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
182     CHECK_NULL_VOID(textHost);
183     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
184     CHECK_NULL_VOID(textLayoutProperty);
185     textLayoutProperty->UpdateTextColor(value);
186     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
187     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, TextColor, value);
188 }
189 
SetText(const std::optional<std::string> & value)190 void ProgressModelNG::SetText(const std::optional<std::string>& value)
191 {
192     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
193     CHECK_NULL_VOID(frameNode);
194     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
195     CHECK_NULL_VOID(textHost);
196     auto pattern = frameNode->GetPattern<ProgressPattern>();
197     CHECK_NULL_VOID(pattern);
198     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
199     CHECK_NULL_VOID(textLayoutProperty);
200     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
201     CHECK_NULL_VOID(progressPaintProperty);
202     std::string context = "";
203     if (!value.has_value()) {
204         auto maxValue = progressPaintProperty->GetMaxValue();
205         auto curValue = progressPaintProperty->GetValue();
206         int32_t curPercent = curValue.value() * 100 / maxValue.value();
207         std::string number = std::to_string(curPercent) + "%";
208         bool isShowText = progressPaintProperty->GetEnableShowText().value_or(false);
209         if (!isShowText) {
210             number = "";
211         }
212         textLayoutProperty->UpdateContent(number);
213         context = number;
214         pattern->SetTextFromUser(false);
215     } else {
216         textLayoutProperty->UpdateContent(value.value());
217         context = value.value();
218         pattern->SetTextFromUser(true);
219     }
220     textHost->MarkModifyDone();
221     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
222     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Text, context);
223 }
224 
SetFontWeight(const FontWeight & value)225 void ProgressModelNG::SetFontWeight(const FontWeight& value)
226 {
227     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
228     CHECK_NULL_VOID(frameNode);
229     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
230     CHECK_NULL_VOID(textHost);
231     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
232     CHECK_NULL_VOID(textLayoutProperty);
233     textLayoutProperty->UpdateFontWeight(value);
234     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
235     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, FontWeight, value);
236 }
237 
SetFontFamily(const std::vector<std::string> & value)238 void ProgressModelNG::SetFontFamily(const std::vector<std::string>& value)
239 {
240     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
241     CHECK_NULL_VOID(frameNode);
242     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
243     CHECK_NULL_VOID(textHost);
244     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
245     CHECK_NULL_VOID(textLayoutProperty);
246     textLayoutProperty->UpdateFontFamily(value);
247     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
248     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, FontFamily, value);
249 }
250 
SetItalicFontStyle(const Ace::FontStyle & value)251 void ProgressModelNG::SetItalicFontStyle(const Ace::FontStyle& value)
252 {
253     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
254     CHECK_NULL_VOID(frameNode);
255     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
256     CHECK_NULL_VOID(textHost);
257     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
258     CHECK_NULL_VOID(textLayoutProperty);
259     textLayoutProperty->UpdateItalicFontStyle(value);
260     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
261     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ItalicFontStyle, value);
262 }
263 
SetTextDefaultStyle(const RefPtr<FrameNode> & textNode,double value,double maxValue)264 void ProgressModelNG::SetTextDefaultStyle(const RefPtr<FrameNode>& textNode, double value, double maxValue)
265 {
266     auto pipeline = PipelineBase::GetCurrentContext();
267     CHECK_NULL_VOID(pipeline);
268     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
269     CHECK_NULL_VOID(frameNode);
270     auto textProps = textNode->GetLayoutProperty<TextLayoutProperty>();
271     CHECK_NULL_VOID(textProps);
272     auto renderContext = textNode->GetRenderContext();
273     CHECK_NULL_VOID(renderContext);
274     renderContext->UpdateClipEdge(false);
275     RefPtr<ProgressTheme> progressTheme = pipeline->GetTheme<ProgressTheme>();
276     CHECK_NULL_VOID(progressTheme);
277     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
278     CHECK_NULL_VOID(progressPaintProperty);
279     int32_t curPercent = 0;
280     if (!NearZero(maxValue)) {
281         curPercent = value * 100 / maxValue;
282     }
283     std::string number = std::to_string(curPercent) + "%";
284     textProps->UpdateContent(number);
285     textProps->UpdateFontSize(progressTheme->GetTextSize());
286     textProps->UpdateTextColor(progressTheme->GetTextColor());
287     textProps->UpdateFontWeight(FontWeight::MEDIUM);
288     textProps->UpdateTextOverflow(TextOverflow::ELLIPSIS);
289     textProps->UpdateMaxLines(1);
290     MarginProperty margin;
291     margin.left = CalcLength(progressTheme->GetTextMargin());
292     margin.right = CalcLength(progressTheme->GetTextMargin());
293     margin.top = CalcLength(0.0_vp);
294     margin.bottom = CalcLength(0.0_vp);
295     textProps->UpdateMargin(margin);
296     bool isShowText = progressPaintProperty->GetEnableShowText().value_or(false);
297     if (!isShowText) {
298         number = "";
299         textProps->UpdateContent(number);
300     }
301     textNode->MarkModifyDone();
302     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Text, number);
303 }
304 
SetPaintShadow(bool value)305 void ProgressModelNG::SetPaintShadow(bool value)
306 {
307     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, PaintShadow, value);
308 }
309 
SetProgressStatus(ProgressStatus status)310 void ProgressModelNG::SetProgressStatus(ProgressStatus status)
311 {
312     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ProgressStatus, status);
313 }
314 
SetShowText(bool value)315 void ProgressModelNG::SetShowText(bool value)
316 {
317     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableShowText, value);
318 }
319 
SetRingSweepingEffect(bool value)320 void ProgressModelNG::SetRingSweepingEffect(bool value)
321 {
322     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableRingScanEffect, value);
323 }
324 
SetLinearSweepingEffect(bool value)325 void ProgressModelNG::SetLinearSweepingEffect(bool value)
326 {
327     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableLinearScanEffect, value);
328 }
329 
SetSmoothEffect(bool value)330 void ProgressModelNG::SetSmoothEffect(bool value)
331 {
332     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableSmoothEffect, value);
333 }
334 
SetStrokeRadius(const Dimension & value)335 void ProgressModelNG::SetStrokeRadius(const Dimension& value)
336 {
337     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, StrokeRadius, value);
338 }
339 
ResetStrokeRadius()340 void ProgressModelNG::ResetStrokeRadius()
341 {
342     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, StrokeRadius, PROPERTY_UPDATE_RENDER);
343 }
344 
SetValue(FrameNode * frameNode,double value)345 void ProgressModelNG::SetValue(FrameNode* frameNode, double value)
346 {
347     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
348     CHECK_NULL_VOID(progressPaintProperty);
349     auto maxValue = progressPaintProperty->GetMaxValue();
350     if (value > maxValue) {
351         value = maxValue.value_or(0);
352     }
353     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Value, value, frameNode);
354     auto pattern = frameNode->GetPattern<ProgressPattern>();
355     CHECK_NULL_VOID(pattern);
356     if (!pattern->IsTextFromUser()) {
357         SetText(frameNode, std::nullopt);
358     }
359 }
360 
SetTotal(FrameNode * frameNode,double max)361 void ProgressModelNG::SetTotal(FrameNode* frameNode, double max)
362 {
363     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
364     CHECK_NULL_VOID(progressPaintProperty);
365     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, MaxValue, max, frameNode);
366 }
367 
SetType(FrameNode * frameNode,NG::ProgressType type)368 void ProgressModelNG::SetType(FrameNode* frameNode, NG::ProgressType type)
369 {
370     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ProgressType, type, frameNode);
371     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ProgressLayoutProperty, Type, type, frameNode);
372 }
373 
SetColor(FrameNode * frameNode,const Color & value)374 void ProgressModelNG::SetColor(FrameNode* frameNode, const Color& value)
375 {
376     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Color, value, frameNode);
377 }
378 
SetGradientColor(FrameNode * frameNode,const Gradient & value)379 void ProgressModelNG::SetGradientColor(FrameNode* frameNode, const Gradient& value)
380 {
381     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, GradientColor, value, frameNode);
382 }
383 
SetSmoothEffect(FrameNode * frameNode,bool value)384 void ProgressModelNG::SetSmoothEffect(FrameNode* frameNode, bool value)
385 {
386     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableSmoothEffect, value, frameNode);
387 }
388 
SetStrokeWidth(FrameNode * frameNode,const Dimension & value)389 void ProgressModelNG::SetStrokeWidth(FrameNode* frameNode, const Dimension& value)
390 {
391     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ProgressLayoutProperty, StrokeWidth, value, frameNode);
392 }
393 
SetLinearSweepingEffect(FrameNode * frameNode,bool value)394 void ProgressModelNG::SetLinearSweepingEffect(FrameNode* frameNode, bool value)
395 {
396     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableLinearScanEffect, value, frameNode);
397 }
398 
SetRingSweepingEffect(FrameNode * frameNode,bool value)399 void ProgressModelNG::SetRingSweepingEffect(FrameNode* frameNode, bool value)
400 {
401     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableRingScanEffect, value, frameNode);
402 }
403 
SetPaintShadow(FrameNode * frameNode,bool value)404 void ProgressModelNG::SetPaintShadow(FrameNode* frameNode, bool value)
405 {
406     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, PaintShadow, value, frameNode);
407 }
408 
SetProgressStatus(FrameNode * frameNode,ProgressStatus status)409 void ProgressModelNG::SetProgressStatus(FrameNode* frameNode, ProgressStatus status)
410 {
411     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ProgressStatus, status, frameNode);
412 }
413 
SetScaleCount(FrameNode * frameNode,int32_t value)414 void ProgressModelNG::SetScaleCount(FrameNode* frameNode, int32_t value)
415 {
416     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ScaleCount, value, frameNode);
417 }
418 
SetScaleWidth(FrameNode * frameNode,const Dimension & value)419 void ProgressModelNG::SetScaleWidth(FrameNode* frameNode, const Dimension& value)
420 {
421     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ScaleWidth, value, frameNode);
422 }
423 
SetBorderWidth(FrameNode * frameNode,const Dimension & value)424 void ProgressModelNG::SetBorderWidth(FrameNode* frameNode, const Dimension& value)
425 {
426     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BorderWidth, value, frameNode);
427 }
428 
SetBorderColor(FrameNode * frameNode,const Color & value)429 void ProgressModelNG::SetBorderColor(FrameNode* frameNode, const Color& value)
430 {
431     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BorderColor, value, frameNode);
432 }
433 
SetSweepingEffect(FrameNode * frameNode,bool value)434 void ProgressModelNG::SetSweepingEffect(FrameNode* frameNode, bool value)
435 {
436     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableScanEffect, value, frameNode);
437 }
438 
SetShowText(FrameNode * frameNode,bool value)439 void ProgressModelNG::SetShowText(FrameNode* frameNode, bool value)
440 {
441     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableShowText, value, frameNode);
442 }
443 
SetText(FrameNode * frameNode,const std::optional<std::string> & value)444 void ProgressModelNG::SetText(FrameNode* frameNode, const std::optional<std::string>& value)
445 {
446     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
447     CHECK_NULL_VOID(textHost);
448     auto pattern = frameNode->GetPattern<ProgressPattern>();
449     CHECK_NULL_VOID(pattern);
450     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
451     CHECK_NULL_VOID(textLayoutProperty);
452     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
453     CHECK_NULL_VOID(progressPaintProperty);
454     std::string context = "";
455     if (!value.has_value()) {
456         auto maxValue = progressPaintProperty->GetMaxValue();
457         auto curValue = progressPaintProperty->GetValue();
458         int32_t curPercent = curValue.value() * 100 / maxValue.value();
459         std::string number = std::to_string(curPercent) + "%";
460         bool isShowText = progressPaintProperty->GetEnableShowText().value_or(false);
461         if (!isShowText) {
462             number = "";
463         }
464         textLayoutProperty->UpdateContent(number);
465         context = number;
466         pattern->SetTextFromUser(false);
467     } else {
468         textLayoutProperty->UpdateContent(value.value());
469         context = value.value();
470         pattern->SetTextFromUser(true);
471     }
472     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
473     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Text, context, frameNode);
474 }
475 
SetFontColor(FrameNode * frameNode,const Color & value)476 void ProgressModelNG::SetFontColor(FrameNode* frameNode, const Color& value)
477 {
478     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
479     CHECK_NULL_VOID(textHost);
480     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
481     CHECK_NULL_VOID(textLayoutProperty);
482     textLayoutProperty->UpdateTextColor(value);
483     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
484     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, TextColor, value, frameNode);
485 }
486 
SetFontSize(FrameNode * frameNode,const Dimension & value)487 void ProgressModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
488 {
489     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
490     CHECK_NULL_VOID(textHost);
491     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
492     CHECK_NULL_VOID(textLayoutProperty);
493     textLayoutProperty->UpdateFontSize(value);
494     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
495     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, TextSize, value, frameNode);
496 }
497 
SetFontWeight(FrameNode * frameNode,const FontWeight & value)498 void ProgressModelNG::SetFontWeight(FrameNode* frameNode, const FontWeight& value)
499 {
500     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
501     CHECK_NULL_VOID(textHost);
502     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
503     CHECK_NULL_VOID(textLayoutProperty);
504     textLayoutProperty->UpdateFontWeight(value);
505     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
506     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, FontWeight, value, frameNode);
507 }
508 
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)509 void ProgressModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
510 {
511     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
512     CHECK_NULL_VOID(textHost);
513     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
514     CHECK_NULL_VOID(textLayoutProperty);
515     textLayoutProperty->UpdateFontFamily(value);
516     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
517     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, FontFamily, value, frameNode);
518 }
519 
SetItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)520 void ProgressModelNG::SetItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
521 {
522     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
523     CHECK_NULL_VOID(textHost);
524     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
525     CHECK_NULL_VOID(textLayoutProperty);
526     textLayoutProperty->UpdateItalicFontStyle(value);
527     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
528     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ItalicFontStyle, value, frameNode);
529 }
530 
SetStrokeRadius(FrameNode * frameNode,const Dimension & value)531 void ProgressModelNG::SetStrokeRadius(FrameNode* frameNode, const Dimension& value)
532 {
533     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, StrokeRadius, value, frameNode);
534 }
535 
ResetStrokeRadius(FrameNode * frameNode)536 void ProgressModelNG::ResetStrokeRadius(FrameNode* frameNode)
537 {
538     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, StrokeRadius, PROPERTY_UPDATE_RENDER, frameNode);
539 }
540 
SetBackgroundColor(FrameNode * frameNode,const Color & value)541 void ProgressModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& value)
542 {
543     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BackgroundColor, value, frameNode);
544 }
545 
GetValue(FrameNode * frameNode)546 double ProgressModelNG::GetValue(FrameNode* frameNode)
547 {
548     double value = 0;
549     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, Value, value, frameNode, value);
550     return value;
551 }
552 
GetColor(FrameNode * frameNode)553 Color ProgressModelNG::GetColor(FrameNode* frameNode)
554 {
555     Color value;
556     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, Color, value, frameNode, value);
557     return value;
558 }
559 
GetTotal(FrameNode * frameNode)560 double ProgressModelNG::GetTotal(FrameNode* frameNode)
561 {
562     double value = 100;
563     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, MaxValue, value, frameNode, value);
564     return value;
565 }
566 
GetType(FrameNode * frameNode)567 NG::ProgressType ProgressModelNG::GetType(FrameNode* frameNode)
568 {
569     NG::ProgressType value = ProgressType::LINEAR;
570     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, ProgressType, value, frameNode, value);
571     return value;
572 }
573 
SetBuilderFunc(FrameNode * frameNode,ProgressMakeCallback && makeFunc)574 void ProgressModelNG::SetBuilderFunc(FrameNode* frameNode, ProgressMakeCallback&& makeFunc)
575 {
576     CHECK_NULL_VOID(frameNode);
577     auto pattern = frameNode->GetPattern<ProgressPattern>();
578     CHECK_NULL_VOID(pattern);
579     pattern->SetBuilderFunc(std::move(makeFunc));
580 }
581 
ProgressInitialize(FrameNode * frameNode,double min,double value,double cachedValue,double max,NG::ProgressType type)582 void ProgressModelNG::ProgressInitialize(
583     FrameNode* frameNode, double min, double value, double cachedValue, double max, NG::ProgressType type)
584 {
585     auto pattern = frameNode->GetPattern<ProgressPattern>();
586     CHECK_NULL_VOID(pattern);
587 
588     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Value, value, frameNode);
589     frameNode->OnAccessibilityEvent(AccessibilityEventType::COMPONENT_CHANGE);
590     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, MaxValue, max, frameNode);
591     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ProgressType, type, frameNode);
592     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ProgressLayoutProperty, Type, type, frameNode);
593     auto pipeline = PipelineBase::GetCurrentContext();
594     CHECK_NULL_VOID(pipeline);
595     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
596         return;
597     }
598     RefPtr<ProgressTheme> theme = pipeline->GetTheme<ProgressTheme>();
599     auto progressFocusNode = frameNode->GetFocusHub();
600     CHECK_NULL_VOID(progressFocusNode);
601     if (type == ProgressType::CAPSULE) {
602         progressFocusNode->SetFocusable(true);
603     } else {
604         progressFocusNode->SetFocusable(false);
605     }
606 
607     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeInputEventHub();
608     CHECK_NULL_VOID(eventHub);
609     if (type == ProgressType::CAPSULE) {
610         if (frameNode->GetChildren().empty()) {
611             auto textNode = FrameNode::CreateFrameNode(
612                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
613             textNode->SetInternal();
614             textNode->MountToParent(AceType::Claim(reinterpret_cast<FrameNode*>(frameNode)));
615         }
616         auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
617         CHECK_NULL_VOID(textHost);
618         SetTextDefaultStyle(textHost, value, max);
619         textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
620         eventHub->SetHoverEffect(HoverEffectType::SCALE);
621     } else {
622         if (!frameNode->GetChildren().empty()) {
623             frameNode->RemoveChildAtIndex(0);
624         }
625         eventHub->SetHoverEffect(HoverEffectType::NONE);
626     }
627 }
628 } // namespace OHOS::Ace::NG
629