1 /*
2 * Copyright (c) 2022-2023 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_ng/pattern/text_picker/textpicker_dialog_view.h"
17
18 #include <securec.h>
19
20 #include "base/i18n/localization.h"
21 #include "base/utils/utils.h"
22 #include "core/common/recorder/event_recorder.h"
23 #include "core/components_ng/base/view_abstract_model.h"
24 #include "core/components_ng/base/view_stack_processor.h"
25 #include "core/components_ng/pattern/button/button_pattern.h"
26 #include "core/components_ng/pattern/dialog/dialog_view.h"
27 #include "core/components_ng/pattern/divider/divider_pattern.h"
28 #include "core/components_ng/pattern/dialog/dialog_pattern.h"
29 #include "core/components_ng/pattern/image/image_pattern.h"
30 #include "core/components_ng/pattern/stack/stack_pattern.h"
31 #include "core/components_ng/pattern/text/text_pattern.h"
32 #include "core/components_ng/pattern/text_picker/textpicker_column_pattern.h"
33 #include "core/components_ng/pattern/text_picker/textpicker_event_hub.h"
34 #include "core/components_ng/pattern/text_picker/textpicker_pattern.h"
35 #include "core/components_v2/inspector/inspector_constants.h"
36 #include "core/pipeline_ng/pipeline_context.h"
37
38 namespace OHOS::Ace::NG {
39 namespace {
40 const int32_t MARGIN_HALF = 2;
41 const int32_t BUFFER_NODE_NUMBER = 2;
42 const int32_t SECOND_DIVEDER_NODE_INDEX = 3;
43 const int32_t THIRD_DIVEDER_NODE_INDEX = 5;
44 const int32_t BACKWARD_BUTTON_DIVEDER_INDEX = 2;
45 const int32_t FORWAED_BUTTON_DIVEDER_INDEX = 4;
46 const int32_t CONFIRM_BUTTON_DIVEDER_INDEX = 6;
47 constexpr size_t ACCEPT_BUTTON_INDEX = 0;
48 constexpr size_t CANCEL_BUTTON_INDEX = 1;
49 constexpr size_t BACKWARD_BUTTON_INDEX = 2;
50 constexpr size_t FORWAED_BUTTON_INDEX = 3;
51 } // namespace
52
53 WeakPtr<FrameNode> TextPickerDialogView::dialogNode_ = nullptr;
54 uint32_t dialogNodePage = 0;
55 uint32_t totalPageNum_ = 0;
56 Dimension TextPickerDialogView::selectedTextStyleFont_ = 40.0_vp;
57 Dimension TextPickerDialogView::normalTextStyleFont_ = 32.0_vp;
58 Dimension TextPickerDialogView::disappearTextStyleFont_ = 28.0_vp;
59
Show(const DialogProperties & dialogProperties,const TextPickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)60 RefPtr<FrameNode> TextPickerDialogView::Show(const DialogProperties& dialogProperties,
61 const TextPickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
62 std::map<std::string, NG::DialogTextEvent> dialogEvent,
63 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
64 {
65 if (settingData.rangeVector.empty() && settingData.options.empty()) {
66 return nullptr;
67 }
68 GetUserSettingLimit();
69 if (settingData.options.empty()) {
70 return RangeShow(dialogProperties, settingData, buttonInfos, dialogEvent, dialogCancelEvent);
71 } else {
72 return OptionsShow(dialogProperties, settingData, buttonInfos, dialogEvent, dialogCancelEvent);
73 }
74 }
75
RangeShow(const DialogProperties & dialogProperties,const TextPickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> & dialogEvent,std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent)76 RefPtr<FrameNode> TextPickerDialogView::RangeShow(const DialogProperties& dialogProperties,
77 const TextPickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
78 std::map<std::string, NG::DialogTextEvent>& dialogEvent,
79 std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent)
80 {
81 auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
82 AceType::MakeRefPtr<LinearLayoutPattern>(true));
83 auto textNodeId = ElementRegister::GetInstance()->MakeUniqueId();
84 auto textPickerNode = FrameNode::GetOrCreateFrameNode(
85 V2::TEXT_PICKER_ETS_TAG, textNodeId, []() { return AceType::MakeRefPtr<TextPickerPattern>(); });
86 ViewStackProcessor::GetInstance()->Push(textPickerNode);
87 auto textPickerPattern = textPickerNode->GetPattern<TextPickerPattern>();
88 CHECK_NULL_RETURN(textPickerPattern, nullptr);
89 textPickerPattern->SetColumnsKind(settingData.columnKind);
90 textPickerPattern->SetIsShowInDialog(true);
91 textPickerPattern->SetPickerTag(false);
92 textPickerPattern->SetTextProperties(settingData.properties);
93 auto context = textPickerNode->GetContext();
94 CHECK_NULL_RETURN(context, nullptr);
95 auto themeManager = context->GetThemeManager();
96 CHECK_NULL_RETURN(themeManager, nullptr);
97 auto dialogTheme = themeManager->GetTheme<DialogTheme>();
98 CHECK_NULL_RETURN(dialogTheme, nullptr);
99 textPickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
100 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
101 CHECK_NULL_RETURN(pickerTheme, nullptr);
102 auto pickerNodeLayout = textPickerNode->GetLayoutProperty<TextPickerLayoutProperty>();
103 CHECK_NULL_RETURN(pickerNodeLayout, nullptr);
104 pickerNodeLayout->UpdateUserDefinedIdealSize(
105 CalcSize(NG::CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), std::nullopt));
106 pickerNodeLayout->UpdateCanLoop(settingData.canLoop);
107 uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
108 OptionsCreateNode(textPickerPattern, settingData, textPickerNode, showCount, 1, pickerTheme);
109 SetDefaultPickerItemHeight(settingData.height);
110 SetTextProperties(pickerTheme, settingData.properties);
111 auto changeEvent = dialogEvent["changeId"];
112 SetDialogChange(textPickerNode, std::move(changeEvent));
113 ViewStackProcessor::GetInstance()->Finish();
114 textPickerNode->MountToParent(contentColumn);
115 auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
116 CHECK_NULL_RETURN(dialogNode, nullptr);
117 auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
118 CHECK_NULL_RETURN(dialogPattern, nullptr);
119 dialogPattern->SetIsPickerDialog(true);
120 auto closeDialogEvent = CloseDialogEvent(textPickerPattern, dialogNode);
121 auto closeCallback = [func = std::move(closeDialogEvent)](const GestureEvent& /* info */) {
122 func();
123 };
124
125 auto contentRow =
126 CreateButtonNode(textPickerNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent), closeCallback);
127 textPickerPattern->SetContentRowNode(contentRow);
128 contentRow->SetNeedCallChildrenUpdate(false);
129 contentRow->AddChild(CreateDividerNode(textPickerNode), 1);
130 contentRow->MountToParent(contentColumn);
131 auto focusHub = contentColumn->GetFocusHub();
132 CHECK_NULL_RETURN(focusHub, nullptr);
133 InitOnKeyEvent(focusHub);
134 dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
135 dialogNode_ = dialogNode;
136 return dialogNode;
137 }
138
CloseDialogEvent(const RefPtr<TextPickerPattern> & textPickerPattern,const RefPtr<FrameNode> & dialogNode)139 std::function<void()> TextPickerDialogView::CloseDialogEvent(const RefPtr<TextPickerPattern>& textPickerPattern,
140 const RefPtr<FrameNode>& dialogNode)
141 {
142 auto event = [weak = WeakPtr<FrameNode>(dialogNode),
143 weakPattern = WeakPtr<TextPickerPattern>(textPickerPattern)]() {
144 auto dialogNode = weak.Upgrade();
145 CHECK_NULL_VOID(dialogNode);
146 auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
147 CHECK_NULL_VOID(dialogPattern);
148 dialogPattern->SetIsPickerDialog(false);
149 auto textPickerPattern = weakPattern.Upgrade();
150 CHECK_NULL_VOID(textPickerPattern);
151 if (textPickerPattern->GetIsShowInDialog()) {
152 auto pipeline = dialogNode->GetContext();
153 CHECK_NULL_VOID(pipeline);
154 auto overlayManager = pipeline->GetOverlayManager();
155 CHECK_NULL_VOID(overlayManager);
156 overlayManager->CloseDialog(dialogNode);
157 textPickerPattern->SetIsShowInDialog(false);
158 }
159 };
160 textPickerPattern->updateFontConfigurationEvent(event);
161 return event;
162 }
163
OptionsCreateNode(const RefPtr<TextPickerPattern> & textPickerPattern,const TextPickerSettingData & settingData,const RefPtr<FrameNode> & textPickerNode,uint32_t showCount,uint32_t columnCount,RefPtr<PickerTheme> pickerTheme)164 void TextPickerDialogView::OptionsCreateNode(const RefPtr<TextPickerPattern>& textPickerPattern,
165 const TextPickerSettingData& settingData, const RefPtr<FrameNode>& textPickerNode, uint32_t showCount,
166 uint32_t columnCount, RefPtr<PickerTheme> pickerTheme)
167 {
168 totalPageNum_ = columnCount;
169 if (textPickerNode->GetChildren().empty()) {
170 for (size_t i = 0; i < columnCount; i++) {
171 auto columnNode = CreateColumnNode(settingData.columnKind,
172 showCount, pickerTheme);
173 auto stackNode = CreateStackNode(pickerTheme);
174 auto buttonNode = CreateButtonNode();
175 auto columnBlendNode = CreateColumnNode();
176 buttonNode->MountToParent(stackNode);
177 columnNode->MountToParent(columnBlendNode);
178 columnBlendNode->MountToParent(stackNode);
179 columnNode->MarkModifyDone();
180 columnNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
181 auto layoutProperty = stackNode->GetLayoutProperty<LayoutProperty>();
182 layoutProperty->UpdateAlignment(Alignment::CENTER);
183 layoutProperty->UpdateLayoutWeight(1);
184 stackNode->MountToParent(textPickerNode);
185 }
186 }
187 if (settingData.options.size() > 0) {
188 SetSelectedValues(textPickerPattern, settingData.selectedValues);
189 SetValues(textPickerPattern, settingData.values);
190 } else {
191 SetRange(textPickerPattern, settingData.rangeVector);
192 SetSelected(textPickerPattern, settingData.selected);
193 }
194 }
195
OptionsShowInternal(const RefPtr<TextPickerPattern> & textPickerPattern,const TextPickerSettingData & settingData,const RefPtr<FrameNode> & textPickerNode,uint32_t showCount,RefPtr<PickerTheme> pickerTheme)196 void TextPickerDialogView::OptionsShowInternal(const RefPtr<TextPickerPattern>& textPickerPattern,
197 const TextPickerSettingData& settingData, const RefPtr<FrameNode>& textPickerNode, uint32_t showCount,
198 RefPtr<PickerTheme> pickerTheme)
199 {
200 textPickerPattern->SetIsCascade(settingData.attr.isCascade);
201 textPickerPattern->SetHasSelectAttr(settingData.attr.isHasSelectAttr);
202 textPickerPattern->SetColumnsKind(settingData.columnKind);
203 if (settingData.attr.isCascade) {
204 std::vector<NG::TextCascadePickerOptions> reOptions;
205 uint32_t columnCount = settingData.options.empty() ? 0 : 1;
206 // Caculate max depth
207 for (size_t i = 0; i < settingData.options.size(); i++) {
208 size_t tmp = textPickerPattern->ProcessCascadeOptionDepth(settingData.options[i]);
209 if (tmp > columnCount) {
210 columnCount = tmp;
211 }
212 }
213 OptionsCreateNode(textPickerPattern, settingData, textPickerNode, showCount, columnCount, pickerTheme);
214 textPickerPattern->ProcessCascadeOptions(settingData.options, reOptions, 0);
215 if (reOptions.size() < columnCount) {
216 auto differ = columnCount - reOptions.size();
217 for (uint32_t i = 0; i < differ; i++) {
218 NG::TextCascadePickerOptions differOption;
219 memset_s(&differOption, sizeof(differOption), 0, sizeof(differOption));
220 reOptions.emplace_back(differOption);
221 }
222 }
223 textPickerPattern->SetCascadeOptions(settingData.options, reOptions);
224 } else {
225 OptionsCreateNode(
226 textPickerPattern, settingData, textPickerNode, showCount, settingData.options.size(), pickerTheme);
227 textPickerPattern->SetCascadeOptions(settingData.options, settingData.options);
228 }
229 }
230
OptionsShow(const DialogProperties & dialogProperties,const TextPickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> & dialogEvent,std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent)231 RefPtr<FrameNode> TextPickerDialogView::OptionsShow(const DialogProperties& dialogProperties,
232 const TextPickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
233 std::map<std::string, NG::DialogTextEvent>& dialogEvent,
234 std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent)
235 {
236 auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
237 AceType::MakeRefPtr<LinearLayoutPattern>(true));
238 auto textNodeId = ElementRegister::GetInstance()->MakeUniqueId();
239 auto textPickerNode = FrameNode::GetOrCreateFrameNode(
240 V2::TEXT_PICKER_ETS_TAG, textNodeId, []() { return AceType::MakeRefPtr<TextPickerPattern>(); });
241 ViewStackProcessor::GetInstance()->Push(textPickerNode);
242 auto textPickerPattern = textPickerNode->GetPattern<TextPickerPattern>();
243 CHECK_NULL_RETURN(textPickerPattern, nullptr);
244 textPickerPattern->SetIsShowInDialog(true);
245 textPickerPattern->SetPickerTag(false);
246 textPickerPattern->SetTextProperties(settingData.properties);
247 auto context = textPickerNode->GetContext();
248 CHECK_NULL_RETURN(context, nullptr);
249 auto themeManager = context->GetThemeManager();
250 CHECK_NULL_RETURN(themeManager, nullptr);
251 auto dialogTheme = themeManager->GetTheme<DialogTheme>();
252 CHECK_NULL_RETURN(dialogTheme, nullptr);
253 textPickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
254 auto pickerTheme = themeManager->GetTheme<PickerTheme>();
255 CHECK_NULL_RETURN(pickerTheme, nullptr);
256 auto pickerNodeLayout = textPickerNode->GetLayoutProperty<TextPickerLayoutProperty>();
257 CHECK_NULL_RETURN(pickerNodeLayout, nullptr);
258 pickerNodeLayout->UpdateUserDefinedIdealSize(
259 CalcSize(NG::CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), std::nullopt));
260 pickerNodeLayout->UpdateCanLoop(settingData.canLoop);
261 uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
262 OptionsShowInternal(textPickerPattern, settingData, textPickerNode, showCount, pickerTheme);
263 SetDefaultPickerItemHeight(settingData.height);
264 SetTextProperties(pickerTheme, settingData.properties);
265 auto changeEvent = dialogEvent["changeId"];
266 SetDialogChange(textPickerNode, std::move(changeEvent));
267
268 ViewStackProcessor::GetInstance()->Finish();
269 textPickerNode->MountToParent(contentColumn);
270 auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
271 CHECK_NULL_RETURN(dialogNode, nullptr);
272 auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
273 CHECK_NULL_RETURN(dialogPattern, nullptr);
274 dialogPattern->SetIsPickerDialog(true);
275
276 auto closeDialogEvent = CloseDialogEvent(textPickerPattern, dialogNode);
277 auto closeCallBack = [func = std::move(closeDialogEvent)](const GestureEvent& /* info */) {
278 func();
279 };
280
281 auto pipeline = PipelineContext::GetCurrentContextSafely();
282 CHECK_NULL_RETURN(pipeline, nullptr);
283 float scale = pipeline->GetFontScale();
284 if (NeedAdaptForAging()) {
285 dialogNode = SeparatedOptionsShow(contentColumn, textPickerNode, buttonInfos, settingData,
286 dialogEvent, dialogCancelEvent, scale, closeCallBack, dialogNode);
287 return dialogNode;
288 }
289
290 auto contentRow =
291 CreateButtonNode(textPickerNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent), closeCallBack);
292 contentRow->AddChild(CreateDividerNode(textPickerNode), 1);
293 contentRow->MountToParent(contentColumn);
294 dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
295 return dialogNode;
296 }
297
CreateIconItemNode(RefPtr<PickerTheme> pickerTheme)298 RefPtr<FrameNode> TextPickerDialogView::CreateIconItemNode(RefPtr<PickerTheme> pickerTheme)
299 {
300 auto row = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
301 AceType::MakeRefPtr<LinearLayoutPattern>(false));
302 CHECK_NULL_RETURN(row, nullptr);
303 auto layoutProps = row->GetLayoutProperty<LinearLayoutProperty>();
304 CHECK_NULL_RETURN(layoutProps, nullptr);
305 layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
306 layoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
307
308 MarginProperty marginProperty;
309 marginProperty.left = CalcLength(pickerTheme->GetPaddingHorizontal());
310 marginProperty.right = CalcLength(pickerTheme->GetPaddingHorizontal());
311 layoutProps->UpdateMargin(marginProperty);
312
313 auto imageNode = FrameNode::CreateFrameNode(
314 V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
315 CHECK_NULL_RETURN(imageNode, nullptr);
316 imageNode->MountToParent(row);
317
318 return row;
319 }
CreateTextItemNode(RefPtr<PickerTheme> pickerTheme)320 RefPtr<FrameNode> TextPickerDialogView::CreateTextItemNode(RefPtr<PickerTheme> pickerTheme)
321 {
322 auto textNode = FrameNode::CreateFrameNode(
323 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
324 CHECK_NULL_RETURN(textNode, nullptr);
325 auto textLayout = textNode->GetLayoutProperty<TextLayoutProperty>();
326 MarginProperty marginProperty;
327 marginProperty.left = CalcLength(pickerTheme->GetPaddingHorizontal());
328 marginProperty.right = CalcLength(pickerTheme->GetPaddingHorizontal());
329 textLayout->UpdateMargin(marginProperty);
330 return textNode;
331 }
CreateMixtureItemNode(RefPtr<PickerTheme> pickerTheme)332 RefPtr<FrameNode> TextPickerDialogView::CreateMixtureItemNode(RefPtr<PickerTheme> pickerTheme)
333 {
334 auto row = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
335 AceType::MakeRefPtr<LinearLayoutPattern>(false));
336 CHECK_NULL_RETURN(row, nullptr);
337
338 auto rowProperty = row->GetLayoutProperty<LinearLayoutProperty>();
339 MarginProperty marginProperty;
340 marginProperty.left = CalcLength(pickerTheme->GetPaddingHorizontal());
341 marginProperty.right = CalcLength(pickerTheme->GetPaddingHorizontal());
342 rowProperty->UpdateMargin(marginProperty);
343
344 auto imageNode = FrameNode::CreateFrameNode(
345 V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
346 CHECK_NULL_RETURN(imageNode, nullptr);
347 imageNode->MountToParent(row);
348
349 auto textNode = FrameNode::CreateFrameNode(
350 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
351 CHECK_NULL_RETURN(textNode, nullptr);
352 textNode->MountToParent(row);
353
354 return row;
355 }
356
CreateColumnNode(uint32_t columnKind,uint32_t showCount,RefPtr<PickerTheme> pickerTheme)357 RefPtr<FrameNode> TextPickerDialogView::CreateColumnNode(
358 uint32_t columnKind, uint32_t showCount, RefPtr<PickerTheme> pickerTheme)
359 {
360 auto columnNode =
361 FrameNode::GetOrCreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
362 []() { return AceType::MakeRefPtr<TextPickerColumnPattern>(); });
363
364 if (columnKind == ICON) {
365 for (uint32_t index = 0; index < showCount; index++) {
366 auto row = CreateIconItemNode(pickerTheme);
367 CHECK_NULL_RETURN(row, nullptr);
368 row->MountToParent(columnNode);
369 }
370 } else if (columnKind == TEXT) {
371 for (uint32_t index = 0; index < showCount; index++) {
372 auto textNode = CreateTextItemNode(pickerTheme);
373 CHECK_NULL_RETURN(textNode, nullptr);
374 textNode->MountToParent(columnNode);
375 }
376 } else if (columnKind == MIXTURE) {
377 for (uint32_t index = 0; index < showCount; index++) {
378 auto row = CreateMixtureItemNode(pickerTheme);
379 CHECK_NULL_RETURN(row, nullptr);
380 row->MountToParent(columnNode);
381 }
382 }
383 return columnNode;
384 }
385
CreateStackNode(RefPtr<PickerTheme> pickerTheme)386 RefPtr<FrameNode> TextPickerDialogView::CreateStackNode(RefPtr<PickerTheme> pickerTheme)
387 {
388 auto stackId = ElementRegister::GetInstance()->MakeUniqueId();
389 auto stackNode = FrameNode::GetOrCreateFrameNode(
390 V2::STACK_ETS_TAG, stackId, []() { return AceType::MakeRefPtr<StackPattern>(); });
391
392 auto stackLayout = stackNode->GetLayoutProperty<LayoutProperty>();
393 MarginProperty marginProperty;
394 marginProperty.top = CalcLength(pickerTheme->GetContentMarginVertical());
395 marginProperty.bottom = CalcLength(pickerTheme->GetContentMarginVertical());
396 stackLayout->UpdateMargin(marginProperty);
397 return stackNode;
398 }
399
CreateColumnNode()400 RefPtr<FrameNode> TextPickerDialogView::CreateColumnNode()
401 {
402 auto columnId = ElementRegister::GetInstance()->MakeUniqueId();
403 return FrameNode::GetOrCreateFrameNode(
404 V2::COLUMN_ETS_TAG, columnId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
405 }
406
CreateButtonNode()407 RefPtr<FrameNode> TextPickerDialogView::CreateButtonNode()
408 {
409 auto buttonId = ElementRegister::GetInstance()->MakeUniqueId();
410 return FrameNode::GetOrCreateFrameNode(
411 V2::BUTTON_ETS_TAG, buttonId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
412 }
413
CreateDividerNode(const RefPtr<FrameNode> & dateNode)414 RefPtr<FrameNode> TextPickerDialogView::CreateDividerNode(const RefPtr<FrameNode>& dateNode)
415 {
416 auto pipeline = PipelineContext::GetCurrentContext();
417 CHECK_NULL_RETURN(pipeline, nullptr);
418 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
419 auto dividerNode = FrameNode::GetOrCreateFrameNode(V2::DIVIDER_ETS_TAG,
420 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<DividerPattern>(); });
421 CHECK_NULL_RETURN(dividerNode, nullptr);
422
423 auto dividerPaintProps = dividerNode->GetPaintProperty<DividerRenderProperty>();
424 CHECK_NULL_RETURN(dividerPaintProps, nullptr);
425 dividerPaintProps->UpdateDividerColor(dialogTheme->GetDividerColor());
426
427 auto dividerLayoutProps = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
428 CHECK_NULL_RETURN(dividerLayoutProps, nullptr);
429 dividerLayoutProps->UpdateVertical(true);
430 dividerLayoutProps->UpdateUserDefinedIdealSize(
431 CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
432 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
433 MarginProperty margin;
434 margin.top = CalcLength(dialogTheme->GetDividerHeight());
435 margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
436 dividerLayoutProps->UpdateMargin(margin);
437 dividerLayoutProps->UpdateUserDefinedIdealSize(
438 CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
439 } else {
440 auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
441 auto dividerWrapper = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG,
442 ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<LinearLayoutPattern>(false));
443 CHECK_NULL_RETURN(dividerWrapper, nullptr);
444 auto layoutProps = dividerWrapper->GetLayoutProperty<LinearLayoutProperty>();
445 CHECK_NULL_RETURN(layoutProps, nullptr);
446 MarginProperty margin;
447 margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
448 margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
449 layoutProps->UpdateMargin(margin);
450 layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
451 layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
452 layoutProps->UpdateUserDefinedIdealSize(CalcSize(
453 CalcLength(dialogTheme->GetActionsPadding().Bottom()), CalcLength(buttonTheme->GetHeight())));
454 dividerNode->MountToParent(dividerWrapper);
455 return dividerWrapper;
456 }
457
458 return dividerNode;
459 }
460
CreateButtonNode(const RefPtr<FrameNode> & frameNode,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent,GestureEventFunc callback)461 RefPtr<FrameNode> TextPickerDialogView::CreateButtonNode(const RefPtr<FrameNode>& frameNode,
462 const std::vector<ButtonInfo>& buttonInfos, std::map<std::string, NG::DialogTextEvent> dialogEvent,
463 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent, GestureEventFunc callback)
464 {
465 auto acceptEvent = dialogEvent["acceptId"];
466 auto cancelEvent = dialogCancelEvent["cancelId"];
467 auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
468 AceType::MakeRefPtr<LinearLayoutPattern>(false));
469 CHECK_NULL_RETURN(contentRow, nullptr);
470 auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
471 CHECK_NULL_RETURN(layoutProps, nullptr);
472 layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
473 layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
474
475 auto buttonCancelNode = CreateCancelNode(cancelEvent, frameNode, buttonInfos);
476 auto buttonConfirmNode = CreateConfirmNode(frameNode, frameNode, buttonInfos, acceptEvent);
477
478 buttonCancelNode->MountToParent(contentRow);
479 buttonConfirmNode->MountToParent(contentRow);
480
481 auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(callback));
482 for (const auto& child : contentRow->GetChildren()) {
483 auto childNode = AceType::DynamicCast<FrameNode>(child);
484 CHECK_NULL_RETURN(childNode, nullptr);
485 auto gestureHub = childNode->GetOrCreateGestureEventHub();
486 CHECK_NULL_RETURN(gestureHub, nullptr);
487 gestureHub->AddClickEvent(onClick);
488 }
489
490 return contentRow;
491 }
492
UpdateButtonConfirmLayoutProperty(const RefPtr<FrameNode> & buttonConfirmNode,RefPtr<PickerTheme> pickerTheme)493 void TextPickerDialogView::UpdateButtonConfirmLayoutProperty(const RefPtr<FrameNode>& buttonConfirmNode,
494 RefPtr<PickerTheme> pickerTheme)
495 {
496 auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
497 CHECK_NULL_VOID(buttonConfirmLayoutProperty);
498 buttonConfirmLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.ok"));
499 buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
500 buttonConfirmLayoutProperty->UpdateType(ButtonType::CAPSULE);
501 buttonConfirmLayoutProperty->UpdateFlexShrink(1.0);
502 auto pipeline = PipelineBase::GetCurrentContext();
503 CHECK_NULL_VOID(pipeline);
504 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
505 CHECK_NULL_VOID(dialogTheme);
506 UpdateConfirmButtonMargin(buttonConfirmNode, dialogTheme);
507 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
508 buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
509 CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
510 } else {
511 auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
512 CHECK_NULL_VOID(buttonTheme);
513 buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
514 CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
515 }
516 }
517
CreateConfirmNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos,DialogEvent & acceptEvent)518 RefPtr<FrameNode> TextPickerDialogView::CreateConfirmNode(const RefPtr<FrameNode>& dateNode,
519 const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos, DialogEvent& acceptEvent)
520 {
521 auto pipeline = PipelineContext::GetCurrentContext();
522 CHECK_NULL_RETURN(pipeline, nullptr);
523 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
524 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
525 auto buttonConfirmNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
526 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
527 auto textConfirmNode = FrameNode::CreateFrameNode(
528 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
529 CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
530 CHECK_NULL_RETURN(textConfirmNode, nullptr);
531 UpdateConfirmButtonTextLayoutProperty(textConfirmNode, pickerTheme);
532 auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
533 textPattern->SetConfirmNode(buttonConfirmNode);
534 auto buttonConfirmEventHub = buttonConfirmNode->GetEventHub<ButtonEventHub>();
535 CHECK_NULL_RETURN(buttonConfirmEventHub, nullptr);
536 buttonConfirmEventHub->SetStateEffect(true);
537 UpdateButtonConfirmLayoutProperty(buttonConfirmNode, pickerTheme);
538 auto buttonConfirmRenderContext = buttonConfirmNode->GetRenderContext();
539 buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
540 auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
541 CHECK_NULL_RETURN(buttonConfirmLayoutProperty, nullptr);
542 UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonConfirmLayoutProperty, buttonConfirmRenderContext);
543 UpdateButtonDefaultFocus(buttonInfos, buttonConfirmNode, true);
544
545 textConfirmNode->MountToParent(buttonConfirmNode);
546 auto eventConfirmHub = buttonConfirmNode->GetOrCreateGestureEventHub();
547 CHECK_NULL_RETURN(eventConfirmHub, nullptr);
548 CHECK_NULL_RETURN(dateNode, nullptr);
549 SetDialogAcceptEvent(dateNode, std::move(acceptEvent));
550 auto clickCallback = [weak = WeakPtr<FrameNode>(dateNode)](const GestureEvent& /* info */) {
551 auto dateNode = weak.Upgrade();
552 CHECK_NULL_VOID(dateNode);
553 auto pickerPattern = dateNode->GetPattern<TextPickerPattern>();
554 CHECK_NULL_VOID(pickerPattern);
555 auto str = pickerPattern->GetSelectedObject(false);
556 auto textPickerEventHub = pickerPattern->GetEventHub<TextPickerEventHub>();
557 CHECK_NULL_VOID(textPickerEventHub);
558 textPickerEventHub->FireDialogAcceptEvent(str);
559 if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
560 Recorder::EventParamsBuilder builder;
561 builder.SetType(dateNode->GetTag()).SetEventType(Recorder::EventType::DIALOG_ACCEPT).SetText(str);
562 Recorder::EventRecorder::Get().OnEvent(std::move(builder));
563 }
564 };
565 eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(clickCallback));
566 buttonConfirmNode->MarkModifyDone();
567 return buttonConfirmNode;
568 }
569
UpdateConfirmButtonTextLayoutProperty(const RefPtr<FrameNode> & textConfirmNode,const RefPtr<PickerTheme> & pickerTheme)570 void TextPickerDialogView::UpdateConfirmButtonTextLayoutProperty(
571 const RefPtr<FrameNode>& textConfirmNode, const RefPtr<PickerTheme>& pickerTheme)
572 {
573 auto textLayoutProperty = textConfirmNode->GetLayoutProperty<TextLayoutProperty>();
574 CHECK_NULL_VOID(textLayoutProperty);
575 textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.ok"));
576 textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
577 if (!NeedAdaptForAging()) {
578 textLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale());
579 }
580 textLayoutProperty->UpdateFontSize(
581 ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
582 textLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
583 }
584
UpdateCancelButtonTextLayoutProperty(const RefPtr<FrameNode> & textCancelNode,const RefPtr<PickerTheme> & pickerTheme)585 void TextPickerDialogView::UpdateCancelButtonTextLayoutProperty(
586 const RefPtr<FrameNode>& textCancelNode, const RefPtr<PickerTheme>& pickerTheme)
587 {
588 auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
589 CHECK_NULL_VOID(textCancelLayoutProperty);
590 textCancelLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.cancel"));
591 textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
592 if (!NeedAdaptForAging()) {
593 textCancelLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale());
594 }
595 textCancelLayoutProperty->UpdateFontSize(
596 ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
597 textCancelLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
598 }
599
UpdateForwardButtonTextLayoutProperty(const RefPtr<FrameNode> & textForwardNode,const RefPtr<PickerTheme> & pickerTheme)600 void TextPickerDialogView::UpdateForwardButtonTextLayoutProperty(
601 const RefPtr<FrameNode>& textForwardNode, const RefPtr<PickerTheme>& pickerTheme)
602 {
603 auto textForwardLayoutProperty = textForwardNode->GetLayoutProperty<TextLayoutProperty>();
604 CHECK_NULL_VOID(textForwardLayoutProperty);
605 auto pickerThemeOptionStyle = pickerTheme->GetOptionStyle(true, false);
606 textForwardLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
607 textForwardLayoutProperty->UpdateTextColor(pickerThemeOptionStyle.GetTextColor());
608 textForwardLayoutProperty->UpdateFontSize(
609 ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
610 textForwardLayoutProperty->UpdateFontWeight(pickerThemeOptionStyle.GetFontWeight());
611 }
612
UpdateBackwardButtonTextLayoutProperty(const RefPtr<FrameNode> & textBackwardNode,const RefPtr<PickerTheme> & pickerTheme)613 void TextPickerDialogView::UpdateBackwardButtonTextLayoutProperty(
614 const RefPtr<FrameNode>& textBackwardNode, const RefPtr<PickerTheme>& pickerTheme)
615 {
616 auto textBackwardLayoutProperty = textBackwardNode->GetLayoutProperty<TextLayoutProperty>();
617 CHECK_NULL_VOID(textBackwardLayoutProperty);
618 auto pickerThemeOptionStyle = pickerTheme->GetOptionStyle(true, false);
619 textBackwardLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.prev"));
620 textBackwardLayoutProperty->UpdateTextColor(pickerThemeOptionStyle.GetTextColor());
621 textBackwardLayoutProperty->UpdateFontSize(
622 ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
623 textBackwardLayoutProperty->UpdateFontWeight(pickerThemeOptionStyle.GetFontWeight());
624 }
625
UpdateConfirmButtonMargin(const RefPtr<FrameNode> & buttonConfirmNode,const RefPtr<DialogTheme> & dialogTheme)626 void TextPickerDialogView::UpdateConfirmButtonMargin(
627 const RefPtr<FrameNode>& buttonConfirmNode, const RefPtr<DialogTheme>& dialogTheme)
628 {
629 MarginProperty margin;
630 bool isRtl = AceApplicationInfo::GetInstance().IsRightToLeft();
631 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
632 margin.top = CalcLength(dialogTheme->GetDividerHeight());
633 margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
634 if (isRtl) {
635 margin.right = CalcLength(0.0_vp);
636 margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
637 } else {
638 margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
639 margin.left = CalcLength(0.0_vp);
640 }
641
642 } else {
643 margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
644 margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
645 if (isRtl) {
646 margin.right = CalcLength(0.0_vp);
647 margin.left = CalcLength(dialogTheme->GetActionsPadding().Left());
648 } else {
649 margin.right = CalcLength(dialogTheme->GetActionsPadding().Right());
650 margin.left = CalcLength(0.0_vp);
651 }
652 }
653 buttonConfirmNode->GetLayoutProperty()->UpdateMargin(margin);
654 }
655
UpdateCancelButtonMargin(const RefPtr<FrameNode> & buttonCancelNode,const RefPtr<DialogTheme> & dialogTheme)656 void TextPickerDialogView::UpdateCancelButtonMargin(
657 const RefPtr<FrameNode>& buttonCancelNode, const RefPtr<DialogTheme>& dialogTheme)
658 {
659 MarginProperty margin;
660 bool isRtl = AceApplicationInfo::GetInstance().IsRightToLeft();
661 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
662 margin.top = CalcLength(dialogTheme->GetDividerHeight());
663 margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
664 if (isRtl) {
665 margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
666 margin.left = CalcLength(0.0_vp);
667 } else {
668 margin.right = CalcLength(0.0_vp);
669 margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
670 }
671 } else {
672 margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
673 margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
674 if (isRtl) {
675 margin.right = CalcLength(dialogTheme->GetActionsPadding().Right());
676 margin.left = CalcLength(0.0_vp);
677 } else {
678 margin.right = CalcLength(0.0_vp);
679 margin.left = CalcLength(dialogTheme->GetActionsPadding().Left());
680 }
681 }
682 buttonCancelNode->GetLayoutProperty()->UpdateMargin(margin);
683 }
684
UpdateForwardButtonMargin(const RefPtr<FrameNode> & buttonForwardNode,const RefPtr<DialogTheme> & dialogTheme)685 void TextPickerDialogView::UpdateForwardButtonMargin(
686 const RefPtr<FrameNode>& buttonForwardNode, const RefPtr<DialogTheme>& dialogTheme)
687 {
688 MarginProperty margin;
689 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
690 margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
691 margin.top = CalcLength(dialogTheme->GetDividerHeight());
692 margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
693 margin.left = CalcLength(0.0_vp);
694 } else {
695 margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
696 margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
697 margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
698 margin.left = CalcLength(0.0_vp);
699 }
700 buttonForwardNode->GetLayoutProperty()->UpdateMargin(margin);
701 }
702
UpdateBackwardButtonMargin(const RefPtr<FrameNode> & buttonBackwardNode,const RefPtr<DialogTheme> & dialogTheme)703 void TextPickerDialogView::UpdateBackwardButtonMargin(
704 const RefPtr<FrameNode>& buttonBackwardNode, const RefPtr<DialogTheme>& dialogTheme)
705 {
706 MarginProperty margin;
707 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
708 margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
709 margin.top = CalcLength(dialogTheme->GetDividerHeight());
710 margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
711 margin.right = CalcLength(0.0_vp);
712 } else {
713 margin.left = CalcLength(dialogTheme->GetActionsPadding().Left());
714 margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
715 margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
716 margin.right = CalcLength(0.0_vp);
717 }
718 buttonBackwardNode->GetLayoutProperty()->UpdateMargin(margin);
719 }
720
UpdateButtonStyles(const std::vector<ButtonInfo> & buttonInfos,size_t index,const RefPtr<ButtonLayoutProperty> & buttonLayoutProperty,const RefPtr<RenderContext> & buttonRenderContext)721 void TextPickerDialogView::UpdateButtonStyles(const std::vector<ButtonInfo>& buttonInfos, size_t index,
722 const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext)
723 {
724 if (index >= buttonInfos.size()) {
725 return;
726 }
727 CHECK_NULL_VOID(buttonLayoutProperty);
728 CHECK_NULL_VOID(buttonRenderContext);
729 auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
730 CHECK_NULL_VOID(pipeline);
731 auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
732 CHECK_NULL_VOID(buttonTheme);
733 if (buttonInfos[index].type.has_value()) {
734 buttonLayoutProperty->UpdateType(buttonInfos[index].type.value());
735 }
736 UpdateButtonStyleAndRole(buttonInfos, index, buttonLayoutProperty, buttonRenderContext, buttonTheme);
737 if (buttonInfos[index].fontSize.has_value()) {
738 buttonLayoutProperty->UpdateFontSize(ConvertFontScaleValue(buttonInfos[index].fontSize.value()));
739 }
740 if (buttonInfos[index].fontColor.has_value()) {
741 buttonLayoutProperty->UpdateFontColor(buttonInfos[index].fontColor.value());
742 }
743 if (buttonInfos[index].fontWeight.has_value()) {
744 buttonLayoutProperty->UpdateFontWeight(buttonInfos[index].fontWeight.value());
745 }
746 if (buttonInfos[index].fontStyle.has_value()) {
747 buttonLayoutProperty->UpdateFontStyle(buttonInfos[index].fontStyle.value());
748 }
749 if (buttonInfos[index].fontFamily.has_value()) {
750 buttonLayoutProperty->UpdateFontFamily(buttonInfos[index].fontFamily.value());
751 }
752 if (buttonInfos[index].borderRadius.has_value()) {
753 buttonLayoutProperty->UpdateBorderRadius(buttonInfos[index].borderRadius.value());
754 }
755 if (buttonInfos[index].backgroundColor.has_value()) {
756 buttonRenderContext->UpdateBackgroundColor(buttonInfos[index].backgroundColor.value());
757 }
758 }
759
UpdateButtonStyleAndRole(const std::vector<ButtonInfo> & buttonInfos,size_t index,const RefPtr<ButtonLayoutProperty> & buttonLayoutProperty,const RefPtr<RenderContext> & buttonRenderContext,const RefPtr<ButtonTheme> & buttonTheme)760 void TextPickerDialogView::UpdateButtonStyleAndRole(const std::vector<ButtonInfo>& buttonInfos, size_t index,
761 const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext,
762 const RefPtr<ButtonTheme>& buttonTheme)
763 {
764 if (index >= buttonInfos.size()) {
765 return;
766 }
767 CHECK_NULL_VOID(buttonLayoutProperty);
768 CHECK_NULL_VOID(buttonRenderContext);
769 CHECK_NULL_VOID(buttonTheme);
770 if (buttonInfos[index].role.has_value()) {
771 buttonLayoutProperty->UpdateButtonRole(buttonInfos[index].role.value());
772 ButtonStyleMode buttonStyleMode;
773 if (buttonInfos[index].buttonStyle.has_value()) {
774 buttonStyleMode = buttonInfos[index].buttonStyle.value();
775 } else {
776 buttonStyleMode = buttonLayoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
777 }
778 auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonInfos[index].role.value());
779 auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonInfos[index].role.value());
780 buttonRenderContext->UpdateBackgroundColor(bgColor);
781 buttonLayoutProperty->UpdateFontColor(textColor);
782 }
783 if (buttonInfos[index].buttonStyle.has_value()) {
784 buttonLayoutProperty->UpdateButtonStyle(buttonInfos[index].buttonStyle.value());
785 ButtonRole buttonRole = buttonLayoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
786 auto bgColor = buttonTheme->GetBgColor(buttonInfos[index].buttonStyle.value(), buttonRole);
787 auto textColor = buttonTheme->GetTextColor(buttonInfos[index].buttonStyle.value(), buttonRole);
788 buttonRenderContext->UpdateBackgroundColor(bgColor);
789 buttonLayoutProperty->UpdateFontColor(textColor);
790 }
791 }
792
CreateCancelNode(NG::DialogGestureEvent & cancelEvent,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos)793 RefPtr<FrameNode> TextPickerDialogView::CreateCancelNode(NG::DialogGestureEvent& cancelEvent,
794 const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos)
795 {
796 auto pipeline = PipelineContext::GetCurrentContext();
797 CHECK_NULL_RETURN(pipeline, nullptr);
798 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
799 auto buttonCancelNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
800 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
801 CHECK_NULL_RETURN(buttonCancelNode, nullptr);
802 auto textCancelNode = FrameNode::CreateFrameNode(
803 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
804 CHECK_NULL_RETURN(textCancelNode, nullptr);
805 auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
806 UpdateCancelButtonTextLayoutProperty(textCancelNode, pickerTheme);
807 auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
808 textPattern->SetCancelNode(buttonCancelNode);
809 textCancelNode->MountToParent(buttonCancelNode);
810 auto eventCancelHub = buttonCancelNode->GetOrCreateGestureEventHub();
811 CHECK_NULL_RETURN(eventCancelHub, nullptr);
812 eventCancelHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(cancelEvent)));
813 auto recordEvent = [](GestureEvent& info) {
814 if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
815 Recorder::EventParamsBuilder builder;
816 builder.SetType("TextPickerDialog").SetEventType(Recorder::EventType::DIALOG_CANCEL);
817 Recorder::EventRecorder::Get().OnEvent(std::move(builder));
818 }
819 };
820 auto recordEventPtr = AceType::MakeRefPtr<ClickEvent>(std::move(recordEvent));
821 eventCancelHub->AddClickEvent(recordEventPtr);
822
823 auto buttonCancelEventHub = buttonCancelNode->GetEventHub<ButtonEventHub>();
824 CHECK_NULL_RETURN(buttonCancelEventHub, nullptr);
825 buttonCancelEventHub->SetStateEffect(true);
826
827 UpdateButtonCancelLayoutProperty(buttonCancelNode, pipeline);
828
829 auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext();
830 buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
831 auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
832 UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonCancelLayoutProperty, buttonCancelRenderContext);
833 UpdateButtonDefaultFocus(buttonInfos, buttonCancelNode, false);
834
835 buttonCancelNode->MarkModifyDone();
836 return buttonCancelNode;
837 }
838
839
UpdateButtonCancelLayoutProperty(const RefPtr<FrameNode> & buttonCancelNode,const RefPtr<PipelineContext> & pipeline)840 void TextPickerDialogView::UpdateButtonCancelLayoutProperty(
841 const RefPtr<FrameNode>& buttonCancelNode, const RefPtr<PipelineContext>& pipeline)
842 {
843 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
844 auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
845 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
846 UpdateCancelButtonMargin(buttonCancelNode, dialogTheme);
847 auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
848 buttonCancelLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.cancel"));
849 buttonCancelLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
850 buttonCancelLayoutProperty->UpdateType(ButtonType::CAPSULE);
851 buttonCancelLayoutProperty->UpdateFlexShrink(1.0);
852 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
853 buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
854 CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
855 } else {
856 buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
857 CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
858 }
859 }
860
UpdateButtonForwardLayoutProperty(const RefPtr<FrameNode> & buttonForwardNode,const RefPtr<PipelineContext> & pipeline)861 void TextPickerDialogView::UpdateButtonForwardLayoutProperty(
862 const RefPtr<FrameNode>& buttonForwardNode, const RefPtr<PipelineContext>& pipeline)
863 {
864 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
865 auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
866 CHECK_NULL_VOID(buttonTheme);
867 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
868 CHECK_NULL_VOID(pickerTheme);
869 UpdateForwardButtonMargin(buttonForwardNode, dialogTheme);
870 auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<ButtonLayoutProperty>();
871 buttonForwardLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.next"));
872 buttonForwardLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
873 buttonForwardLayoutProperty->UpdateType(ButtonType::CAPSULE);
874 buttonForwardLayoutProperty->UpdateFlexShrink(1.0);
875 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
876 buttonForwardLayoutProperty->UpdateUserDefinedIdealSize(
877 CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
878 } else {
879 buttonForwardLayoutProperty->UpdateUserDefinedIdealSize(
880 CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
881 }
882 }
883
UpdateButtonBackwardLayoutProperty(const RefPtr<FrameNode> & buttonBackwardNode,const RefPtr<PipelineContext> & pipeline)884 void TextPickerDialogView::UpdateButtonBackwardLayoutProperty(
885 const RefPtr<FrameNode>& buttonBackwardNode, const RefPtr<PipelineContext>& pipeline)
886 {
887 CHECK_NULL_VOID(pipeline);
888 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
889 auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
890 CHECK_NULL_VOID(buttonTheme);
891 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
892 CHECK_NULL_VOID(pickerTheme);
893 UpdateBackwardButtonMargin(buttonBackwardNode, dialogTheme);
894 auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<ButtonLayoutProperty>();
895 buttonBackwardLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.prev"));
896 buttonBackwardLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
897 buttonBackwardLayoutProperty->UpdateType(ButtonType::CAPSULE);
898 buttonBackwardLayoutProperty->UpdateFlexShrink(1.0);
899 if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
900 buttonBackwardLayoutProperty->UpdateUserDefinedIdealSize(
901 CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
902 } else {
903 buttonBackwardLayoutProperty->UpdateUserDefinedIdealSize(
904 CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
905 }
906 }
907
SetSelected(const RefPtr<TextPickerPattern> & textPickerPattern,uint32_t value)908 void TextPickerDialogView::SetSelected(const RefPtr<TextPickerPattern>& textPickerPattern, uint32_t value)
909 {
910 textPickerPattern->SetSelected(value);
911 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, Selected, value);
912 }
913
SetSelectedValues(const RefPtr<TextPickerPattern> & textPickerPattern,const std::vector<uint32_t> & values)914 void TextPickerDialogView::SetSelectedValues(
915 const RefPtr<TextPickerPattern>& textPickerPattern, const std::vector<uint32_t>& values)
916 {
917 textPickerPattern->SetSelecteds(values);
918 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, Selecteds, values);
919 }
920
SetValues(const RefPtr<TextPickerPattern> & textPickerPattern,const std::vector<std::string> & values)921 void TextPickerDialogView::SetValues(
922 const RefPtr<TextPickerPattern>& textPickerPattern, const std::vector<std::string>& values)
923 {
924 textPickerPattern->SetValues(values);
925 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, Values, values);
926 }
927
SetRange(const RefPtr<TextPickerPattern> & textPickerPattern,const std::vector<NG::RangeContent> & value)928 void TextPickerDialogView::SetRange(
929 const RefPtr<TextPickerPattern>& textPickerPattern, const std::vector<NG::RangeContent>& value)
930 {
931 textPickerPattern->SetRange(value);
932 }
933
SetTextProperties(const RefPtr<PickerTheme> & pickerTheme,const PickerTextProperties & properties)934 void TextPickerDialogView::SetTextProperties(
935 const RefPtr<PickerTheme>& pickerTheme, const PickerTextProperties& properties)
936 {
937 CHECK_NULL_VOID(pickerTheme);
938 auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
939 auto normalStyle = pickerTheme->GetOptionStyle(false, false);
940
941 SetTextDisappearProperties(pickerTheme, properties);
942
943 if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
944 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontSize,
945 ConvertFontScaleValue(properties.normalTextStyle_.fontSize.value(), normalTextStyleFont_, true));
946 } else {
947 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontSize,
948 ConvertFontScaleValue(normalStyle.GetFontSize()));
949 }
950 ACE_UPDATE_LAYOUT_PROPERTY(
951 TextPickerLayoutProperty, Color, properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
952 ACE_UPDATE_LAYOUT_PROPERTY(
953 TextPickerLayoutProperty, Weight, properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
954 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontFamily,
955 properties.normalTextStyle_.fontFamily.value_or(normalStyle.GetFontFamilies()));
956 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontStyle,
957 properties.normalTextStyle_.fontStyle.value_or(normalStyle.GetFontStyle()));
958
959 if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
960 ACE_UPDATE_LAYOUT_PROPERTY(
961 TextPickerLayoutProperty, SelectedFontSize,
962 ConvertFontScaleValue(properties.selectedTextStyle_.fontSize.value(), selectedTextStyleFont_, true));
963 } else {
964 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedFontSize,
965 ConvertFontScaleValue(selectedStyle.GetFontSize()));
966 }
967 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedColor,
968 properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
969 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedWeight,
970 properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
971 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedFontFamily,
972 properties.selectedTextStyle_.fontFamily.value_or(selectedStyle.GetFontFamilies()));
973 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedFontStyle,
974 properties.selectedTextStyle_.fontStyle.value_or(selectedStyle.GetFontStyle()));
975 }
976
SetTextDisappearProperties(const RefPtr<PickerTheme> & pickerTheme,const PickerTextProperties & properties)977 void TextPickerDialogView::SetTextDisappearProperties(
978 const RefPtr<PickerTheme>& pickerTheme, const PickerTextProperties& properties)
979
980 {
981 CHECK_NULL_VOID(pickerTheme);
982 auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
983 if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
984 ACE_UPDATE_LAYOUT_PROPERTY(
985 TextPickerLayoutProperty, DisappearFontSize,
986 ConvertFontScaleValue(properties.disappearTextStyle_.fontSize.value(), disappearTextStyleFont_, true));
987 } else {
988 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearFontSize,
989 ConvertFontScaleValue(disappearStyle.GetFontSize()));
990 }
991 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearColor,
992 properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
993 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearWeight,
994 properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
995 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearFontFamily,
996 properties.disappearTextStyle_.fontFamily.value_or(disappearStyle.GetFontFamilies()));
997 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearFontStyle,
998 properties.disappearTextStyle_.fontStyle.value_or(disappearStyle.GetFontStyle()));
999 }
1000
SetDialogChange(const RefPtr<FrameNode> & frameNode,DialogTextEvent && onChange)1001 void TextPickerDialogView::SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogTextEvent&& onChange)
1002 {
1003 CHECK_NULL_VOID(frameNode);
1004 auto eventHub = frameNode->GetEventHub<TextPickerEventHub>();
1005 CHECK_NULL_VOID(eventHub);
1006 eventHub->SetDialogChange(std::move(onChange));
1007 }
1008
SetDefaultPickerItemHeight(const Dimension & value)1009 void TextPickerDialogView::SetDefaultPickerItemHeight(const Dimension& value)
1010 {
1011 ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultPickerItemHeight, value);
1012 }
1013
SetDialogAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogTextEvent && onChange)1014 void TextPickerDialogView::SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogTextEvent&& onChange)
1015 {
1016 CHECK_NULL_VOID(frameNode);
1017 auto eventHub = frameNode->GetEventHub<TextPickerEventHub>();
1018 CHECK_NULL_VOID(eventHub);
1019 eventHub->SetDialogAcceptEvent(std::move(onChange));
1020 }
1021
InitOnKeyEvent(const RefPtr<FocusHub> & focusHub)1022 void TextPickerDialogView::InitOnKeyEvent(const RefPtr<FocusHub>& focusHub)
1023 {
1024 auto onKeyEvent = [](const KeyEvent& event) -> bool { return TextPickerDialogView::OnKeyEvent(event); };
1025 focusHub->SetOnKeyEventInternal(std::move(onKeyEvent));
1026 }
OnKeyEvent(const KeyEvent & event)1027 bool TextPickerDialogView::OnKeyEvent(const KeyEvent& event)
1028 {
1029 if (event.action != KeyAction::DOWN) {
1030 return false;
1031 }
1032
1033 if (event.code == KeyCode::KEY_ESCAPE) {
1034 auto dialogNode = dialogNode_.Upgrade();
1035 CHECK_NULL_RETURN(dialogNode, false);
1036 auto pipeline = dialogNode->GetContext();
1037 CHECK_NULL_RETURN(pipeline, false);
1038 auto overlayManager = pipeline->GetOverlayManager();
1039 CHECK_NULL_RETURN(overlayManager, false);
1040 overlayManager->CloseDialog(dialogNode);
1041 return true;
1042 }
1043
1044 return false;
1045 }
1046
UpdateButtonDefaultFocus(const std::vector<ButtonInfo> & buttonInfos,const RefPtr<FrameNode> & buttonNode,bool isConfirm)1047 void TextPickerDialogView::UpdateButtonDefaultFocus(const std::vector<ButtonInfo>& buttonInfos,
1048 const RefPtr<FrameNode>& buttonNode, bool isConfirm)
1049 {
1050 bool setDefaultFocus = false;
1051 if (buttonInfos.size() > CANCEL_BUTTON_INDEX) {
1052 if (buttonInfos[ACCEPT_BUTTON_INDEX].isPrimary && buttonInfos[CANCEL_BUTTON_INDEX].isPrimary) {
1053 return;
1054 }
1055 auto index = isConfirm ? ACCEPT_BUTTON_INDEX : CANCEL_BUTTON_INDEX;
1056 if (buttonInfos[index].isPrimary) {
1057 setDefaultFocus = true;
1058 }
1059 } else if (buttonInfos.size() == CANCEL_BUTTON_INDEX) {
1060 bool isAcceptButtonPrimary = (buttonInfos[0].isAcceptButton && isConfirm && buttonInfos[0].isPrimary);
1061 bool isCancelButtonPrimary = (!buttonInfos[0].isAcceptButton && !isConfirm && buttonInfos[0].isPrimary);
1062 if (isAcceptButtonPrimary || isCancelButtonPrimary) {
1063 setDefaultFocus = true;
1064 }
1065 }
1066 if (setDefaultFocus && buttonNode) {
1067 auto focusHub = buttonNode->GetOrCreateFocusHub();
1068 if (focusHub) {
1069 focusHub->SetIsDefaultFocus(true);
1070 }
1071 }
1072 }
1073
CreateForwardNode(NG::DialogGestureEvent & moveForwardEvent,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos)1074 RefPtr<FrameNode> TextPickerDialogView::CreateForwardNode(NG::DialogGestureEvent& moveForwardEvent,
1075 const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos)
1076 {
1077 CHECK_NULL_RETURN(textPickerNode, nullptr);
1078 auto pipeline = PipelineContext::GetCurrentContextSafely();
1079 CHECK_NULL_RETURN(pipeline, nullptr);
1080 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1081 CHECK_NULL_RETURN(pickerTheme, nullptr);
1082 auto buttonForwardNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
1083 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
1084 CHECK_NULL_RETURN(buttonForwardNode, nullptr);
1085 auto textForwardNode = FrameNode::CreateFrameNode(
1086 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1087 CHECK_NULL_RETURN(textForwardNode, nullptr);
1088 UpdateForwardButtonTextLayoutProperty(textForwardNode, pickerTheme);
1089 auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
1090 textPattern->SetForwardNode(buttonForwardNode);
1091 textForwardNode->MountToParent(buttonForwardNode);
1092 auto eventForwardHub = buttonForwardNode->GetOrCreateGestureEventHub();
1093 CHECK_NULL_RETURN(eventForwardHub, nullptr);
1094 eventForwardHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(moveForwardEvent)));
1095 auto recordEvent = [](GestureEvent& info) {
1096 if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
1097 Recorder::EventParamsBuilder builder;
1098 builder.SetType("TextPickerDialog").SetEventType(Recorder::EventType::STEPPER_NEXT);
1099 Recorder::EventRecorder::Get().OnEvent(std::move(builder));
1100 }
1101 };
1102 auto recordEventPtr = AceType::MakeRefPtr<ClickEvent>(std::move(recordEvent));
1103 eventForwardHub->AddClickEvent(recordEventPtr);
1104
1105 auto buttonForwardEventHub = buttonForwardNode->GetEventHub<ButtonEventHub>();
1106 CHECK_NULL_RETURN(buttonForwardEventHub, nullptr);
1107 buttonForwardEventHub->SetStateEffect(true);
1108
1109 UpdateButtonForwardLayoutProperty(buttonForwardNode, pipeline);
1110
1111 const auto& buttonForwardRenderContext = buttonForwardNode->GetRenderContext();
1112 buttonForwardRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1113 auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<ButtonLayoutProperty>();
1114 UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonForwardLayoutProperty, buttonForwardRenderContext);
1115 UpdateButtonDefaultFocus(buttonInfos, buttonForwardNode, false);
1116
1117 buttonForwardNode->MarkModifyDone();
1118 return buttonForwardNode;
1119 }
1120
CreateBackwardNode(NG::DialogGestureEvent & moveBackwardEvent,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos)1121 RefPtr<FrameNode> TextPickerDialogView::CreateBackwardNode(NG::DialogGestureEvent& moveBackwardEvent,
1122 const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos)
1123 {
1124 CHECK_NULL_RETURN(textPickerNode, nullptr);
1125 auto pipeline = PipelineContext::GetCurrentContextSafely();
1126 CHECK_NULL_RETURN(pipeline, nullptr);
1127 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1128 CHECK_NULL_RETURN(pickerTheme, nullptr);
1129 auto buttonBackwardNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
1130 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
1131 CHECK_NULL_RETURN(buttonBackwardNode, nullptr);
1132 auto textBackwardNode = FrameNode::CreateFrameNode(
1133 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1134 CHECK_NULL_RETURN(textBackwardNode, nullptr);
1135 UpdateBackwardButtonTextLayoutProperty(textBackwardNode, pickerTheme);
1136 auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
1137 textPattern->SetBackwardNode(buttonBackwardNode);
1138 textBackwardNode->MountToParent(buttonBackwardNode);
1139 auto eventBackwardHub = buttonBackwardNode->GetOrCreateGestureEventHub();
1140 CHECK_NULL_RETURN(eventBackwardHub, nullptr);
1141 eventBackwardHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(moveBackwardEvent)));
1142 auto recordEvent = [](GestureEvent& info) {
1143 if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
1144 Recorder::EventParamsBuilder builder;
1145 builder.SetType("TextPickerDialog").SetEventType(Recorder::EventType::STEPPER_NEXT);
1146 Recorder::EventRecorder::Get().OnEvent(std::move(builder));
1147 }
1148 };
1149 auto recordEventPtr = AceType::MakeRefPtr<ClickEvent>(std::move(recordEvent));
1150 eventBackwardHub->AddClickEvent(recordEventPtr);
1151
1152 auto buttonBackwardEventHub = buttonBackwardNode->GetEventHub<ButtonEventHub>();
1153 CHECK_NULL_RETURN(buttonBackwardEventHub, nullptr);
1154 buttonBackwardEventHub->SetStateEffect(true);
1155
1156 UpdateButtonBackwardLayoutProperty(buttonBackwardNode, pipeline);
1157
1158 const auto& buttonBackwardRenderContext = buttonBackwardNode->GetRenderContext();
1159 buttonBackwardRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1160 auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<ButtonLayoutProperty>();
1161 UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonBackwardLayoutProperty, buttonBackwardRenderContext);
1162 UpdateButtonDefaultFocus(buttonInfos, buttonBackwardNode, false);
1163
1164 buttonBackwardNode->MarkModifyDone();
1165 return buttonBackwardNode;
1166 }
1167
SetFirstDialogButtonActive(RefPtr<UINode> & contentRow)1168 void TextPickerDialogView::SetFirstDialogButtonActive(RefPtr<UINode>& contentRow)
1169 {
1170 CHECK_NULL_VOID(contentRow);
1171 auto buttonCancel = contentRow->GetFirstChild();
1172 auto buttonCancelNode = AceType::DynamicCast<FrameNode>(buttonCancel);
1173 CHECK_NULL_VOID(buttonCancelNode);
1174 auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
1175 CHECK_NULL_VOID(buttonCancelLayoutProperty);
1176 buttonCancelLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1177
1178 auto buttonForward = contentRow->GetChildAtIndex(FORWAED_BUTTON_DIVEDER_INDEX);
1179 auto buttonForwardNode = AceType::DynamicCast<FrameNode>(buttonForward);
1180 CHECK_NULL_VOID(buttonForwardNode);
1181 auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<LayoutProperty>();
1182 CHECK_NULL_VOID(buttonForwardLayoutProperty);
1183 buttonForwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1184
1185 auto buttonBackward = contentRow->GetChildAtIndex(BACKWARD_BUTTON_DIVEDER_INDEX);
1186 auto buttonBackwardNode = AceType::DynamicCast<FrameNode>(buttonBackward);
1187 CHECK_NULL_VOID(buttonBackwardNode);
1188 auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<LayoutProperty>();
1189 CHECK_NULL_VOID(buttonBackwardLayoutProperty);
1190 buttonBackwardLayoutProperty->UpdateVisibility(VisibleType::GONE);
1191
1192 auto buttonConfirm = contentRow->GetChildAtIndex(CONFIRM_BUTTON_DIVEDER_INDEX);
1193 auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(buttonConfirm);
1194 CHECK_NULL_VOID(buttonConfirmNode);
1195 auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
1196 CHECK_NULL_VOID(buttonConfirmLayoutProperty);
1197 buttonConfirmLayoutProperty->UpdateVisibility(VisibleType::GONE);
1198 }
1199
SetSecondDialogButtonActive(RefPtr<UINode> & contentRow)1200 void TextPickerDialogView::SetSecondDialogButtonActive(RefPtr<UINode>& contentRow)
1201 {
1202 CHECK_NULL_VOID(contentRow);
1203 auto buttonCancel = contentRow->GetFirstChild();
1204 auto buttonCancelNode = AceType::DynamicCast<FrameNode>(buttonCancel);
1205 CHECK_NULL_VOID(buttonCancelNode);
1206 auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
1207 CHECK_NULL_VOID(buttonCancelLayoutProperty);
1208 buttonCancelLayoutProperty->UpdateVisibility(VisibleType::GONE);
1209
1210 auto buttonForward = contentRow->GetChildAtIndex(FORWAED_BUTTON_DIVEDER_INDEX);
1211 auto buttonForwardNode = AceType::DynamicCast<FrameNode>(buttonForward);
1212 CHECK_NULL_VOID(buttonForwardNode);
1213 auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<LayoutProperty>();
1214 CHECK_NULL_VOID(buttonForwardLayoutProperty);
1215 buttonForwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1216
1217 auto buttonBackward = contentRow->GetChildAtIndex(BACKWARD_BUTTON_DIVEDER_INDEX);
1218 auto buttonBackwardNode = AceType::DynamicCast<FrameNode>(buttonBackward);
1219 CHECK_NULL_VOID(buttonBackwardNode);
1220 auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<LayoutProperty>();
1221 CHECK_NULL_VOID(buttonBackwardLayoutProperty);
1222 buttonBackwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1223
1224 auto buttonConfirm = contentRow->GetChildAtIndex(CONFIRM_BUTTON_DIVEDER_INDEX);
1225 auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(buttonConfirm);
1226 CHECK_NULL_VOID(buttonConfirmNode);
1227 auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
1228 CHECK_NULL_VOID(buttonConfirmLayoutProperty);
1229 buttonConfirmLayoutProperty->UpdateVisibility(VisibleType::GONE);
1230 }
1231
SetThirdDialogButtonActive(RefPtr<UINode> & contentRow)1232 void TextPickerDialogView::SetThirdDialogButtonActive(RefPtr<UINode>& contentRow)
1233 {
1234 CHECK_NULL_VOID(contentRow);
1235 auto buttonCancel = contentRow->GetFirstChild();
1236 auto buttonCancelNode = AceType::DynamicCast<FrameNode>(buttonCancel);
1237 CHECK_NULL_VOID(buttonCancelNode);
1238 auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
1239 CHECK_NULL_VOID(buttonCancelLayoutProperty);
1240 buttonCancelLayoutProperty->UpdateVisibility(VisibleType::GONE);
1241
1242 auto buttonForward = contentRow->GetChildAtIndex(FORWAED_BUTTON_DIVEDER_INDEX);
1243 auto buttonForwardNode = AceType::DynamicCast<FrameNode>(buttonForward);
1244 CHECK_NULL_VOID(buttonForwardNode);
1245 auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<LayoutProperty>();
1246 CHECK_NULL_VOID(buttonForwardLayoutProperty);
1247 buttonForwardLayoutProperty->UpdateVisibility(VisibleType::GONE);
1248
1249 auto buttonBackward = contentRow->GetChildAtIndex(BACKWARD_BUTTON_DIVEDER_INDEX);
1250 auto buttonBackwardNode = AceType::DynamicCast<FrameNode>(buttonBackward);
1251 CHECK_NULL_VOID(buttonBackwardNode);
1252 auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<LayoutProperty>();
1253 CHECK_NULL_VOID(buttonBackwardLayoutProperty);
1254 buttonBackwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1255
1256 auto buttonConfirm = contentRow->GetChildAtIndex(CONFIRM_BUTTON_DIVEDER_INDEX);
1257 auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(buttonConfirm);
1258 CHECK_NULL_VOID(buttonConfirmNode);
1259 auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
1260 CHECK_NULL_VOID(buttonConfirmLayoutProperty);
1261 buttonConfirmLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1262 }
1263
SetDialogButtonActive(RefPtr<FrameNode> & contentColumn,const uint32_t & dialogNodePage,const uint32_t & columnCount)1264 void TextPickerDialogView::SetDialogButtonActive(RefPtr<FrameNode>& contentColumn,
1265 const uint32_t& dialogNodePage, const uint32_t& columnCount)
1266 {
1267 CHECK_NULL_VOID(contentColumn);
1268 auto contentRow = contentColumn->GetLastChild();
1269 if (dialogNodePage == 0) {
1270 SetFirstDialogButtonActive(contentRow);
1271 SetDividerNodeActive(contentRow, true, false, false);
1272 } else if (dialogNodePage != (columnCount - 1)) {
1273 SetSecondDialogButtonActive(contentRow);
1274 SetDividerNodeActive(contentRow, false, true, false);
1275 } else {
1276 SetThirdDialogButtonActive(contentRow);
1277 SetDividerNodeActive(contentRow, false, false, true);
1278 }
1279 }
1280
SetDividerNodeActive(RefPtr<UINode> & contentRow,bool firstDividerActive,bool secondDividerActive,bool thirdDividerActive)1281 void TextPickerDialogView::SetDividerNodeActive(RefPtr<UINode>& contentRow, bool firstDividerActive,
1282 bool secondDividerActive, bool thirdDividerActive)
1283 {
1284 CHECK_NULL_VOID(contentRow);
1285 auto firstDivider = contentRow->GetChildAtIndex(1);
1286 auto firstDividerNode = AceType::DynamicCast<FrameNode>(firstDivider);
1287 CHECK_NULL_VOID(firstDividerNode);
1288 auto secondDivider = contentRow->GetChildAtIndex(SECOND_DIVEDER_NODE_INDEX);
1289 auto secondDividerNode = AceType::DynamicCast<FrameNode>(secondDivider);
1290 CHECK_NULL_VOID(secondDividerNode);
1291 auto thirdDivider = contentRow->GetChildAtIndex(THIRD_DIVEDER_NODE_INDEX);
1292 auto thirdDividerNode = AceType::DynamicCast<FrameNode>(thirdDivider);
1293 CHECK_NULL_VOID(thirdDividerNode);
1294
1295 SetSingleDividerNodeActive(firstDividerNode, firstDividerActive);
1296 SetSingleDividerNodeActive(secondDividerNode, secondDividerActive);
1297 SetSingleDividerNodeActive(thirdDividerNode, thirdDividerActive);
1298 }
1299
SetSingleDividerNodeActive(RefPtr<FrameNode> & dividerNode,bool dividerActive)1300 void TextPickerDialogView::SetSingleDividerNodeActive(RefPtr<FrameNode>& dividerNode, bool dividerActive)
1301 {
1302 CHECK_NULL_VOID(dividerNode);
1303 auto dividerLayoutProperty = dividerNode->GetLayoutProperty<LayoutProperty>();
1304 CHECK_NULL_VOID(dividerLayoutProperty);
1305 if (dividerActive) {
1306 dividerLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1307 } else {
1308 dividerLayoutProperty->UpdateVisibility(VisibleType::GONE);
1309 }
1310 }
1311
SetDialogNodePageActive(RefPtr<FrameNode> & contentColumn,RefPtr<FrameNode> & textPickerNode,const uint32_t & dialogNodePage,const uint32_t & columnCount)1312 void TextPickerDialogView::SetDialogNodePageActive(RefPtr<FrameNode>& contentColumn,
1313 RefPtr<FrameNode>& textPickerNode,
1314 const uint32_t& dialogNodePage, const uint32_t& columnCount)
1315 {
1316 CHECK_NULL_VOID(textPickerNode);
1317 for (uint32_t i = 0; i < columnCount; i++) {
1318 auto selectedStackNode = AceType::DynamicCast<FrameNode>(textPickerNode->GetChildAtIndex(i));
1319 CHECK_NULL_VOID(selectedStackNode);
1320 if (i != dialogNodePage) {
1321 auto layoutProperty = selectedStackNode->GetLayoutProperty<LayoutProperty>();
1322 CHECK_NULL_VOID(layoutProperty);
1323 layoutProperty->UpdateLayoutWeight(0);
1324 for (auto& child : selectedStackNode->GetChildren()) {
1325 auto childNode = AceType::DynamicCast<FrameNode>(child);
1326 CHECK_NULL_VOID(childNode);
1327 auto childNodeProperty = childNode->GetLayoutProperty<LayoutProperty>();
1328 childNodeProperty->UpdateVisibility(VisibleType::GONE);
1329 }
1330 } else {
1331 auto layoutProperty = selectedStackNode->GetLayoutProperty<LayoutProperty>();
1332 CHECK_NULL_VOID(layoutProperty);
1333 layoutProperty->UpdateLayoutWeight(1);
1334 for (auto& child : selectedStackNode->GetChildren()) {
1335 auto childNode = AceType::DynamicCast<FrameNode>(child);
1336 CHECK_NULL_VOID(childNode);
1337 auto childNodeProperty = childNode->GetLayoutProperty<LayoutProperty>();
1338 childNodeProperty->UpdateVisibility(VisibleType::VISIBLE);
1339 }
1340 }
1341 }
1342 SetDialogButtonActive(contentColumn, dialogNodePage, columnCount);
1343 }
1344
CreateAgingButtonNode(RefPtr<FrameNode> & frameNode,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent,std::map<std::string,NG::DialogGestureEvent> dialogMoveForwardEvent,std::map<std::string,NG::DialogGestureEvent> dialogMoveBackwardEvent,GestureEventFunc closeCallback,GestureEventFunc nextCallBack,GestureEventFunc previousCallBack)1345 RefPtr<FrameNode> TextPickerDialogView::CreateAgingButtonNode(
1346 RefPtr<FrameNode>& frameNode,
1347 const std::vector<ButtonInfo>& buttonInfos,
1348 std::map<std::string, NG::DialogTextEvent> dialogEvent,
1349 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent,
1350 std::map<std::string, NG::DialogGestureEvent> dialogMoveForwardEvent,
1351 std::map<std::string, NG::DialogGestureEvent> dialogMoveBackwardEvent,
1352 GestureEventFunc closeCallback, GestureEventFunc nextCallBack, GestureEventFunc previousCallBack)
1353 {
1354 auto acceptEvent = dialogEvent["acceptId"];
1355 auto cancelEvent = dialogCancelEvent["cancelId"];
1356 auto moveForwardEvent = dialogMoveForwardEvent["moveForwardId"];
1357 auto moveBackwardEvent = dialogMoveBackwardEvent["moveBackwardId"];
1358
1359 auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
1360 AceType::MakeRefPtr<LinearLayoutPattern>(false));
1361 CHECK_NULL_RETURN(contentRow, nullptr);
1362 auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
1363 CHECK_NULL_RETURN(layoutProps, nullptr);
1364 layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
1365 layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
1366
1367 auto buttonCancelNode = CreateCancelNode(cancelEvent, frameNode, buttonInfos);
1368 CHECK_NULL_RETURN(buttonCancelNode, nullptr);
1369 auto buttonConfirmNode = CreateConfirmNode(frameNode, frameNode, buttonInfos, acceptEvent);
1370 CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
1371 auto buttonForwardNode = CreateForwardNode(moveForwardEvent, frameNode, buttonInfos);
1372 CHECK_NULL_RETURN(buttonForwardNode, nullptr);
1373 auto buttonBackwardNode = CreateBackwardNode(moveBackwardEvent, frameNode, buttonInfos);
1374 CHECK_NULL_RETURN(buttonBackwardNode, nullptr);
1375
1376 buttonCancelNode->MountToParent(contentRow);
1377 buttonBackwardNode->MountToParent(contentRow);
1378 buttonForwardNode->MountToParent(contentRow);
1379 buttonConfirmNode->MountToParent(contentRow);
1380
1381 auto closeClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(closeCallback));
1382 auto nextClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(nextCallBack));
1383 auto previousClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(previousCallBack));
1384
1385 for (size_t i = 0; i < contentRow->GetChildren().size(); i++) {
1386 auto child = contentRow->GetChildAtIndex(i);
1387 auto childNode = AceType::DynamicCast<FrameNode>(child);
1388 CHECK_NULL_RETURN(childNode, nullptr);
1389 if (i == 0 || i == FORWAED_BUTTON_INDEX) {
1390 auto gestureHub = childNode->GetOrCreateGestureEventHub();
1391 CHECK_NULL_RETURN(gestureHub, nullptr);
1392 gestureHub->AddClickEvent(closeClick);
1393 } else if (i == BACKWARD_BUTTON_INDEX) {
1394 auto gestureHub = childNode->GetOrCreateGestureEventHub();
1395 CHECK_NULL_RETURN(gestureHub, nullptr);
1396 gestureHub->AddClickEvent(nextClick);
1397 } else if (i == 1) {
1398 auto gestureHub = childNode->GetOrCreateGestureEventHub();
1399 CHECK_NULL_RETURN(gestureHub, nullptr);
1400 gestureHub->AddClickEvent(previousClick);
1401 }
1402 }
1403 return contentRow;
1404 }
1405
SeparatedOptionsShow(RefPtr<FrameNode> & contentColumn,RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos,const TextPickerSettingData & settingData,std::map<std::string,NG::DialogTextEvent> & dialogEvent,std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent,const float & scale,GestureEventFunc closeCallBack,RefPtr<FrameNode> & dialogNode)1406 RefPtr<FrameNode> TextPickerDialogView::SeparatedOptionsShow(
1407 RefPtr<FrameNode>& contentColumn, RefPtr<FrameNode>& textPickerNode,
1408 const std::vector<ButtonInfo>& buttonInfos,
1409 const TextPickerSettingData& settingData,
1410 std::map<std::string, NG::DialogTextEvent>& dialogEvent,
1411 std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent,
1412 const float& scale, GestureEventFunc closeCallBack, RefPtr<FrameNode>& dialogNode)
1413 {
1414 dialogNodePage = 0;
1415 auto moveForwardFunc = [](const GestureEvent& info) { (void)info; };
1416 std::map<std::string, NG::DialogGestureEvent> dialogMoveForwardEvent;
1417 dialogMoveForwardEvent["moveForwardId"] = moveForwardFunc;
1418 auto moveBackwardFunc = [](const GestureEvent& info) { (void)info; };
1419 std::map<std::string, NG::DialogGestureEvent> dialogMoveBackwardFunc;
1420 dialogMoveBackwardFunc["moveBackwardId"] = moveBackwardFunc;
1421
1422 uint32_t columnCount = totalPageNum_;
1423 auto nextCallBack = [weak = WeakPtr<FrameNode>(dialogNode),
1424 weakText = WeakPtr<FrameNode>(textPickerNode),
1425 columnCount, weakColumn = WeakPtr<FrameNode>(contentColumn)](const GestureEvent& /* info */) {
1426 auto dialogNode = weak.Upgrade();
1427 auto textPickerNode = weakText.Upgrade();
1428 auto contentColumn = weakColumn.Upgrade();
1429 CHECK_NULL_VOID(dialogNode);
1430 if (dialogNodePage < (columnCount - 1)) {
1431 dialogNodePage++;
1432 }
1433 SetDialogNodePageActive(contentColumn, textPickerNode, dialogNodePage, columnCount);
1434 };
1435 auto previousCallBack = [weak = WeakPtr<FrameNode>(dialogNode),
1436 weakText = WeakPtr<FrameNode>(textPickerNode),
1437 columnCount, weakColumn = WeakPtr<FrameNode>(contentColumn)](const GestureEvent& /* info */) {
1438 auto dialogNode = weak.Upgrade();
1439 auto textPickerNode = weakText.Upgrade();
1440 auto contentColumn = weakColumn.Upgrade();
1441 CHECK_NULL_VOID(dialogNode);
1442 if (dialogNodePage > 0) {
1443 dialogNodePage--;
1444 }
1445 SetDialogNodePageActive(contentColumn, textPickerNode, dialogNodePage, columnCount);
1446 };
1447 auto contentRow =
1448 CreateAgingButtonNode(textPickerNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent),
1449 std::move(dialogMoveForwardEvent), std::move(dialogMoveBackwardFunc),
1450 closeCallBack, nextCallBack, previousCallBack);
1451 CHECK_NULL_RETURN(contentRow, nullptr);
1452 contentRow->AddChild(CreateDividerNode(textPickerNode), 1);
1453 contentRow->AddChild(CreateDividerNode(textPickerNode), SECOND_DIVEDER_NODE_INDEX);
1454 contentRow->AddChild(CreateDividerNode(textPickerNode), THIRD_DIVEDER_NODE_INDEX);
1455 contentRow->MountToParent(contentColumn);
1456 SetDialogNodePageActive(contentColumn, textPickerNode, dialogNodePage, columnCount);
1457 dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
1458 return dialogNode;
1459 }
1460
NeedAdaptForAging()1461 bool TextPickerDialogView::NeedAdaptForAging()
1462 {
1463 auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
1464 CHECK_NULL_RETURN(pipeline, false);
1465 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1466 CHECK_NULL_RETURN(pickerTheme, false);
1467 if (GreatOrEqual(pipeline->GetFontScale(), pickerTheme->GetMaxOneFontScale()) &&
1468 Dimension(pipeline->GetRootHeight()).ConvertToVp() > pickerTheme->GetDeviceHeightLimit()) {
1469 return true;
1470 }
1471 return false;
1472 }
1473
AdjustFontSizeScale(const Dimension & fontSizeValue,double fontScale)1474 const Dimension TextPickerDialogView::AdjustFontSizeScale(const Dimension& fontSizeValue, double fontScale)
1475 {
1476 auto pipeline = PipelineContext::GetCurrentContextSafely();
1477 CHECK_NULL_RETURN(pipeline, fontSizeValue);
1478 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1479 CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
1480
1481 auto adjustedScale = std::clamp(fontScale, pickerTheme->GetNormalFontScale(),
1482 pickerTheme->GetMaxTwoFontScale());
1483 return fontSizeValue * adjustedScale;
1484 }
1485
ConvertFontScaleValue(const Dimension & fontSizeValue,const Dimension & fontSizeLimit,bool isUserSetFont)1486 const Dimension TextPickerDialogView::ConvertFontScaleValue(
1487 const Dimension& fontSizeValue, const Dimension& fontSizeLimit, bool isUserSetFont)
1488 {
1489 auto pipeline = PipelineContext::GetCurrentContextPtrSafelyWithCheck();
1490 CHECK_NULL_RETURN(pipeline, fontSizeValue);
1491 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1492 CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
1493 float fontSizeScale = pipeline->GetFontScale();
1494 Dimension fontSizeValueResult = fontSizeValue;
1495
1496 if (NeedAdaptForAging()) {
1497 if (fontSizeValue.Unit() == DimensionUnit::VP) {
1498 if (isUserSetFont) {
1499 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValue, fontSizeLimit, isUserSetFont);
1500 }
1501 fontSizeValueResult = AdjustFontSizeScale(fontSizeValueResult, fontSizeScale);
1502 } else {
1503 if (GreatOrEqualCustomPrecision(fontSizeScale, pickerTheme->GetMaxThirdFontScale())) {
1504 fontSizeScale = pickerTheme->GetMaxTwoFontScale() / pickerTheme->GetMaxThirdFontScale();
1505 fontSizeValueResult = fontSizeValue * fontSizeScale;
1506 }
1507 if (isUserSetFont) {
1508 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValueResult, fontSizeLimit, isUserSetFont);
1509 }
1510 }
1511 } else {
1512 if (isUserSetFont) {
1513 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValue, fontSizeLimit, isUserSetFont);
1514 }
1515
1516 if (GreatOrEqualCustomPrecision(fontSizeScale, pickerTheme->GetMaxOneFontScale()) &&
1517 fontSizeValueResult.Unit() != DimensionUnit::VP) {
1518 if (!NearZero(fontSizeScale)) {
1519 fontSizeValueResult = fontSizeValueResult / fontSizeScale;
1520 }
1521 }
1522 }
1523 return fontSizeValueResult;
1524 }
1525
ConvertFontSizeLimit(const Dimension & fontSizeValue,const Dimension & fontSizeLimit,bool isUserSetFont)1526 const Dimension TextPickerDialogView::ConvertFontSizeLimit(
1527 const Dimension& fontSizeValue, const Dimension& fontSizeLimit, bool isUserSetFont)
1528 {
1529 if (isUserSetFont == false) {
1530 return fontSizeValue;
1531 }
1532 Dimension fontSizeValueResult = fontSizeValue;
1533 if (fontSizeValue.Unit() == DimensionUnit::VP) {
1534 if (GreatOrEqualCustomPrecision(fontSizeValue.ConvertToPx(), fontSizeLimit.ConvertToPx() / MARGIN_HALF)) {
1535 fontSizeValueResult = fontSizeLimit / MARGIN_HALF;
1536 } else {
1537 fontSizeValueResult = fontSizeValue;
1538 }
1539 } else {
1540 if (GreatOrEqualCustomPrecision(fontSizeValue.ConvertToPx(), fontSizeLimit.ConvertToPx())) {
1541 fontSizeValueResult = fontSizeLimit;
1542 } else {
1543 fontSizeValueResult = fontSizeValue;
1544 }
1545 }
1546
1547 return fontSizeValueResult;
1548 }
1549
GetUserSettingLimit()1550 void TextPickerDialogView::GetUserSettingLimit()
1551 {
1552 auto pipeline = PipelineContext::GetCurrentContextSafely();
1553 CHECK_NULL_VOID(pipeline);
1554 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1555 CHECK_NULL_VOID(pickerTheme);
1556 selectedTextStyleFont_ = pickerTheme->GetUseSetSelectedTextStyle();
1557 normalTextStyleFont_ = pickerTheme->GetUserSetNormalTextStyle();
1558 disappearTextStyleFont_ = pickerTheme->GetUserSetDisappearTextStyle();
1559 }
1560
1561 } // namespace OHOS::Ace::NG
1562