• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_PROGRESS_THEME_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_PROGRESS_THEME_H
18 
19 #include "base/geometry/dimension.h"
20 #include "core/common/container.h"
21 #include "core/components/common/properties/color.h"
22 #include "core/components/theme/theme.h"
23 #include "core/components/theme/theme_constants.h"
24 #include "core/components/theme/theme_constants_defines.h"
25 
26 namespace OHOS::Ace {
27 
28 constexpr double CAPSULE_NONE_SHADOW_VALUE = 6.0;
29 constexpr double CAPSULE_HOVER_EFFECT_SCALE = 2.0;
30 
31 /**
32  * ProgressTheme defines color and styles of ProgressComponent. ProgressTheme should be built
33  * using ProgressTheme::Builder.
34  */
35 class ProgressTheme : public virtual Theme {
36     DECLARE_ACE_TYPE(ProgressTheme, Theme);
37 
38 public:
39     class Builder {
40     public:
41         Builder() = default;
42         virtual ~Builder() = default;
43 
Build(const RefPtr<ThemeConstants> & themeConstants)44         RefPtr<ProgressTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const
45         {
46             RefPtr<ProgressTheme> theme = AceType::MakeRefPtr<ProgressTheme>();
47             if (!themeConstants) {
48                 return theme;
49             }
50             // Read style from system.
51             ParsePattern(themeConstants, theme);
52             return theme;
53         }
54 
ParsePattern(const RefPtr<ThemeConstants> & themeConstants,const RefPtr<ProgressTheme> & theme)55         void ParsePattern(const RefPtr<ThemeConstants>& themeConstants, const RefPtr<ProgressTheme>& theme) const
56         {
57             CHECK_NULL_VOID(themeConstants);
58             CHECK_NULL_VOID(theme);
59             auto themeStyle = themeConstants->GetThemeStyle();
60             if (!themeStyle) {
61                 return;
62             }
63             auto pattern = themeStyle->GetAttr<RefPtr<ThemeStyle>>("progress_pattern", nullptr);
64             if (!pattern) {
65                 return;
66             }
67             const double defaultCachedAlpha = 0.4;
68             const double defaultLoadBGAlpha = 0.6;
69             const double defaultRingBackgroundOpacity = 0.03;
70             Color defaultColor = Color::FromRGBO(18, 24, 31, 1.0);
71             theme->trackThickness_ = pattern->GetAttr<Dimension>("progress_thickness", 0.0_vp);
72             theme->trackWidth_ = pattern->GetAttr<Dimension>("progress_default_width", 0.0_vp);
73             theme->ringThickness_ = pattern->GetAttr<Dimension>("progress_ring_thickness", 0.0_vp);
74             theme->ringDiameter_ = pattern->GetAttr<Dimension>("progress_default_diameter", 0.0_vp);
75             theme->loadingDiameter_ = pattern->GetAttr<Dimension>("progress_default_diameter", 0.0_vp);
76             theme->scaleNumber_ = static_cast<int32_t>(pattern->GetAttr<double>("progress_scale_number", 0.0));
77             theme->scaleWidth_ = pattern->GetAttr<Dimension>("progress_scale_width", 0.0_vp);
78             theme->scaleLength_ = pattern->GetAttr<Dimension>("progress_stroke_width", 0.0_vp);
79             theme->scaleRingDiameter_ = pattern->GetAttr<Dimension>("progress_scale_default_diameter", 0.0_vp);
80             theme->moonDiameter_ = pattern->GetAttr<Dimension>("progress_moon_diameter", 0.0_vp);
81             theme->moveRatio_ = pattern->GetAttr<double>("progress_loading_move_ratio", 0.0);
82             theme->ringRadius_ = pattern->GetAttr<Dimension>("progress_loading_ring_radius", 0.0_vp);
83             theme->orbitRadius_ = pattern->GetAttr<Dimension>("progress_loading_orbit_radius", 0.0_vp);
84             theme->cometTailLen_ = pattern->GetAttr<double>("progress_loading_comet_tail_len", 0.0);
85             theme->bubbleRadius_ = pattern->GetAttr<Dimension>("progress_bubble_radius", 0.0_vp);
86             theme->bubbleDiameter_ = pattern->GetAttr<Dimension>("progress_bubble_diameter", 0.0_vp);
87             theme->progressHeight_ = pattern->GetAttr<Dimension>("progress_button_download_height", 0.0_vp);
88             theme->trackBgColor_ = pattern->GetAttr<Color>("bg_color", Color::RED);
89             theme->trackSelectedColor_ = pattern->GetAttr<Color>("fg_color", Color::RED);
90             theme->trackCachedColor_ = theme->trackSelectedColor_
91                 .BlendOpacity(pattern->GetAttr<double>("fg_color_cached_alpha", defaultCachedAlpha));
92             theme->progressColor_ = pattern->GetAttr<Color>("fg_progress_color", Color::RED);
93             theme->loadingColor_ = pattern->GetAttr<Color>("fg_progress_color", Color::RED);
94             theme->moonFrontColor_ = pattern->GetAttr<Color>("moon_progress_fg_color", Color::RED)
95                 .BlendOpacity(pattern->GetAttr<double>("moon_progress_fg_color_alpha", 1.0));
96             theme->moonTrackBackgroundColor_ = pattern->GetAttr<Color>("moon_progress_bg_color", Color::RED)
97                 .BlendOpacity(pattern->GetAttr<double>("moon_progress_bg_color_alpha", 1.0))
98                 .BlendOpacity(pattern->GetAttr<double>("moon_progress_bg_color_alpha_ex", 1.0));
99             theme->borderColor_ = pattern->GetAttr<Color>("progress_border_color", Color::RED)
100                 .BlendOpacity(pattern->GetAttr<double>("progress_border_color_alpha", 1.0));
101             theme->maskColor_ = pattern->GetAttr<Color>("progress_mask_color", Color::RED);
102             theme->borderWidth_ = pattern->GetAttr<Dimension>("progress_border_width", 1.0_vp);
103             theme->fontScalePadding_ = pattern->GetAttr<Dimension>("progress_aging_padding_height", 8.0_vp);
104             theme->fontScale_ = pattern->GetAttr<double>("progress_aging_font_scale", 1.75);
105             theme->textColor_ = pattern->GetAttr<Color>("progress_text_color", defaultColor);
106             theme->textSize_ = pattern->GetAttr<Dimension>("progress_text_size", 12.0_fp);
107             theme->capsuleSelectColor_ = pattern->GetAttr<Color>("capsule_progress_select_color", Color::RED);
108             theme->selectColorAlpha_ = pattern->GetAttr<double>("capsule_progress_default_alpha", 1.0);
109             theme->capsuleSelectColor_ = theme->capsuleSelectColor_.BlendOpacity(theme->selectColorAlpha_);
110             theme->progressDisable_ = pattern->GetAttr<double>("progress_disabled_alpha", 1.0);
111             theme->clickEffect_ = pattern->GetAttr<Color>("progress_click_effect", Color::RED);
112             theme->capsuleBgColor_ = pattern->GetAttr<Color>("capsule_progress_bg_color", Color::RED)
113                 .BlendOpacity(pattern->GetAttr<double>("capsule_progress_bg_alpha", 1.0));
114             theme->ringProgressEndSideColor_ =
115                 pattern->GetAttr<Color>("ring_progress_fg_color_end", theme->trackSelectedColor_);
116             theme->ringProgressBeginSideColor_ =
117                 pattern->GetAttr<Color>("ring_progress_fg_color_begin", theme->trackSelectedColor_);
118             theme->ringProgressBackgroundColor_ =
119                 pattern->GetAttr<Color>("ring_progress_bg_color", Color::GRAY);
120             theme->loadingFocusedColor_ =
121                 pattern->GetAttr<Color>("loading_progress_focused_color", theme->loadingColor_);
122             theme->capsuleBgFocusedColor_ = pattern->GetAttr<Color>("capsule_progress_bg_focused_color",
123                 theme->capsuleBgColor_).BlendOpacity(pattern->GetAttr<double>("capsule_progress_bg_alpha", 1.0));
124             theme->capsuleTextFocusedColor_ =
125                 pattern->GetAttr<Color>("capsule_progress_text_focused_color", theme->textColor_);
126             theme->capsuleSelectFocusedColor_ =
127                 pattern->GetAttr<Color>("capsule_progress_select_focused_color", theme->capsuleSelectColor_)
128                     .BlendOpacity(pattern->GetAttr<double>("capsule_progress_select_focused_color_alpha", 1.0));
129             theme->capsuleInprogressBgColor_ =
130                 pattern->GetAttr<Color>("capsule_progress_bg_inprogress_color", theme->capsuleBgColor_)
131                     .BlendOpacity(pattern->GetAttr<double>("capsule_progress_bg_inprogress_color_alpha", 1.0));
132             theme->capsuleInprogressBorderColor_ =
133                 pattern->GetAttr<Color>("capsule_progress_inprogress_border_color", theme->borderColor_)
134                     .BlendOpacity(pattern->GetAttr<double>("capsule_progress_inprogress_border_color_alpha", 1.0));
135             theme->capsuleInprogressBorderWidth_ =
136                 pattern->GetAttr<Dimension>("capsule_progress_inprogress_border_width", theme->borderWidth_);
137             theme->hoverBlendColor_ = pattern->GetAttr<Color>("progress_hover_blend_color", Color::TRANSPARENT);
138             theme->capsuleHoverEffectType_ = static_cast<int32_t>(
139                 pattern->GetAttr<double>("capsule_progress_hover_effect_type", CAPSULE_HOVER_EFFECT_SCALE));
140             theme->loadingDefaultSize_ = pattern->GetAttr<Dimension>("loading_progress_default_size", 0.0_vp);
141             theme->textMargin_ = pattern->GetAttr<Dimension>("progress_text_margin", 8.0_vp);
142             theme->ringDefaultPadding_ = pattern->GetAttr<Dimension>("ring_progress_default_padding", 0.0_vp);
143             theme->capsuleFocusScale_ = pattern->GetAttr<double>("capsule_progress_focused_scale", 1.0);
144             theme->capsuleFocusedShadowStyle_ = static_cast<int32_t>(
145                 pattern->GetAttr<double>("capsule_progress_focused_shadow_style", CAPSULE_NONE_SHADOW_VALUE));
146             theme->scaleTrackSelectedColor_ = pattern->GetAttr<Color>("fg_color", Color::RED);
147             theme->loadingParseFailedColor_ = pattern->GetAttr<Color>("fg_progress_color", Color::RED);
148             theme->capsuleParseFailedBgColor_ = pattern->GetAttr<Color>("capsule_progress_bg_color", Color::RED)
149                 .BlendOpacity(pattern->GetAttr<double>("capsule_progress_bg_alpha", 1.0));
150             theme->ringProgressParseFailedBgColor_ = pattern->GetAttr<Color>("ring_progress_bg_color", Color::GRAY);
151             theme->trackParseFailedBgColor_ = pattern->GetAttr<Color>("bg_color", Color::RED);
152             theme->capsuleParseFailedSelectColor_ =
153                 pattern->GetAttr<Color>("capsule_progress_select_color", Color::RED)
154                     .BlendOpacity(theme->selectColorAlpha_);
155             theme->trackParseFailedSelectedColor_ = pattern->GetAttr<Color>("fg_color", Color::RED);
156 
157             if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) {
158                 theme->capsuleBgColor_ = theme->trackBgColor_;
159                 theme->capsuleSelectColor_ = theme->trackSelectedColor_;
160                 theme->ringProgressBackgroundColor_ = theme->trackBgColor_;
161                 theme->ringProgressBeginSideColor_ = theme->trackSelectedColor_;
162                 theme->ringProgressEndSideColor_ = theme->trackSelectedColor_;
163             } else if (Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
164                 theme->capsuleSelectColor_ =
165                     pattern->GetAttr<Color>("progress_select_color", Color::RED).BlendOpacity(theme->selectColorAlpha_);
166                 theme->borderColor_ = theme->capsuleSelectColor_;
167                 theme->ringProgressBackgroundColor_ = theme->trackBgColor_.ChangeOpacity(defaultRingBackgroundOpacity);
168                 theme->loadingColor_ = theme->loadingColor_.BlendOpacity(
169                     pattern->GetAttr<double>("loading_progress_bg_color_alpha", defaultLoadBGAlpha));
170             }
171         }
172     };
173 
174     ~ProgressTheme() override = default;
175 
GetTrackThickness()176     const Dimension& GetTrackThickness() const
177     {
178         return trackThickness_;
179     }
180 
GetTrackWidth()181     const Dimension& GetTrackWidth() const
182     {
183         return trackWidth_;
184     }
185 
GetRingThickness()186     const Dimension& GetRingThickness() const
187     {
188         return ringThickness_;
189     }
190 
GetRingDiameter()191     const Dimension& GetRingDiameter() const
192     {
193         return ringDiameter_;
194     }
195 
GetTrackBgColor()196     const Color& GetTrackBgColor() const
197     {
198         return trackBgColor_;
199     }
200 
GetTrackSelectedColor()201     const Color& GetTrackSelectedColor() const
202     {
203         return trackSelectedColor_;
204     }
205 
GetTrackCachedColor()206     Color GetTrackCachedColor() const
207     {
208         return trackCachedColor_;
209     }
210 
GetLoadingDiameter()211     const Dimension& GetLoadingDiameter() const
212     {
213         return loadingDiameter_;
214     }
215 
GetLoadingColor()216     const Color& GetLoadingColor() const
217     {
218         return loadingColor_;
219     }
220 
GetScaleWidth()221     const Dimension& GetScaleWidth() const
222     {
223         return scaleWidth_;
224     }
225 
GetScaleNumber()226     int32_t GetScaleNumber() const
227     {
228         return scaleNumber_;
229     }
230 
GetScaleLength()231     const Dimension& GetScaleLength() const
232     {
233         return scaleLength_;
234     }
235 
GetProgressColor()236     const Color& GetProgressColor() const
237     {
238         return progressColor_;
239     }
240 
GetMoveRatio()241     double GetMoveRatio() const
242     {
243         return moveRatio_;
244     }
245 
GetRingRadius()246     const Dimension& GetRingRadius() const
247     {
248         return ringRadius_;
249     }
250 
GetOrbitRadius()251     const Dimension& GetOrbitRadius() const
252     {
253         return orbitRadius_;
254     }
255 
GetCometTailLen()256     double GetCometTailLen() const
257     {
258         return cometTailLen_;
259     }
260 
GetScaleRingDiameter()261     const Dimension& GetScaleRingDiameter() const
262     {
263         return scaleRingDiameter_;
264     }
265 
GetMoonDiameter()266     const Dimension& GetMoonDiameter() const
267     {
268         return moonDiameter_;
269     }
270 
GetMoonBackgroundColor()271     const Color& GetMoonBackgroundColor() const
272     {
273         return moonTrackBackgroundColor_;
274     }
275 
GetMoonFrontColor()276     const Color& GetMoonFrontColor() const
277     {
278         return moonFrontColor_;
279     }
280 
GetBubbleDiameter()281     const Dimension& GetBubbleDiameter() const
282     {
283         return bubbleDiameter_;
284     }
285 
GetBubbleRadius()286     const Dimension& GetBubbleRadius() const
287     {
288         return bubbleRadius_;
289     }
290 
GetBorderColor()291     const Color& GetBorderColor() const
292     {
293         return borderColor_;
294     }
295 
GetBorderWidth()296     const Dimension& GetBorderWidth() const
297     {
298         return borderWidth_;
299     }
300 
GetMaskColor()301     const Color& GetMaskColor() const
302     {
303         return maskColor_;
304     }
305 
GetTextColor()306     const Color& GetTextColor() const
307     {
308         return textColor_;
309     }
310 
GetTextSize()311     const Dimension& GetTextSize() const
312     {
313         return textSize_;
314     }
315 
GetProgressHeight()316     const Dimension& GetProgressHeight() const
317     {
318         return progressHeight_;
319     }
320 
GetCapsuleSelectColor()321     const Color& GetCapsuleSelectColor() const
322     {
323         return capsuleSelectColor_;
324     }
325 
GetProgressDisable()326     const float& GetProgressDisable() const
327     {
328         return progressDisable_;
329     }
330 
GetClickEffect()331     const Color& GetClickEffect() const
332     {
333         return clickEffect_;
334     }
335 
GetSelectColorAlpha()336     const float& GetSelectColorAlpha() const
337     {
338         return selectColorAlpha_;
339     }
340 
GetTextMargin()341     const Dimension& GetTextMargin() const
342     {
343         return textMargin_;
344     }
345 
GetFontScale()346     float GetFontScale() const
347     {
348         return fontScale_;
349     }
350 
GetfontScalePadding()351     const Dimension& GetfontScalePadding() const
352     {
353         return fontScalePadding_;
354     }
355 
GetCapsuleBgColor()356     const Color& GetCapsuleBgColor() const
357     {
358         return capsuleBgColor_;
359     }
360 
GetRingProgressEndSideColor()361     const Color& GetRingProgressEndSideColor() const
362     {
363         return ringProgressEndSideColor_;
364     }
365 
GetRingProgressBeginSideColor()366     const Color& GetRingProgressBeginSideColor() const
367     {
368         return ringProgressBeginSideColor_;
369     }
370 
GetRingProgressBgColor()371     const Color& GetRingProgressBgColor() const
372     {
373         return ringProgressBackgroundColor_;
374     }
375 
GetLoadingFocusedColor()376     const Color& GetLoadingFocusedColor() const
377     {
378         return loadingFocusedColor_;
379     }
380 
GetCapsuleBgFocusedColor()381     const Color& GetCapsuleBgFocusedColor() const
382     {
383         return capsuleBgFocusedColor_;
384     }
385 
GetCapsuleTextFocusedColor()386     const Color& GetCapsuleTextFocusedColor() const
387     {
388         return capsuleTextFocusedColor_;
389     }
390 
GetCapsuleSelectFocusedColor()391     const Color& GetCapsuleSelectFocusedColor() const
392     {
393         return capsuleSelectFocusedColor_;
394     }
395 
GetHoverBlendColor()396     const Color& GetHoverBlendColor() const
397     {
398         return hoverBlendColor_;
399     }
400 
GetCapsuleInprogressBgColor()401     const Color& GetCapsuleInprogressBgColor() const
402     {
403         return capsuleInprogressBgColor_;
404     }
405 
GetCapsuleInprogressBorderColor()406     const Color& GetCapsuleInprogressBorderColor() const
407     {
408         return capsuleInprogressBorderColor_;
409     }
410 
GetCapsuleInprogressBorderWidth()411     const Dimension& GetCapsuleInprogressBorderWidth() const
412     {
413         return capsuleInprogressBorderWidth_;
414     }
415 
GetLoadingDefaultSize()416     const Dimension& GetLoadingDefaultSize() const
417     {
418         return loadingDefaultSize_;
419     }
420 
GetRingDefaultPadding()421     const Dimension& GetRingDefaultPadding() const
422     {
423         return ringDefaultPadding_;
424     }
425 
GetCapsuleHoverEffectType()426     int32_t GetCapsuleHoverEffectType() const
427     {
428         return capsuleHoverEffectType_;
429     }
430 
GetCapsuleFocusedShadowStyle()431     int32_t GetCapsuleFocusedShadowStyle() const
432     {
433         return capsuleFocusedShadowStyle_;
434     }
435 
GetCapsuleFocusScale()436     float GetCapsuleFocusScale() const
437     {
438         return capsuleFocusScale_;
439     }
440 
GetScaleTrackSelectedColor()441     const Color& GetScaleTrackSelectedColor() const
442     {
443         return scaleTrackSelectedColor_;
444     }
445 
GetLoadingParseFailedColor()446     const Color& GetLoadingParseFailedColor() const
447     {
448         return loadingParseFailedColor_;
449     }
450 
GetCapsuleParseFailedBgColor()451     const Color& GetCapsuleParseFailedBgColor() const
452     {
453         return capsuleParseFailedBgColor_;
454     }
455 
GetRingProgressParseFailedBgColor()456     const Color& GetRingProgressParseFailedBgColor() const
457     {
458         return ringProgressParseFailedBgColor_;
459     }
460 
GetTrackParseFailedBgColor()461     const Color& GetTrackParseFailedBgColor() const
462     {
463         return trackParseFailedBgColor_;
464     }
465 
GetCapsuleParseFailedSelectColor()466     const Color& GetCapsuleParseFailedSelectColor() const
467     {
468         return capsuleParseFailedSelectColor_;
469     }
470 
GetTrackParseFailedSelectedColor()471     const Color& GetTrackParseFailedSelectedColor() const
472     {
473         return trackParseFailedSelectedColor_;
474     }
475 
476 protected:
477     ProgressTheme() = default;
478 
479     Dimension trackThickness_;
480     Dimension trackWidth_;
481     Color trackBgColor_;
482     Color trackSelectedColor_;
483     Color trackCachedColor_;
484 
485     Dimension ringThickness_;
486     Dimension ringDiameter_;
487     Dimension bubbleDiameter_;
488     Dimension bubbleRadius_;
489 
490     Dimension loadingDiameter_;
491     Color loadingColor_;
492 
493     Dimension scaleWidth_;
494     int32_t scaleNumber_ = 0;
495     Dimension scaleLength_;
496     Dimension scaleRingDiameter_;
497 
498     Dimension moonDiameter_;
499     Color moonTrackBackgroundColor_;
500     Color moonFrontColor_;
501 
502     // For loading progress in cycle type.
503     Color progressColor_;
504     double moveRatio_ = 0.0;
505     Dimension ringRadius_;
506     Dimension orbitRadius_;
507     double cometTailLen_ = 0.0;
508 
509     Color borderColor_;
510     Dimension borderWidth_;
511     Color maskColor_;
512 
513     // For capsule progress.
514     Color textColor_;
515     Dimension textSize_;
516     Dimension progressHeight_;
517     Color capsuleSelectColor_;
518     float progressDisable_ = 0.4;
519     Color clickEffect_;
520     float selectColorAlpha_ = 1.0f;
521     Dimension textMargin_ = 8.0_vp;
522     Color capsuleBgFocusedColor_;
523     Color capsuleTextFocusedColor_;
524     Color capsuleSelectFocusedColor_;
525     Color hoverBlendColor_;
526     Color capsuleInprogressBgColor_;
527     Color capsuleInprogressBorderColor_;
528     Color loadingFocusedColor_;
529     Dimension loadingDefaultSize_;
530     Dimension ringDefaultPadding_;
531     Dimension capsuleInprogressBorderWidth_;
532     int32_t capsuleHoverEffectType_;
533     int32_t capsuleFocusedShadowStyle_;
534     float capsuleFocusScale_ = 1.0f;
535     Color capsuleBgColor_;
536 
537     // For ring progress.
538     Color ringProgressEndSideColor_;
539     Color ringProgressBeginSideColor_;
540     Color ringProgressBackgroundColor_;
541     float fontScale_ = 1.75f;
542     Dimension fontScalePadding_;
543 
544     // For scale progress.
545     Color scaleTrackSelectedColor_;
546 
547     // For Parse Failed
548     Color loadingParseFailedColor_;
549     Color capsuleParseFailedBgColor_;
550     Color ringProgressParseFailedBgColor_;
551     Color trackParseFailedBgColor_;
552     Color capsuleParseFailedSelectColor_;
553     Color trackParseFailedSelectedColor_;
554 };
555 
556 } // namespace OHOS::Ace
557 
558 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_PROGRESS_THEME_H
559