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 ParsePattern(themeConstants->GetThemeStyle(), theme); 54 return theme; 55 } 56 57 private: ParsePattern(const RefPtr<ThemeStyle> & themeStyle,const RefPtr<ListItemTheme> & theme)58 void ParsePattern(const RefPtr<ThemeStyle>& themeStyle, const RefPtr<ListItemTheme>& theme) const 59 { 60 if (!themeStyle) { 61 return; 62 } 63 auto pattern = themeStyle->GetAttr<RefPtr<ThemeStyle>>("list_item_pattern", nullptr); 64 if (!pattern) { 65 LOGE("Pattern of checkbox is null, please check!"); 66 return; 67 } 68 theme->defaultColor_ = pattern->GetAttr<Color>("item_normal_color", Color::WHITE); 69 theme->itemDefaultColor_ = pattern->GetAttr<Color>("item_normal_color", Color::WHITE); 70 theme->defaultLeftMargin_ = pattern->GetAttr<Dimension>("item_margin_left", LISTITEM_MARGIN_PADDING); 71 theme->defaultRightMargin_ = pattern->GetAttr<Dimension>("item_margin_right", LISTITEM_MARGIN_PADDING); 72 theme->defaultPadding_ = Edge(LISTITEMGROUP_PADDING); 73 theme->borderRadiusValue_ = pattern->GetAttr<Dimension>("item_border_radius", 0.0_vp); 74 theme->defaultBorderRadius_.SetRadius(theme->borderRadiusValue_); 75 theme->itemBorderRadius_.SetRadius(theme->borderRadiusValue_ - LISTITEM_LISTITEMGROUP_INTERVAL); 76 theme->itemLeftPadding_ = LISTITEM_PADDING; 77 theme->itemRightPadding_ = LISTITEM_PADDING; 78 theme->focusBorderColor_ = pattern->GetAttr<Color>("item_focus_color", Color::WHITE); 79 theme->clickColor_ = pattern->GetAttr<Color>("item_press_color", Color::WHITE); 80 theme->hoverColor_ = pattern->GetAttr<Color>("item_hover_color", Color::WHITE); 81 theme->pressColor_ = pattern->GetAttr<Color>("item_press_color", Color::WHITE); 82 theme->disabledAlpha_ = pattern->GetAttr<double>("item_disabled_alpha", 0.0); 83 theme->selectedColor_ = pattern->GetAttr<Color>("item_select_color", Color::WHITE); 84 theme->selectedColorWithAlpha_ = 85 theme->selectedColor_.BlendOpacity(pattern->GetAttr<double>("item_selected_alpha", SELECTED_ALPHA)); 86 theme->hoverAnimationDuration_ = 250; //250: the duration of hover animation, unit is ms. 87 theme->hoverToPressAnimationDuration_ = 100; //100: the duration of hover to press animation, unit is ms. 88 theme->clickAlphaBegin_ = pattern->GetAttr<double>("click_alpha_begin", 0.0f); 89 theme->clickAlphaEnd_ = pattern->GetAttr<double>("click_alpha_end", 0.05f); 90 theme->clickScale_ = pattern->GetAttr<double>("click_scale", 0.95f); 91 theme->focusScale_ = pattern->GetAttr<double>("focus_scale", 1.12f); 92 theme->focusScaleLarge_ = pattern->GetAttr<double>("focus_scale_large", 0.94f); 93 theme->focusScaleMiddle_ = pattern->GetAttr<double>("focus_scale_middle", 0.8f); 94 theme->focusScaleLittle_ = pattern->GetAttr<double>("focus_scale_little", 0.6f); 95 theme->focusOpacityLarge_ = pattern->GetAttr<double>("focus_opacity_large", 1.0f); 96 theme->focusOpacityMiddle_ = pattern->GetAttr<double>("focus_opacity_middle", 0.66f); 97 theme->focusOpacityLittle_ = pattern->GetAttr<double>("focus_opacity_little", 0.38f); 98 theme->focusAnimationDuration_ = pattern->GetAttr<double>("focus_animation_duration", 100.0f); 99 theme->clickAnimationDuration_ = pattern->GetAttr<double>("click_animation_duration", 200.0f); 100 theme->itemSize_ = pattern->GetAttr<Dimension>("item_size", 76.0_vp); 101 theme->paddingInPercent_ = pattern->GetAttr<double>("padding_in_percent", 0.0f); 102 theme->groupImageSize_ = pattern->GetAttr<Dimension>("group_image_size", 24.0_vp); 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