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