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