• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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/common/resource/resource_parse_utils.h"
20 #include "core/components/progress/progress_component.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/pattern.h"
24 #include "core/components_ng/pattern/progress/progress_date.h"
25 #include "core/components_ng/pattern/progress/progress_paint_property.h"
26 #include "core/components_ng/pattern/progress/progress_pattern.h"
27 #include "core/components_ng/pattern/text/text_layout_property.h"
28 #include "core/components_ng/pattern/text/text_pattern.h"
29 #include "core/components_v2/inspector/inspector_constants.h"
30 namespace OHOS::Ace::NG {
Create(double min,double value,double cachedValue,double max,NG::ProgressType type)31 void ProgressModelNG::Create(double min, double value, double cachedValue, double max, NG::ProgressType type)
32 {
33     auto* stack = ViewStackProcessor::GetInstance();
34     auto nodeId = stack->ClaimNodeId();
35     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::PROGRESS_ETS_TAG, nodeId);
36     auto frameNode = FrameNode::GetOrCreateFrameNode(
37         V2::PROGRESS_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ProgressPattern>(); });
38     stack->Push(frameNode);
39 
40     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Value, value);
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     RefPtr<ProgressTheme> theme = pipeline->GetTheme<ProgressTheme>(frameNode->GetThemeScopeId());
58     CHECK_NULL_VOID(theme);
59     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeInputEventHub();
60     CHECK_NULL_VOID(eventHub);
61     auto pattern = frameNode->GetPattern<ProgressPattern>();
62     CHECK_NULL_VOID(pattern);
63     if (type == ProgressType::CAPSULE) {
64         if (frameNode->GetChildren().empty()) {
65             auto textNode = FrameNode::CreateFrameNode(
66                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
67             textNode->SetInternal();
68             textNode->MountToParent(frameNode);
69         }
70         auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
71         CHECK_NULL_VOID(textHost);
72         SetTextDefaultStyle(textHost, value, max);
73         textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
74         eventHub->SetHoverEffect(HoverEffectType::SCALE);
75     } else {
76         if (!frameNode->GetChildren().empty()) {
77             frameNode->RemoveChildAtIndex(0);
78         }
79         eventHub->SetHoverEffect(HoverEffectType::NONE);
80     }
81 
82     auto pros = frameNode->GetPaintProperty<ProgressPaintProperty>();
83     if (pros) {
84         pros->ResetCapsuleStyleFontColorSetByUser();
85         pros->ResetCapsuleStyleSetByUser();
86         pros->ResetGradientColorSetByUser();
87     }
88 }
89 
CreateFrameNode(int32_t nodeId,double value,double max,NG::ProgressType type)90 RefPtr<FrameNode> ProgressModelNG::CreateFrameNode(int32_t nodeId, double value, double max, NG::ProgressType type)
91 {
92     auto frameNode = FrameNode::CreateFrameNode(V2::PROGRESS_ETS_TAG, nodeId, AceType::MakeRefPtr<ProgressPattern>());
93     CHECK_NULL_RETURN(frameNode, nullptr);
94     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
95     progressPaintProperty->UpdateValue(value);
96     progressPaintProperty->UpdateMaxValue(max);
97     progressPaintProperty->UpdateProgressType(type);
98     auto progressLayoutProperty = frameNode->GetLayoutProperty<NG::ProgressLayoutProperty>();
99     progressLayoutProperty->UpdateType(type);
100     return frameNode;
101 }
102 
SetValue(double value)103 void ProgressModelNG::SetValue(double value)
104 {
105     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
106     CHECK_NULL_VOID(frameNode);
107     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
108     CHECK_NULL_VOID(progressPaintProperty);
109     auto maxValue = progressPaintProperty->GetMaxValue();
110     if (value > maxValue) {
111         value = maxValue.value_or(0);
112     }
113     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Value, value);
114     auto pattern = frameNode->GetPattern<ProgressPattern>();
115     CHECK_NULL_VOID(pattern);
116     if (!pattern->IsTextFromUser()) {
117         SetText(std::nullopt);
118     }
119 }
120 
SetColor(const Color & value)121 void ProgressModelNG::SetColor(const Color& value)
122 {
123     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
124     CHECK_NULL_VOID(frameNode);
125     auto pattern = frameNode->GetPattern<ProgressPattern>();
126     CHECK_NULL_VOID(pattern);
127     pattern->SetUserInitiatedColor(true);
128     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Color, value);
129 }
130 
ResetColor()131 void ProgressModelNG::ResetColor()
132 {
133     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
134     CHECK_NULL_VOID(frameNode);
135     auto pattern = frameNode->GetPattern<ProgressPattern>();
136     CHECK_NULL_VOID(pattern);
137     pattern->SetUserInitiatedColor(false);
138     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER);
139 }
140 
SetGradientColor(const Gradient & value)141 void ProgressModelNG::SetGradientColor(const Gradient& value)
142 {
143     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColor, value);
144 }
145 
ResetGradientColor()146 void ProgressModelNG::ResetGradientColor()
147 {
148     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, GradientColor, PROPERTY_UPDATE_RENDER);
149 }
150 
SetBackgroundColor(const Color & value)151 void ProgressModelNG::SetBackgroundColor(const Color& value)
152 {
153     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
154     CHECK_NULL_VOID(frameNode);
155     auto pattern = frameNode->GetPattern<ProgressPattern>();
156     CHECK_NULL_VOID(pattern);
157     pattern->SetUserInitiatedBgColor(true);
158     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BackgroundColor, value);
159 }
160 
ResetBackgroundColor()161 void ProgressModelNG::ResetBackgroundColor()
162 {
163     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
164     CHECK_NULL_VOID(frameNode);
165     auto pattern = frameNode->GetPattern<ProgressPattern>();
166     CHECK_NULL_VOID(pattern);
167     pattern->SetUserInitiatedBgColor(false);
168     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, BackgroundColor, PROPERTY_UPDATE_RENDER);
169 }
170 
SetStrokeWidth(const Dimension & value)171 void ProgressModelNG::SetStrokeWidth(const Dimension& value)
172 {
173     ACE_UPDATE_LAYOUT_PROPERTY(ProgressLayoutProperty, StrokeWidth, value);
174 }
175 
SetScaleCount(int32_t value)176 void ProgressModelNG::SetScaleCount(int32_t value)
177 {
178     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ScaleCount, value);
179 }
180 
SetScaleWidth(const Dimension & value)181 void ProgressModelNG::SetScaleWidth(const Dimension& value)
182 {
183     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ScaleWidth, value);
184 }
185 
SetBorderColor(const Color & value)186 void ProgressModelNG::SetBorderColor(const Color& value)
187 {
188     if (isCapsule()) {
189         ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BorderColor, value);
190     }
191 }
192 
ResetBorderColor()193 void ProgressModelNG::ResetBorderColor()
194 {
195     if (isCapsule()) {
196         ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, BorderColor, PROPERTY_UPDATE_RENDER);
197     }
198 }
199 
SetBorderWidth(const Dimension & value)200 void ProgressModelNG::SetBorderWidth(const Dimension& value)
201 {
202     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BorderWidth, value);
203 }
204 
SetSweepingEffect(bool value)205 void ProgressModelNG::SetSweepingEffect(bool value)
206 {
207     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableScanEffect, value);
208 }
209 
SetFontSize(const Dimension & value)210 void ProgressModelNG::SetFontSize(const Dimension& value)
211 {
212     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
213     CHECK_NULL_VOID(frameNode);
214     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
215     CHECK_NULL_VOID(textHost);
216     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
217     CHECK_NULL_VOID(textLayoutProperty);
218     textLayoutProperty->UpdateFontSize(value);
219     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
220     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, TextSize, value);
221 }
222 
SetFontColor(const Color & value)223 void ProgressModelNG::SetFontColor(const Color& value)
224 {
225     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
226     CHECK_NULL_VOID(frameNode);
227     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
228     CHECK_NULL_VOID(textHost);
229     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
230     CHECK_NULL_VOID(textLayoutProperty);
231     textLayoutProperty->UpdateTextColor(value);
232     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
233     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, TextColor, value);
234 }
235 
ResetFontColor()236 void ProgressModelNG::ResetFontColor()
237 {
238     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
239     CHECK_NULL_VOID(frameNode);
240     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
241     CHECK_NULL_VOID(textHost);
242     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
243     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, TextColor, PROPERTY_UPDATE_RENDER);
244 }
245 
SetText(const std::optional<std::string> & value)246 void ProgressModelNG::SetText(const std::optional<std::string>& value)
247 {
248     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
249     CHECK_NULL_VOID(frameNode);
250     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
251     CHECK_NULL_VOID(textHost);
252     auto pattern = frameNode->GetPattern<ProgressPattern>();
253     CHECK_NULL_VOID(pattern);
254     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
255     CHECK_NULL_VOID(textLayoutProperty);
256     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
257     CHECK_NULL_VOID(progressPaintProperty);
258     std::string context = "";
259     if (!value.has_value()) {
260         auto maxValue = progressPaintProperty->GetMaxValue();
261         auto curValue = progressPaintProperty->GetValue();
262         if (maxValue.has_value() && curValue.has_value()) {
263             int32_t curPercent = curValue.value() * 100 / maxValue.value();
264             std::string number = std::to_string(curPercent) + "%";
265             bool isShowText = progressPaintProperty->GetEnableShowText().value_or(false);
266             if (!isShowText) {
267                 number = "";
268             }
269             textLayoutProperty->UpdateContent(number);
270             context = number;
271             pattern->SetTextFromUser(false);
272         }
273     } else {
274         textLayoutProperty->UpdateContent(value.value());
275         context = value.value();
276         pattern->SetTextFromUser(true);
277     }
278     textHost->MarkModifyDone();
279     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
280     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Text, context);
281 }
282 
SetFontWeight(const FontWeight & value)283 void ProgressModelNG::SetFontWeight(const FontWeight& value)
284 {
285     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
286     CHECK_NULL_VOID(frameNode);
287     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
288     CHECK_NULL_VOID(textHost);
289     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
290     CHECK_NULL_VOID(textLayoutProperty);
291     textLayoutProperty->UpdateFontWeight(value);
292     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
293     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, FontWeight, value);
294 }
295 
SetFontFamily(const std::vector<std::string> & value)296 void ProgressModelNG::SetFontFamily(const std::vector<std::string>& value)
297 {
298     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
299     CHECK_NULL_VOID(frameNode);
300     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
301     CHECK_NULL_VOID(textHost);
302     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
303     CHECK_NULL_VOID(textLayoutProperty);
304     textLayoutProperty->UpdateFontFamily(value);
305     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
306     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, FontFamily, value);
307 }
308 
SetItalicFontStyle(const Ace::FontStyle & value)309 void ProgressModelNG::SetItalicFontStyle(const Ace::FontStyle& value)
310 {
311     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
312     CHECK_NULL_VOID(frameNode);
313     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
314     CHECK_NULL_VOID(textHost);
315     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
316     CHECK_NULL_VOID(textLayoutProperty);
317     textLayoutProperty->UpdateItalicFontStyle(value);
318     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
319     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ItalicFontStyle, value);
320 }
321 
SetTextDefaultStyle(const RefPtr<FrameNode> & textNode,double value,double maxValue)322 void ProgressModelNG::SetTextDefaultStyle(const RefPtr<FrameNode>& textNode, double value, double maxValue)
323 {
324     auto pipeline = PipelineBase::GetCurrentContext();
325     CHECK_NULL_VOID(pipeline);
326     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
327     CHECK_NULL_VOID(frameNode);
328     auto textProps = textNode->GetLayoutProperty<TextLayoutProperty>();
329     CHECK_NULL_VOID(textProps);
330     auto renderContext = textNode->GetRenderContext();
331     CHECK_NULL_VOID(renderContext);
332     renderContext->UpdateClipEdge(false);
333     RefPtr<ProgressTheme> progressTheme = pipeline->GetTheme<ProgressTheme>(frameNode->GetThemeScopeId());
334     CHECK_NULL_VOID(progressTheme);
335     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
336     CHECK_NULL_VOID(progressPaintProperty);
337     int32_t curPercent = 0;
338     if (!NearZero(maxValue)) {
339         curPercent = value * 100 / maxValue;
340     }
341     std::string number = std::to_string(curPercent) + "%";
342     textProps->UpdateContent(number);
343     textProps->UpdateFontSize(progressTheme->GetTextSize());
344     textProps->UpdateTextColor(progressTheme->GetTextColor());
345     textProps->UpdateFontWeight(FontWeight::MEDIUM);
346     textProps->UpdateTextOverflow(TextOverflow::ELLIPSIS);
347     textProps->UpdateMaxLines(1);
348     MarginProperty margin;
349     margin.left = CalcLength(progressTheme->GetTextMargin());
350     margin.right = CalcLength(progressTheme->GetTextMargin());
351     margin.top = CalcLength(0.0_vp);
352     margin.bottom = CalcLength(0.0_vp);
353     textProps->UpdateMargin(margin);
354     bool isShowText = progressPaintProperty->GetEnableShowText().value_or(false);
355     if (!isShowText) {
356         number = "";
357         textProps->UpdateContent(number);
358     }
359     textNode->MarkModifyDone();
360     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Text, number);
361 }
362 
SetPaintShadow(bool value)363 void ProgressModelNG::SetPaintShadow(bool value)
364 {
365     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, PaintShadow, value);
366 }
367 
SetProgressStatus(ProgressStatus status)368 void ProgressModelNG::SetProgressStatus(ProgressStatus status)
369 {
370     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ProgressStatus, status);
371 }
372 
SetShowText(bool value)373 void ProgressModelNG::SetShowText(bool value)
374 {
375     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableShowText, value);
376 }
377 
SetRingSweepingEffect(bool value)378 void ProgressModelNG::SetRingSweepingEffect(bool value)
379 {
380     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableRingScanEffect, value);
381 }
382 
SetLinearSweepingEffect(bool value)383 void ProgressModelNG::SetLinearSweepingEffect(bool value)
384 {
385     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableLinearScanEffect, value);
386 }
387 
SetSmoothEffect(bool value)388 void ProgressModelNG::SetSmoothEffect(bool value)
389 {
390     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, EnableSmoothEffect, value);
391 }
392 
SetStrokeRadius(const Dimension & value)393 void ProgressModelNG::SetStrokeRadius(const Dimension& value)
394 {
395     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, StrokeRadius, value);
396 }
397 
ResetStrokeRadius()398 void ProgressModelNG::ResetStrokeRadius()
399 {
400     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, StrokeRadius, PROPERTY_UPDATE_RENDER);
401 }
402 
SetValue(FrameNode * frameNode,double value)403 void ProgressModelNG::SetValue(FrameNode* frameNode, double value)
404 {
405     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
406     CHECK_NULL_VOID(progressPaintProperty);
407     auto maxValue = progressPaintProperty->GetMaxValue();
408     if (value > maxValue) {
409         value = maxValue.value_or(0);
410     }
411     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Value, value, frameNode);
412     auto pattern = frameNode->GetPattern<ProgressPattern>();
413     CHECK_NULL_VOID(pattern);
414     if (!pattern->IsTextFromUser()) {
415         SetText(frameNode, std::nullopt);
416     }
417 }
418 
SetTotal(FrameNode * frameNode,double max)419 void ProgressModelNG::SetTotal(FrameNode* frameNode, double max)
420 {
421     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
422     CHECK_NULL_VOID(progressPaintProperty);
423     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, MaxValue, max, frameNode);
424 }
425 
SetType(FrameNode * frameNode,NG::ProgressType type)426 void ProgressModelNG::SetType(FrameNode* frameNode, NG::ProgressType type)
427 {
428     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ProgressType, type, frameNode);
429     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ProgressLayoutProperty, Type, type, frameNode);
430 }
431 
SetColor(FrameNode * frameNode,const Color & value)432 void ProgressModelNG::SetColor(FrameNode* frameNode, const Color& value)
433 {
434     CHECK_NULL_VOID(frameNode);
435     auto pattern = frameNode->GetPattern<ProgressPattern>();
436     CHECK_NULL_VOID(pattern);
437     pattern->SetUserInitiatedColor(true);
438     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Color, value, frameNode);
439 }
440 
SetGradientColor(FrameNode * frameNode,const Gradient & value)441 void ProgressModelNG::SetGradientColor(FrameNode* frameNode, const Gradient& value)
442 {
443     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, GradientColor, value, frameNode);
444 }
445 
SetSmoothEffect(FrameNode * frameNode,bool value)446 void ProgressModelNG::SetSmoothEffect(FrameNode* frameNode, bool value)
447 {
448     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableSmoothEffect, value, frameNode);
449 }
450 
SetStrokeWidth(FrameNode * frameNode,const Dimension & value)451 void ProgressModelNG::SetStrokeWidth(FrameNode* frameNode, const Dimension& value)
452 {
453     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ProgressLayoutProperty, StrokeWidth, value, frameNode);
454 }
455 
SetLinearSweepingEffect(FrameNode * frameNode,bool value)456 void ProgressModelNG::SetLinearSweepingEffect(FrameNode* frameNode, bool value)
457 {
458     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableLinearScanEffect, value, frameNode);
459 }
460 
SetRingSweepingEffect(FrameNode * frameNode,bool value)461 void ProgressModelNG::SetRingSweepingEffect(FrameNode* frameNode, bool value)
462 {
463     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableRingScanEffect, value, frameNode);
464 }
465 
SetPaintShadow(FrameNode * frameNode,bool value)466 void ProgressModelNG::SetPaintShadow(FrameNode* frameNode, bool value)
467 {
468     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, PaintShadow, value, frameNode);
469 }
470 
SetProgressStatus(FrameNode * frameNode,ProgressStatus status)471 void ProgressModelNG::SetProgressStatus(FrameNode* frameNode, ProgressStatus status)
472 {
473     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ProgressStatus, status, frameNode);
474 }
475 
SetScaleCount(FrameNode * frameNode,int32_t value)476 void ProgressModelNG::SetScaleCount(FrameNode* frameNode, int32_t value)
477 {
478     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ScaleCount, value, frameNode);
479 }
480 
SetScaleWidth(FrameNode * frameNode,const Dimension & value)481 void ProgressModelNG::SetScaleWidth(FrameNode* frameNode, const Dimension& value)
482 {
483     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ScaleWidth, value, frameNode);
484 }
485 
SetBorderWidth(FrameNode * frameNode,const Dimension & value)486 void ProgressModelNG::SetBorderWidth(FrameNode* frameNode, const Dimension& value)
487 {
488     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BorderWidth, value, frameNode);
489 }
490 
SetBorderColor(FrameNode * frameNode,const Color & value)491 void ProgressModelNG::SetBorderColor(FrameNode* frameNode, const Color& value)
492 {
493     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BorderColor, value, frameNode);
494 }
495 
SetSweepingEffect(FrameNode * frameNode,bool value)496 void ProgressModelNG::SetSweepingEffect(FrameNode* frameNode, bool value)
497 {
498     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableScanEffect, value, frameNode);
499 }
500 
SetShowText(FrameNode * frameNode,bool value)501 void ProgressModelNG::SetShowText(FrameNode* frameNode, bool value)
502 {
503     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, EnableShowText, value, frameNode);
504 }
505 
SetText(FrameNode * frameNode,const std::optional<std::string> & value)506 void ProgressModelNG::SetText(FrameNode* frameNode, const std::optional<std::string>& value)
507 {
508     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
509     CHECK_NULL_VOID(textHost);
510     auto pattern = frameNode->GetPattern<ProgressPattern>();
511     CHECK_NULL_VOID(pattern);
512     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
513     CHECK_NULL_VOID(textLayoutProperty);
514     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
515     CHECK_NULL_VOID(progressPaintProperty);
516     std::string context = "";
517     if (!value.has_value()) {
518         auto maxValue = progressPaintProperty->GetMaxValue();
519         auto curValue = progressPaintProperty->GetValue();
520         if (maxValue.has_value() && curValue.has_value()) {
521             int32_t curPercent = curValue.value() * 100 / maxValue.value();
522             std::string number = std::to_string(curPercent) + "%";
523             bool isShowText = progressPaintProperty->GetEnableShowText().value_or(false);
524             if (!isShowText) {
525                 number = "";
526             }
527             textLayoutProperty->UpdateContent(number);
528             context = number;
529             pattern->SetTextFromUser(false);
530         }
531     } else {
532         textLayoutProperty->UpdateContent(value.value());
533         context = value.value();
534         pattern->SetTextFromUser(true);
535     }
536     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
537     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Text, context, frameNode);
538 }
539 
SetFontColor(FrameNode * frameNode,const Color & value)540 void ProgressModelNG::SetFontColor(FrameNode* frameNode, const Color& value)
541 {
542     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
543     CHECK_NULL_VOID(textHost);
544     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
545     CHECK_NULL_VOID(textLayoutProperty);
546     textLayoutProperty->UpdateTextColor(value);
547     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
548     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, TextColor, value, frameNode);
549 }
550 
SetFontSize(FrameNode * frameNode,const Dimension & value)551 void ProgressModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
552 {
553     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
554     CHECK_NULL_VOID(textHost);
555     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
556     CHECK_NULL_VOID(textLayoutProperty);
557     textLayoutProperty->UpdateFontSize(value);
558     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
559     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, TextSize, value, frameNode);
560 }
561 
SetFontWeight(FrameNode * frameNode,const FontWeight & value)562 void ProgressModelNG::SetFontWeight(FrameNode* frameNode, const FontWeight& value)
563 {
564     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
565     CHECK_NULL_VOID(textHost);
566     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
567     CHECK_NULL_VOID(textLayoutProperty);
568     textLayoutProperty->UpdateFontWeight(value);
569     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
570     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, FontWeight, value, frameNode);
571 }
572 
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)573 void ProgressModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
574 {
575     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
576     CHECK_NULL_VOID(textHost);
577     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
578     CHECK_NULL_VOID(textLayoutProperty);
579     textLayoutProperty->UpdateFontFamily(value);
580     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
581     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, FontFamily, value, frameNode);
582 }
583 
SetItalicFontStyle(FrameNode * frameNode,const Ace::FontStyle & value)584 void ProgressModelNG::SetItalicFontStyle(FrameNode* frameNode, const Ace::FontStyle& value)
585 {
586     auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
587     CHECK_NULL_VOID(textHost);
588     auto textLayoutProperty = textHost->GetLayoutProperty<TextLayoutProperty>();
589     CHECK_NULL_VOID(textLayoutProperty);
590     textLayoutProperty->UpdateItalicFontStyle(value);
591     textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
592     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ItalicFontStyle, value, frameNode);
593 }
594 
SetStrokeRadius(FrameNode * frameNode,const Dimension & value)595 void ProgressModelNG::SetStrokeRadius(FrameNode* frameNode, const Dimension& value)
596 {
597     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, StrokeRadius, value, frameNode);
598 }
599 
ResetStrokeRadius(FrameNode * frameNode)600 void ProgressModelNG::ResetStrokeRadius(FrameNode* frameNode)
601 {
602     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, StrokeRadius, PROPERTY_UPDATE_RENDER, frameNode);
603 }
604 
SetBackgroundColor(FrameNode * frameNode,const Color & value)605 void ProgressModelNG::SetBackgroundColor(FrameNode* frameNode, const Color& value)
606 {
607     auto pattern = frameNode->GetPattern<ProgressPattern>();
608     CHECK_NULL_VOID(pattern);
609     pattern->SetUserInitiatedBgColor(true);
610     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BackgroundColor, value, frameNode);
611 }
612 
GetValue(FrameNode * frameNode)613 double ProgressModelNG::GetValue(FrameNode* frameNode)
614 {
615     double value = 0;
616     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, Value, value, frameNode, value);
617     return value;
618 }
619 
GetColor(FrameNode * frameNode)620 Color ProgressModelNG::GetColor(FrameNode* frameNode)
621 {
622     Color value;
623     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, Color, value, frameNode, value);
624     return value;
625 }
626 
GetTotal(FrameNode * frameNode)627 double ProgressModelNG::GetTotal(FrameNode* frameNode)
628 {
629     double value = 100;
630     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, MaxValue, value, frameNode, value);
631     return value;
632 }
633 
GetType(FrameNode * frameNode)634 NG::ProgressType ProgressModelNG::GetType(FrameNode* frameNode)
635 {
636     NG::ProgressType value = ProgressType::LINEAR;
637     ACE_GET_NODE_PAINT_PROPERTY_WITH_DEFAULT_VALUE(ProgressPaintProperty, ProgressType, value, frameNode, value);
638     return value;
639 }
640 
SetBuilderFunc(FrameNode * frameNode,ProgressMakeCallback && makeFunc)641 void ProgressModelNG::SetBuilderFunc(FrameNode* frameNode, ProgressMakeCallback&& makeFunc)
642 {
643     CHECK_NULL_VOID(frameNode);
644     auto pattern = frameNode->GetPattern<ProgressPattern>();
645     CHECK_NULL_VOID(pattern);
646     pattern->SetBuilderFunc(std::move(makeFunc));
647 }
648 
ProgressInitialize(FrameNode * frameNode,double min,double value,double cachedValue,double max,NG::ProgressType type)649 void ProgressModelNG::ProgressInitialize(
650     FrameNode* frameNode, double min, double value, double cachedValue, double max, NG::ProgressType type)
651 {
652     auto pattern = frameNode->GetPattern<ProgressPattern>();
653     CHECK_NULL_VOID(pattern);
654 
655     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Value, value, frameNode);
656     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, MaxValue, max, frameNode);
657     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ProgressType, type, frameNode);
658     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ProgressLayoutProperty, Type, type, frameNode);
659     auto pipeline = PipelineBase::GetCurrentContext();
660     CHECK_NULL_VOID(pipeline);
661     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
662         return;
663     }
664     RefPtr<ProgressTheme> theme = pipeline->GetTheme<ProgressTheme>(frameNode->GetThemeScopeId());
665     auto progressFocusNode = frameNode->GetFocusHub();
666     CHECK_NULL_VOID(progressFocusNode);
667     if (type == ProgressType::CAPSULE) {
668         progressFocusNode->SetFocusable(true);
669     } else {
670         progressFocusNode->SetFocusable(false);
671     }
672 
673     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeInputEventHub();
674     CHECK_NULL_VOID(eventHub);
675     if (type == ProgressType::CAPSULE) {
676         if (frameNode->GetChildren().empty()) {
677             auto textNode = FrameNode::CreateFrameNode(
678                 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
679             textNode->SetInternal();
680             textNode->MountToParent(AceType::Claim(reinterpret_cast<FrameNode*>(frameNode)));
681         }
682         auto textHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(0));
683         CHECK_NULL_VOID(textHost);
684         SetTextDefaultStyle(textHost, value, max);
685         textHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
686         eventHub->SetHoverEffect(HoverEffectType::SCALE);
687         eventHub->SetHoverEffect(static_cast<HoverEffectType>(theme->GetCapsuleHoverEffectType()));
688     } else {
689         if (!frameNode->GetChildren().empty()) {
690             frameNode->RemoveChildAtIndex(0);
691         }
692         eventHub->SetHoverEffect(HoverEffectType::NONE);
693     }
694     if (frameNode->GetThemeScopeId()) {
695         if (type == ProgressType::LINEAR || type == ProgressType::MOON) {
696             ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Color, theme->GetTrackSelectedColor());
697         } else if (type == ProgressType::CAPSULE) {
698             ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Color, theme->GetCapsuleSelectColor());
699         }
700         if (type != ProgressType::CAPSULE) {
701             ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BackgroundColor, theme->GetTrackBgColor());
702         }
703     }
704 }
705 
SetBorderRadius(const Dimension & value)706 void ProgressModelNG::SetBorderRadius(const Dimension& value)
707 {
708     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BorderRadius, value);
709 }
710 
ResetBorderRadius()711 void ProgressModelNG::ResetBorderRadius()
712 {
713     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, BorderRadius, PROPERTY_UPDATE_RENDER);
714 }
715 
SetBorderRadius(FrameNode * frameNode,const Dimension & value)716 void ProgressModelNG::SetBorderRadius(FrameNode* frameNode, const Dimension& value)
717 {
718     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, BorderRadius, value, frameNode);
719 }
720 
ResetBorderRadius(FrameNode * frameNode)721 void ProgressModelNG::ResetBorderRadius(FrameNode* frameNode)
722 {
723     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, BorderRadius, PROPERTY_UPDATE_RENDER, frameNode);
724 }
725 
ResetColor(FrameNode * frameNode)726 void ProgressModelNG::ResetColor(FrameNode* frameNode)
727 {
728     CHECK_NULL_VOID(frameNode);
729     auto pattern = frameNode->GetPattern<ProgressPattern>();
730     CHECK_NULL_VOID(pattern);
731     pattern->SetUserInitiatedColor(false);
732     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER, frameNode);
733 }
734 
ResetBackgroundColor(FrameNode * frameNode)735 void ProgressModelNG::ResetBackgroundColor(FrameNode* frameNode)
736 {
737     auto pattern = frameNode->GetPattern<ProgressPattern>();
738     CHECK_NULL_VOID(pattern);
739     pattern->SetUserInitiatedBgColor(false);
740     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, BackgroundColor, PROPERTY_UPDATE_RENDER, frameNode);
741 }
742 
ResetGradientColor(FrameNode * frameNode)743 void ProgressModelNG::ResetGradientColor(FrameNode* frameNode)
744 {
745     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, GradientColor, PROPERTY_UPDATE_RENDER, frameNode);
746 }
747 
isCapsule() const748 bool ProgressModelNG::isCapsule() const
749 {
750     const bool result = false;
751     auto frameNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
752     CHECK_NULL_RETURN(frameNode, result);
753     auto progressPaintProperty = frameNode->GetPaintProperty<NG::ProgressPaintProperty>();
754     CHECK_NULL_RETURN(progressPaintProperty, result);
755     const auto& progressType = progressPaintProperty->GetProgressType();
756     return progressType == ProgressType::CAPSULE;
757 }
758 
SetModifierInitiatedColor(FrameNode * frameNode,bool value)759 void ProgressModelNG::SetModifierInitiatedColor(FrameNode* frameNode, bool value)
760 {
761     CHECK_NULL_VOID(frameNode);
762     auto pattern = frameNode->GetPattern<ProgressPattern>();
763     CHECK_NULL_VOID(pattern);
764     pattern->IsModifierInitiatedColor(value);
765 }
766 
SetModifierInitiatedBgColor(FrameNode * frameNode,bool value)767 void ProgressModelNG::SetModifierInitiatedBgColor(FrameNode* frameNode, bool value)
768 {
769     CHECK_NULL_VOID(frameNode);
770     auto pattern = frameNode->GetPattern<ProgressPattern>();
771     CHECK_NULL_VOID(pattern);
772     pattern->IsModifierInitiatedBgColor(value);
773 }
774 
SetProgressColor(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)775 void ProgressModelNG::SetProgressColor(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
776 {
777     CHECK_NULL_VOID(frameNode);
778     auto pattern = frameNode->GetPattern<ProgressPattern>();
779     std::string key = "progress.color";
780     pattern->RemoveResObj(key);
781     CHECK_NULL_VOID(resObj);
782     auto&& updateFunc = [patternWeak = AceType::WeakClaim(AceType::RawPtr(pattern)), key,
783                             weak = AceType::WeakClaim(frameNode)](
784                             const RefPtr<ResourceObject>& resObj, bool isFirstLoad = false) {
785         auto frameNode = weak.Upgrade();
786         CHECK_NULL_VOID(frameNode);
787         auto pattern = patternWeak.Upgrade();
788         CHECK_NULL_VOID(pattern);
789         Color result;
790         NG::Gradient gradient;
791         Color endColor;
792         Color beginColor;
793         if (!ResourceParseUtils::ParseResColor(resObj, result)) {
794             auto pipeline = PipelineBase::GetCurrentContext();
795             CHECK_NULL_VOID(pipeline);
796             auto pops = frameNode->GetPaintProperty<ProgressPaintProperty>();
797             CHECK_NULL_VOID(pops);
798             const auto& type = pops->GetProgressType();
799             auto progressTheme = pipeline->GetTheme<ProgressTheme>();
800             CHECK_NULL_VOID(progressTheme);
801             endColor = progressTheme->GetRingProgressEndSideColor();
802             beginColor = progressTheme->GetRingProgressBeginSideColor();
803             result = (type == ProgressType::CAPSULE) ? progressTheme->GetCapsuleParseFailedSelectColor()
804                                                      : progressTheme->GetTrackParseFailedSelectedColor();
805 
806         } else {
807             endColor = result;
808             beginColor = result;
809         }
810 
811         NG::GradientColor endSideColor;
812         NG::GradientColor beginSideColor;
813         endSideColor.SetLinearColor(LinearColor(endColor));
814         endSideColor.SetDimension(Dimension(0.0f));
815         beginSideColor.SetLinearColor(LinearColor(beginColor));
816         beginSideColor.SetDimension(Dimension(1.0f));
817         gradient.AddColor(endSideColor);
818         gradient.AddColor(beginSideColor);
819         pattern->UpdateGradientColor(gradient, isFirstLoad);
820         pattern->UpdateColor(result, isFirstLoad);
821     };
822     pattern->AddResObj(key, resObj, std::move(updateFunc));
823 }
824 
SetLSStrokeWidth(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)825 void ProgressModelNG::SetLSStrokeWidth(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
826 {
827     CHECK_NULL_VOID(frameNode);
828     auto pattern = frameNode->GetPattern<ProgressPattern>();
829     CHECK_NULL_VOID(pattern);
830     std::string key = "progress.strokeWidth";
831     pattern->RemoveResObj(key);
832     CHECK_NULL_VOID(resObj);
833     auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
834                             const RefPtr<ResourceObject>& resObj, bool isFirstLoad = false) {
835         auto pattern = weak.Upgrade();
836         CHECK_NULL_VOID(pattern);
837         auto node = pattern->GetHost();
838         CHECK_NULL_VOID(node);
839         auto pipeline = PipelineBase::GetCurrentContext();
840         CHECK_NULL_VOID(pipeline);
841         auto progressTheme = pipeline->GetTheme<ProgressTheme>();
842         CHECK_NULL_VOID(progressTheme);
843         CalcDimension width;
844         bool parseOK = false;
845         if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
846             parseOK = ResourceParseUtils::ParseResDimensionVpNG(resObj, width);
847         } else {
848             parseOK = ResourceParseUtils::ParseResDimensionVp(resObj, width);
849         }
850         if (!parseOK || LessOrEqual(width.Value(), 0.0f) || width.Unit() == DimensionUnit::PERCENT) {
851             width = progressTheme->GetTrackThickness();
852         }
853         SetStrokeWidth(AceType::RawPtr(node), width);
854     };
855     pattern->AddResObj(key, resObj, std::move(updateFunc));
856 }
857 
SetLSSweepingEffect(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)858 void ProgressModelNG::SetLSSweepingEffect(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
859 {
860     CHECK_NULL_VOID(frameNode);
861     auto pattern = frameNode->GetPattern<ProgressPattern>();
862     CHECK_NULL_VOID(pattern);
863     std::string key = "progress.sweepingEffect";
864     pattern->RemoveResObj(key);
865     CHECK_NULL_VOID(resObj);
866     auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
867                             const RefPtr<ResourceObject>& resourceObj, bool isFirstLoad = false) {
868         auto pattern = weak.Upgrade();
869         CHECK_NULL_VOID(pattern);
870         auto hostNode = pattern->GetHost();
871         CHECK_NULL_VOID(hostNode);
872         bool value = false;
873         if (!ResourceParseUtils::ParseResBool(resourceObj, value)) {
874             value = false;
875         }
876         SetLinearSweepingEffect(AceType::RawPtr(hostNode), value);
877     };
878     pattern->AddResObj(key, resObj, std::move(updateFunc));
879 }
880 
SetLSStrokeRadius(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)881 void ProgressModelNG::SetLSStrokeRadius(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
882 {
883     CHECK_NULL_VOID(frameNode);
884     auto pattern = frameNode->GetPattern<ProgressPattern>();
885     CHECK_NULL_VOID(pattern);
886     std::string key = "progress.strokeRadius";
887     pattern->RemoveResObj(key);
888     CHECK_NULL_VOID(resObj);
889     auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
890                             const RefPtr<ResourceObject>& resObj, bool isFirstLoad = false) {
891         auto pattern = weak.Upgrade();
892         CHECK_NULL_VOID(pattern);
893         auto hostNode = pattern->GetHost();
894         CHECK_NULL_VOID(hostNode);
895         CalcDimension radius;
896         bool parseOK = false;
897         parseOK = ResourceParseUtils::ParseResDimensionVpNG(resObj, radius);
898         if (!parseOK || LessOrEqual(radius.Value(), 0.0f) || radius.Unit() == DimensionUnit::PERCENT) {
899             ResetStrokeRadius(AceType::RawPtr(hostNode));
900         } else {
901             SetStrokeRadius(AceType::RawPtr(hostNode), radius);
902         }
903     };
904     pattern->AddResObj(key, resObj, std::move(updateFunc));
905 }
906 
SetSmoothResEffect(FrameNode * frameNode,const RefPtr<ResourceObject> & resourceObject)907 void ProgressModelNG::SetSmoothResEffect(FrameNode* frameNode, const RefPtr<ResourceObject>& resourceObject)
908 {
909     CHECK_NULL_VOID(frameNode);
910     auto pattern = frameNode->GetPattern<ProgressPattern>();
911     CHECK_NULL_VOID(pattern);
912     std::string key = "progress.smoothEffect";
913     pattern->RemoveResObj(key);
914     CHECK_NULL_VOID(resourceObject);
915     auto updateFunction = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
916                               const RefPtr<ResourceObject>& resourceObject, bool isFirstLoad = false) {
917         auto pattern = weak.Upgrade();
918         CHECK_NULL_VOID(pattern);
919         auto hostNode = pattern->GetHost();
920         CHECK_NULL_VOID(hostNode);
921         bool smoothEffectEnabled = true;
922         if (!ResourceParseUtils::ParseResBool(resourceObject, smoothEffectEnabled)) {
923             smoothEffectEnabled = true;
924         }
925         SetSmoothEffect(AceType::RawPtr(hostNode), smoothEffectEnabled);
926     };
927     pattern->AddResObj(key, resourceObject, std::move(updateFunction));
928 }
929 
SetRingStrokeWidth(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)930 void ProgressModelNG::SetRingStrokeWidth(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
931 {
932     CHECK_NULL_VOID(frameNode);
933     auto pattern = frameNode->GetPattern<ProgressPattern>();
934     CHECK_NULL_VOID(pattern);
935 
936     const std::string key = "progress.ring.strokeWidth";
937     pattern->RemoveResObj(key);
938     CHECK_NULL_VOID(resObj);
939     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
940                           const RefPtr<ResourceObject>& resourceObj, bool isFirstLoad = false) {
941         auto pattern = weak.Upgrade();
942         CHECK_NULL_VOID(pattern);
943         auto node = pattern->GetHost();
944         CHECK_NULL_VOID(node);
945         auto pipeline = PipelineBase::GetCurrentContext();
946         CHECK_NULL_VOID(pipeline);
947         auto progressTheme = pipeline->GetTheme<ProgressTheme>();
948         CHECK_NULL_VOID(progressTheme);
949 
950         CalcDimension strokeWidth;
951         bool parseOK = false;
952         if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
953             parseOK = ResourceParseUtils::ParseResDimensionVpNG(resourceObj, strokeWidth);
954         } else {
955             parseOK = ResourceParseUtils::ParseResDimensionVp(resourceObj, strokeWidth);
956         }
957         if (!parseOK || LessOrEqual(strokeWidth.Value(), 0.0f) || strokeWidth.Unit() == DimensionUnit::PERCENT) {
958             strokeWidth = progressTheme->GetTrackThickness();
959         }
960         SetStrokeWidth(AceType::RawPtr(node), strokeWidth);
961     };
962     pattern->AddResObj(key, resObj, std::move(updateFunc));
963 }
964 
SetRingShadow(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)965 void ProgressModelNG::SetRingShadow(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
966 {
967     CHECK_NULL_VOID(frameNode);
968     auto pattern = frameNode->GetPattern<ProgressPattern>();
969     CHECK_NULL_VOID(pattern);
970 
971     const std::string key = "progress.ring.shadow";
972     pattern->RemoveResObj(key);
973     CHECK_NULL_VOID(resObj);
974     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
975                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
976         auto pattern = weak.Upgrade();
977         CHECK_NULL_VOID(pattern);
978         auto node = pattern->GetHost();
979         CHECK_NULL_VOID(node);
980         bool shadow = false;
981         if (ResourceParseUtils::ParseResBool(obj, shadow)) {
982             SetPaintShadow(AceType::RawPtr(node), shadow);
983         } else {
984             SetPaintShadow(AceType::RawPtr(node), false);
985         }
986     };
987     pattern->AddResObj(key, resObj, std::move(updateFunc));
988 }
989 
SetRingStatus(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)990 void ProgressModelNG::SetRingStatus(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
991 {
992     CHECK_NULL_VOID(frameNode);
993     auto pattern = frameNode->GetPattern<ProgressPattern>();
994     CHECK_NULL_VOID(pattern);
995     const std::string key = "progress.ring.status";
996     pattern->RemoveResObj(key);
997     CHECK_NULL_VOID(resObj);
998     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
999                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1000         auto pattern = weak.Upgrade();
1001         CHECK_NULL_VOID(pattern);
1002         auto node = pattern->GetHost();
1003         CHECK_NULL_VOID(node);
1004         std::string statusStr;
1005         NG::ProgressStatus status = NG::ProgressStatus::PROGRESSING;
1006         if (ResourceParseUtils::ParseResString(obj, statusStr)) {
1007             status = (statusStr == "LOADING" ? NG::ProgressStatus::LOADING : NG::ProgressStatus::PROGRESSING);
1008         }
1009         SetProgressStatus(AceType::RawPtr(node), status);
1010     };
1011     pattern->AddResObj(key, resObj, std::move(updateFunc));
1012 }
1013 
SetRingSweepingEffect(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1014 void ProgressModelNG::SetRingSweepingEffect(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1015 {
1016     CHECK_NULL_VOID(frameNode);
1017     auto pattern = frameNode->GetPattern<ProgressPattern>();
1018     CHECK_NULL_VOID(pattern);
1019 
1020     const std::string key = "progress.ring.sweepingEffect";
1021     pattern->RemoveResObj(key);
1022     CHECK_NULL_VOID(resObj);
1023     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1024                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1025         auto pattern = weak.Upgrade();
1026         CHECK_NULL_VOID(pattern);
1027         auto node = pattern->GetHost();
1028         CHECK_NULL_VOID(node);
1029         bool enable = false;
1030         if (!ResourceParseUtils::ParseResBool(obj, enable)) {
1031             enable = false;
1032         }
1033         SetRingSweepingEffect(AceType::RawPtr(node), enable);
1034     };
1035     pattern->AddResObj(key, resObj, std::move(updateFunc));
1036 }
1037 
SetCapsuleBorderWidth(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1038 void ProgressModelNG::SetCapsuleBorderWidth(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1039 {
1040     CHECK_NULL_VOID(frameNode);
1041     auto pattern = frameNode->GetPattern<ProgressPattern>();
1042     CHECK_NULL_VOID(pattern);
1043     const std::string key = "progress.capsule.borderWidth";
1044     pattern->RemoveResObj(key);
1045     CHECK_NULL_VOID(resObj);
1046     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1047                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1048         auto pattern = weak.Upgrade();
1049         CHECK_NULL_VOID(pattern);
1050         auto node = pattern->GetHost();
1051         CHECK_NULL_VOID(node);
1052         auto pipeline = PipelineBase::GetCurrentContext();
1053         CHECK_NULL_VOID(pipeline);
1054         auto progressTheme = pipeline->GetTheme<ProgressTheme>();
1055         CHECK_NULL_VOID(progressTheme);
1056         CalcDimension width;
1057         bool parseOK = false;
1058         parseOK = ResourceParseUtils::ParseResDimensionVpNG(obj, width);
1059         if (!parseOK || LessNotEqual(width.Value(), 0.0f) || width.Unit() == DimensionUnit::PERCENT) {
1060             width = progressTheme->GetBorderWidth();
1061         }
1062         SetBorderWidth(AceType::RawPtr(node), width);
1063     };
1064     pattern->AddResObj(key, resObj, std::move(updateFunc));
1065 }
1066 
SetCapsuleBorderColor(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1067 void ProgressModelNG::SetCapsuleBorderColor(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1068 {
1069     CHECK_NULL_VOID(frameNode);
1070     auto pattern = frameNode->GetPattern<ProgressPattern>();
1071     CHECK_NULL_VOID(pattern);
1072 
1073     const std::string resourceKey = "progress.capsule.borderColor";
1074     pattern->RemoveResObj(resourceKey);
1075     CHECK_NULL_VOID(resObj);
1076     auto updateResourceFunction = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), resourceKey](
1077                                       const RefPtr<ResourceObject>& resourceObject, bool isFirstLoad = false) {
1078         auto pattern = weak.Upgrade();
1079         CHECK_NULL_VOID(pattern);
1080         auto hostNode = pattern->GetHost();
1081         CHECK_NULL_VOID(hostNode);
1082         auto pipelineContext = PipelineBase::GetCurrentContext();
1083         CHECK_NULL_VOID(pipelineContext);
1084         auto progressTheme = pipelineContext->GetTheme<ProgressTheme>();
1085         CHECK_NULL_VOID(progressTheme);
1086 
1087         Color borderColor;
1088         if (ResourceParseUtils::ParseResColor(resourceObject, borderColor)) {
1089             SetBorderColor(AceType::RawPtr(hostNode), borderColor);
1090         } else {
1091             SetBorderColor(AceType::RawPtr(hostNode), progressTheme->GetBorderColor());
1092         }
1093     };
1094     pattern->AddResObj(resourceKey, resObj, std::move(updateResourceFunction));
1095 }
1096 
SetCapsuleSweepingEffect(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1097 void ProgressModelNG::SetCapsuleSweepingEffect(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1098 {
1099     CHECK_NULL_VOID(frameNode);
1100     auto pattern = frameNode->GetPattern<ProgressPattern>();
1101     CHECK_NULL_VOID(pattern);
1102     const std::string key = "progress.capsule.sweepingEffect";
1103     pattern->RemoveResObj(key);
1104     CHECK_NULL_VOID(resObj);
1105     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1106                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1107         auto pattern = weak.Upgrade();
1108         CHECK_NULL_VOID(pattern);
1109         auto node = pattern->GetHost();
1110         CHECK_NULL_VOID(node);
1111         bool enableScanEffect = false;
1112         if (!ResourceParseUtils::ParseResBool(obj, enableScanEffect)) {
1113             enableScanEffect = false;
1114         }
1115         SetSweepingEffect(AceType::RawPtr(node), enableScanEffect);
1116     };
1117     pattern->AddResObj(key, resObj, std::move(updateFunc));
1118 }
1119 
SetShowDefaultPercentage(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1120 void ProgressModelNG::SetShowDefaultPercentage(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1121 {
1122     CHECK_NULL_VOID(frameNode);
1123     auto pattern = frameNode->GetPattern<ProgressPattern>();
1124     CHECK_NULL_VOID(pattern);
1125     const std::string key = "progress.capsule.showDefaultPercentage";
1126     pattern->RemoveResObj(key);
1127     CHECK_NULL_VOID(resObj);
1128     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1129                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1130         auto pattern = weak.Upgrade();
1131         CHECK_NULL_VOID(pattern);
1132         auto node = pattern->GetHost();
1133         CHECK_NULL_VOID(node);
1134         bool show = false;
1135         if (!ResourceParseUtils::ParseResBool(obj, show)) {
1136             show = false;
1137         }
1138         SetShowText(AceType::RawPtr(node), show);
1139     };
1140     pattern->AddResObj(key, resObj, std::move(updateFunc));
1141 }
1142 
SetFontColorResource(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1143 void ProgressModelNG::SetFontColorResource(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1144 {
1145     CHECK_NULL_VOID(frameNode);
1146     auto pattern = frameNode->GetPattern<ProgressPattern>();
1147     CHECK_NULL_VOID(pattern);
1148     const std::string key = "progress.fontColor";
1149     pattern->RemoveResObj(key);
1150     CHECK_NULL_VOID(resObj);
1151     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1152                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1153         auto pattern = weak.Upgrade();
1154         CHECK_NULL_VOID(pattern);
1155         auto node = pattern->GetHost();
1156         CHECK_NULL_VOID(node);
1157         Color color;
1158         if (ResourceParseUtils::ParseResColor(obj, color)) {
1159             SetFontColor(AceType::RawPtr(node), color);
1160         } else {
1161             auto pipeline = PipelineBase::GetCurrentContext();
1162             CHECK_NULL_VOID(pipeline);
1163             auto theme = pipeline->GetTheme<TextTheme>();
1164             CHECK_NULL_VOID(theme);
1165             SetFontColor(AceType::RawPtr(node), theme->GetTextStyle().GetTextColor());
1166         }
1167     };
1168     pattern->AddResObj(key, resObj, std::move(updateFunc));
1169 }
1170 
SetBackgroundColorResource(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1171 void ProgressModelNG::SetBackgroundColorResource(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1172 {
1173     CHECK_NULL_VOID(frameNode);
1174     auto pattern = frameNode->GetPattern<ProgressPattern>();
1175     CHECK_NULL_VOID(pattern);
1176     const std::string key = "progress.backgroundColor";
1177     pattern->RemoveResObj(key);
1178     CHECK_NULL_VOID(resObj);
1179     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1180                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1181         auto pattern = weak.Upgrade();
1182         CHECK_NULL_VOID(pattern);
1183         auto node = pattern->GetHost();
1184         CHECK_NULL_VOID(node);
1185         Color color;
1186         if (ResourceParseUtils::ParseResColor(obj, color)) {
1187             SetBackgroundColor(AceType::RawPtr(node), color);
1188         } else {
1189             auto pipeline = PipelineBase::GetCurrentContext();
1190             CHECK_NULL_VOID(pipeline);
1191             auto theme = pipeline->GetTheme<ProgressTheme>();
1192             CHECK_NULL_VOID(theme);
1193             auto paintProp = node->GetPaintProperty<ProgressPaintProperty>();
1194             auto type = paintProp->GetProgressType().value_or(ProgressType::LINEAR);
1195             Color bg = (type == ProgressType::CAPSULE)
1196                            ? theme->GetCapsuleBgColor()
1197                            : (type == ProgressType::RING ? theme->GetRingProgressBgColor() : theme->GetTrackBgColor());
1198             SetBackgroundColor(AceType::RawPtr(node), bg);
1199         }
1200     };
1201     pattern->AddResObj(key, resObj, std::move(updateFunc));
1202 }
1203 
SetFontWeightResource(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1204 void ProgressModelNG::SetFontWeightResource(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1205 {
1206     CHECK_NULL_VOID(frameNode);
1207     auto pattern = frameNode->GetPattern<ProgressPattern>();
1208     CHECK_NULL_VOID(pattern);
1209 
1210     const std::string key = "progress.fontWeight";
1211     pattern->RemoveResObj(key);
1212     CHECK_NULL_VOID(resObj);
1213     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1214                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1215         auto pattern = weak.Upgrade();
1216         CHECK_NULL_VOID(pattern);
1217         auto node = pattern->GetHost();
1218         CHECK_NULL_VOID(node);
1219         std::string weightStr;
1220         if (ResourceParseUtils::ParseResString(obj, weightStr)) {
1221             auto weight = StringUtils::StringToFontWeight(weightStr, FontWeight::NORMAL);
1222             SetFontWeight(AceType::RawPtr(node), weight);
1223         } else {
1224             auto pipeline = PipelineBase::GetCurrentContext();
1225             CHECK_NULL_VOID(pipeline);
1226             auto theme = pipeline->GetTheme<TextTheme>();
1227             CHECK_NULL_VOID(theme);
1228             SetFontWeight(AceType::RawPtr(node), theme->GetTextStyle().GetFontWeight());
1229         }
1230     };
1231     pattern->AddResObj(key, resObj, std::move(updateFunc));
1232 }
SetRSStrokeWidth(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1233 void ProgressModelNG::SetRSStrokeWidth(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1234 {
1235     CHECK_NULL_VOID(frameNode);
1236     auto pattern = frameNode->GetPattern<ProgressPattern>();
1237     CHECK_NULL_VOID(pattern);
1238     std::string key = "progress.style.strokeWidth";
1239     pattern->RemoveResObj(key);
1240     CHECK_NULL_VOID(resObj);
1241     auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1242                             const RefPtr<ResourceObject>& resObj, bool isFirstLoad = false) {
1243         auto pattern = weak.Upgrade();
1244         CHECK_NULL_VOID(pattern);
1245         auto node = pattern->GetHost();
1246         CHECK_NULL_VOID(node);
1247         auto pipeline = PipelineBase::GetCurrentContext();
1248         CHECK_NULL_VOID(pipeline);
1249         auto progressTheme = pipeline->GetTheme<ProgressTheme>();
1250         CHECK_NULL_VOID(progressTheme);
1251         CalcDimension width;
1252         bool parseOK = false;
1253         if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
1254             parseOK = ResourceParseUtils::ParseResDimensionVpNG(resObj, width);
1255         } else {
1256             parseOK = ResourceParseUtils::ParseResDimensionVp(resObj, width);
1257         }
1258         if (!parseOK || LessOrEqual(width.Value(), 0.0f) || width.Unit() == DimensionUnit::PERCENT) {
1259             width = progressTheme->GetTrackThickness();
1260         }
1261         SetStrokeWidth(AceType::RawPtr(node), width);
1262     };
1263     pattern->AddResObj(key, resObj, std::move(updateFunc));
1264 }
1265 
SetRSScaleWidth(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1266 void ProgressModelNG::SetRSScaleWidth(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1267 {
1268     CHECK_NULL_VOID(frameNode);
1269     auto pattern = frameNode->GetPattern<ProgressPattern>();
1270     CHECK_NULL_VOID(pattern);
1271     std::string key = "progress.style.scaleWidth";
1272     pattern->RemoveResObj(key);
1273     CHECK_NULL_VOID(resObj);
1274     auto&& updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1275                             const RefPtr<ResourceObject>& resObj, bool isFirstLoad = false) {
1276         auto pattern = weak.Upgrade();
1277         CHECK_NULL_VOID(pattern);
1278         auto node = pattern->GetHost();
1279         CHECK_NULL_VOID(node);
1280         auto pipeline = PipelineBase::GetCurrentContext();
1281         CHECK_NULL_VOID(pipeline);
1282         auto progressTheme = pipeline->GetTheme<ProgressTheme>();
1283         CHECK_NULL_VOID(progressTheme);
1284         auto progressPaintProperty = node->GetLayoutProperty<NG::ProgressLayoutProperty>();
1285         CHECK_NULL_VOID(progressPaintProperty);
1286         auto strokeWidthDimension =
1287             progressPaintProperty->GetStrokeWidth().value_or(progressTheme->GetTrackThickness());
1288         CalcDimension width;
1289         bool parseOK = false;
1290         if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
1291             parseOK = ResourceParseUtils::ParseResDimensionVpNG(resObj, width);
1292         } else {
1293             parseOK = ResourceParseUtils::ParseResDimensionVp(resObj, width);
1294         }
1295         if (!parseOK || LessOrEqual(width.Value(), 0.0f) || (width.Value() > strokeWidthDimension.Value()) ||
1296             width.Unit() == DimensionUnit::PERCENT) {
1297             width = progressTheme->GetScaleWidth();
1298         }
1299         SetScaleWidth(AceType::RawPtr(node), width);
1300     };
1301     pattern->AddResObj(key, resObj, std::move(updateFunc));
1302 }
1303 
SetTextResource(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1304 void ProgressModelNG::SetTextResource(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1305 {
1306     CHECK_NULL_VOID(frameNode);
1307     auto pattern = frameNode->GetPattern<ProgressPattern>();
1308     CHECK_NULL_VOID(pattern);
1309     const std::string key = "progress.text";
1310     pattern->RemoveResObj(key);
1311     CHECK_NULL_VOID(resObj);
1312     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1313                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1314         auto pattern = weak.Upgrade();
1315         CHECK_NULL_VOID(pattern);
1316         auto node = pattern->GetHost();
1317         CHECK_NULL_VOID(node);
1318         std::string text;
1319         if (ResourceParseUtils::ParseResString(obj, text)) {
1320             SetText(AceType::RawPtr(node), text);
1321         } else {
1322             SetText(AceType::RawPtr(node), std::nullopt);
1323         }
1324     };
1325     pattern->AddResObj(key, resObj, std::move(updateFunc));
1326 }
1327 
SetFontSizeResource(FrameNode * frameNode,const RefPtr<ResourceObject> & resObj)1328 void ProgressModelNG::SetFontSizeResource(FrameNode* frameNode, const RefPtr<ResourceObject>& resObj)
1329 {
1330     CHECK_NULL_VOID(frameNode);
1331     auto pattern = frameNode->GetPattern<ProgressPattern>();
1332     CHECK_NULL_VOID(pattern);
1333     const std::string key = "progress.fontSize";
1334     pattern->RemoveResObj(key);
1335     CHECK_NULL_VOID(resObj);
1336     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), key](
1337                           const RefPtr<ResourceObject>& obj, bool isFirstLoad = false) {
1338         auto pattern = weak.Upgrade();
1339         CHECK_NULL_VOID(pattern);
1340         auto node = pattern->GetHost();
1341         CHECK_NULL_VOID(node);
1342         CalcDimension fontSize;
1343         bool sizeState = false;
1344         sizeState = ResourceParseUtils::ParseResDimensionNG(obj, fontSize, DimensionUnit::FP);
1345         if (!sizeState || LessNotEqual(fontSize.Value(), 0.0f) || fontSize.Unit() == DimensionUnit::PERCENT) {
1346             auto pipeline = PipelineBase::GetCurrentContext();
1347             CHECK_NULL_VOID(pipeline);
1348             auto progressTheme = pipeline->GetTheme<ProgressTheme>();
1349             CHECK_NULL_VOID(progressTheme);
1350             fontSize = progressTheme->GetTextSize();
1351         }
1352         SetFontSize(AceType::RawPtr(node), fontSize);
1353     };
1354     pattern->AddResObj(key, resObj, std::move(updateFunc));
1355 }
1356 
SetCapsuleStyleFontColor(bool value)1357 void ProgressModelNG::SetCapsuleStyleFontColor(bool value)
1358 {
1359     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, CapsuleStyleFontColorSetByUser, value);
1360 }
1361 
SetCapsuleStyle(bool value)1362 void ProgressModelNG::SetCapsuleStyle(bool value)
1363 {
1364     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, CapsuleStyleSetByUser, value);
1365 }
1366 
SetCapsuleStyle(FrameNode * frameNode,bool value)1367 void ProgressModelNG::SetCapsuleStyle(FrameNode* frameNode, bool value)
1368 {
1369     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, CapsuleStyleSetByUser, value, frameNode);
1370 }
1371 
SetCapsuleStyleFontColor(FrameNode * frameNode,bool value)1372 void ProgressModelNG::SetCapsuleStyleFontColor(FrameNode* frameNode, bool value)
1373 {
1374     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, CapsuleStyleFontColorSetByUser, value, frameNode);
1375 }
1376 
SetGradientColorByUser(bool value)1377 void ProgressModelNG::SetGradientColorByUser(bool value)
1378 {
1379     ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, value);
1380 }
1381 
SetGradientColorByUser(FrameNode * frameNode,bool value)1382 void ProgressModelNG::SetGradientColorByUser(FrameNode* frameNode, bool value)
1383 {
1384     ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, value, frameNode);
1385 }
1386 
CreateWithResourceObj(JsProgressResourceType type,const RefPtr<ResourceObject> & resObj)1387 void ProgressModelNG::CreateWithResourceObj(JsProgressResourceType type, const RefPtr<ResourceObject>& resObj)
1388 {
1389     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1390     CHECK_NULL_VOID(frameNode);
1391     CreateWithResourceObj(frameNode, type, resObj);
1392 }
1393 
CreateLSOrRingOrCapsuleWithResourceObj(FrameNode * frameNode,JsProgressResourceType type,const RefPtr<ResourceObject> & resObj)1394 void ProgressModelNG::CreateLSOrRingOrCapsuleWithResourceObj(
1395     FrameNode* frameNode, JsProgressResourceType type, const RefPtr<ResourceObject>& resObj)
1396 {
1397     switch (type) {
1398         case JsProgressResourceType::LSStrokeWidth:
1399             SetLSStrokeWidth(frameNode, resObj);
1400             break;
1401         case JsProgressResourceType::LSSweepingEffect:
1402             SetLSSweepingEffect(frameNode, resObj);
1403             break;
1404         case JsProgressResourceType::LSStrokeRadius:
1405             SetLSStrokeRadius(frameNode, resObj);
1406             break;
1407         case JsProgressResourceType::RingStrokeWidth:
1408             SetRingStrokeWidth(frameNode, resObj);
1409             break;
1410         case JsProgressResourceType::RingShadow:
1411             SetRingShadow(frameNode, resObj);
1412             break;
1413         case JsProgressResourceType::RingStatus:
1414             SetRingStatus(frameNode, resObj);
1415             break;
1416         case JsProgressResourceType::RingSweepingEffect:
1417             SetRingSweepingEffect(frameNode, resObj);
1418             break;
1419         case JsProgressResourceType::CapsuleBorderWidth:
1420             SetCapsuleBorderWidth(frameNode, resObj);
1421             break;
1422         case JsProgressResourceType::CapsuleBorderColor:
1423             SetCapsuleBorderColor(frameNode, resObj);
1424             break;
1425         case JsProgressResourceType::CapsuleSweepingEffect:
1426             SetCapsuleSweepingEffect(frameNode, resObj);
1427             break;
1428         default:
1429             break;
1430     }
1431 }
1432 
CreateWithResourceObj(FrameNode * frameNode,JsProgressResourceType type,const RefPtr<ResourceObject> & resObj)1433 void ProgressModelNG::CreateWithResourceObj(
1434     FrameNode* frameNode, JsProgressResourceType type, const RefPtr<ResourceObject>& resObj)
1435 {
1436     switch (type) {
1437         case JsProgressResourceType::COLOR:
1438             SetProgressColor(frameNode, resObj);
1439             break;
1440         case JsProgressResourceType::SmoothEffect:
1441             SetSmoothResEffect(frameNode, resObj);
1442             break;
1443         case JsProgressResourceType::ShowDefaultPercentage:
1444             SetShowDefaultPercentage(frameNode, resObj);
1445             break;
1446         case JsProgressResourceType::FontColor:
1447             SetFontColorResource(frameNode, resObj);
1448             break;
1449         case JsProgressResourceType::BackgroundColor:
1450             SetBackgroundColorResource(frameNode, resObj);
1451             break;
1452         case JsProgressResourceType::FontWeight:
1453             SetFontWeightResource(frameNode, resObj);
1454             break;
1455         case JsProgressResourceType::PSStrokeWidth:
1456             SetRSStrokeWidth(frameNode, resObj);
1457             break;
1458         case JsProgressResourceType::PSScaleWidth:
1459             SetRSScaleWidth(frameNode, resObj);
1460             break;
1461         case JsProgressResourceType::Text:
1462             SetTextResource(frameNode, resObj);
1463             break;
1464         case JsProgressResourceType::FontSize:
1465             SetFontSizeResource(frameNode, resObj);
1466             break;
1467         default:
1468             CreateLSOrRingOrCapsuleWithResourceObj(frameNode, type, resObj);
1469             break;
1470     }
1471 }
1472 } // namespace OHOS::Ace::NG
1473