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_LIST_LIST_ITEM_THEME_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_LIST_LIST_ITEM_THEME_H 18 19 #include "core/components/theme/theme.h" 20 #include "core/components/theme/theme_constants.h" 21 #include "core/components/theme/theme_constants_defines.h" 22 #include "core/components_ng/property/border_property.h" 23 #include "core/components_ng/property/measure_property.h" 24 25 namespace OHOS::Ace { 26 namespace { 27 constexpr Dimension LISTITEM_MARGIN_PADDING = 12.0_vp; 28 constexpr Dimension LISTITEM_LISTITEMGROUP_INTERVAL = 4.0_vp; 29 constexpr Dimension LISTITEMGROUP_PADDING = 4.0_vp; 30 constexpr Dimension LISTITEM_PADDING = 8.0_vp; 31 constexpr double SELECTED_ALPHA = 0.1; 32 } // namespace 33 34 /** 35 * ListItemTheme defines styles of list or grid item. ListItemTheme should be built 36 * using ListItemTheme::Builder. 37 */ 38 class ListItemTheme : public virtual Theme { 39 DECLARE_ACE_TYPE(ListItemTheme, Theme); 40 41 public: 42 class Builder { 43 public: 44 Builder() = default; 45 ~Builder() = default; 46 Build(const RefPtr<ThemeConstants> & themeConstants)47 RefPtr<ListItemTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const 48 { 49 RefPtr<ListItemTheme> theme = AceType::Claim(new ListItemTheme()); 50 if (!themeConstants) { 51 return theme; 52 } 53 theme->clickColor_ = themeConstants->GetColor(THEME_ITEM_CLICK_COLOR); 54 theme->clickAlphaBegin_ = themeConstants->GetDouble(THEME_ITEM_CLICK_ALPHA_BEGIN); 55 theme->clickAlphaEnd_ = themeConstants->GetDouble(THEME_ITEM_CLICK_ALPHA_END); 56 theme->clickScale_ = themeConstants->GetDouble(THEME_ITEM_CLICK_SCALE); 57 theme->focusScale_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_SCALE); 58 theme->focusScaleLarge_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_SCALE_LARGE); 59 theme->focusScaleMiddle_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_SCALE_MIDDLE); 60 theme->focusScaleLittle_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_SCALE_LITTLE); 61 theme->focusOpacityLarge_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_OPACITY_LARGE); 62 theme->focusOpacityMiddle_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_OPACITY_MIDDLE); 63 theme->focusOpacityLittle_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_OPACITY_LITTLE); 64 theme->focusAnimationDuration_ = themeConstants->GetDouble(THEME_ITEM_FOCUS_ANIMATION_DURATION); 65 theme->clickAnimationDuration_ = themeConstants->GetDouble(THEME_ITEM_CLICK_ANIMATION_DURATION); 66 theme->itemSize_ = themeConstants->GetDimension(THEME_ITEM_SIZE); 67 theme->paddingInPercent_ = themeConstants->GetDouble(THEME_ITEM_PADDING_IN_PERCENT); 68 theme->groupImageSize_ = themeConstants->GetDimension(THEME_ITEM_GROUP_IMAGE_SIZE); 69 ParsePattern(themeConstants->GetThemeStyle(), theme); 70 return theme; 71 } 72 73 private: ParsePattern(const RefPtr<ThemeStyle> & themeStyle,const RefPtr<ListItemTheme> & theme)74 void ParsePattern(const RefPtr<ThemeStyle>& themeStyle, const RefPtr<ListItemTheme>& theme) const 75 { 76 if (!themeStyle) { 77 return; 78 } 79 auto pattern = themeStyle->GetAttr<RefPtr<ThemeStyle>>("list_item_pattern", nullptr); 80 if (!pattern) { 81 LOGE("Pattern of checkbox is null, please check!"); 82 return; 83 } 84 theme->defaultColor_ = pattern->GetAttr<Color>("item_normal_color", Color::WHITE); 85 theme->itemDefaultColor_ = pattern->GetAttr<Color>("item_normal_color", Color::WHITE); 86 theme->defaultLeftMargin_ = pattern->GetAttr<Dimension>("item_margin_left", LISTITEM_MARGIN_PADDING); 87 theme->defaultRightMargin_ = pattern->GetAttr<Dimension>("item_margin_right", LISTITEM_MARGIN_PADDING); 88 theme->defaultPadding_ = Edge(LISTITEMGROUP_PADDING); 89 theme->borderRadiusValue_ = pattern->GetAttr<Dimension>("item_border_radius", 0.0_vp); 90 theme->defaultBorderRadius_.SetRadius(theme->borderRadiusValue_); 91 theme->itemBorderRadius_.SetRadius(theme->borderRadiusValue_ - LISTITEM_LISTITEMGROUP_INTERVAL); 92 theme->itemLeftPadding_ = LISTITEM_PADDING; 93 theme->itemRightPadding_ = LISTITEM_PADDING; 94 theme->focusBorderColor_ = pattern->GetAttr<Color>("item_focus_color", Color::WHITE); 95 theme->hoverColor_ = pattern->GetAttr<Color>("item_hover_color", Color::WHITE); 96 theme->pressColor_ = pattern->GetAttr<Color>("item_press_color", Color::WHITE); 97 theme->disabledAlpha_ = pattern->GetAttr<double>("item_disabled_alpha", 0.0); 98 theme->selectedColor_ = pattern->GetAttr<Color>("item_select_color", Color::WHITE); 99 theme->selectedColorWithAlpha_ = 100 theme->selectedColor_.BlendOpacity(pattern->GetAttr<double>("item_selected_alpha", SELECTED_ALPHA)); 101 theme->hoverAnimationDuration_ = 250; 102 theme->hoverToPressAnimationDuration_ = 100; 103 } 104 }; 105 106 ~ListItemTheme() override = default; 107 GetClickColor()108 const Color& GetClickColor() const 109 { 110 return clickColor_; 111 } GetClickAlphaBegin()112 double GetClickAlphaBegin() const 113 { 114 return clickAlphaBegin_; 115 } GetClickAlphaEnd()116 double GetClickAlphaEnd() const 117 { 118 return clickAlphaEnd_; 119 } GetClickScale()120 double GetClickScale() const 121 { 122 return clickScale_; 123 } GetFocusScale()124 double GetFocusScale() const 125 { 126 return focusScale_; 127 } GetFocusScaleLarge()128 double GetFocusScaleLarge() const 129 { 130 return focusScaleLarge_; 131 } GetFocusScaleMiddle()132 double GetFocusScaleMiddle() const 133 { 134 return focusScaleMiddle_; 135 } GetFocusScaleLittle()136 double GetFocusScaleLittle() const 137 { 138 return focusScaleLittle_; 139 } GetFocusOpacityLarge()140 double GetFocusOpacityLarge() const 141 { 142 return focusOpacityLarge_; 143 } GetFocusOpacityMiddle()144 double GetFocusOpacityMiddle() const 145 { 146 return focusOpacityMiddle_; 147 } GetFocusOpacityLittle()148 double GetFocusOpacityLittle() const 149 { 150 return focusOpacityLittle_; 151 } GetFocusAnimationDuration()152 double GetFocusAnimationDuration() const 153 { 154 return focusAnimationDuration_; 155 } GetClickAnimationDuration()156 double GetClickAnimationDuration() const 157 { 158 return clickAnimationDuration_; 159 } GetItemSize()160 Dimension GetItemSize() const 161 { 162 return itemSize_; 163 } GetItemPaddingInPercent()164 double GetItemPaddingInPercent() const 165 { 166 return paddingInPercent_; 167 } GetGroupImageSize()168 Dimension GetGroupImageSize() const 169 { 170 return groupImageSize_; 171 } GetItemSwipeThreshold()172 double GetItemSwipeThreshold() const 173 { 174 return swipeThreshold_; 175 } GetItemSwipeSpeedThreshold()176 double GetItemSwipeSpeedThreshold() const 177 { 178 return swipeSpeedThreshold_; 179 } GetItemSwipeRatio()180 double GetItemSwipeRatio() const 181 { 182 return swipeRatio_; 183 } GetItemSwipeSpringMass()184 double GetItemSwipeSpringMass() const 185 { 186 return swipeSpringMass_; 187 } GetItemSwipeSpringStiffness()188 double GetItemSwipeSpringStiffness() const 189 { 190 return swipeSpringStiffness_; 191 } GetItemSwipeSpringDamping()192 double GetItemSwipeSpringDamping() const 193 { 194 return swipeSpringDamping_; 195 } GetDeleteDistance()196 const Dimension& GetDeleteDistance() const 197 { 198 return deleteDistance_; 199 } GetItemGroupDefaultColor()200 const Color& GetItemGroupDefaultColor() const 201 { 202 return defaultColor_; 203 } GetItemDefaultColor()204 const Color& GetItemDefaultColor() const 205 { 206 return itemDefaultColor_; 207 } GetItemDefaultHeight()208 const Dimension& GetItemDefaultHeight() const 209 { 210 return defaultHeight_; 211 } GetItemGroupDefaultBorderRadius()212 const NG::BorderRadiusProperty& GetItemGroupDefaultBorderRadius() const 213 { 214 return defaultBorderRadius_; 215 } GetItemDefaultBorderRadius()216 const NG::BorderRadiusProperty& GetItemDefaultBorderRadius() const 217 { 218 return itemBorderRadius_; 219 } GetItemGroupDefaultLeftMargin()220 const Dimension& GetItemGroupDefaultLeftMargin() const 221 { 222 return defaultLeftMargin_; 223 } GetItemGroupDefaultRightMargin()224 const Dimension& GetItemGroupDefaultRightMargin() const 225 { 226 return defaultRightMargin_; 227 } GetItemGroupDefaultPadding()228 const Edge& GetItemGroupDefaultPadding() const 229 { 230 return defaultPadding_; 231 } GetItemDefaultLeftPadding()232 const Dimension& GetItemDefaultLeftPadding() const 233 { 234 return itemLeftPadding_; 235 } GetItemDefaultRightPadding()236 const Dimension& GetItemDefaultRightPadding() const 237 { 238 return itemRightPadding_; 239 } GetItemFocusBorderColor()240 const Color& GetItemFocusBorderColor() const 241 { 242 return focusBorderColor_; 243 } GetItemFocusBorderWidth()244 const Dimension& GetItemFocusBorderWidth() const 245 { 246 return focusBorderWidth_; 247 } GetItemHoverColor()248 const Color& GetItemHoverColor() const 249 { 250 return hoverColor_; 251 } GetItemPressColor()252 const Color& GetItemPressColor() const 253 { 254 return pressColor_; 255 } GetHoverAnimationDuration()256 int32_t GetHoverAnimationDuration() const 257 { 258 return hoverAnimationDuration_; 259 } GetHoverToPressAnimationDuration()260 int32_t GetHoverToPressAnimationDuration() const 261 { 262 return hoverToPressAnimationDuration_; 263 } GetItemDisabledAlpha()264 double GetItemDisabledAlpha() const 265 { 266 return disabledAlpha_; 267 } GetItemSelectedColor()268 const Color& GetItemSelectedColor() const 269 { 270 return selectedColorWithAlpha_; 271 } 272 273 protected: 274 ListItemTheme() = default; 275 276 private: 277 Color clickColor_; 278 double clickAlphaBegin_ = 1.0; 279 double clickAlphaEnd_ = 1.0; 280 double clickScale_ = 1.0; 281 double focusScale_ = 1.0; 282 double focusScaleLarge_ = 1.0; 283 double focusScaleMiddle_ = 1.0; 284 double focusScaleLittle_ = 1.0; 285 double focusOpacityLarge_ = 1.0; 286 double focusOpacityMiddle_ = 1.0; 287 double focusOpacityLittle_ = 1.0; 288 double focusAnimationDuration_ = 100.0; 289 double clickAnimationDuration_ = 200.0; 290 double paddingInPercent_ = 0.0; 291 double swipeThreshold_ = 0.25; 292 double swipeSpeedThreshold_ = 1200; 293 double swipeRatio_ = 0.6; 294 double swipeSpringMass_ = 1; 295 double swipeSpringStiffness_ = 228; 296 double swipeSpringDamping_ = 30; 297 Dimension itemSize_; 298 Dimension groupImageSize_; 299 Dimension deleteDistance_ = 56.0_vp; 300 Color defaultColor_; 301 Color itemDefaultColor_; 302 Dimension defaultHeight_ = 48.0_vp; 303 NG::BorderRadiusProperty defaultBorderRadius_; 304 NG::BorderRadiusProperty itemBorderRadius_; 305 Dimension defaultLeftMargin_; 306 Dimension defaultRightMargin_; 307 Dimension itemLeftPadding_; 308 Dimension itemRightPadding_; 309 Edge defaultPadding_; 310 Color focusBorderColor_; 311 Dimension focusBorderWidth_ = 2.0_vp; 312 Color hoverColor_; 313 Color pressColor_; 314 int32_t hoverAnimationDuration_ = 0; 315 int32_t hoverToPressAnimationDuration_ = 0; 316 double disabledAlpha_ = 0.4; 317 Color selectedColor_; 318 Color selectedColorWithAlpha_; 319 Dimension borderRadiusValue_; 320 }; 321 322 } // namespace OHOS::Ace 323 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_LIST_LIST_ITEM_THEME_H 324