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