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