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 #include "core/components_ng/pattern/picker/datepicker_dialog_view.h"
16
17 #include <utility>
18
19 #include "base/geometry/dimension.h"
20 #include "base/memory/ace_type.h"
21 #include "base/utils/utils.h"
22 #include "core/components/theme/icon_theme.h"
23 #include "core/components_ng/base/view_stack_processor.h"
24 #include "core/components_ng/pattern/button/button_pattern.h"
25 #include "core/components_ng/pattern/calendar/calendar_paint_property.h"
26 #include "core/components_ng/pattern/checkbox/checkbox_pattern.h"
27 #include "core/components_ng/pattern/dialog/dialog_view.h"
28 #include "core/components_ng/pattern/divider/divider_pattern.h"
29 #include "core/components_ng/pattern/image/image_pattern.h"
30 #include "core/components_ng/pattern/picker/date_time_animation_controller.h"
31 #include "core/components_ng/pattern/picker/datepicker_pattern.h"
32 #include "core/components_ng/pattern/picker/datepicker_row_layout_property.h"
33 #include "core/components_ng/pattern/stack/stack_pattern.h"
34 #include "core/components_ng/property/measure_property.h"
35 #include "core/components_v2/inspector/inspector_constants.h"
36 #include "core/pipeline/pipeline_base.h"
37
38 namespace OHOS::Ace::NG {
39 namespace {
40 const int32_t MARGIN_HALF = 2;
41 constexpr double MONTHDAYS_WIDTH_PERCENT_ONE = 0.4285;
42 constexpr double TIME_WIDTH_PERCENT_ONE = 0.5714;
43 constexpr double MONTHDAYS_WIDTH_PERCENT_TWO = 0.3636;
44 constexpr double TIME_WIDTH_PERCENT_TWO = 0.6363;
45 constexpr Dimension BUTTON_BOTTOM_TOP_MARGIN = 10.0_vp;
46 constexpr Dimension LUNARSWITCH_HEIGHT = 48.0_vp;
47 constexpr Dimension CHECKBOX_SIZE = 24.0_vp;
48 constexpr Dimension PICKER_DIALOG_MARGIN_FORM_EDGE = 24.0_vp;
49 constexpr Dimension LUNARSWITCH_MARGIN_TO_BUTTON = 8.0_vp;
50 constexpr int32_t HOVER_ANIMATION_DURATION = 250;
51 } // namespace
52 bool DatePickerDialogView::switchFlag_ = false;
53
Show(const DialogProperties & dialogProperties,const DatePickerSettingData & settingData,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)54 RefPtr<FrameNode> DatePickerDialogView::Show(const DialogProperties& dialogProperties,
55 const DatePickerSettingData& settingData, std::map<std::string, NG::DialogEvent> dialogEvent,
56 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
57 {
58 auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
59 AceType::MakeRefPtr<LinearLayoutPattern>(true));
60 auto pickerStack = CreateStackNode();
61 auto dateNodeId = ElementRegister::GetInstance()->MakeUniqueId();
62 auto monthDaysNodeId = ElementRegister::GetInstance()->MakeUniqueId();
63 auto dateNode =
64 CreateDateNode(dateNodeId, settingData.datePickerProperty, settingData.properties, settingData.isLunar, false);
65 ViewStackProcessor::GetInstance()->Push(dateNode);
66 dateNode->MountToParent(pickerStack);
67 auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
68 CHECK_NULL_RETURN(pickerPattern, nullptr);
69 pickerPattern->SetIsShowInDialog(true);
70
71 // create title node and bind title text id to date picker, then mark picker node modify done
72 auto buttonTitleNode = CreateTitleButtonNode(dateNode);
73 CHECK_NULL_RETURN(buttonTitleNode, nullptr);
74
75 auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
76 datePickerPattern->SetbuttonTitleNode(buttonTitleNode);
77
78 buttonTitleNode->MountToParent(contentColumn);
79 std::function<void(bool)> lunarChangeEvent = [weak = AceType::WeakClaim(AceType::RawPtr(dateNode))](bool selected) {
80 auto datePicker = weak.Upgrade();
81 CHECK_NULL_VOID(datePicker);
82 auto layoutProp = datePicker->GetLayoutProperty<DataPickerRowLayoutProperty>();
83 CHECK_NULL_VOID(layoutProp);
84 layoutProp->UpdateLunar(selected);
85 datePicker->MarkModifyDone();
86 };
87 RefPtr<FrameNode> acceptNode = dateNode;
88 if (settingData.showTime) {
89 switchFlag_ = false;
90 auto pickerRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
91 AceType::MakeRefPtr<LinearLayoutPattern>(false));
92 CHECK_NULL_RETURN(pickerRow, nullptr);
93 auto layoutProperty = dateNode->GetLayoutProperty<LayoutProperty>();
94 CHECK_NULL_RETURN(layoutProperty, nullptr);
95 layoutProperty->UpdateVisibility(VisibleType::INVISIBLE);
96 auto monthDaysNode = CreateDateNode(
97 monthDaysNodeId, settingData.datePickerProperty, settingData.properties, settingData.isLunar, true);
98 lunarChangeEvent = [monthDaysNodeWeak = AceType::WeakClaim(AceType::RawPtr(monthDaysNode)),
99 dateNodeWeak = AceType::WeakClaim(AceType::RawPtr(dateNode))](bool selected) {
100 auto monthDaysNode = monthDaysNodeWeak.Upgrade();
101 auto dateNode = dateNodeWeak.Upgrade();
102 CHECK_NULL_VOID(monthDaysNode);
103 CHECK_NULL_VOID(dateNode);
104 SetShowLunar(monthDaysNode, selected);
105 SetShowLunar(dateNode, selected);
106 monthDaysNode->MarkModifyDone();
107 dateNode->MarkModifyDone();
108 };
109 auto monthDaysPickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
110 CHECK_NULL_RETURN(monthDaysPickerPattern, nullptr);
111 monthDaysPickerPattern->SetTitleId(pickerPattern->GetTitleId());
112 monthDaysPickerPattern->SetShowTimeFlag(true);
113 pickerPattern->SetShowTimeFlag(true);
114 auto monthDaysLayoutProperty = monthDaysNode->GetLayoutProperty();
115 CHECK_NULL_RETURN(monthDaysLayoutProperty, nullptr);
116 monthDaysLayoutProperty->UpdateUserDefinedIdealSize(
117 CalcSize(NG::CalcLength(
118 Dimension(settingData.useMilitary ? MONTHDAYS_WIDTH_PERCENT_ONE : MONTHDAYS_WIDTH_PERCENT_TWO,
119 DimensionUnit::PERCENT)),
120 std::nullopt));
121 monthDaysNode->MarkModifyDone();
122 monthDaysNode->MountToParent(pickerRow);
123 auto timeNode = CreateTimeNode(settingData.timePickerProperty, settingData.properties, settingData.useMilitary);
124 auto timePickerEventHub = timeNode->GetEventHub<TimePickerEventHub>();
125 CHECK_NULL_RETURN(timePickerEventHub, nullptr);
126 auto onChangeCallback = [monthDaysNode]() {
127 auto pickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
128 CHECK_NULL_VOID(pickerPattern);
129 auto str = pickerPattern->GetSelectedObject(true);
130 auto datePickerEventHub = pickerPattern->GetEventHub<DatePickerEventHub>();
131 CHECK_NULL_VOID(datePickerEventHub);
132 datePickerEventHub->FireDialogChangeEvent(str);
133 };
134 timePickerEventHub->SetOnChangeForDatePicker(std::move(onChangeCallback));
135 auto timeLayoutProperty = timeNode->GetLayoutProperty();
136 CHECK_NULL_RETURN(timeLayoutProperty, nullptr);
137 timeLayoutProperty->UpdateUserDefinedIdealSize(
138 CalcSize(NG::CalcLength(Dimension(settingData.useMilitary ? TIME_WIDTH_PERCENT_ONE : TIME_WIDTH_PERCENT_TWO,
139 DimensionUnit::PERCENT)),
140 std::nullopt));
141 timeNode->MarkModifyDone();
142 timeNode->MountToParent(pickerRow);
143 pickerRow->MountToParent(pickerStack);
144
145 CreateTitleIconNode(buttonTitleNode);
146 SetTitleMouseHoverEvent(buttonTitleNode);
147 buttonTitleNode->MarkModifyDone();
148 RefPtr<DateTimeAnimationController> animationController = AceType::MakeRefPtr<DateTimeAnimationController>();
149 auto titleSwitchEvent = [contentColumn, pickerStack, animationController]() {
150 // switch picker page.
151 auto pickerRow = pickerStack->GetLastChild();
152 CHECK_NULL_VOID(pickerRow);
153 auto dateNode = AceType::DynamicCast<FrameNode>(pickerStack->GetChildAtIndex(0));
154 CHECK_NULL_VOID(dateNode);
155 auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
156 CHECK_NULL_VOID(datePickerPattern);
157 auto monthDaysNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(0));
158 auto timeNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(1));
159 CHECK_NULL_VOID(monthDaysNode);
160 CHECK_NULL_VOID(timeNode);
161 auto timePickerPattern = timeNode->GetPattern<TimePickerRowPattern>();
162 CHECK_NULL_VOID(timePickerPattern);
163 auto monthDaysPickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
164 CHECK_NULL_VOID(monthDaysPickerPattern);
165
166 PickerDate selectedDate =
167 switchFlag_ ? datePickerPattern->GetCurrentDate() : monthDaysPickerPattern->GetCurrentDate();
168 SetSelectedDate(switchFlag_ ? monthDaysNode : dateNode, selectedDate);
169 if (switchFlag_) {
170 datePickerPattern->SetFocusDisable();
171 timePickerPattern->SetFocusEnable();
172 monthDaysPickerPattern->SetFocusEnable();
173 monthDaysNode->MarkModifyDone();
174 } else {
175 monthDaysPickerPattern->SetFocusDisable();
176 timePickerPattern->SetFocusDisable();
177 datePickerPattern->SetFocusEnable();
178 dateNode->MarkModifyDone();
179 }
180
181 auto contentRow = AceType::DynamicCast<FrameNode>(contentColumn->GetLastChild());
182 auto titleRow = AceType::DynamicCast<FrameNode>(contentColumn->GetChildAtIndex(0));
183 CHECK_NULL_VOID(titleRow);
184 auto titleButtonNode = AceType::DynamicCast<FrameNode>(titleRow->GetFirstChild());
185 CHECK_NULL_VOID(titleButtonNode);
186 auto titleButtonRowNode = AceType::DynamicCast<FrameNode>(titleButtonNode->GetFirstChild());
187 CHECK_NULL_VOID(titleButtonRowNode);
188 auto spinnerNode = AceType::DynamicCast<FrameNode>(titleButtonRowNode->GetLastChild());
189 CHECK_NULL_VOID(spinnerNode);
190 animationController->SetButtonIcon(spinnerNode);
191 animationController->SetMonthDays(monthDaysNode);
192 animationController->SetDatePicker(dateNode);
193 animationController->SetTimePicker(timeNode);
194 animationController->SetButtonRow(contentRow);
195 switchFlag_ = !switchFlag_;
196
197 animationController->Play(switchFlag_);
198 };
199 auto switchEvent = [func = titleSwitchEvent]() {
200 if (switchFlag_) {
201 func();
202 return true;
203 }
204 return false;
205 };
206 SetDialogSwitchEvent(switchEvent);
207 auto titleClickEvent = [func = std::move(titleSwitchEvent)](const GestureEvent& /* info */) { func(); };
208 auto titleButtonNode = AceType::DynamicCast<FrameNode>(buttonTitleNode->GetFirstChild());
209 CHECK_NULL_RETURN(titleButtonNode, nullptr);
210 auto titleEventHub = titleButtonNode->GetOrCreateGestureEventHub();
211 auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(titleClickEvent));
212 titleEventHub->AddClickEvent(onClick);
213 acceptNode = monthDaysNode;
214 }
215 dateNode->MarkModifyDone();
216
217 ViewStackProcessor::GetInstance()->Finish();
218 auto stackLayoutProperty = pickerStack->GetLayoutProperty();
219 CHECK_NULL_RETURN(stackLayoutProperty, nullptr);
220 stackLayoutProperty->UpdateUserDefinedIdealSize(
221 CalcSize(NG::CalcLength(Dimension(1, DimensionUnit::PERCENT)), std::nullopt));
222 pickerStack->MountToParent(contentColumn);
223 // build lunarswitch Node
224 if (settingData.lunarswitch) {
225 CreateLunarswitchNode(contentColumn, std::move(lunarChangeEvent), settingData.isLunar);
226 }
227 auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
228 CHECK_NULL_RETURN(dialogNode, nullptr);
229
230 // build dialog accept and cancel button
231 auto changeEvent = dialogEvent["changeId"];
232 auto dateChangeEvent = dialogEvent["dateChangeId"];
233 if (settingData.showTime) {
234 auto changeEventSame = changeEvent;
235 auto dateChangeEventSame = dateChangeEvent;
236 SetDialogChange(acceptNode, std::move(changeEventSame));
237 SetDialogDateChange(acceptNode, std::move(dateChangeEventSame));
238 }
239 SetDialogChange(dateNode, std::move(changeEvent));
240 SetDialogDateChange(dateNode, std::move(dateChangeEvent));
241 auto contentRow = CreateButtonNode(acceptNode, dateNode, dialogEvent, std::move(dialogCancelEvent));
242 CHECK_NULL_RETURN(contentRow, nullptr);
243 auto event = [dialogNode](const GestureEvent& /* info */) {
244 auto pipeline = PipelineContext::GetCurrentContext();
245 auto overlayManager = pipeline->GetOverlayManager();
246 overlayManager->CloseDialog(dialogNode);
247 };
248 for (const auto& child : contentRow->GetChildren()) {
249 auto firstChild = AceType::DynamicCast<FrameNode>(child);
250 auto gesturHub = firstChild->GetOrCreateGestureEventHub();
251 auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(event);
252 gesturHub->AddClickEvent(onClick);
253 }
254 contentRow->AddChild(CreateDividerNode(dateNode), 1);
255 contentRow->MountToParent(contentColumn);
256 dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
257 return dialogNode;
258 }
259
CreateStackNode()260 RefPtr<FrameNode> DatePickerDialogView::CreateStackNode()
261 {
262 auto stackId = ElementRegister::GetInstance()->MakeUniqueId();
263 return FrameNode::GetOrCreateFrameNode(
264 V2::STACK_ETS_TAG, stackId, []() { return AceType::MakeRefPtr<StackPattern>(); });
265 }
266
CreateButtonNode()267 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNode()
268 {
269 auto buttonId = ElementRegister::GetInstance()->MakeUniqueId();
270 return FrameNode::GetOrCreateFrameNode(
271 V2::BUTTON_ETS_TAG, buttonId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
272 }
273
CreateTitleButtonNode(const RefPtr<FrameNode> & dateNode)274 RefPtr<FrameNode> DatePickerDialogView::CreateTitleButtonNode(const RefPtr<FrameNode>& dateNode)
275 {
276 auto pipeline = PipelineContext::GetCurrentContext();
277 CHECK_NULL_RETURN(pipeline, nullptr);
278 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
279 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
280 auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
281 CHECK_NULL_RETURN(pickerPattern, nullptr);
282 auto titleRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
283 AceType::MakeRefPtr<LinearLayoutPattern>(false));
284 CHECK_NULL_RETURN(titleRow, nullptr);
285 auto layoutProps = titleRow->GetLayoutProperty<LinearLayoutProperty>();
286 CHECK_NULL_RETURN(layoutProps, nullptr);
287 layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
288 layoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
289 layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
290
291 auto buttonTitleNode = FrameNode::GetOrCreateFrameNode(
292 V2::BUTTON_ETS_TAG, pickerPattern->GetButtonTitleId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
293 CHECK_NULL_RETURN(buttonTitleNode, nullptr);
294 auto titleButtonRow = CreateTitleButtonRowNode();
295 CHECK_NULL_RETURN(titleButtonRow, nullptr);
296 auto textTitleNodeId = pickerPattern->GetTitleId();
297 auto textTitleNode =
298 FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, textTitleNodeId, AceType::MakeRefPtr<TextPattern>());
299 CHECK_NULL_RETURN(textTitleNode, nullptr);
300 auto textLayoutProperty = textTitleNode->GetLayoutProperty<TextLayoutProperty>();
301 CHECK_NULL_RETURN(textLayoutProperty, nullptr);
302 textLayoutProperty->UpdateContent("");
303 textLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
304
305 textLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor());
306 textLayoutProperty->UpdateFontSize(pickerTheme->GetTitleStyle().GetFontSize());
307 textLayoutProperty->UpdateFontWeight(pickerTheme->GetTitleStyle().GetFontWeight());
308 textLayoutProperty->UpdateTextOverflow(pickerTheme->GetTitleStyle().GetTextOverflow());
309 textLayoutProperty->UpdateMaxLines(pickerTheme->GetTitleStyle().GetMaxLines());
310 auto buttonTitleRenderContext = buttonTitleNode->GetRenderContext();
311 CHECK_NULL_RETURN(buttonTitleRenderContext, nullptr);
312 buttonTitleRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
313 MarginProperty margin;
314 margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
315 margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
316 margin.top = CalcLength(dialogTheme->GetDividerHeight() / MARGIN_HALF);
317 margin.bottom = CalcLength(dialogTheme->GetDividerHeight() / MARGIN_HALF);
318 buttonTitleNode->GetLayoutProperty()->UpdateMargin(margin);
319 textTitleNode->MountToParent(titleButtonRow);
320 titleButtonRow->MountToParent(buttonTitleNode);
321 buttonTitleNode->MountToParent(titleRow);
322 titleRow->SetNeedCallChildrenUpdate(false);
323 return titleRow;
324 }
325
CreateTitleButtonRowNode()326 RefPtr<FrameNode> DatePickerDialogView::CreateTitleButtonRowNode()
327 {
328 auto titleButtonRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
329 AceType::MakeRefPtr<LinearLayoutPattern>(false));
330 CHECK_NULL_RETURN(titleButtonRow, nullptr);
331 auto bottonRowlayoutProps = titleButtonRow->GetLayoutProperty<LinearLayoutProperty>();
332 CHECK_NULL_RETURN(bottonRowlayoutProps, nullptr);
333 bottonRowlayoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
334 bottonRowlayoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
335 bottonRowlayoutProps->UpdateMeasureType(MeasureType::MATCH_CONTENT);
336 return titleButtonRow;
337 }
338
CreateTitleIconNode(const RefPtr<FrameNode> & titleNode)339 void DatePickerDialogView::CreateTitleIconNode(const RefPtr<FrameNode>& titleNode)
340 {
341 auto pipeline = PipelineContext::GetCurrentContext();
342 CHECK_NULL_VOID(pipeline);
343 auto iconTheme = pipeline->GetTheme<IconTheme>();
344 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
345 auto spinnerNode = FrameNode::CreateFrameNode(
346 V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
347 CHECK_NULL_VOID(spinnerNode);
348 ImageSourceInfo imageSourceInfo;
349 auto iconPath = iconTheme->GetIconPath(InternalResource::ResourceId::SPINNER);
350 imageSourceInfo.SetSrc(iconPath);
351 imageSourceInfo.SetFillColor(pickerTheme->GetTitleStyle().GetTextColor());
352
353 auto spinnerLayoutProperty = spinnerNode->GetLayoutProperty<ImageLayoutProperty>();
354 CHECK_NULL_VOID(spinnerLayoutProperty);
355 spinnerLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
356 CalcSize idealSize = { CalcLength(pickerTheme->GetTitleStyle().GetFontSize()),
357 CalcLength(pickerTheme->GetTitleStyle().GetFontSize()) };
358 MeasureProperty layoutConstraint;
359 layoutConstraint.selfIdealSize = idealSize;
360 spinnerLayoutProperty->UpdateCalcLayoutProperty(layoutConstraint);
361 spinnerNode->MarkModifyDone();
362 auto buttonNode = AceType::DynamicCast<FrameNode>(titleNode->GetFirstChild());
363 CHECK_NULL_VOID(buttonNode);
364 auto buttonRowNode = AceType::DynamicCast<FrameNode>(buttonNode->GetFirstChild());
365 CHECK_NULL_VOID(buttonRowNode);
366 spinnerNode->MountToParent(buttonRowNode);
367 }
368
CreateDividerNode(const RefPtr<FrameNode> & dateNode)369 RefPtr<FrameNode> DatePickerDialogView::CreateDividerNode(const RefPtr<FrameNode>& dateNode)
370 {
371 auto pipeline = PipelineContext::GetCurrentContext();
372 CHECK_NULL_RETURN(pipeline, nullptr);
373 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
374 auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
375 CHECK_NULL_RETURN(pickerPattern, nullptr);
376 auto dividerNode = FrameNode::GetOrCreateFrameNode(
377 V2::DIVIDER_ETS_TAG, pickerPattern->GetDividerId(), []() { return AceType::MakeRefPtr<DividerPattern>(); });
378 CHECK_NULL_RETURN(dividerNode, nullptr);
379
380 auto dividerPaintProps = dividerNode->GetPaintProperty<DividerRenderProperty>();
381 CHECK_NULL_RETURN(dividerPaintProps, nullptr);
382 dividerPaintProps->UpdateDividerColor(dialogTheme->GetDividerColor());
383
384 auto dividerLayoutProps = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
385 CHECK_NULL_RETURN(dividerLayoutProps, nullptr);
386 dividerLayoutProps->UpdateVertical(true);
387 dividerLayoutProps->UpdateUserDefinedIdealSize(
388 CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
389
390 return dividerNode;
391 }
392
CreateButtonNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & datePickerNode,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)393 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNode(const RefPtr<FrameNode>& dateNode,
394 const RefPtr<FrameNode>& datePickerNode, std::map<std::string, NG::DialogEvent> dialogEvent,
395 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
396 {
397 auto acceptEvent = dialogEvent["acceptId"];
398 auto dateAcceptEvent = dialogEvent["dateAcceptId"];
399 auto cancelEvent = dialogCancelEvent["cancelId"];
400 auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
401 AceType::MakeRefPtr<LinearLayoutPattern>(false));
402 CHECK_NULL_RETURN(contentRow, nullptr);
403 auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
404 CHECK_NULL_RETURN(layoutProps, nullptr);
405 layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
406 layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
407
408 contentRow->SetNeedCallChildrenUpdate(false);
409 SetDialogDateAcceptEvent(dateNode, std::move(dateAcceptEvent));
410
411 auto buttonCancelNode = CreateCancelNode(cancelEvent, datePickerNode);
412 auto buttonConfirmNode = CreateConfirmNode(dateNode, datePickerNode, acceptEvent);
413
414 buttonCancelNode->MountToParent(contentRow);
415 buttonConfirmNode->MountToParent(contentRow);
416
417 auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
418 datePickerPattern->SetContentRowNode(contentRow);
419
420 return contentRow;
421 }
422
CreateConfirmNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & datePickerNode,DialogEvent & acceptEvent)423 RefPtr<FrameNode> DatePickerDialogView::CreateConfirmNode(
424 const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& datePickerNode, DialogEvent& acceptEvent)
425 {
426 auto pipeline = PipelineContext::GetCurrentContext();
427 CHECK_NULL_RETURN(pipeline, nullptr);
428 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
429 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
430
431 auto buttonConfirmNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
432 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
433 auto textConfirmNode = FrameNode::CreateFrameNode(
434 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
435 CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
436 CHECK_NULL_RETURN(textConfirmNode, nullptr);
437 auto textLayoutProperty = textConfirmNode->GetLayoutProperty<TextLayoutProperty>();
438 CHECK_NULL_RETURN(textLayoutProperty, nullptr);
439 textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.ok"));
440 textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
441 textLayoutProperty->UpdateFontSize(pickerTheme->GetOptionStyle(false, false).GetFontSize());
442 textLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
443 auto datePickerPattern = datePickerNode->GetPattern<DatePickerPattern>();
444 datePickerPattern->SetConfirmNode(buttonConfirmNode);
445 auto buttonConfirmEventHub = buttonConfirmNode->GetEventHub<ButtonEventHub>();
446 CHECK_NULL_RETURN(buttonConfirmEventHub, nullptr);
447 buttonConfirmEventHub->SetStateEffect(true);
448
449 auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
450 buttonConfirmLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.ok"));
451 buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
452 buttonConfirmLayoutProperty->UpdateType(ButtonType::CAPSULE);
453 buttonConfirmLayoutProperty->UpdateFlexShrink(1.0);
454 buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
455 CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
456 auto buttonConfirmRenderContext = buttonConfirmNode->GetRenderContext();
457 buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
458
459 MarginProperty margin;
460 margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
461 margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
462 margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
463 buttonConfirmNode->GetLayoutProperty()->UpdateMargin(margin);
464 textConfirmNode->MountToParent(buttonConfirmNode);
465 auto eventConfirmHub = buttonConfirmNode->GetOrCreateGestureEventHub();
466 CHECK_NULL_RETURN(eventConfirmHub, nullptr);
467 CHECK_NULL_RETURN(dateNode, nullptr);
468 SetDialogAcceptEvent(dateNode, std::move(acceptEvent));
469 auto clickCallback = [dateNode](const GestureEvent& /* info */) {
470 auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
471 CHECK_NULL_VOID(pickerPattern);
472 auto datePickerEventHub = pickerPattern->GetEventHub<DatePickerEventHub>();
473 CHECK_NULL_VOID(datePickerEventHub);
474 datePickerEventHub->FireDialogAcceptEvent(pickerPattern->GetSelectedObject(true));
475 };
476 eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(clickCallback));
477 buttonConfirmNode->MarkModifyDone();
478 return buttonConfirmNode;
479 }
480
CreateDateNode(int32_t dateNodeId,std::map<std::string,PickerDate> datePickerProperty,const PickerTextProperties & properties,bool isLunar,bool showTime)481 RefPtr<FrameNode> DatePickerDialogView::CreateDateNode(int32_t dateNodeId,
482 std::map<std::string, PickerDate> datePickerProperty, const PickerTextProperties& properties, bool isLunar,
483 bool showTime)
484 {
485 auto dateNode = FrameNode::GetOrCreateFrameNode(
486 V2::DATE_PICKER_ETS_TAG, dateNodeId, []() { return AceType::MakeRefPtr<DatePickerPattern>(); });
487 CHECK_NULL_RETURN(dateNode, nullptr);
488 auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
489 CHECK_NULL_RETURN(datePickerPattern, nullptr);
490
491 auto pipeline = PipelineBase::GetCurrentContext();
492 CHECK_NULL_RETURN(pipeline, nullptr);
493 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
494 CHECK_NULL_RETURN(dialogTheme, nullptr);
495 datePickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
496 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
497 CHECK_NULL_RETURN(pickerTheme, nullptr);
498 uint32_t showCount = pickerTheme->GetShowOptionCount();
499 datePickerPattern->SetShowCount(showCount);
500
501 if (showTime) {
502 CreateSingleDateNode(dateNode, showCount);
503 } else {
504 CreateNormalDateNode(dateNode, showCount);
505 }
506
507 PickerDate parseStartDate;
508 PickerDate parseEndDate;
509 PickerDate parseSelectedDate;
510 SetShowLunar(dateNode, isLunar);
511 SetDateTextProperties(dateNode, properties);
512 if (datePickerProperty.find("start") != datePickerProperty.end()) {
513 parseStartDate = datePickerProperty["start"];
514 SetStartDate(dateNode, parseStartDate);
515 }
516 if (datePickerProperty.find("end") != datePickerProperty.end()) {
517 parseEndDate = datePickerProperty["end"];
518 SetEndDate(dateNode, parseEndDate);
519 }
520 if (datePickerProperty.find("selected") != datePickerProperty.end()) {
521 parseSelectedDate = datePickerProperty["selected"];
522 SetSelectedDate(dateNode, parseSelectedDate);
523 }
524 return dateNode;
525 }
526
CreateColumnNode(int32_t nodeId,uint32_t showCount,bool isDate)527 RefPtr<FrameNode> DatePickerDialogView::CreateColumnNode(int32_t nodeId, uint32_t showCount, bool isDate)
528 {
529 RefPtr<FrameNode> columnNode;
530 if (isDate) {
531 columnNode = FrameNode::GetOrCreateFrameNode(
532 V2::COLUMN_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<DatePickerColumnPattern>(); });
533 } else {
534 columnNode = FrameNode::GetOrCreateFrameNode(
535 V2::COLUMN_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
536 }
537 CHECK_NULL_RETURN(columnNode, nullptr);
538 columnNode->Clean();
539 for (uint32_t index = 0; index < showCount; index++) {
540 auto textNode = FrameNode::CreateFrameNode(
541 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
542 CHECK_NULL_RETURN(textNode, nullptr);
543 textNode->MountToParent(columnNode);
544 }
545 columnNode->MarkModifyDone();
546 return columnNode;
547 }
548
CreateNormalDateNode(const RefPtr<FrameNode> & dateNode,uint32_t showCount)549 void DatePickerDialogView::CreateNormalDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount)
550 {
551 auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
552 CHECK_NULL_VOID(datePickerPattern);
553 datePickerPattern->SetShowMonthDaysFlag(false);
554
555 auto yearColumnNode = CreateColumnNode(datePickerPattern->GetYearId(), showCount);
556 auto monthColumnNode = CreateColumnNode(datePickerPattern->GetMonthId(), showCount);
557 auto dayColumnNode = CreateColumnNode(datePickerPattern->GetDayId(), showCount);
558 CHECK_NULL_VOID(yearColumnNode);
559 CHECK_NULL_VOID(monthColumnNode);
560 CHECK_NULL_VOID(dayColumnNode);
561 datePickerPattern->SetColumn(yearColumnNode);
562 datePickerPattern->SetColumn(monthColumnNode);
563 datePickerPattern->SetColumn(dayColumnNode);
564
565 {
566 auto stackYearNode = CreateStackNode();
567 auto buttonYearNode = CreateButtonNode();
568 buttonYearNode->MountToParent(stackYearNode);
569 yearColumnNode->MountToParent(stackYearNode);
570 auto layoutProperty = stackYearNode->GetLayoutProperty<LayoutProperty>();
571 layoutProperty->UpdateAlignment(Alignment::CENTER);
572 layoutProperty->UpdateLayoutWeight(1);
573 stackYearNode->MountToParent(dateNode);
574 }
575 {
576 auto stackMonthNode = CreateStackNode();
577 auto buttonMonthNode = CreateButtonNode();
578 buttonMonthNode->MountToParent(stackMonthNode);
579 monthColumnNode->MountToParent(stackMonthNode);
580 auto layoutProperty = stackMonthNode->GetLayoutProperty<LayoutProperty>();
581 layoutProperty->UpdateAlignment(Alignment::CENTER);
582 layoutProperty->UpdateLayoutWeight(1);
583 stackMonthNode->MountToParent(dateNode);
584 }
585 {
586 auto stackDayNode = CreateStackNode();
587 auto buttonDayNode = CreateButtonNode();
588 buttonDayNode->MountToParent(stackDayNode);
589 dayColumnNode->MountToParent(stackDayNode);
590 auto layoutProperty = stackDayNode->GetLayoutProperty<LayoutProperty>();
591 layoutProperty->UpdateAlignment(Alignment::CENTER);
592 layoutProperty->UpdateLayoutWeight(1);
593 stackDayNode->MountToParent(dateNode);
594 }
595 }
596
CreateSingleDateNode(const RefPtr<FrameNode> & dateNode,uint32_t showCount)597 void DatePickerDialogView::CreateSingleDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount)
598 {
599 auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
600 CHECK_NULL_VOID(datePickerPattern);
601 datePickerPattern->SetShowMonthDaysFlag(true);
602
603 auto monthDaysColumnNode = CreateColumnNode(datePickerPattern->GetMonthDaysId(), showCount);
604 auto yearColumnNode = CreateColumnNode(datePickerPattern->GetYearId(), showCount);
605 CHECK_NULL_VOID(monthDaysColumnNode);
606 CHECK_NULL_VOID(yearColumnNode);
607 datePickerPattern->SetColumn(monthDaysColumnNode);
608 datePickerPattern->SetColumn(yearColumnNode);
609
610 {
611 auto stackMonthNode = CreateStackNode();
612 auto buttonMonthNode = CreateButtonNode();
613 buttonMonthNode->MountToParent(stackMonthNode);
614 monthDaysColumnNode->MountToParent(stackMonthNode);
615 auto layoutProperty = stackMonthNode->GetLayoutProperty<LayoutProperty>();
616 layoutProperty->UpdateAlignment(Alignment::CENTER);
617 layoutProperty->UpdateLayoutWeight(1);
618 stackMonthNode->MountToParent(dateNode);
619 }
620
621 {
622 auto stackYearNode = CreateStackNode();
623 auto buttonYearNode = CreateButtonNode();
624 buttonYearNode->MountToParent(stackYearNode);
625 yearColumnNode->MountToParent(stackYearNode);
626 auto layoutProperty = stackYearNode->GetLayoutProperty<LayoutProperty>();
627 layoutProperty->UpdateAlignment(Alignment::CENTER);
628 layoutProperty->UpdateVisibility(VisibleType::GONE);
629 stackYearNode->MountToParent(dateNode);
630 }
631 }
632
CreateTimeNode(std::map<std::string,PickerTime> timePickerProperty,const PickerTextProperties & properties,bool useMilitaryTime)633 RefPtr<FrameNode> DatePickerDialogView::CreateTimeNode(
634 std::map<std::string, PickerTime> timePickerProperty, const PickerTextProperties& properties, bool useMilitaryTime)
635 {
636 auto timePickerNode = FrameNode::GetOrCreateFrameNode(V2::TIME_PICKER_ETS_TAG,
637 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<TimePickerRowPattern>(); });
638 CHECK_NULL_RETURN(timePickerNode, nullptr);
639 auto timePickerRowPattern = timePickerNode->GetPattern<TimePickerRowPattern>();
640 CHECK_NULL_RETURN(timePickerRowPattern, nullptr);
641
642 auto pipeline = PipelineBase::GetCurrentContext();
643 CHECK_NULL_RETURN(pipeline, nullptr);
644 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
645 CHECK_NULL_RETURN(pickerTheme, nullptr);
646 uint32_t showCount = pickerTheme->GetShowOptionCount();
647 timePickerRowPattern->SetShowCount(showCount);
648
649 auto hasHourNode = timePickerRowPattern->HasHourNode();
650 auto hasMinuteNode = timePickerRowPattern->HasMinuteNode();
651
652 auto hourColumnNode = CreateColumnNode(timePickerRowPattern->GetHourId(), showCount, false);
653 auto minuteColumnNode = CreateColumnNode(timePickerRowPattern->GetMinuteId(), showCount, false);
654 CHECK_NULL_RETURN(hourColumnNode, nullptr);
655 CHECK_NULL_RETURN(minuteColumnNode, nullptr);
656 timePickerRowPattern->SetColumn(hourColumnNode);
657 timePickerRowPattern->SetColumn(minuteColumnNode);
658
659 if (!hasHourNode) {
660 auto stackHourNode = CreateStackNode();
661 auto buttonYearNode = CreateButtonNode();
662 buttonYearNode->MountToParent(stackHourNode);
663 hourColumnNode->MountToParent(stackHourNode);
664 auto layoutProperty = stackHourNode->GetLayoutProperty<LayoutProperty>();
665 layoutProperty->UpdateAlignment(Alignment::CENTER);
666 layoutProperty->UpdateLayoutWeight(1);
667 stackHourNode->MountToParent(timePickerNode);
668 }
669 if (!hasMinuteNode) {
670 auto stackMinuteNode = CreateStackNode();
671 auto buttonYearNode = CreateButtonNode();
672 buttonYearNode->MountToParent(stackMinuteNode);
673 minuteColumnNode->MountToParent(stackMinuteNode);
674 auto layoutProperty = stackMinuteNode->GetLayoutProperty<LayoutProperty>();
675 layoutProperty->UpdateAlignment(Alignment::CENTER);
676 layoutProperty->UpdateLayoutWeight(1);
677 stackMinuteNode->MountToParent(timePickerNode);
678 }
679 if (timePickerProperty.find("selected") != timePickerProperty.end()) {
680 auto selectedTime = timePickerProperty["selected"];
681 timePickerRowPattern->SetSelectedTime(selectedTime);
682 }
683 timePickerRowPattern->SetHour24(useMilitaryTime);
684
685 SetTimeTextProperties(timePickerNode, properties);
686 return timePickerNode;
687 }
688
CreateCancelNode(NG::DialogGestureEvent & cancelEvent,const RefPtr<FrameNode> & datePickerNode)689 RefPtr<FrameNode> DatePickerDialogView::CreateCancelNode(
690 NG::DialogGestureEvent& cancelEvent, const RefPtr<FrameNode>& datePickerNode)
691 {
692 auto pipeline = PipelineContext::GetCurrentContext();
693 CHECK_NULL_RETURN(pipeline, nullptr);
694 auto dialogTheme = pipeline->GetTheme<DialogTheme>();
695 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
696 auto buttonCancelNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
697 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
698 CHECK_NULL_RETURN(buttonCancelNode, nullptr);
699 auto textCancelNode = FrameNode::CreateFrameNode(
700 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
701 CHECK_NULL_RETURN(textCancelNode, nullptr);
702 auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
703 CHECK_NULL_RETURN(textCancelLayoutProperty, nullptr);
704 textCancelLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.cancel"));
705 textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
706 textCancelLayoutProperty->UpdateFontSize(pickerTheme->GetOptionStyle(false, false).GetFontSize());
707 textCancelLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
708 auto datePickerPattern = datePickerNode->GetPattern<DatePickerPattern>();
709 datePickerPattern->SetCancelNode(buttonCancelNode);
710 textCancelNode->MountToParent(buttonCancelNode);
711 auto eventCancelHub = buttonCancelNode->GetOrCreateGestureEventHub();
712 CHECK_NULL_RETURN(eventCancelHub, nullptr);
713 eventCancelHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(cancelEvent)));
714
715 auto buttonCancelEventHub = buttonCancelNode->GetEventHub<ButtonEventHub>();
716 CHECK_NULL_RETURN(buttonCancelEventHub, nullptr);
717 buttonCancelEventHub->SetStateEffect(true);
718
719 MarginProperty margin;
720 margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
721 margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
722 margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
723 buttonCancelNode->GetLayoutProperty()->UpdateMargin(margin);
724
725 auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
726 buttonCancelLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.cancel"));
727 buttonCancelLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
728 buttonCancelLayoutProperty->UpdateType(ButtonType::CAPSULE);
729 buttonCancelLayoutProperty->UpdateFlexShrink(1.0);
730 buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
731 CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
732
733 auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext();
734 buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
735 buttonCancelNode->MarkModifyDone();
736 return buttonCancelNode;
737 }
738
CreateLunarswitchNode(const RefPtr<FrameNode> & contentColumn,std::function<void (const bool)> && changeEvent,bool isLunar)739 void DatePickerDialogView::CreateLunarswitchNode(
740 const RefPtr<FrameNode>& contentColumn, std::function<void(const bool)>&& changeEvent, bool isLunar)
741 {
742 auto pipeline = PipelineBase::GetCurrentContext();
743 CHECK_NULL_VOID(pipeline);
744 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
745 CHECK_NULL_VOID(pickerTheme);
746 auto contentRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
747 AceType::MakeRefPtr<LinearLayoutPattern>(false));
748 CHECK_NULL_VOID(contentRow);
749 auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
750 CHECK_NULL_VOID(layoutProps);
751 MarginProperty margin;
752 margin.bottom = CalcLength(LUNARSWITCH_MARGIN_TO_BUTTON);
753 layoutProps->UpdateMargin(margin);
754 layoutProps->UpdateUserDefinedIdealSize(
755 CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(LUNARSWITCH_HEIGHT)));
756
757 auto checkbox = FrameNode::CreateFrameNode(
758 V2::CHECK_BOX_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<CheckBoxPattern>());
759 CHECK_NULL_VOID(checkbox);
760 auto eventHub = checkbox->GetEventHub<CheckBoxEventHub>();
761 CHECK_NULL_VOID(eventHub);
762 eventHub->SetOnChange(std::move(changeEvent));
763 auto checkboxPaintProps = checkbox->GetPaintProperty<CheckBoxPaintProperty>();
764 CHECK_NULL_VOID(checkboxPaintProps);
765 checkboxPaintProps->UpdateCheckBoxSelect(isLunar);
766 auto checkboxLayoutProps = checkbox->GetLayoutProperty<LayoutProperty>();
767 CHECK_NULL_VOID(checkboxLayoutProps);
768 MarginProperty marginCheckbox;
769 marginCheckbox.left = CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE);
770 marginCheckbox.right = CalcLength(LUNARSWITCH_MARGIN_TO_BUTTON);
771 checkboxLayoutProps->UpdateMargin(marginCheckbox);
772 checkboxLayoutProps->UpdateUserDefinedIdealSize(CalcSize(CalcLength(CHECKBOX_SIZE), CalcLength(CHECKBOX_SIZE)));
773 checkbox->MarkModifyDone();
774 checkbox->MountToParent(contentRow);
775
776 auto textNode = FrameNode::CreateFrameNode(
777 V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
778 CHECK_NULL_VOID(textNode);
779 auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
780 CHECK_NULL_VOID(textLayoutProperty);
781 // the unicode encoding of chinese string of lunarSwitch.
782 textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("datepicker.lunarSwitch"));
783 textLayoutProperty->UpdateFontSize(pickerTheme->GetLunarSwitchTextSize());
784 textLayoutProperty->UpdateTextColor(pickerTheme->GetLunarSwitchTextColor());
785 textNode->MarkModifyDone();
786 textNode->MountToParent(contentRow);
787
788 contentRow->MountToParent(contentColumn);
789 }
790
SetStartDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)791 void DatePickerDialogView::SetStartDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
792 {
793 auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
794 CHECK_NULL_VOID(datePickerPattern);
795 datePickerPattern->SetStartDate(value);
796 auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
797 CHECK_NULL_VOID(pickerProperty);
798 pickerProperty->UpdateStartDate(datePickerPattern->GetStartDateLunar());
799 }
800
SetEndDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)801 void DatePickerDialogView::SetEndDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
802 {
803 auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
804 CHECK_NULL_VOID(datePickerPattern);
805 datePickerPattern->SetEndDate(value);
806 auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
807 CHECK_NULL_VOID(pickerProperty);
808 pickerProperty->UpdateEndDate(datePickerPattern->GetEndDateLunar());
809 }
810
SetSelectedDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)811 void DatePickerDialogView::SetSelectedDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
812 {
813 auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
814 CHECK_NULL_VOID(datePickerPattern);
815 datePickerPattern->SetSelectDate(value);
816 auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
817 CHECK_NULL_VOID(pickerProperty);
818 pickerProperty->UpdateSelectedDate(datePickerPattern->GetSelectDate());
819 }
820
SetShowLunar(const RefPtr<FrameNode> & frameNode,bool lunar)821 void DatePickerDialogView::SetShowLunar(const RefPtr<FrameNode>& frameNode, bool lunar)
822 {
823 auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
824 CHECK_NULL_VOID(pickerProperty);
825 pickerProperty->UpdateLunar(lunar);
826 }
827
SetDialogChange(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)828 void DatePickerDialogView::SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
829 {
830 CHECK_NULL_VOID(frameNode);
831 auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
832 CHECK_NULL_VOID(eventHub);
833 eventHub->SetDialogChange(std::move(onChange));
834 }
835
SetDialogDateChange(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)836 void DatePickerDialogView::SetDialogDateChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
837 {
838 CHECK_NULL_VOID(frameNode);
839 auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
840 CHECK_NULL_VOID(eventHub);
841 eventHub->SetDialogDateChange(std::move(onChange));
842 }
843
SetDialogAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)844 void DatePickerDialogView::SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
845 {
846 CHECK_NULL_VOID(frameNode);
847 auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
848 CHECK_NULL_VOID(eventHub);
849 eventHub->SetDialogAcceptEvent(std::move(onChange));
850 }
851
SetDialogDateAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)852 void DatePickerDialogView::SetDialogDateAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
853 {
854 CHECK_NULL_VOID(frameNode);
855 auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
856 CHECK_NULL_VOID(eventHub);
857 eventHub->SetDialogDateAcceptEvent(std::move(onChange));
858 }
859
SetDialogSwitchEvent(std::function<bool ()> switchEvent)860 void DatePickerDialogView::SetDialogSwitchEvent(std::function<bool()> switchEvent)
861 {
862 auto pipeline = PipelineContext::GetCurrentContext();
863 CHECK_NULL_VOID(pipeline);
864 auto overlayManger = pipeline->GetOverlayManager();
865 CHECK_NULL_VOID(overlayManger);
866 overlayManger->SetBackPressEvent(switchEvent);
867 }
868
SetDateTextProperties(const RefPtr<FrameNode> & frameNode,const PickerTextProperties & properties)869 void DatePickerDialogView::SetDateTextProperties(
870 const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties)
871 {
872 auto pipeline = PipelineContext::GetCurrentContext();
873 CHECK_NULL_VOID(pipeline);
874 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
875 CHECK_NULL_VOID(pickerTheme);
876 auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
877 auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
878 auto normalStyle = pickerTheme->GetOptionStyle(false, false);
879 auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
880 CHECK_NULL_VOID(pickerProperty);
881
882 if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
883 pickerProperty->UpdateDisappearFontSize(properties.disappearTextStyle_.fontSize.value());
884 } else {
885 pickerProperty->UpdateDisappearFontSize(disappearStyle.GetFontSize());
886 }
887 pickerProperty->UpdateDisappearColor(
888 properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
889 pickerProperty->UpdateDisappearWeight(
890 properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
891 pickerProperty->UpdateDisappearFontFamily(
892 properties.disappearTextStyle_.fontFamily.value_or(disappearStyle.GetFontFamilies()));
893 pickerProperty->UpdateDisappearFontStyle(
894 properties.disappearTextStyle_.fontStyle.value_or(disappearStyle.GetFontStyle()));
895
896 if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
897 pickerProperty->UpdateFontSize(properties.normalTextStyle_.fontSize.value());
898 } else {
899 pickerProperty->UpdateFontSize(normalStyle.GetFontSize());
900 }
901 pickerProperty->UpdateColor(properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
902 pickerProperty->UpdateWeight(properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
903 pickerProperty->UpdateFontFamily(properties.normalTextStyle_.fontFamily.value_or(normalStyle.GetFontFamilies()));
904 pickerProperty->UpdateFontStyle(properties.normalTextStyle_.fontStyle.value_or(normalStyle.GetFontStyle()));
905
906 if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
907 pickerProperty->UpdateSelectedFontSize(properties.selectedTextStyle_.fontSize.value());
908 } else {
909 pickerProperty->UpdateSelectedFontSize(selectedStyle.GetFontSize());
910 }
911 pickerProperty->UpdateSelectedColor(properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
912 pickerProperty->UpdateSelectedWeight(
913 properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
914 pickerProperty->UpdateSelectedFontFamily(
915 properties.selectedTextStyle_.fontFamily.value_or(selectedStyle.GetFontFamilies()));
916 pickerProperty->UpdateSelectedFontStyle(
917 properties.selectedTextStyle_.fontStyle.value_or(selectedStyle.GetFontStyle()));
918 }
919
SetTimeTextProperties(const RefPtr<FrameNode> & frameNode,const PickerTextProperties & properties)920 void DatePickerDialogView::SetTimeTextProperties(
921 const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties)
922 {
923 auto pipeline = PipelineContext::GetCurrentContext();
924 CHECK_NULL_VOID(pipeline);
925 auto pickerTheme = pipeline->GetTheme<PickerTheme>();
926 CHECK_NULL_VOID(pickerTheme);
927 auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
928 auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
929 auto normalStyle = pickerTheme->GetOptionStyle(false, false);
930 auto pickerProperty = frameNode->GetLayoutProperty<TimePickerLayoutProperty>();
931 CHECK_NULL_VOID(pickerProperty);
932
933 if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
934 pickerProperty->UpdateDisappearFontSize(properties.disappearTextStyle_.fontSize.value());
935 } else {
936 pickerProperty->UpdateDisappearFontSize(disappearStyle.GetFontSize());
937 }
938 pickerProperty->UpdateDisappearColor(
939 properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
940 pickerProperty->UpdateDisappearWeight(
941 properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
942
943 if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
944 pickerProperty->UpdateFontSize(properties.normalTextStyle_.fontSize.value());
945 } else {
946 pickerProperty->UpdateFontSize(normalStyle.GetFontSize());
947 }
948 pickerProperty->UpdateColor(properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
949 pickerProperty->UpdateWeight(properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
950
951 if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
952 pickerProperty->UpdateSelectedFontSize(properties.selectedTextStyle_.fontSize.value());
953 } else {
954 pickerProperty->UpdateSelectedFontSize(selectedStyle.GetFontSize());
955 }
956 pickerProperty->UpdateSelectedColor(properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
957 pickerProperty->UpdateSelectedWeight(
958 properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
959 }
960
SetTitleMouseHoverEvent(const RefPtr<FrameNode> & titleRow)961 void DatePickerDialogView::SetTitleMouseHoverEvent(const RefPtr<FrameNode>& titleRow)
962 {
963 auto titleButtonNode = AceType::DynamicCast<FrameNode>(titleRow->GetFirstChild());
964 CHECK_NULL_VOID(titleButtonNode);
965 auto eventHub = titleButtonNode->GetEventHub<EventHub>();
966 CHECK_NULL_VOID(eventHub);
967 auto inputHub = eventHub->GetOrCreateInputEventHub();
968 auto mouseTask = [titleButtonNode](bool isHover) {
969 HandleMouseEvent(titleButtonNode, isHover);
970 };
971 auto mouseEvent = AceType::MakeRefPtr<InputEvent>(std::move(mouseTask));
972 CHECK_NULL_VOID(mouseEvent);
973 inputHub->AddOnHoverEvent(mouseEvent);
974 }
975
HandleMouseEvent(const RefPtr<FrameNode> & titleButton,bool isHover)976 void DatePickerDialogView::HandleMouseEvent(const RefPtr<FrameNode>& titleButton, bool isHover)
977 {
978 if (isHover) {
979 auto pipeline = PipelineBase::GetCurrentContext();
980 CHECK_NULL_VOID(pipeline);
981 auto theme = pipeline->GetTheme<PickerTheme>();
982 CHECK_NULL_VOID(theme);
983 PlayHoverAnimation(titleButton, theme->GetHoverColor());
984 } else {
985 PlayHoverAnimation(titleButton, Color::TRANSPARENT);
986 }
987 }
988
PlayHoverAnimation(const RefPtr<FrameNode> & titleButton,const Color & color)989 void DatePickerDialogView::PlayHoverAnimation(const RefPtr<FrameNode>& titleButton, const Color& color)
990 {
991 AnimationOption option = AnimationOption();
992 option.SetDuration(HOVER_ANIMATION_DURATION);
993 option.SetCurve(Curves::FRICTION);
994 option.SetFillMode(FillMode::FORWARDS);
995 AnimationUtils::Animate(option, [titleButton, color]() {
996 auto buttonTitleNode = AceType::DynamicCast<FrameNode>(titleButton);
997 CHECK_NULL_VOID(buttonTitleNode);
998 auto buttonTitleRenderContext = buttonTitleNode->GetRenderContext();
999 buttonTitleRenderContext->UpdateBackgroundColor(color);
1000 buttonTitleNode->MarkDirtyNode();
1001 });
1002 }
1003 } // namespace OHOS::Ace::NG
1004