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
35 theme->subtitleTextStyle_.SetFontSize(dialogPattern->GetAttr<Dimension>("subtitle_text_font_size", 14.0_fp));
36 theme->contentTextStyle_.SetTextColor(dialogPattern->GetAttr<Color>("content_text_color", Color::BLACK));
37 theme->contentTextStyle_.SetFontSize(dialogPattern->GetAttr<Dimension>("content_text_font_size", 16.0_fp));
38 theme->buttonBackgroundColor_ = dialogPattern->GetAttr<Color>("button_bg_color", Color::BLACK);
39 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWELVE)) {
40 theme->radius_ = Radius(dialogPattern->GetAttr<Dimension>("dialog_container_radius", 32.0_vp));
41 theme->backgroundColor_ = dialogPattern->GetAttr<Color>("bg_color_version_twelve", Color(0xffffff));
42 } else {
43 theme->radius_ = Radius(dialogPattern->GetAttr<Dimension>("radius", 24.0_vp));
44 theme->backgroundColor_ = dialogPattern->GetAttr<Color>(PATTERN_BG_COLOR, Color(0xd9ffffff));
45 }
46 theme->dividerLength_ = dialogPattern->GetAttr<Dimension>(DIALOG_DIVIDER_LENGTH, 24.0_vp);
47 theme->dividerBetweenButtonWidth_ = dialogPattern->GetAttr<Dimension>(DIALOG_DIVIDER_BETWEEN_BUTTON_WIDTH, 2.0_px);
48 theme->dividerColor_ = dialogPattern->GetAttr<Color>("divider_color", Color(0x33000000));
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->text_align_content_ = dialogPattern->GetAttr<int>("text_align_content", 0);
127 theme->text_align_title_ = dialogPattern->GetAttr<int>("text_align_title", 0);
128 theme->button_type_ = dialogPattern->GetAttr<int>("button_type", 0);
129 theme->shadowDialog_ = static_cast<uint32_t>(dialogPattern->GetAttr<double>("shadow_dialog", SHADOW_NONE));
130 theme->alignDialog_ = static_cast<int32_t>(dialogPattern->GetAttr<double>("align_dialog", DEFAULT_ALIGN_DIALOG));
131 theme->colorBgWithBlur_ = dialogPattern->GetAttr<Color>("color_bg_with_blur", Color::TRANSPARENT);
132 theme->paddingTopTitle_ = dialogPattern->GetAttr<Dimension>("padding_top_title", 16.0_vp);
133 theme->paddingSingleTitle_ = dialogPattern->GetAttr<Dimension>("padding_single_title", 0.0_vp);
134 theme->backgroundBorderColor_ = dialogPattern->GetAttr<Color>("border_color", Color::TRANSPARENT);
135 theme->backgroundBorderWidth_ = dialogPattern->GetAttr<Dimension>("border_width", 0.0_vp);
136 theme->normalButtonFontSize_ = dialogPattern->GetAttr<Dimension>("normal_button_text_font_size", 16.0_fp);
137 theme->dialogRatioHeight_ = dialogPattern->GetAttr<double>("dialog_ratio_height", 0.9f);
138 theme->titleMinFontSize_ = dialogPattern->GetAttr<Dimension>("dialog_title_text_font_size_min", 15.0_fp);
139 theme->contentMinFontSize_ = dialogPattern->GetAttr<Dimension>("content_text_font_size_min", 16.0_fp);
140 auto titleMaxLines = dialogPattern->GetAttr<int>("dialog_title_text_max_lines", 2);
141 theme->titleMaxLines_ = titleMaxLines < 0 ? theme->titleMaxLines_ : static_cast<uint32_t>(titleMaxLines);
142 theme->defaultPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left", 24.0_vp),
143 dialogPattern->GetAttr<Dimension>("dialog_padding_top", 24.0_vp),
144 dialogPattern->GetAttr<Dimension>("dialog_padding_right", 24.0_vp),
145 dialogPattern->GetAttr<Dimension>("dialog_padding_bottom", 24.0_vp));
146 theme->adjustPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left_adjust", 24.0_vp),
147 dialogPattern->GetAttr<Dimension>("dialog_padding_top_adjust", 24.0_vp),
148 dialogPattern->GetAttr<Dimension>("dialog_padding_right_adjust", 24.0_vp),
149 dialogPattern->GetAttr<Dimension>("dialog_padding_bottom_adjust", 0.0_vp));
150 theme->titleDefaultPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left", 24.0_vp),
151 dialogPattern->GetAttr<Dimension>("button_title_padding_vertical", 14.0_vp),
152 dialogPattern->GetAttr<Dimension>("dialog_padding_right", 24.0_vp),
153 dialogPattern->GetAttr<Dimension>("button_title_padding_vertical", 14.0_vp));
154 theme->titleAdjustPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left_adjust", 24.0_vp),
155 dialogPattern->GetAttr<Dimension>("button_title_padding_vertical", 14.0_vp),
156 dialogPattern->GetAttr<Dimension>("dialog_padding_right_adjust", 24.0_vp),
157 dialogPattern->GetAttr<Dimension>("dialog_padding_bottom_adjust", 0.0_vp));
158 theme->contentDefaultPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_left", 24.0_vp),
159 dialogPattern->GetAttr<Dimension>("dialog_padding_top", 24.0_vp),
160 dialogPattern->GetAttr<Dimension>("dialog_padding_right", 24.0_vp),
161 dialogPattern->GetAttr<Dimension>("dialog_padding_bottom", 24.0_vp));
162 theme->buttonPaddingLeft_ =
163 Edge(dialogPattern->GetAttr<Dimension>("dialog_padding_min", 4.0_vp).Value(), 0.0, 0.0, 0.0, DimensionUnit::VP);
164 theme->buttonPaddingRight_ =
165 Edge(0.0, 0.0, dialogPattern->GetAttr<Dimension>("dialog_padding_min", 4.0_vp).Value(), 0.0, DimensionUnit::VP);
166 theme->buttonPaddingCenter_ = Edge(0.0, dialogPattern->GetAttr<Dimension>("dialog_padding_mid", 8.0_vp).Value(),
167 0.0, dialogPattern->GetAttr<Dimension>("dialog_padding_mid", 8.0_vp).Value(), DimensionUnit::VP);
168 theme->buttonSpacingHorizontal_ = dialogPattern->GetAttr<Dimension>("dialog_button_spacing_vertical", 8.0_vp);
169 theme->buttonSpacingVertical_ = dialogPattern->GetAttr<Dimension>("dialog_button_spacing_vertical", 8.0_vp);
170 theme->buttonClickedColor_ = dialogPattern->GetAttr<Color>("button_color_clicked", Color(0x19182431));
171 theme->frameStart_ = dialogPattern->GetAttr<double>("dialog_frame_start", 0.0f);
172 theme->frameEnd_ = dialogPattern->GetAttr<double>("dialog_frame_end", 1.0f);
173 theme->scaleStart_ = dialogPattern->GetAttr<double>("dialog_scale_start", 0.85f);
174 theme->scaleEnd_ = dialogPattern->GetAttr<double>("dialog_scale_end", 1.0f);
175 theme->opacityStart_ = dialogPattern->GetAttr<double>("dialog_opacity_start", 0.0f);
176 theme->opacityEnd_ = dialogPattern->GetAttr<double>("dialog_opacity_end", 1.0f);
177 theme->maskColorStart_ = dialogPattern->GetAttr<Color>("dialog_mask_color_start", Color(0x00000000));
178 theme->maskColorEnd_ = dialogPattern->GetAttr<Color>("dialog_mask_color_end", Color(0x33000000));
179 theme->animationDurationIn_ =
180 dialogPattern->GetAttr<int>("dialog_animation_duration_in", DEFAULT_ANIMATION_DURATION_IN);
181 theme->animationDurationOut_ =
182 dialogPattern->GetAttr<int>("dialog_animation_duration_out", DEFAULT_ANIMATION_DURATION_OUT);
183 theme->translateValue_ = Dimension(dialogPattern->GetAttr<double>("dialog_translate", 500.0f), DimensionUnit::PX);
184 theme->dividerWidth_ = dialogPattern->GetAttr<Dimension>("dialog_divider_width", 1.0_vp);
185 theme->dividerHeight_ = dialogPattern->GetAttr<Dimension>("dialog_divider_height", 24.0_vp);
186 theme->dividerPadding_ = Edge(dialogPattern->GetAttr<Dimension>("dialog_divider_padding_horizon", 4.0_vp),
187 dialogPattern->GetAttr<Dimension>("dialog_divider_padding_vertical", 6.0_vp),
188 dialogPattern->GetAttr<Dimension>("dialog_divider_padding_horizon", 4.0_vp),
189 dialogPattern->GetAttr<Dimension>("dialog_divider_padding_vertical", 6.0_vp));
190 theme->marginBottom_ = dialogPattern->GetAttr<Dimension>("dialog_dimension_bottom", 16.0_vp);
191 if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWELVE)) {
192 theme->marginLeft_ = dialogPattern->GetAttr<Dimension>("dialog_container_margin_left", 16.0_vp);
193 theme->marginRight_ = dialogPattern->GetAttr<Dimension>("dialog_container_margin_right", 16.0_vp);
194 } else {
195 theme->marginLeft_ = dialogPattern->GetAttr<Dimension>("dialog_dimension_start", 12.0_vp);
196 theme->marginRight_ = dialogPattern->GetAttr<Dimension>("dialog_dimension_end", 12.0_vp);
197 }
198 theme->containerMaxWidth_ = dialogPattern->GetAttr<Dimension>("dialog_container_max_width", 400.0_vp);
199 theme->defaultShadowOn_ = static_cast<uint32_t>(
200 dialogPattern->GetAttr<int>("dialog_background_shadow_on", static_cast<int>(ShadowStyle::None)));
201 theme->defaultShadowOff_ = static_cast<uint32_t>(
202 dialogPattern->GetAttr<int>("dialog_background_shadow_off", static_cast<int>(ShadowStyle::None)));
203 theme->alignment_ =
204 static_cast<DialogAlignment>(dialogPattern->GetAttr<int>("dialog_alignment", DEFAULT_DIALOG_ALIGNMENT));
205 theme->maxSizeScaleLandscape_ =
206 dialogPattern->GetAttr<double>("dialog_maxsize_scale_landscape", DEFAULT_DIALOG_MAXSIZE_SCALE_LANDSCAPE);
207 theme->maxSizeScalePortrait_ =
208 dialogPattern->GetAttr<double>("dialog_maxsize_scale_portrait", DEFAULT_DIALOG_MAXSIZE_SCALE_PORTRAIT);
209 theme->scrollFlexAlign_ = static_cast<FlexAlign>(
210 dialogPattern->GetAttr<int>("dialog_scroll_flex_align", DEFAULT_DIALOG_SCROLL_FLEX_ALIGN));
211 theme->columnMeasureType_ = static_cast<NG::MeasureType>(
212 dialogPattern->GetAttr<int>("dialog_column_measure_type", DEFAULT_DIALOG_COLUMN_MEASURE_TYPE));
213 theme->dialogDoubleBorderEnable_ = dialogPattern->GetAttr<int>("dialog_double_border_enable", 0);
214 theme->dialogOuterBorderColor_ = dialogPattern->GetAttr<Color>("dialog_outer_border_color", Color::TRANSPARENT);
215 theme->dialogOuterBorderWidth_ = dialogPattern->GetAttr<double>("dialog_outer_border_width", 0.0f);
216 theme->dialogInnerBorderColor_ = dialogPattern->GetAttr<Color>("dialog_inner_border_color", Color::TRANSPARENT);
217 theme->dialogInnerBorderWidth_ = dialogPattern->GetAttr<double>("dialog_inner_border_width", 0.0f);
218 theme->buttonBottomTopMargin_ = dialogPattern->GetAttr<Dimension>("button_bottom_top_margin", 10.0_vp);
219 theme->titlePaddingHorizontal_ = dialogPattern->GetAttr<Dimension>("title_padding_horizontal", 16.0_vp);
220 theme->dialogBackgroundBlurStyle_ =
221 dialogPattern->GetAttr<int>("dialog_background_blur_style", static_cast<int>(BlurStyle::COMPONENT_ULTRA_THICK));
222 }
223 } // namespace OHOS::Ace