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_RATING_RATING_THEME_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_RATING_RATING_THEME_H 18 19 #include "base/resource/internal_resource.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 namespace { 27 constexpr Dimension BORDER_RADIUS = 4.0_vp; 28 constexpr Color STAR_PRESS_COLOR = Color(0x19182431); 29 constexpr Color STAR_HOVER_COLOR = Color(0x0c182431); 30 } // namespace 31 /** 32 * RatingTheme defines color and styles of RatingComponent. RatingTheme should be built 33 * using RatingTheme::Builder. 34 */ 35 class RatingTheme : public virtual Theme { 36 DECLARE_ACE_TYPE(RatingTheme, Theme); 37 38 public: 39 class Builder { 40 public: 41 Builder() = default; 42 ~Builder() = default; 43 Build(const RefPtr<ThemeConstants> & themeConstants)44 RefPtr<RatingTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const 45 { 46 RefPtr<RatingTheme> theme = AceType::MakeRefPtr<RatingTheme>(); 47 if (!themeConstants) { 48 return theme; 49 } 50 theme->foregroundResourceId_ = themeConstants->GetResourceId(THEME_RATING_RESOURCE_ID_BIG_ON); 51 theme->secondaryResourceId_ = themeConstants->GetResourceId(THEME_RATING_RESOURCE_ID_BIG_HALF); 52 theme->backgroundResourceId_ = themeConstants->GetResourceId(THEME_RATING_RESOURCE_ID_BIG_OFF); 53 theme->foregroundMiniResourceId_ = themeConstants->GetResourceId(THEME_RATING_RESOURCE_ID_MINI_ON); 54 theme->secondaryMiniResourceId_ = themeConstants->GetResourceId(THEME_RATING_RESOURCE_ID_MINI_HALF); 55 theme->backgroundMiniResourceId_ = themeConstants->GetResourceId(THEME_RATING_RESOURCE_ID_MINI_OFF); 56 57 RefPtr<ThemeStyle> pattern = themeConstants->GetPatternByName(THEME_PATTERN_RATING); 58 if (pattern) { 59 theme->starNum_ = static_cast<int32_t>(pattern->GetAttr<double>("rating_start_num", 0.0)); 60 theme->ratingScore_ = pattern->GetAttr<double>("rating_score", 0.0); 61 theme->ratingMiniScore_ = pattern->GetAttr<double>("rating_mini_score", 0.0); 62 theme->stepSize_ = pattern->GetAttr<double>("rating_step_size", 0.0); 63 theme->paddingVertical_ = pattern->GetAttr<Dimension>("rating_padding_vertical", 0.0_vp); 64 theme->ratingWidth_ = pattern->GetAttr<Dimension>("rating_big_width", 0.0_vp); 65 theme->ratingHeight_ = pattern->GetAttr<Dimension>("rating_big_height", 0.0_vp); 66 theme->ratingMiniWidth_ = pattern->GetAttr<Dimension>("rating_mini_width", 0.0_vp); 67 theme->ratingMiniHeight_ = pattern->GetAttr<Dimension>("rating_mini_height", 0.0_vp); 68 theme->designedStarAspectRatio_ = pattern->GetAttr<double>("rating_designed_start_aspect_ratio", 0.0); 69 theme->focusBorderWidth_ = pattern->GetAttr<Dimension>("rating_focus_border_width", 0.0_vp); 70 theme->hoverColor_ = pattern->GetAttr<Color>(PATTERN_BG_COLOR_HOVERED, STAR_HOVER_COLOR); 71 theme->pressColor_ = pattern->GetAttr<Color>(PATTERN_BG_COLOR_PRESSED, STAR_PRESS_COLOR); 72 theme->starColorActive_ = pattern->GetAttr<Color>("icon_color_active", Color::RED); 73 theme->starColorInactive_ = pattern->GetAttr<Color>("icon_color_inactive", Color::GRAY); 74 theme->borderRadius_ = pattern->GetAttr<Dimension>("hover_radius_size", BORDER_RADIUS); 75 theme->hoverAnimationDuration_ = pattern->GetAttr<double>("hover_animation_duration", 0.0); 76 theme->pressAnimationDuration_ = pattern->GetAttr<double>("press_animation_duration", 0.0); 77 theme->disabledAlpha_ = pattern->GetAttr<double>("rating_disable_alpha", 0.0); 78 theme->iconBoardDistance_ = pattern->GetAttr<Dimension>("rating_icon_board_distance", 0.0_vp); 79 theme->focusColor_ = pattern->GetAttr<Color>("rating_focus_bgcolor", Color()); 80 theme->focusSpace_ = pattern->GetAttr<Dimension>("rating_focus_space", 0.0_vp); 81 theme->cancelAnimation_ = pattern->GetAttr<double>("rating_focus_blur_cancel_animation", 0.0); 82 theme->isCircleRadius_ = static_cast<bool>(pattern->GetAttr<double>("rating_apply_circle_radius", 0.0)); 83 theme->unlitStarFocusColor_ = pattern->GetAttr<Color>("rating_unlit_star_focus_color", Color()); 84 } else { 85 LOGW("find pattern of rating fail"); 86 } 87 return theme; 88 } 89 }; 90 91 ~RatingTheme() override = default; 92 GetStarNum()93 int32_t GetStarNum() const 94 { 95 return starNum_; 96 } 97 GetIconBoardDistance()98 const Dimension& GetIconBoardDistance() const 99 { 100 return iconBoardDistance_; 101 } 102 GetUnlitStarFocusColor()103 Color GetUnlitStarFocusColor() const 104 { 105 return unlitStarFocusColor_; 106 } 107 GetRatingWidth()108 const Dimension& GetRatingWidth() const 109 { 110 return ratingWidth_; 111 } 112 GetRatingHeight()113 const Dimension& GetRatingHeight() const 114 { 115 return ratingHeight_; 116 } 117 GetRatingMiniWidth()118 const Dimension& GetRatingMiniWidth() const 119 { 120 return ratingMiniWidth_; 121 } 122 GetRatingMiniHeight()123 const Dimension& GetRatingMiniHeight() const 124 { 125 return ratingMiniHeight_; 126 } 127 GetPaddingVertical()128 const Dimension& GetPaddingVertical() const 129 { 130 return paddingVertical_; 131 } 132 GetStepSize()133 double GetStepSize() const 134 { 135 return stepSize_; 136 } 137 GetRatingScore()138 double GetRatingScore() const 139 { 140 return ratingScore_; 141 } 142 GetRatingMiniScore()143 double GetRatingMiniScore() const 144 { 145 return ratingMiniScore_; 146 } 147 GetForegroundResourceId()148 const InternalResource::ResourceId& GetForegroundResourceId() const 149 { 150 return foregroundResourceId_; 151 } 152 GetSecondaryResourceId()153 const InternalResource::ResourceId& GetSecondaryResourceId() const 154 { 155 return secondaryResourceId_; 156 } 157 GetBackgroundResourceId()158 const InternalResource::ResourceId& GetBackgroundResourceId() const 159 { 160 return backgroundResourceId_; 161 } 162 GetForegroundMiniResourceId()163 const InternalResource::ResourceId& GetForegroundMiniResourceId() const 164 { 165 return foregroundMiniResourceId_; 166 } 167 GetSecondaryMiniResourceId()168 const InternalResource::ResourceId& GetSecondaryMiniResourceId() const 169 { 170 return secondaryMiniResourceId_; 171 } 172 GetBackgroundMiniResourceId()173 const InternalResource::ResourceId& GetBackgroundMiniResourceId() const 174 { 175 return backgroundMiniResourceId_; 176 } 177 GetDesignedStarAspectRatio()178 double GetDesignedStarAspectRatio() const 179 { 180 return designedStarAspectRatio_; 181 } 182 GetFocusAndBlurCancleAnimation()183 double GetFocusAndBlurCancleAnimation() const 184 { 185 return cancelAnimation_; 186 } 187 GetFocusBorderWidth()188 const Dimension& GetFocusBorderWidth() const 189 { 190 return focusBorderWidth_; 191 } 192 GetFocusBorderRadius()193 const Dimension& GetFocusBorderRadius() const 194 { 195 return borderRadius_; 196 } 197 GetFocusSpace()198 const Dimension& GetFocusSpace() const 199 { 200 return focusSpace_; 201 } 202 GetHoverColor()203 const Color& GetHoverColor() const 204 { 205 return hoverColor_; 206 } 207 GetPressColor()208 const Color& GetPressColor() const 209 { 210 return pressColor_; 211 } 212 GetFocusColor()213 const Color& GetFocusColor() const 214 { 215 return focusColor_; 216 } 217 GetStarColorActive()218 const Color& GetStarColorActive() const 219 { 220 return starColorActive_; 221 } 222 GetStarColorInactive()223 const Color& GetStarColorInactive() const 224 { 225 return starColorInactive_; 226 } 227 GetHoverAnimationDuration()228 double GetHoverAnimationDuration() const 229 { 230 return hoverAnimationDuration_; 231 } 232 GetPressAnimationDuration()233 double GetPressAnimationDuration() const 234 { 235 return pressAnimationDuration_; 236 } 237 GetDisabledAlpha()238 double GetDisabledAlpha() const 239 { 240 return disabledAlpha_; 241 } 242 GetIsCircleRadius()243 bool GetIsCircleRadius() const 244 { 245 return isCircleRadius_; 246 } 247 248 protected: 249 RatingTheme() = default; 250 251 private: 252 int32_t starNum_ = 0; 253 Dimension ratingWidth_; 254 Dimension ratingHeight_; 255 Dimension ratingMiniWidth_; 256 Dimension ratingMiniHeight_; 257 Dimension paddingVertical_; 258 Dimension focusSpace_; 259 Dimension iconBoardDistance_; 260 double stepSize_ = 0.0; 261 double ratingScore_ = 0.0; 262 double ratingMiniScore_ = 0.0; 263 double designedStarAspectRatio_ = 1.0; 264 double hoverAnimationDuration_ = 0.0; 265 double pressAnimationDuration_ = 0.0; 266 double disabledAlpha_ = 1.0; 267 InternalResource::ResourceId foregroundResourceId_ = InternalResource::ResourceId::RATE_STAR_BIG_ON_SVG; 268 InternalResource::ResourceId secondaryResourceId_ = InternalResource::ResourceId::RATE_STAR_BIG_OFF_SVG; 269 InternalResource::ResourceId backgroundResourceId_ = InternalResource::ResourceId::RATE_STAR_BIG_OFF_SVG; 270 InternalResource::ResourceId foregroundMiniResourceId_ = InternalResource::ResourceId::RATE_STAR_SMALL_ON_SVG; 271 InternalResource::ResourceId secondaryMiniResourceId_ = InternalResource::ResourceId::RATE_STAR_SMALL_ON_SVG; 272 InternalResource::ResourceId backgroundMiniResourceId_ = InternalResource::ResourceId::RATE_STAR_SMALL_OFF_SVG; 273 274 // properties for phone platform 275 Color hoverColor_; 276 Color pressColor_; 277 Color starColorActive_; 278 Color starColorInactive_; 279 Color focusColor_; 280 Color unlitStarFocusColor_; 281 Dimension focusBorderWidth_; 282 Dimension borderRadius_; 283 double cancelAnimation_ = 0.0; 284 bool isCircleRadius_ = false; 285 }; 286 287 } // namespace OHOS::Ace 288 289 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_RATING_RATING_THEME_H 290