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_TEXT_OVERLAY_TEXT_OVERLAY_THEME_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TEXT_OVERLAY_TEXT_OVERLAY_THEME_H
18 
19 #include "base/geometry/dimension.h"
20 #include "core/components/common/properties/border.h"
21 #include "core/components/common/properties/border_edge.h"
22 #include "core/components/common/properties/color.h"
23 #include "core/components/common/properties/edge.h"
24 #include "core/components/common/properties/radius.h"
25 #include "core/components/common/properties/text_style.h"
26 #include "core/components/theme/theme.h"
27 #include "core/components/theme/theme_constants.h"
28 #include "core/components/theme/theme_constants_defines.h"
29 
30 namespace OHOS::Ace {
31 
32 /**
33  * DialogTheme defines color and styles of PopupComponent. PopupTheme should be built
34  * using DialogTheme::Builder.
35  */
36 class TextOverlayTheme : public virtual Theme {
37     DECLARE_ACE_TYPE(TextOverlayTheme, Theme);
38 
39 public:
40     class Builder {
41     public:
42         Builder() = default;
43         ~Builder() = default;
44 
Build(const RefPtr<ThemeConstants> & themeConstants)45         RefPtr<TextOverlayTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const
46         {
47             RefPtr<TextOverlayTheme> theme = AceType::Claim(new TextOverlayTheme());
48             if (!themeConstants) {
49                 return theme;
50             }
51             theme->backResourceId_ = themeConstants->GetResourceId(THEME_NAVIGATION_BAR_RESOURCE_ID_BACK);
52             theme->moreResourceId_ = themeConstants->GetResourceId(THEME_NAVIGATION_BAR_RESOURCE_ID_MORE);
53             ParsePattern(themeConstants->GetThemeStyle(), theme);
54             return theme;
55         }
56 
57     private:
ParsePattern(const RefPtr<ThemeStyle> & themeStyle,const RefPtr<TextOverlayTheme> & theme)58         void ParsePattern(const RefPtr<ThemeStyle>& themeStyle, const RefPtr<TextOverlayTheme>& theme) const
59         {
60             if (!themeStyle || !theme) {
61                 return;
62             }
63             auto pattern = themeStyle->GetAttr<RefPtr<ThemeStyle>>("text_overlay_pattern", nullptr);
64             if (pattern) {
65                 const double defaultTertiaryColorAlpha = 0.4;
66 
67                 theme->menuBorder_ = Border(BorderEdge(
68                     pattern->GetAttr<Color>("text_overlay_menu_border_color", Color()),
69                     pattern->GetAttr<Dimension>("text_overlay_menu_border_width", 0.0_vp),
70                     BorderStyle(
71                         static_cast<int32_t>(pattern->GetAttr<double>("text_overlay_menu_border_style", 0.0)))));
72                 theme->menuPadding_ = Edge(pattern->GetAttr<Dimension>("text_overlay_menu_padding_left", 0.0_vp),
73                     pattern->GetAttr<Dimension>("text_overlay_menu_padding_top", 0.0_vp),
74                     pattern->GetAttr<Dimension>("text_overlay_menu_padding_right", 0.0_vp),
75                     pattern->GetAttr<Dimension>("text_overlay_menu_padding_bottom", 0.0_vp));
76                 theme->menuSpacingWithText_ =
77                     pattern->GetAttr<Dimension>("text_overlay_menu_spacing_with_text", 0.0_vp);
78                 theme->menuSafeSpacing_ = pattern->GetAttr<Dimension>("text_overlay_menu_safe_spacing", 16.0_vp);
79                 theme->menuButtonWidth_ = pattern->GetAttr<Dimension>("text_overlay_menu_button_width", 0.0_vp);
80                 theme->menuButtonHeight_ = pattern->GetAttr<Dimension>("text_overlay_menu_button_height", 0.0_vp);
81                 theme->menuButtonTextStyle_.SetFontWeight(FontWeight(
82                     static_cast<int32_t>(pattern->GetAttr<double>("text_overlay_button_text_font_weight", 0.0))));
83                 theme->menuButtonPadding_ =
84                     Edge(pattern->GetAttr<Dimension>("text_overlay_menu_button_padding_left", 0.0_vp).Value(),
85                         pattern->GetAttr<Dimension>("text_overlay_menu_button_padding_top", 0.0_vp).Value(),
86                         pattern->GetAttr<Dimension>("text_overlay_menu_button_padding_right", 0.0_vp).Value(),
87                         pattern->GetAttr<Dimension>("text_overlay_menu_button_padding_bottom", 0.0_vp).Value(),
88                         pattern->GetAttr<Dimension>("text_overlay_menu_padding_left", 0.0_vp).Unit());
89                 theme->iconColor_ = pattern->GetAttr<Color>("icon_color", Color());
90                 theme->menuIconColor_ = pattern->GetAttr<Color>("memu_icon_color", Color());
91                 theme->handleColor_ = pattern->GetAttr<Color>("handle_outer_color", Color());
92                 theme->handleColorInner_ = pattern->GetAttr<Color>("handle_inner_color", Color());
93                 theme->menuBackgroundColor_ = pattern->GetAttr<Color>("menu_bg_color", Color());
94                 theme->buttonHoverColor_ = pattern->GetAttr<Color>("button_bg_color_hovered", Color());
95                 theme->buttonClickedColor_ = pattern->GetAttr<Color>("button_bg_color_clicked", Color());
96                 theme->moreOrBackIconColor_ = pattern->GetAttr<Color>("more_or_back_icon_color", Color());
97                 theme->menuButtonTextStyle_.SetTextColor(pattern->GetAttr<Color>(PATTERN_TEXT_COLOR, Color()));
98                 theme->menuButtonTextStyle_.SetFontSize(pattern->GetAttr<Dimension>(PATTERN_TEXT_SIZE, 0.0_fp));
99                 theme->handleDiameter_ = pattern->GetAttr<Dimension>("handle_outer_diameter", 14.0_vp);
100                 theme->handleDiameterInner_ = pattern->GetAttr<Dimension>("handle_inner_diameter", 12.0_vp);
101                 theme->alphaDisabled_ =
102                     pattern->GetAttr<double>(PATTERN_BG_COLOR_DISABLED_ALPHA, defaultTertiaryColorAlpha);
103                 theme->cameraInput_ = pattern->GetAttr<std::string>("camera_input", "Camera input");
104                 theme->aiWrite_ = pattern->GetAttr<std::string>("ai_write_menu_name", "Celia writer");
105             } else {
106                 LOGW("find pattern of textoverlay fail");
107             }
108         }
109     };
110 
111     ~TextOverlayTheme() override = default;
112 
GetMenuBorder()113     const Border& GetMenuBorder() const
114     {
115         return menuBorder_;
116     }
117 
GetMenuBackgroundColor()118     const Color& GetMenuBackgroundColor() const
119     {
120         return menuBackgroundColor_;
121     }
122 
GetHandleColor()123     const Color& GetHandleColor() const
124     {
125         return handleColor_;
126     }
127 
GetHandleColorInner()128     const Color& GetHandleColorInner() const
129     {
130         return handleColorInner_;
131     }
132 
GetButtonClickedColor()133     const Color& GetButtonClickedColor() const
134     {
135         return buttonClickedColor_;
136     }
137 
GetButtonHoverColor()138     const Color& GetButtonHoverColor() const
139     {
140         return buttonHoverColor_;
141     }
142 
GetIconColor()143     const Color& GetIconColor() const
144     {
145         return iconColor_;
146     }
147 
GetMenuIconColor()148     const Color& GetMenuIconColor() const
149     {
150         return menuIconColor_;
151     }
152 
GetMoreOrBackIconColor()153     const Color& GetMoreOrBackIconColor() const
154     {
155         return moreOrBackIconColor_;
156     }
157 
GetMenuPadding()158     const Edge& GetMenuPadding() const
159     {
160         return menuPadding_;
161     }
162 
GetMenuButtonPadding()163     const Edge& GetMenuButtonPadding() const
164     {
165         return menuButtonPadding_;
166     }
167 
GetHandleDiameter()168     const Dimension& GetHandleDiameter() const
169     {
170         return handleDiameter_;
171     }
172 
GetHandleDiameterStrokeWidth()173     const Dimension GetHandleDiameterStrokeWidth() const
174     {
175         return 2.0_vp;
176     }
177 
GetHandleDiameterInner()178     const Dimension& GetHandleDiameterInner() const
179     {
180         return handleDiameterInner_;
181     }
182 
GetMenuSpacingWithText()183     const Dimension& GetMenuSpacingWithText() const
184     {
185         return menuSpacingWithText_;
186     }
187 
GetMenuSafeSpacing()188     const Dimension& GetMenuSafeSpacing() const
189     {
190         return menuSafeSpacing_;
191     }
192 
GetMenuButtonWidth()193     const Dimension& GetMenuButtonWidth() const
194     {
195         return menuButtonWidth_;
196     }
197 
GetMenuButtonHeight()198     const Dimension& GetMenuButtonHeight() const
199     {
200         return menuButtonHeight_;
201     }
202 
GetMenuButtonTextStyle()203     const TextStyle& GetMenuButtonTextStyle() const
204     {
205         return menuButtonTextStyle_;
206     }
207 
GetMenuToolbarHeight()208     Dimension GetMenuToolbarHeight() const
209     {
210         return 40.0_vp;
211     }
212 
GetDefaultMenuPositionX()213     float GetDefaultMenuPositionX()
214     {
215         return Dimension(16.0_vp).ConvertToPx();
216     }
217 
GetHandleLineWidth()218     Dimension GetHandleLineWidth() const
219     {
220         return 2.0_vp;
221     }
222 
GetHandleHotZoneRadius()223     Dimension GetHandleHotZoneRadius() const
224     {
225         return handleDiameter_;
226     }
227 
GetBackResourceId()228     InternalResource::ResourceId GetBackResourceId() const
229     {
230         return backResourceId_;
231     }
232 
GetMoreResourceId()233     InternalResource::ResourceId GetMoreResourceId() const
234     {
235         return moreResourceId_;
236     }
237 
GetAlphaDisabled()238     double GetAlphaDisabled() const
239     {
240         return alphaDisabled_;
241     }
242 
GetCameraInput()243     const std::string& GetCameraInput() const
244     {
245         return cameraInput_;
246     }
247 
GetAIWrite()248     const std::string& GetAIWrite() const
249     {
250         return aiWrite_;
251     }
252 protected:
253     TextOverlayTheme() = default;
254 
255 private:
256     Border menuBorder_;
257     Color iconColor_;
258     Color menuIconColor_;
259     Color menuBackgroundColor_;
260     Color handleColor_;
261     Color handleColorInner_;
262     Color buttonClickedColor_;
263     Color buttonHoverColor_;
264     Color moreOrBackIconColor_;
265     Edge menuPadding_;
266     Edge menuButtonPadding_;
267     Dimension handleDiameter_;
268     Dimension handleDiameterInner_;
269     Dimension menuSpacingWithText_;
270     Dimension menuSafeSpacing_;
271     Dimension menuButtonWidth_;
272     Dimension menuButtonHeight_;
273     TextStyle menuButtonTextStyle_;
274     double alphaDisabled_ = 0.0;
275     std::string cameraInput_;
276     std::string aiWrite_;
277 
278     InternalResource::ResourceId backResourceId_ = InternalResource::ResourceId::NO_ID;
279     InternalResource::ResourceId moreResourceId_ = InternalResource::ResourceId::NO_ID;
280 };
281 
282 } // namespace OHOS::Ace
283 
284 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TEXT_OVERLAY_TEXT_OVERLAY_THEME_H
285