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