1 /*
2  * Copyright (c) 2021-2022 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_DIALOG_DIALOG_THEME_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DIALOG_DIALOG_THEME_H
18 
19 #include "base/utils/system_properties.h"
20 #include "core/common/container.h"
21 #include "core/components/common/layout/constants.h"
22 #include "core/components/common/layout/layout_param.h"
23 #include "core/components/common/properties/color.h"
24 #include "core/components/common/properties/edge.h"
25 #include "core/components/common/properties/radius.h"
26 #include "core/components/common/properties/text_style.h"
27 #include "core/components/theme/theme.h"
28 #include "core/components/theme/theme_constants.h"
29 #include "core/components/theme/theme_constants_defines.h"
30 
31 namespace OHOS::Ace {
32 namespace {
33 constexpr double PRIMARY_RGBA_OPACITY = 0.9f;
34 constexpr double SECONDARY_RGBA_OPACITY = 0.6f;
35 constexpr int DEFAULT_ANIMATION_DURATION_OUT = 220;
36 constexpr int DEFAULT_ANIMATION_DURATION_IN = 250;
37 constexpr int DEFAULT_DIALOG_ALIGNMENT = 2;
38 constexpr double DEFAULT_DIALOG_MAXSIZE_SCALE_LANDSCAPE = 0.9f;
39 constexpr double DEFAULT_DIALOG_MAXSIZE_SCALE_PORTRAIT = 0.8f;
40 constexpr int DEFAULT_DIALOG_SCROLL_FLEX_ALIGN = 1;
41 constexpr int DEFAULT_DIALOG_COLUMN_MEASURE_TYPE = 1;
42 constexpr int DIALOG_TITLE_MAX_LINES_VALUE = 2;
43 
44 } // namespace
45 /**
46  * DialogTheme defines color and styles of DialogComponent. DialogTheme should be built
47  * using DialogTheme::Builder.
48  */
49 class DialogTheme : public virtual Theme {
50     DECLARE_ACE_TYPE(DialogTheme, Theme);
51 
52 public:
53     class Builder {
54     public:
55         Builder() = default;
56         ~Builder() = default;
57 
Build(const RefPtr<ThemeConstants> & themeConstants)58         RefPtr<DialogTheme> Build(const RefPtr<ThemeConstants>& themeConstants) const
59         {
60             RefPtr<DialogTheme> theme = AceType::Claim(new DialogTheme());
61             if (!themeConstants) {
62                 return theme;
63             }
64             // init theme from global data
65             ParseNewPattern(themeConstants, theme);
66             ParsePattern(themeConstants, theme);
67             return theme;
68         }
69 
70         void ParsePattern(const RefPtr<ThemeConstants>& themeConstants, const RefPtr<DialogTheme>& theme) const;
71         void ParseNewPattern(const RefPtr<ThemeConstants>& themeConstants, const RefPtr<DialogTheme>& theme) const;
72     };
73 
74     ~DialogTheme() override = default;
75 
GetRadius()76     const Radius& GetRadius() const
77     {
78         return radius_;
79     }
80 
GetBackgroundColor()81     const Color& GetBackgroundColor() const
82     {
83         return backgroundColor_;
84     }
85 
GetCommonButtonBgColor()86     const Color& GetCommonButtonBgColor() const
87     {
88         return commonButtonBgColor_;
89     }
90 
GetEmphasizeButtonBgColor()91     const Color& GetEmphasizeButtonBgColor() const
92     {
93         return emphasizeButtonBgColor_;
94     }
95 
GetTitleTextStyle()96     const TextStyle& GetTitleTextStyle() const
97     {
98         return titleTextStyle_;
99     }
100 
GetSubTitleTextStyle()101     const TextStyle& GetSubTitleTextStyle() const
102     {
103         return subtitleTextStyle_;
104     }
105 
GetTitleMinFontSize()106     const Dimension& GetTitleMinFontSize() const
107     {
108         return titleMinFontSize_;
109     }
110 
GetContentMinFontSize()111     const Dimension& GetContentMinFontSize() const
112     {
113         return contentMinFontSize_;
114     }
115 
GetTitleMaxLines()116     uint32_t GetTitleMaxLines() const
117     {
118         return titleMaxLines_;
119     }
120 
GetContentTextStyle()121     const TextStyle& GetContentTextStyle() const
122     {
123         return contentTextStyle_;
124     }
125 
GetDefaultPadding()126     const Edge& GetDefaultPadding() const
127     {
128         return defaultPadding_;
129     }
130 
GetAdjustPadding()131     const Edge& GetAdjustPadding() const
132     {
133         return adjustPadding_;
134     }
135 
GetTitleDefaultPadding()136     const Edge& GetTitleDefaultPadding() const
137     {
138         return titleDefaultPadding_;
139     }
140 
GetTitleAdjustPadding()141     const Edge& GetTitleAdjustPadding() const
142     {
143         return titleAdjustPadding_;
144     }
145 
GetContentDefaultPadding()146     const Edge& GetContentDefaultPadding() const
147     {
148         return contentDefaultPadding_;
149     }
150 
GetContentAdjustPadding()151     const Edge& GetContentAdjustPadding() const
152     {
153         return contentAdjustPadding_;
154     }
155 
GetActionsPadding()156     const Edge& GetActionsPadding() const
157     {
158         return actionsPadding_;
159     }
160 
GetButtonPaddingLeft()161     const Edge& GetButtonPaddingLeft() const
162     {
163         return buttonPaddingLeft_;
164     }
165 
GetButtonPaddingRight()166     const Edge& GetButtonPaddingRight() const
167     {
168         return buttonPaddingRight_;
169     }
170 
GetButtonPaddingCenter()171     const Edge& GetButtonPaddingCenter() const
172     {
173         return buttonPaddingCenter_;
174     }
175 
GetButtonPaddingBottom()176     const Dimension& GetButtonPaddingBottom() const
177     {
178         return buttonPaddingBottom_;
179     }
180 
GetSingleButtonPaddingStart()181     const Dimension& GetSingleButtonPaddingStart() const
182     {
183         return singleButtonPaddingStart_;
184     }
185 
GetSingleButtonPaddingEnd()186     const Dimension& GetSingleButtonPaddingEnd() const
187     {
188         return singleButtonPaddingEnd_;
189     }
190 
GetMutiButtonPaddingStart()191     const Dimension& GetMutiButtonPaddingStart() const
192     {
193         return mutiButtonPaddingStart_;
194     }
195 
GetMutiButtonPaddingEnd()196     const Dimension& GetMutiButtonPaddingEnd() const
197     {
198         return mutiButtonPaddingEnd_;
199     }
200 
GetMutiButtonPaddingHorizontal()201     const Dimension& GetMutiButtonPaddingHorizontal() const
202     {
203         return mutiButtonPaddingHorizontal_;
204     }
205 
GetMutiButtonPaddingVertical()206     const Dimension& GetMutiButtonPaddingVertical() const
207     {
208         return mutiButtonPaddingVertical_;
209     }
210 
GetButtonSpacingHorizontal()211     const Dimension& GetButtonSpacingHorizontal() const
212     {
213         return buttonSpacingHorizontal_;
214     }
215 
GetButtonSpacingVertical()216     const Dimension& GetButtonSpacingVertical() const
217     {
218         return buttonSpacingVertical_;
219     }
220 
GetDividerLength()221     const Dimension& GetDividerLength() const
222     {
223         return dividerLength_;
224     }
225 
GetDividerBetweenButtonWidth_()226     const Dimension& GetDividerBetweenButtonWidth_() const
227     {
228         return dividerBetweenButtonWidth_;
229     }
230 
GetButtonBackgroundColor()231     const Color& GetButtonBackgroundColor() const
232     {
233         return buttonBackgroundColor_;
234     }
235 
GetButtonClickedColor()236     const Color& GetButtonClickedColor() const
237     {
238         return buttonClickedColor_;
239     }
240 
GetButtonHighlightBgColor()241     const Color& GetButtonHighlightBgColor() const
242     {
243         return buttonHighlightBgColor_;
244     }
245 
GetButtonHighlightFontColor()246     const Color& GetButtonHighlightFontColor() const
247     {
248         return buttonHighlightFontColor_;
249     }
250 
GetButtonDefaultBgColor()251     const Color& GetButtonDefaultBgColor() const
252     {
253         return buttonDefaultBgColor_;
254     }
255 
GetButtonDefaultFontColor()256     const Color& GetButtonDefaultFontColor() const
257     {
258         return buttonDefaultFontColor_;
259     }
260 
GetFrameStart()261     double GetFrameStart() const
262     {
263         return frameStart_;
264     }
265 
GetFrameEnd()266     double GetFrameEnd() const
267     {
268         return frameEnd_;
269     }
270 
GetScaleStart()271     double GetScaleStart() const
272     {
273         return scaleStart_;
274     }
275 
GetScaleEnd()276     double GetScaleEnd() const
277     {
278         return scaleEnd_;
279     }
280 
GetOpacityStart()281     double GetOpacityStart() const
282     {
283         return opacityStart_;
284     }
285 
GetOpacityEnd()286     double GetOpacityEnd() const
287     {
288         return opacityEnd_;
289     }
290 
GetTranslateValue()291     const Dimension& GetTranslateValue() const
292     {
293         return translateValue_;
294     }
295 
GetMaskColorStart()296     const Color& GetMaskColorStart() const
297     {
298         return maskColorStart_;
299     }
300 
GetMaskColorEnd()301     const Color& GetMaskColorEnd() const
302     {
303         return maskColorEnd_;
304     }
305 
GetCommonButtonTextColor()306     const Color& GetCommonButtonTextColor() const
307     {
308         return commonButtonTextColor_;
309     }
310 
GetEmphasizeButtonTextColor()311     const Color& GetEmphasizeButtonTextColor() const
312     {
313         return emphasizeButtonTextColor_;
314     }
315 
GetOpacityAnimationDurIn()316     int32_t GetOpacityAnimationDurIn() const
317     {
318         return opacityAnimationDurIn_;
319     }
320 
GetAnimationDurationIn()321     int32_t GetAnimationDurationIn() const
322     {
323         return animationDurationIn_;
324     }
325 
GetAnimationDurationOut()326     int32_t GetAnimationDurationOut() const
327     {
328         return animationDurationOut_;
329     }
330 
GetDividerColor()331     const Color& GetDividerColor()
332     {
333         return dividerColor_;
334     }
335 
GetDividerWidth()336     const Dimension& GetDividerWidth()
337     {
338         return dividerWidth_;
339     }
340 
GetDividerHeight()341     const Dimension& GetDividerHeight()
342     {
343         return dividerHeight_;
344     }
345 
GetDividerPadding()346     const Edge& GetDividerPadding()
347     {
348         return dividerPadding_;
349     }
350 
GetMarginBottom()351     const Dimension& GetMarginBottom() const
352     {
353         return marginBottom_;
354     }
355 
GetMarginLeft()356     const Dimension& GetMarginLeft() const
357     {
358         return marginLeft_;
359     }
360 
GetMarginRight()361     const Dimension& GetMarginRight() const
362     {
363         return marginRight_;
364     }
365 
GetButtonHeight()366     const Dimension& GetButtonHeight() const
367     {
368         return buttonHeight_;
369     }
370 
GetButtonTextSize()371     const Dimension& GetButtonTextSize() const
372     {
373         return buttonTextSize_;
374     }
375 
GetMinButtonTextSize()376     const Dimension& GetMinButtonTextSize() const
377     {
378         return buttonMinTextSize_;
379     }
380 
GetDefaultPaddingBottomFixed()381     const Dimension& GetDefaultPaddingBottomFixed()
382     {
383         return defaultPaddingBottomFixed_;
384     }
385 
GetDefaultDialogMarginBottom()386     const Dimension& GetDefaultDialogMarginBottom()
387     {
388         return defaultDialogMarginBottom_;
389     }
390 
GetMultipleDialogDisplay()391     const std::string& GetMultipleDialogDisplay()
392     {
393         return multipleDialogDisplay_;
394     }
395 
GetExpandDisplay()396     bool GetExpandDisplay() const
397     {
398         return expandDisplay_;
399     }
400 
GetButtonWithContentPadding()401     const Dimension& GetButtonWithContentPadding() const
402     {
403         return buttonWithContentPadding_;
404     }
405 
GetContainerMaxWidth()406     const Dimension& GetContainerMaxWidth() const
407     {
408         return containerMaxWidth_;
409     }
410 
GetDefaultShadowOn()411     uint32_t GetDefaultShadowOn() const
412     {
413         return defaultShadowOn_;
414     }
415 
GetDefaultShadowOff()416     uint32_t GetDefaultShadowOff() const
417     {
418         return defaultShadowOff_;
419     }
GetAlignment()420     const DialogAlignment& GetAlignment() const
421     {
422         return alignment_;
423     }
424 
GetMaxSizeScaleLandscape()425     double GetMaxSizeScaleLandscape() const
426     {
427         return maxSizeScaleLandscape_;
428     }
429 
GetMaxSizeScalePortrait()430     double GetMaxSizeScalePortrait() const
431     {
432         return maxSizeScalePortrait_;
433     }
434 
GetScrollFlexAlign()435     const FlexAlign& GetScrollFlexAlign() const
436     {
437         return scrollFlexAlign_;
438     }
439 
GetColumnMeasureType()440     const NG::MeasureType& GetColumnMeasureType() const
441     {
442         return columnMeasureType_;
443     }
444 
GetMinFontScaleForElderly()445     double GetMinFontScaleForElderly() const
446     {
447         return minFontScaleForElderly_;
448     }
449 
GetDialogDefaultScale()450     double GetDialogDefaultScale() const
451     {
452         return dialogDefaultScale_;
453     }
454 
GetContentMaxFontScale()455     double GetContentMaxFontScale() const
456     {
457         return contentMaxFontScale_;
458     }
459 
GetContentLandscapeMaxFontScale()460     double GetContentLandscapeMaxFontScale() const
461     {
462         return contentLandscapeMaxFontScale_;
463     }
464 
GetButtonMaxFontScale()465     double GetButtonMaxFontScale() const
466     {
467         return buttonMaxFontScale_;
468     }
469 
GetButtonLandscapeMaxFontScale()470     double GetButtonLandscapeMaxFontScale() const
471     {
472         return buttonLandscapeMaxFontScale_;
473     }
474 
GetTitleMaxFontScale()475     double GetTitleMaxFontScale() const
476     {
477         return titleMaxFontScale_;
478     }
479 
GetDialogLandscapeHeightBoundary()480     const Dimension& GetDialogLandscapeHeightBoundary() const
481     {
482         return dialogLandscapeHeightBoundary_;
483     }
484 
485 protected:
486     DialogTheme() = default;
487 
488 private:
489     Radius radius_;
490     Color backgroundColor_;
491     TextStyle titleTextStyle_;
492     TextStyle subtitleTextStyle_;
493     TextStyle contentTextStyle_;
494     Dimension titleMinFontSize_;
495     Dimension contentMinFontSize_;
496     uint32_t titleMaxLines_ = 1;
497     Edge defaultPadding_;
498     Edge adjustPadding_;
499     Edge titleDefaultPadding_;
500     Edge titleAdjustPadding_;
501     Edge contentDefaultPadding_;
502     Edge contentAdjustPadding_;
503     Edge actionsPadding_;
504     Edge buttonPaddingLeft_;
505     Edge buttonPaddingRight_;
506     Edge buttonPaddingCenter_;
507     Dimension buttonSpacingHorizontal_;
508     Dimension buttonSpacingVertical_;
509     Dimension dividerLength_;
510     Dimension dividerBetweenButtonWidth_;
511     Dimension dialogLandscapeHeightBoundary_;
512     Color buttonBackgroundColor_;
513     Color buttonClickedColor_;
514     Color buttonHighlightBgColor_;
515     Color buttonHighlightFontColor_;
516     Color buttonDefaultBgColor_;
517     Color buttonDefaultFontColor_;
518     Color emphasizeButtonTextColor_;
519     Dimension translateValue_;
520     double frameStart_ = 0.0;
521     double frameEnd_ = 1.0;
522     double scaleStart_ = 0.0;
523     double scaleEnd_ = 1.0;
524     double opacityStart_ = 0.0;
525     double opacityEnd_ = 1.0;
526     double minFontScaleForElderly_ = 1.75;
527     double dialogDefaultScale_ = 1.0;
528     double contentMaxFontScale_ = 3.2;
529     double contentLandscapeMaxFontScale_ = 2.0;
530     double buttonMaxFontScale_ = 3.2;
531     double buttonLandscapeMaxFontScale_ = 2.0;
532     double titleMaxFontScale_ = 2.0;
533     int32_t animationDurationIn_ = 250;
534     int32_t opacityAnimationDurIn_ = 150;
535     int32_t animationDurationOut_ = 250;
536     Color maskColorStart_;
537     Color maskColorEnd_;
538     Color dividerColor_;
539     Color commonButtonBgColor_;
540     Color commonButtonTextColor_;
541     Color emphasizeButtonBgColor_;
542     Dimension dividerWidth_;
543     Dimension dividerHeight_;
544     Edge dividerPadding_;
545     Dimension marginLeft_;
546     Dimension marginRight_;
547     Dimension marginBottom_;
548     Dimension buttonHeight_;
549     Dimension buttonTextSize_;
550     Dimension buttonMinTextSize_;
551     Dimension minButtonWidth_;
552     Dimension maxButtonWidth_;
553     Dimension defaultPaddingBottomFixed_;
554     Dimension defaultDialogMarginBottom_;
555     Dimension buttonPaddingBottom_;
556     Dimension singleButtonPaddingStart_;
557     Dimension singleButtonPaddingEnd_;
558     Dimension mutiButtonPaddingStart_;
559     Dimension mutiButtonPaddingEnd_;
560     Dimension mutiButtonPaddingHorizontal_;
561     Dimension mutiButtonPaddingVertical_;
562     std::string multipleDialogDisplay_;
563     bool expandDisplay_ = false;
564     Dimension buttonWithContentPadding_;
565     Dimension containerMaxWidth_;
566     uint32_t defaultShadowOn_ = 6;
567     uint32_t defaultShadowOff_ = 6;
568     DialogAlignment alignment_;
569     double maxSizeScaleLandscape_ = 0.9;
570     double maxSizeScalePortrait_ = 0.8;
571     FlexAlign scrollFlexAlign_ = FlexAlign::FLEX_START;
572     NG::MeasureType columnMeasureType_ = NG::MeasureType::MATCH_CONTENT;
573 };
574 
575 } // namespace OHOS::Ace
576 
577 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DIALOG_DIALOG_THEME_H
578