1 /*
2  * Copyright (c) 2024 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 #include "core/components/dialog/dialog_theme.h"
17 
18 namespace OHOS::Ace {
ParsePattern(const RefPtr<ThemeConstants> & themeConstants,const RefPtr<DialogTheme> & theme) const19 void DialogTheme::Builder::ParsePattern(
20     const RefPtr<ThemeConstants>& themeConstants, const RefPtr<DialogTheme>& theme) const
21 {
22     auto themeStyle = themeConstants->GetThemeStyle();
23     if (!themeStyle) {
24         return;
25     }
26     RefPtr<ThemeStyle> dialogPattern = themeConstants->GetPatternByName(THEME_PATTERN_DIALOG);
27     if (!dialogPattern) {
28         return;
29     }
30     theme->titleTextStyle_.SetTextColor(dialogPattern->GetAttr<Color>("title_text_color", Color::BLACK));
31     theme->titleTextStyle_.SetFontSize(dialogPattern->GetAttr<Dimension>("title_text_font_size", 20.0_fp));
32     theme->titleTextStyle_.SetFontWeight(FontWeight::MEDIUM);
33     theme->subtitleTextStyle_.SetTextColor(dialogPattern->GetAttr<Color>("subtitle_text_color", Color::BLACK));
34     theme->subtitleTextStyle_.SetFontSize(dialogPattern->GetAttr<Dimension>("subtitle_text_font_size", 14.0_fp));
35     theme->contentTextStyle_.SetTextColor(dialogPattern->GetAttr<Color>("content_text_color", Color::BLACK));
36     theme->contentTextStyle_.SetFontSize(dialogPattern->GetAttr<Dimension>("content_text_font_size", 16.0_fp));
37     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWELVE)) {
38         theme->radius_ = Radius(dialogPattern->GetAttr<Dimension>("dialog_container_radius", 32.0_vp));
39         theme->backgroundColor_ = dialogPattern->GetAttr<Color>("bg_color_version_twelve", Color(0xffffff));
40     } else {
41         theme->radius_ = Radius(dialogPattern->GetAttr<Dimension>("radius", 24.0_vp));
42         theme->backgroundColor_ = dialogPattern->GetAttr<Color>(PATTERN_BG_COLOR, Color(0xd9ffffff));
43     }
44     theme->buttonBackgroundColor_ = dialogPattern->GetAttr<Color>("button_bg_color", Color::BLACK);
45     theme->dividerLength_ = dialogPattern->GetAttr<Dimension>(DIALOG_DIVIDER_LENGTH, 24.0_vp);
46     theme->dividerBetweenButtonWidth_ = dialogPattern->GetAttr<Dimension>(DIALOG_DIVIDER_BETWEEN_BUTTON_WIDTH, 2.0_px);
47     theme->dividerColor_ = dialogPattern->GetAttr<Color>("divider_color", Color(0x33000000));
48 
49     auto defaultPadding = dialogPattern->GetAttr<Dimension>(DIALOG_CONTENT_TOP_PADDING, 24.0_vp);
50     theme->contentAdjustPadding_ = Edge(defaultPadding, defaultPadding, defaultPadding, 0.0_vp);
51     theme->defaultPaddingBottomFixed_ = dialogPattern->GetAttr<Dimension>("default_padding_bottom_fixed", 24.0_vp);
52     theme->defaultDialogMarginBottom_ = dialogPattern->GetAttr<Dimension>("default_dialog_margin_bottom", 16.0_vp);
53     theme->buttonHighlightBgColor_ = dialogPattern->GetAttr<Color>("button_bg_highlight_color", Color(0xff007dff));
54     theme->buttonHighlightFontColor_ = dialogPattern->GetAttr<Color>("first_button_text_color", Color::WHITE);
55     theme->buttonDefaultBgColor_ = dialogPattern->GetAttr<Color>("button_default_bg_color", Color::TRANSPARENT);
56     theme->buttonDefaultFontColor_ = dialogPattern->GetAttr<Color>("button_default_font_color", Color(0xff007dff));
57     theme->buttonPaddingBottom_ = dialogPattern->GetAttr<Dimension>("button_padding_bottom", 16.0_vp);
58     theme->singleButtonPaddingStart_ = dialogPattern->GetAttr<Dimension>("single_button_padding_start", 16.0_vp);
59     theme->singleButtonPaddingEnd_ = dialogPattern->GetAttr<Dimension>("single_button_padding_end", 16.0_vp);
60     theme->mutiButtonPaddingStart_ = dialogPattern->GetAttr<Dimension>("muti_button_padding_start", 16.0_vp);
61     theme->mutiButtonPaddingEnd_ = dialogPattern->GetAttr<Dimension>("muti_button_padding_end", 16.0_vp);
62     theme->mutiButtonPaddingHorizontal_ = dialogPattern->GetAttr<Dimension>("muti_button_padding_horizontal", 8.0_vp);
63     theme->mutiButtonPaddingVertical_ = dialogPattern->GetAttr<Dimension>("muti_button_padding_vertical", 4.0_vp);
64     theme->multipleDialogDisplay_ = dialogPattern->GetAttr<std::string>("multiple_dialog_display", "stack");
65     theme->actionsPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_actions_left", 16.0_vp),
66         dialogPattern->GetAttr<Dimension>("dialog_padding_actions_top", 8.0_vp),
67         dialogPattern->GetAttr<Dimension>("dialog_padding_actions_right", 16.0_vp),
68         dialogPattern->GetAttr<Dimension>("dialog_padding_actions_bottom", 16.0_vp));
69     theme->buttonWithContentPadding_ = dialogPattern->GetAttr<Dimension>("dialog_buttonwithcontent_padding", 8.0_vp);
70     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN)) {
71         theme->expandDisplay_ = false;
72     } else {
73         std::string expandDisplay = dialogPattern->GetAttr<std::string>("dialog_expand_display", "");
74         theme->expandDisplay_ = (expandDisplay == "true");
75     }
76     theme->titleMaxFontScale_ = dialogPattern->GetAttr<double>("dialog_title_max_scale_aging", 2.0f);
77     theme->dialogDefaultScale_ = dialogPattern->GetAttr<double>("dialog_default_scale_aging", 1.0f);
78     theme->contentMaxFontScale_ = dialogPattern->GetAttr<double>("dialog_content_max_scale_aging", 3.2f);
79     theme->contentLandscapeMaxFontScale_ =
80         dialogPattern->GetAttr<double>("dialog_content_landscape_max_scale_aging", 2.0f);
81     theme->buttonMaxFontScale_ = dialogPattern->GetAttr<double>("dialog_button_max_scale_aging", 3.2f);
82     theme->buttonLandscapeMaxFontScale_ =
83         dialogPattern->GetAttr<double>("dialog_button_landscape_max_scale_aging", 2.0f);
84     theme->minFontScaleForElderly_ = dialogPattern->GetAttr<double>("dialog_min_scale_aging", 1.75f);
85     theme->dialogLandscapeHeightBoundary_ =
86         dialogPattern->GetAttr<Dimension>("dialog_landscape_boundary_aging", 640.0_vp);
87     if (SystemProperties::GetDeviceType() != DeviceType::CAR) {
88         return;
89     }
90     auto titlePadding = dialogPattern->GetAttr<Dimension>(DIALOG_TITLE_TOP_PADDING, 0.0_vp);
91     auto actionsTopPadding = dialogPattern->GetAttr<Dimension>(DIALOG_ACTIONS_TOP_PADDING, 0.0_vp);
92     theme->titleAdjustPadding_ = Edge(defaultPadding, titlePadding, defaultPadding, titlePadding);
93     theme->titleDefaultPadding_ = Edge(defaultPadding, titlePadding, defaultPadding, titlePadding);
94     theme->defaultPadding_ = Edge(defaultPadding, defaultPadding, defaultPadding, defaultPadding);
95     theme->adjustPadding_ = Edge(defaultPadding, defaultPadding, defaultPadding, 0.0_vp);
96     theme->contentDefaultPadding_ = Edge(defaultPadding, 0.0_vp, defaultPadding, defaultPadding);
97     theme->contentAdjustPadding_ = Edge(defaultPadding, 0.0_vp, defaultPadding, 0.0_vp);
98     theme->buttonHeight_ = dialogPattern->GetAttr<Dimension>(DIALOG_BUTTON_HEIGHT, 0.0_vp);
99     theme->titleMaxLines_ =
100         static_cast<uint32_t>(dialogPattern->GetAttr<int32_t>(DIALOG_TITLE_MAX_LINES, DIALOG_TITLE_MAX_LINES_VALUE));
101     theme->buttonSpacingHorizontal_ = actionsTopPadding;
102     theme->commonButtonTextColor_ = dialogPattern->GetAttr<Color>(DIALOG_COMMON_BUTTON_TEXT_COLOR, Color::WHITE);
103     theme->buttonMinTextSize_ = dialogPattern->GetAttr<Dimension>(DIALOG_MIN_BUTTON_TEXT_SIZE, 10.0_vp);
104     theme->minButtonWidth_ = dialogPattern->GetAttr<Dimension>(DIALOG_MIN_BUTTON_WIDTH, 104.0_vp);
105     theme->maxButtonWidth_ = dialogPattern->GetAttr<Dimension>(DIALOG_MAX_BUTTON_WIDTH, 260.0_vp);
106     theme->maskColorEnd_ = dialogPattern->GetAttr<Color>(DIALOG_MASK_COLOR_END, Color::WHITE);
107     // pattern config
108     theme->titleTextStyle_.SetFontSize(dialogPattern->GetAttr<Dimension>("title_text_font_size", 20.0_vp));
109     theme->titleMinFontSize_ = dialogPattern->GetAttr<Dimension>("title_text_font_size_min", 20.0_vp);
110     theme->commonButtonBgColor_ = dialogPattern->GetAttr<Color>("common_button_bg_color", Color::GRAY);
111     theme->emphasizeButtonBgColor_ = dialogPattern->GetAttr<Color>("first_button_bg_color", Color::BLACK);
112     theme->emphasizeButtonTextColor_ = dialogPattern->GetAttr<Color>("first_button_text_color", Color::WHITE);
113     theme->buttonTextSize_ = dialogPattern->GetAttr<Dimension>("button_text_font_size", 16.0_vp);
114     theme->buttonClickedColor_ = dialogPattern->GetAttr<Color>("button_bg_color_clicked", Color::BLACK);
115     theme->contentTextStyle_.SetFontSize(themeStyle->GetAttr<Dimension>("content_text_font_size", 16.0_vp));
116     theme->contentMinFontSize_ = themeStyle->GetAttr<Dimension>("content_text_font_size_min", 16.0_vp);
117 }
118 
ParseNewPattern(const RefPtr<ThemeConstants> & themeConstants,const RefPtr<DialogTheme> & theme) const119 void DialogTheme::Builder::ParseNewPattern(
120     const RefPtr<ThemeConstants>& themeConstants, const RefPtr<DialogTheme>& theme) const
121 {
122     RefPtr<ThemeStyle> dialogPattern = themeConstants->GetPatternByName(THEME_PATTERN_DIALOG);
123     if (!dialogPattern) {
124         return;
125     }
126     theme->titleMinFontSize_ = dialogPattern->GetAttr<Dimension>("dialog_title_text_font_size_min", 15.0_fp);
127     theme->contentMinFontSize_ = dialogPattern->GetAttr<Dimension>("content_text_font_size_min", 16.0_fp);
128     auto titleMaxLines = dialogPattern->GetAttr<int>("dialog_title_text_max_lines", 2);
129     theme->titleMaxLines_ = titleMaxLines < 0 ? theme->titleMaxLines_ : static_cast<uint32_t>(titleMaxLines);
130     theme->defaultPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left", 24.0_vp),
131         dialogPattern->GetAttr<Dimension>("dialog_padding_top", 24.0_vp),
132         dialogPattern->GetAttr<Dimension>("dialog_padding_right", 24.0_vp),
133         dialogPattern->GetAttr<Dimension>("dialog_padding_bottom", 24.0_vp));
134     theme->adjustPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left_adjust", 24.0_vp),
135         dialogPattern->GetAttr<Dimension>("dialog_padding_top_adjust", 24.0_vp),
136         dialogPattern->GetAttr<Dimension>("dialog_padding_right_adjust", 24.0_vp),
137         dialogPattern->GetAttr<Dimension>("dialog_padding_bottom_adjust", 0.0_vp));
138     theme->titleDefaultPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left", 24.0_vp),
139         dialogPattern->GetAttr<Dimension>("button_title_padding_vertical", 14.0_vp),
140         dialogPattern->GetAttr<Dimension>("dialog_padding_right", 24.0_vp),
141         dialogPattern->GetAttr<Dimension>("button_title_padding_vertical", 14.0_vp));
142     theme->titleAdjustPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left_adjust", 24.0_vp),
143         dialogPattern->GetAttr<Dimension>("button_title_padding_vertical", 14.0_vp),
144         dialogPattern->GetAttr<Dimension>("dialog_padding_right_adjust", 24.0_vp),
145         dialogPattern->GetAttr<Dimension>("dialog_padding_bottom_adjust", 0.0_vp));
146     theme->contentDefaultPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left", 24.0_vp),
147         dialogPattern->GetAttr<Dimension>("dialog_padding_top", 24.0_vp),
148         dialogPattern->GetAttr<Dimension>("dialog_padding_right", 24.0_vp),
149         dialogPattern->GetAttr<Dimension>("dialog_padding_bottom", 24.0_vp));
150     theme->buttonPaddingLeft_ =
151         Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_min", 4.0_vp).Value(), 0.0, 0.0, 0.0, DimensionUnit::VP);
152     theme->buttonPaddingRight_ =
153         Edge(0.0, 0.0, dialogPattern->GetAttr<Dimension>("dialog_padding_min", 4.0_vp).Value(), 0.0, DimensionUnit::VP);
154     theme->buttonPaddingCenter_ = Edge(0.0,
155         dialogPattern->GetAttr<Dimension>("dialog_padding_mid", 8.0_vp).Value(),
156         0.0,
157         dialogPattern->GetAttr<Dimension>("dialog_padding_mid", 8.0_vp).Value(),
158         DimensionUnit::VP);
159     theme->buttonSpacingHorizontal_ = dialogPattern->GetAttr<Dimension>("dialog_button_spacing_vertical", 8.0_vp);
160     theme->buttonSpacingVertical_ = dialogPattern->GetAttr<Dimension>("dialog_button_spacing_vertical", 8.0_vp);
161     theme->buttonClickedColor_ = dialogPattern->GetAttr<Color>("button_color_clicked", Color(0x19182431));
162     theme->frameStart_ = dialogPattern->GetAttr<double>("dialog_frame_start", 0.0f);
163     theme->frameEnd_ = dialogPattern->GetAttr<double>("dialog_frame_end", 1.0f);
164     theme->scaleStart_ = dialogPattern->GetAttr<double>("dialog_scale_start", 0.85f);
165     theme->scaleEnd_ = dialogPattern->GetAttr<double>("dialog_scale_end", 1.0f);
166     theme->opacityStart_ = dialogPattern->GetAttr<double>("dialog_opacity_start", 0.0f);
167     theme->opacityEnd_ = dialogPattern->GetAttr<double>("dialog_opacity_end", 1.0f);
168     theme->maskColorStart_ = dialogPattern->GetAttr<Color>("dialog_mask_color_start", Color(0x00000000));
169     theme->maskColorEnd_ = dialogPattern->GetAttr<Color>("dialog_mask_color_end", Color(0x33000000));
170     theme->animationDurationIn_ =
171         dialogPattern->GetAttr<int>("dialog_animation_duration_in", DEFAULT_ANIMATION_DURATION_IN);
172     theme->animationDurationOut_ =
173         dialogPattern->GetAttr<int>("dialog_animation_duration_out", DEFAULT_ANIMATION_DURATION_OUT);
174     theme->translateValue_ = Dimension(dialogPattern->GetAttr<double>("dialog_translate", 500.0f), DimensionUnit::PX);
175     theme->dividerWidth_ = dialogPattern->GetAttr<Dimension>("dialog_divider_width", 1.0_vp);
176     theme->dividerHeight_ = dialogPattern->GetAttr<Dimension>("dialog_divider_height", 24.0_vp);
177     theme->dividerPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_divider_padding_horizon", 4.0_vp),
178         dialogPattern->GetAttr<Dimension>("dialog_divider_padding_vertical", 6.0_vp),
179         dialogPattern->GetAttr<Dimension>("dialog_divider_padding_horizon", 4.0_vp),
180         dialogPattern->GetAttr<Dimension>("dialog_divider_padding_vertical", 6.0_vp));
181     theme->marginBottom_ = dialogPattern->GetAttr<Dimension>("dialog_dimension_bottom", 16.0_vp);
182     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWELVE)) {
183         theme->marginLeft_ = dialogPattern->GetAttr<Dimension>("dialog_container_margin_left", 16.0_vp);
184         theme->marginRight_ = dialogPattern->GetAttr<Dimension>("dialog_container_margin_right", 16.0_vp);
185     } else {
186         theme->marginLeft_ = dialogPattern->GetAttr<Dimension>("dialog_dimension_start", 12.0_vp);
187         theme->marginRight_ = dialogPattern->GetAttr<Dimension>("dialog_dimension_end", 12.0_vp);
188     }
189     theme->containerMaxWidth_ = dialogPattern->GetAttr<Dimension>("dialog_container_max_width", 400.0_vp);
190     theme->defaultShadowOn_ = static_cast<uint32_t>(
191         dialogPattern->GetAttr<int>("dialog_background_shadow_on", static_cast<int>(ShadowStyle::None)));
192     theme->defaultShadowOff_ = static_cast<uint32_t>(
193         dialogPattern->GetAttr<int>("dialog_background_shadow_off", static_cast<int>(ShadowStyle::None)));
194     theme->alignment_ =
195         static_cast<DialogAlignment>(dialogPattern->GetAttr<int>("dialog_alignment", DEFAULT_DIALOG_ALIGNMENT));
196     theme->maxSizeScaleLandscape_ =
197         dialogPattern->GetAttr<double>("dialog_maxsize_scale_landscape", DEFAULT_DIALOG_MAXSIZE_SCALE_LANDSCAPE);
198     theme->maxSizeScalePortrait_ =
199         dialogPattern->GetAttr<double>("dialog_maxsize_scale_portrait", DEFAULT_DIALOG_MAXSIZE_SCALE_PORTRAIT);
200     theme->scrollFlexAlign_ = static_cast<FlexAlign>(
201         dialogPattern->GetAttr<int>("dialog_scroll_flex_align", DEFAULT_DIALOG_SCROLL_FLEX_ALIGN));
202     theme->columnMeasureType_ = static_cast<NG::MeasureType>(
203         dialogPattern->GetAttr<int>("dialog_column_measure_type", DEFAULT_DIALOG_COLUMN_MEASURE_TYPE));
204 }
205 } // namespace OHOS::Ace
206