1 /* 2 * Copyright (c) 2021 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/components/common/properties/color.h" 21 #include "core/components/theme/theme.h" 22 #include "core/components/theme/theme_constants.h" 23 #include "core/components/theme/theme_constants_defines.h" 24 25 namespace OHOS::Ace { 26 27 /** 28 * ProgressTheme defines color and styles of ProgressComponent. ProgressTheme should be built 29 * using ProgressTheme::Builder. 30 */ 31 class ProgressTheme : public virtual Theme { 32 DECLARE_ACE_TYPE(ProgressTheme, Theme); 33 34 public: 35 class Builder { 36 public: 37 Builder() = default; 38 ~Builder() = default; 39 Build(const RefPtr<ThemeConstants> & themeConstants)40 RefPtr<ProgressTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const 41 { 42 RefPtr<ProgressTheme> theme = AceType::Claim(new ProgressTheme()); 43 if (!themeConstants) { 44 return theme; 45 } 46 theme->trackThickness_ = themeConstants->GetDimension(THEME_PROGRERSS_THICKNESS); 47 theme->trackWidth_ = themeConstants->GetDimension(THEME_PROGRESS_DEFAULT_WIDTH); 48 theme->ringThickness_ = themeConstants->GetDimension(THEME_PROGRESS_RING_THICKNESS); 49 theme->ringDiameter_ = themeConstants->GetDimension(THEME_PROGRESS_DEFAULT_DIAMETER); 50 theme->trackBgColor_ = themeConstants->GetColor(THEME_PROGRESS_BG_COLOR); 51 theme->trackSelectedColor_ = themeConstants->GetColor(THEME_PROGRESS_COLOR); 52 theme->trackCachedColor_ = themeConstants->GetColor(THEME_PROGRESS_CACHED_COLOR); 53 theme->loadingColor_ = themeConstants->GetColor(THEME_LOADING_COLOR); 54 theme->loadingDiameter_ = themeConstants->GetDimension(THEME_PROGRESS_DEFAULT_DIAMETER); 55 theme->scaleNumber_ = themeConstants->GetInt(THEME_PROGRESS_SCALE_NUMBER); 56 theme->scaleWidth_ = themeConstants->GetDimension(THEME_PROGRESS_SCALE_WIDTH); 57 theme->scaleLength_ = themeConstants->GetDimension(THEME_PROGRESS_STROKE_WIDTH); 58 theme->scaleRingDiameter_ = themeConstants->GetDimension(THEME_SCALE_PROGRESS_DEFAULT_DIAMETER); 59 60 // For moon progress 61 theme->moonDiameter_ = themeConstants->GetDimension(THEME_MOON_PROGRESS_DIAMETER); 62 theme->moonTrackBackgroundColor_ = themeConstants->GetColor(THEME_MOON_BACKGROUDN_COLOR); 63 theme->moonFrontColor_ = themeConstants->GetColor(THEME_MOON_FRONT_COLOR); 64 65 // For loading progress in cycle type. 66 theme->progressColor_ = themeConstants->GetColor(THEME_LOADING_PROGRESS_COLOR); 67 theme->moveRatio_ = themeConstants->GetDouble(THEME_LOADING_PROGRESS_MOVE_RATIO); 68 theme->ringRadius_ = themeConstants->GetDimension(THEME_LOADING_PROGRESS_RING_RADIUS); 69 theme->orbitRadius_ = themeConstants->GetDimension(THEME_LOADING_PROGRESS_ORBIT_RADIUS); 70 theme->cometTailLen_ = themeConstants->GetDouble(THEME_LOADING_PROGRESS_COMET_TAIL_LEN); 71 72 theme->bubbleRadius_ = themeConstants->GetDimension(THEME_BUBBLE_PROGRESS_RADIUS); 73 theme->bubbleDiameter_ = themeConstants->GetDimension(THEME_BUBBLE_PROGRESS_DIAMETER); 74 // Read style from system. 75 ParsePattern(themeConstants->GetThemeStyle(), theme); 76 return theme; 77 } 78 ParsePattern(const RefPtr<ThemeStyle> & themeStyle,const RefPtr<ProgressTheme> & theme)79 void ParsePattern(const RefPtr<ThemeStyle>& themeStyle, const RefPtr<ProgressTheme>& theme) const 80 { 81 if (!themeStyle) { 82 LOGI("progress theme style is null"); 83 return; 84 } 85 auto pattern = themeStyle->GetAttr<RefPtr<ThemeStyle>>("progress_pattern", nullptr); 86 if (!pattern) { 87 LOGE("Pattern of progress is null, please check!"); 88 return; 89 } 90 const double defaultCachedAlpha = 0.4; 91 const double defaultLoadBGAlpha = 0.6; 92 theme->trackBgColor_ = pattern->GetAttr<Color>(PATTERN_BG_COLOR, Color::RED); 93 theme->trackSelectedColor_ = pattern->GetAttr<Color>(PATTERN_FG_COLOR, Color::RED); 94 theme->trackCachedColor_ = theme->trackSelectedColor_ 95 .BlendOpacity(pattern->GetAttr<double>("fg_color_cached_alpha", defaultCachedAlpha)); 96 theme->progressColor_ = pattern->GetAttr<Color>("fg_progress_color", Color::RED); 97 theme->loadingColor_ = theme->progressColor_ 98 .BlendOpacity(pattern->GetAttr<double>("loading_progress_bg_color_alpha", defaultLoadBGAlpha)); 99 theme->moonFrontColor_ = pattern->GetAttr<Color>("moon_progress_fg_color", Color::RED) 100 .BlendOpacity(pattern->GetAttr<double>("moon_progress_fg_color_alpha", 1.0)); 101 theme->moonTrackBackgroundColor_ = pattern->GetAttr<Color>("moon_progress_bg_color", Color::RED) 102 .BlendOpacity(pattern->GetAttr<double>("moon_progress_bg_color_alpha", 1.0)) 103 .BlendOpacity(pattern->GetAttr<double>("moon_progress_bg_color_alpha_ex", 1.0)); 104 } 105 }; 106 107 ~ProgressTheme() override = default; 108 GetTrackThickness()109 const Dimension& GetTrackThickness() const 110 { 111 return trackThickness_; 112 } 113 GetTrackWidth()114 const Dimension& GetTrackWidth() const 115 { 116 return trackWidth_; 117 } 118 GetRingThickness()119 const Dimension& GetRingThickness() const 120 { 121 return ringThickness_; 122 } 123 GetRingDiameter()124 const Dimension& GetRingDiameter() const 125 { 126 return ringDiameter_; 127 } 128 GetTrackBgColor()129 const Color& GetTrackBgColor() const 130 { 131 return trackBgColor_; 132 } 133 GetTrackSelectedColor()134 const Color& GetTrackSelectedColor() const 135 { 136 return trackSelectedColor_; 137 } 138 GetTrackCachedColor()139 Color GetTrackCachedColor() const 140 { 141 return trackCachedColor_; 142 } 143 GetLoadingDiameter()144 const Dimension& GetLoadingDiameter() const 145 { 146 return loadingDiameter_; 147 } 148 GetLoadingColor()149 const Color& GetLoadingColor() const 150 { 151 return loadingColor_; 152 } 153 GetScaleWidth()154 const Dimension& GetScaleWidth() const 155 { 156 return scaleWidth_; 157 } 158 GetScaleNumber()159 int32_t GetScaleNumber() const 160 { 161 return scaleNumber_; 162 } 163 GetScaleLength()164 const Dimension& GetScaleLength() const 165 { 166 return scaleLength_; 167 } 168 GetProgressColor()169 const Color& GetProgressColor() const 170 { 171 return progressColor_; 172 } 173 GetMoveRatio()174 double GetMoveRatio() const 175 { 176 return moveRatio_; 177 } 178 GetRingRadius()179 const Dimension& GetRingRadius() const 180 { 181 return ringRadius_; 182 } 183 GetOrbitRadius()184 const Dimension& GetOrbitRadius() const 185 { 186 return orbitRadius_; 187 } 188 GetCometTailLen()189 double GetCometTailLen() const 190 { 191 return cometTailLen_; 192 } 193 GetScaleRingDiameter()194 const Dimension& GetScaleRingDiameter() const 195 { 196 return scaleRingDiameter_; 197 } 198 GetMoonDiameter()199 const Dimension& GetMoonDiameter() const 200 { 201 return moonDiameter_; 202 } 203 GetMoonBackgroundColor()204 const Color& GetMoonBackgroundColor() const 205 { 206 return moonTrackBackgroundColor_; 207 } 208 GetMoonFrontColor()209 const Color& GetMoonFrontColor() const 210 { 211 return moonFrontColor_; 212 } 213 GetBubbleDiameter()214 const Dimension& GetBubbleDiameter() const 215 { 216 return bubbleDiameter_; 217 } 218 GetBubbleRadius()219 const Dimension& GetBubbleRadius() const 220 { 221 return bubbleRadius_; 222 } 223 224 protected: 225 ProgressTheme() = default; 226 227 private: 228 Dimension trackThickness_; 229 Dimension trackWidth_; 230 Color trackBgColor_; 231 Color trackSelectedColor_; 232 Color trackCachedColor_; 233 234 Dimension ringThickness_; 235 Dimension ringDiameter_; 236 Dimension bubbleDiameter_; 237 Dimension bubbleRadius_; 238 239 Dimension loadingDiameter_; 240 Color loadingColor_; 241 242 Dimension scaleWidth_; 243 int32_t scaleNumber_ = 0; 244 Dimension scaleLength_; 245 Dimension scaleRingDiameter_; 246 247 Dimension moonDiameter_; 248 Color moonTrackBackgroundColor_; 249 Color moonFrontColor_; 250 251 // For loading progress in cycle type. 252 Color progressColor_; 253 double moveRatio_ = 0.0; 254 Dimension ringRadius_; 255 Dimension orbitRadius_; 256 double cometTailLen_ = 0.0; 257 }; 258 259 } // namespace OHOS::Ace 260 261 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_PROGRESS_THEME_H 262