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_BUTTON_BUTTON_THEME_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BUTTON_BUTTON_THEME_H 18 19 #include "core/components/common/properties/color.h" 20 #include "core/components/common/properties/text_style.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 * ButtonTheme defines color and styles of ButtonComponent. ButtonTheme should be built 29 * using ButtonTheme::Builder. 30 */ 31 class ButtonTheme : public virtual Theme { 32 DECLARE_ACE_TYPE(ButtonTheme, Theme); 33 34 public: 35 class Builder { 36 public: 37 Builder() = default; 38 ~Builder() = default; 39 Build(const RefPtr<ThemeConstants> & themeConstants)40 RefPtr<ButtonTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const 41 { 42 RefPtr<ButtonTheme> theme = AceType::Claim(new ButtonTheme()); 43 if (!themeConstants) { 44 return theme; 45 } 46 ParsePattern(themeConstants, theme); 47 return theme; 48 } 49 50 private: ParsePattern(const RefPtr<ThemeConstants> & themeConstants,const RefPtr<ButtonTheme> & theme)51 void ParsePattern(const RefPtr<ThemeConstants>& themeConstants, const RefPtr<ButtonTheme>& theme) const 52 { 53 if (!themeConstants) { 54 return; 55 } 56 RefPtr<ThemeStyle> buttonPattern = themeConstants->GetPatternByName(THEME_PATTERN_BUTTON); 57 if (!buttonPattern) { 58 LOGW("find pattern of button fail"); 59 return; 60 } 61 theme->bgColor_ = buttonPattern->GetAttr<Color>("button_bg_color", Color()); 62 theme->clickedColor_ = buttonPattern->GetAttr<Color>("bg_color_clicked_blend", Color()); 63 theme->disabledColor_ = theme->bgColor_ 64 .BlendOpacity(buttonPattern->GetAttr<double>(PATTERN_BG_COLOR_DISABLED_ALPHA, 0.0)); 65 theme->hoverColor_ = buttonPattern->GetAttr<Color>("bg_color_hovered_blend", Color()); 66 theme->borderColor_ = buttonPattern->GetAttr<Color>("border_color", Color()); 67 theme->borderWidth_ = buttonPattern->GetAttr<Dimension>("border_width", 0.0_vp); 68 theme->textStyle_.SetTextColor(buttonPattern->GetAttr<Color>("button_text_color", Color())); 69 theme->textDisabledColor_ = buttonPattern->GetAttr<Color>(PATTERN_TEXT_COLOR, Color()) 70 .BlendOpacity(buttonPattern->GetAttr<double>("text_color_disabled_alpha", 0.0)); 71 theme->textWaitingColor_ = buttonPattern->GetAttr<Color>("waiting_button_text_color", Color()); 72 theme->normalTextColor_ = buttonPattern->GetAttr<Color>("normal_text_color", Color()); 73 theme->downloadBackgroundColor_ = buttonPattern->GetAttr<Color>("download_button_bg_color", Color()) 74 .BlendOpacity(buttonPattern->GetAttr<double>("download_button_bg_color_alpha", 0.0)); 75 theme->downloadBorderColor_ = buttonPattern->GetAttr<Color>("download_button_border_color", Color()) 76 .BlendOpacity(buttonPattern->GetAttr<double>("download_button_border_color_alpha", 0.0)); 77 theme->downloadProgressColor_ = buttonPattern->GetAttr<Color>("download_button_process_color", Color()) 78 .BlendOpacity(buttonPattern->GetAttr<double>("download_button_process_color_alpha", 0.0)); 79 theme->downloadTextColor_ = buttonPattern->GetAttr<Color>("download_button_text_color", Color()); 80 theme->progressColor_ = buttonPattern->GetAttr<Color>("process_button_text_color", Color()); 81 theme->radius_ = buttonPattern->GetAttr<Dimension>("button_radius", 0.0_vp); 82 theme->bgFocusColor_ = buttonPattern->GetAttr<Color>("button_bg_focus_color", Color()); 83 theme->bgDisabledAlpha_ = buttonPattern->GetAttr<double>("bg_color_disabled_alpha", 0.0); 84 theme->textFocusColor_ = buttonPattern->GetAttr<Color>("button_text_focus_color", Color()); 85 theme->textStyle_.SetFontSize(buttonPattern->GetAttr<Dimension>("button_font_size", 0.0_fp)); 86 theme->textStyle_.SetFontWeight( 87 FontWeight(static_cast<int32_t>(buttonPattern->GetAttr<double>("button_font_weight", 0.0)))); 88 theme->minWidth_ = buttonPattern->GetAttr<Dimension>("button_min_width", 0.0_vp); 89 theme->height_ = buttonPattern->GetAttr<Dimension>("button_height", 0.0_vp); 90 theme->downloadHeight_ = buttonPattern->GetAttr<Dimension>("button_download_height", 0.0_vp); 91 theme->padding_ = Edge(buttonPattern->GetAttr<Dimension>("button_horizontal_padding", 0.0_vp).Value(), 92 buttonPattern->GetAttr<Dimension>("button_vertical_padding", 0.0_vp).Value(), 93 buttonPattern->GetAttr<Dimension>("button_horizontal_padding", 0.0_vp).Value(), 94 buttonPattern->GetAttr<Dimension>("button_vertical_padding", 0.0_vp).Value(), 95 buttonPattern->GetAttr<Dimension>("button_vertical_padding", 0.0_vp).Unit()); 96 theme->minFontSize_ = buttonPattern->GetAttr<Dimension>("button_min_font_size", 0.0_fp); 97 int32_t maxlines = static_cast<int32_t>(buttonPattern->GetAttr<double>("button_text_max_lines", 0.0)); 98 theme->textMaxLines_ = maxlines < 0 ? theme->textMaxLines_ : static_cast<uint32_t>(maxlines); 99 theme->minCircleButtonDiameter_ = buttonPattern->GetAttr<Dimension>("min_circle_button_diameter", 0.0_vp); 100 theme->minCircleButtonIcon_ = buttonPattern->GetAttr<Dimension>("min_circle_button_icon_size", 0.0_vp); 101 theme->minCircleButtonPadding_ = 102 Edge(buttonPattern->GetAttr<Dimension>("min_circle_button_padding", 0.0_vp)); 103 theme->maxCircleButtonDiameter_ = buttonPattern->GetAttr<Dimension>("max_circle_button_diameter", 0.0_vp); 104 theme->maxCircleButtonIcon_ = buttonPattern->GetAttr<Dimension>("max_circle_button_icon_size", 0.0_vp); 105 theme->maxCircleButtonPadding_ = 106 Edge(buttonPattern->GetAttr<Dimension>("button_max_circle_button_padding", 0.0_vp)); 107 theme->progressFocusColor_ = buttonPattern->GetAttr<Color>("button_progress_focus_color", Color()); 108 theme->downloadFontSize_ = buttonPattern->GetAttr<Dimension>("button_download_font_size", 0.0_fp); 109 theme->progressDiameter_ = buttonPattern->GetAttr<Dimension>("button_progress_diameter", 0.0_vp); 110 theme->innerPadding_ = buttonPattern->GetAttr<Dimension>("button_inner_padding", 0.0_vp); 111 ParseSubStylePattern(buttonPattern, theme); 112 } 113 ParseSubStylePattern(const RefPtr<ThemeStyle> & buttonPattern,const RefPtr<ButtonTheme> & theme)114 void ParseSubStylePattern(const RefPtr<ThemeStyle>& buttonPattern, const RefPtr<ButtonTheme>& theme) const 115 { 116 theme->bgColorMap_.insert(std::pair<ButtonStyleMode, Color>(ButtonStyleMode::EMPHASIZE, theme->bgColor_)); 117 theme->bgColorMap_.insert(std::pair<ButtonStyleMode, Color>( 118 ButtonStyleMode::NORMAL, buttonPattern->GetAttr<Color>("bg_color_normal", Color()))); 119 theme->bgColorMap_.insert(std::pair<ButtonStyleMode, Color>(ButtonStyleMode::TEXT, Color::TRANSPARENT)); 120 121 theme->textColorMap_.insert(std::pair<ButtonStyleMode, Color>( 122 ButtonStyleMode::EMPHASIZE, buttonPattern->GetAttr<Color>("emphasize_button_text_color", Color()))); 123 theme->textColorMap_.insert( 124 std::pair<ButtonStyleMode, Color>(ButtonStyleMode::NORMAL, theme->normalTextColor_)); 125 theme->textColorMap_.insert( 126 std::pair<ButtonStyleMode, Color>(ButtonStyleMode::TEXT, theme->normalTextColor_)); 127 128 theme->heightMap_.insert(std::pair<ControlSize, Dimension>(ControlSize::NORMAL, theme->height_)); 129 theme->heightMap_.insert(std::pair<ControlSize, Dimension>( 130 ControlSize::SMALL, buttonPattern->GetAttr<Dimension>("small_button_height", 0.0_vp))); 131 132 theme->textSizeMap_.insert(std::pair<ControlSize, Dimension>( 133 ControlSize::NORMAL, buttonPattern->GetAttr<Dimension>("button_font_size", 0.0_fp))); 134 theme->textSizeMap_.insert(std::pair<ControlSize, Dimension>( 135 ControlSize::SMALL, buttonPattern->GetAttr<Dimension>("small_button_font_size", 0.0_fp))); 136 137 theme->paddingMap_.insert(std::pair<ControlSize, Edge>(ControlSize::NORMAL, theme->padding_)); 138 theme->paddingMap_.insert(std::pair<ControlSize, Edge>(ControlSize::SMALL, 139 Edge(buttonPattern->GetAttr<Dimension>("small_button_horizontal_padding", 0.0_vp).Value(), 140 buttonPattern->GetAttr<Dimension>("button_vertical_padding", 0.0_vp).Value(), 141 buttonPattern->GetAttr<Dimension>("small_button_horizontal_padding", 0.0_vp).Value(), 142 buttonPattern->GetAttr<Dimension>("button_vertical_padding", 0.0_vp).Value(), 143 buttonPattern->GetAttr<Dimension>("button_vertical_padding", 0.0_vp).Unit()))); 144 } 145 }; 146 147 ~ButtonTheme() override = default; 148 GetRadius()149 const Dimension& GetRadius() const 150 { 151 return radius_; 152 } 153 GetBgColor()154 const Color& GetBgColor() const 155 { 156 return bgColor_; 157 } 158 GetBgFocusColor()159 const Color& GetBgFocusColor() const 160 { 161 return bgFocusColor_; 162 } 163 GetClickedColor()164 const Color& GetClickedColor() const 165 { 166 return clickedColor_; 167 } 168 GetDisabledColor()169 const Color& GetDisabledColor() const 170 { 171 return disabledColor_; 172 } 173 GetHoverColor()174 const Color& GetHoverColor() const 175 { 176 return hoverColor_; 177 } 178 GetBorderColor()179 const Color& GetBorderColor() const 180 { 181 return borderColor_; 182 } 183 GetBorderWidth()184 const Dimension& GetBorderWidth() const 185 { 186 return borderWidth_; 187 } 188 GetBgDisabledAlpha()189 double GetBgDisabledAlpha() const 190 { 191 return bgDisabledAlpha_; 192 } 193 GetTextFocusColor()194 const Color& GetTextFocusColor() const 195 { 196 return textFocusColor_; 197 } 198 GetTextDisabledColor()199 const Color& GetTextDisabledColor() const 200 { 201 return textDisabledColor_; 202 } 203 GetNormalTextColor()204 const Color& GetNormalTextColor() const 205 { 206 return normalTextColor_; 207 } 208 GetDownloadBackgroundColor()209 const Color& GetDownloadBackgroundColor() const 210 { 211 return downloadBackgroundColor_; 212 } 213 GetDownloadTextColor()214 const Color& GetDownloadTextColor() const 215 { 216 return downloadTextColor_; 217 } 218 GetTextWaitingColor()219 const Color& GetTextWaitingColor() const 220 { 221 return textWaitingColor_; 222 } 223 GetTextStyle()224 const TextStyle& GetTextStyle() const 225 { 226 return textStyle_; 227 } 228 GetMinWidth()229 const Dimension& GetMinWidth() const 230 { 231 return minWidth_; 232 } 233 GetHeight()234 const Dimension& GetHeight() const 235 { 236 return height_; 237 } 238 GetDownloadHeight()239 const Dimension& GetDownloadHeight() const 240 { 241 return downloadHeight_; 242 } 243 GetPadding()244 const Edge& GetPadding() const 245 { 246 return padding_; 247 } 248 GetMinFontSize()249 const Dimension& GetMinFontSize() const 250 { 251 return minFontSize_; 252 } 253 GetDownloadFontSize()254 const Dimension& GetDownloadFontSize() const 255 { 256 return downloadFontSize_; 257 } 258 GetMaxFontSize()259 const Dimension& GetMaxFontSize() const 260 { 261 return textStyle_.GetFontSize(); 262 } 263 GetTextMaxLines()264 uint32_t GetTextMaxLines() const 265 { 266 return textMaxLines_; 267 } 268 GetMinCircleButtonDiameter()269 const Dimension& GetMinCircleButtonDiameter() const 270 { 271 return minCircleButtonDiameter_; 272 } 273 GetMinCircleButtonIcon()274 const Dimension& GetMinCircleButtonIcon() const 275 { 276 return minCircleButtonIcon_; 277 } 278 GetMinCircleButtonPadding()279 const Edge& GetMinCircleButtonPadding() const 280 { 281 return minCircleButtonPadding_; 282 } 283 GetMaxCircleButtonDiameter()284 const Dimension& GetMaxCircleButtonDiameter() const 285 { 286 return maxCircleButtonDiameter_; 287 } 288 GetMaxCircleButtonIcon()289 const Dimension& GetMaxCircleButtonIcon() const 290 { 291 return maxCircleButtonIcon_; 292 } 293 GetMaxCircleButtonPadding()294 const Edge& GetMaxCircleButtonPadding() const 295 { 296 return maxCircleButtonPadding_; 297 } 298 GetProgressFocusColor()299 const Color& GetProgressFocusColor() const 300 { 301 return progressFocusColor_; 302 } 303 GetDownloadBorderColor()304 const Color& GetDownloadBorderColor() const 305 { 306 return downloadBorderColor_; 307 } 308 GetProgressColor()309 const Color& GetProgressColor() const 310 { 311 return progressColor_; 312 } 313 GetProgressDiameter()314 const Dimension& GetProgressDiameter() const 315 { 316 return progressDiameter_; 317 } 318 GetDownloadProgressColor()319 const Color& GetDownloadProgressColor() const 320 { 321 return downloadProgressColor_; 322 } 323 GetInnerPadding()324 const Dimension& GetInnerPadding() const 325 { 326 return innerPadding_; 327 } 328 GetBgColor(ButtonStyleMode buttonStyle)329 const Color& GetBgColor(ButtonStyleMode buttonStyle) const 330 { 331 auto result = bgColorMap_.find(buttonStyle); 332 if (result != bgColorMap_.end()) { 333 return result->second; 334 } 335 return bgColor_; 336 } 337 GetTextColor(ButtonStyleMode buttonStyle)338 const Color& GetTextColor(ButtonStyleMode buttonStyle) const 339 { 340 auto result = textColorMap_.find(buttonStyle); 341 if (result != textColorMap_.end()) { 342 return result->second; 343 } 344 return normalTextColor_; 345 } 346 GetHeight(ControlSize controlSize)347 const Dimension& GetHeight(ControlSize controlSize) const 348 { 349 auto result = heightMap_.find(controlSize); 350 if (result != heightMap_.end()) { 351 return result->second; 352 } 353 return height_; 354 } 355 GetTextSize(ControlSize controlSize)356 const Dimension& GetTextSize(ControlSize controlSize) const 357 { 358 auto result = textSizeMap_.find(controlSize); 359 if (result != textSizeMap_.end()) { 360 return result->second; 361 } 362 return textStyle_.GetFontSize(); 363 } 364 GetPadding(ControlSize controlSize)365 const Edge& GetPadding(ControlSize controlSize) const 366 { 367 auto result = paddingMap_.find(controlSize); 368 if (result != paddingMap_.end()) { 369 return result->second; 370 } 371 return padding_; 372 } 373 374 protected: 375 ButtonTheme() = default; 376 377 private: 378 Color bgColor_; 379 Color bgFocusColor_; 380 Color clickedColor_; 381 Color disabledColor_; 382 Color hoverColor_; 383 Color borderColor_; 384 Color textFocusColor_; 385 Color textDisabledColor_; 386 Color textWaitingColor_; 387 Color progressColor_; 388 Color progressFocusColor_; 389 Color normalTextColor_; 390 Color downloadBackgroundColor_; 391 Color downloadTextColor_; 392 Color downloadBorderColor_; 393 Color downloadProgressColor_; 394 TextStyle textStyle_; 395 Edge padding_; 396 Edge minCircleButtonPadding_; 397 Edge maxCircleButtonPadding_; 398 399 Dimension radius_; 400 Dimension minWidth_; 401 Dimension height_; 402 Dimension progressDiameter_; 403 Dimension innerPadding_; 404 Dimension minFontSize_; 405 Dimension downloadFontSize_; 406 Dimension minCircleButtonDiameter_; 407 Dimension minCircleButtonIcon_; 408 Dimension maxCircleButtonDiameter_; 409 Dimension maxCircleButtonIcon_; 410 Dimension borderWidth_; 411 Dimension downloadHeight_; 412 413 std::unordered_map<ButtonStyleMode, Color> bgColorMap_; 414 std::unordered_map<ButtonStyleMode, Color> textColorMap_; 415 std::unordered_map<ControlSize, Dimension> heightMap_; 416 std::unordered_map<ControlSize, Dimension> textSizeMap_; 417 std::unordered_map<ControlSize, Edge> paddingMap_; 418 double bgDisabledAlpha_ = 1.0; 419 uint32_t textMaxLines_ = 1; 420 }; 421 422 } // namespace OHOS::Ace 423 424 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_BUTTON_BUTTON_THEME_H 425