1 /*
2 * Copyright (c) 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 "bridge/declarative_frontend/jsview/models/picker_model_impl.h"
17
18 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
19 #include "bridge/declarative_frontend/view_stack_processor.h"
20 #include "core/components/picker/picker_date_component.h"
21 #include "core/components/picker/picker_time_component.h"
22
23 namespace OHOS::Ace::Framework {
CreateDatePicker(RefPtr<PickerTheme> theme)24 void DatePickerModelImpl::CreateDatePicker(RefPtr<PickerTheme> theme)
25 {
26 auto datePicker = AceType::MakeRefPtr<PickerDateComponent>();
27 ViewStackProcessor::GetInstance()->ClaimElementId(datePicker);
28
29 datePicker->SetIsDialog(false);
30 datePicker->SetHasButtons(false);
31 datePicker->SetTheme(theme);
32 ViewStackProcessor::GetInstance()->Push(datePicker);
33 }
34
CreateTimePicker(RefPtr<PickerTheme> theme)35 void DatePickerModelImpl::CreateTimePicker(RefPtr<PickerTheme> theme)
36 {
37 auto timePicker = AceType::MakeRefPtr<PickerTimeComponent>();
38 ViewStackProcessor::GetInstance()->ClaimElementId(timePicker);
39 timePicker->SetIsDialog(false);
40 timePicker->SetHasButtons(false);
41
42 timePicker->SetTheme(theme);
43 ViewStackProcessor::GetInstance()->Push(timePicker);
44 }
45
SetStartDate(const PickerDate & value)46 void DatePickerModelImpl::SetStartDate(const PickerDate& value)
47 {
48 JSViewSetProperty(&PickerDateComponent::SetStartDate, value);
49 }
50
SetEndDate(const PickerDate & value)51 void DatePickerModelImpl::SetEndDate(const PickerDate& value)
52 {
53 JSViewSetProperty(&PickerDateComponent::SetEndDate, value);
54 }
55
SetSelectedDate(const PickerDate & value)56 void DatePickerModelImpl::SetSelectedDate(const PickerDate& value)
57 {
58 JSViewSetProperty(&PickerDateComponent::SetSelectedDate, value);
59 }
60
SetMode(const DatePickerMode & value)61 void DatePickerModelImpl::SetMode(const DatePickerMode& value)
62 {
63 JSViewSetProperty(&PickerDateComponent::SetMode, value);
64 }
65
SetSelectedTime(const PickerTime & selectedTime)66 void DatePickerModelImpl::SetSelectedTime(const PickerTime& selectedTime)
67 {
68 JSViewSetProperty(&PickerTimeComponent::SetSelectedTime, selectedTime);
69 }
70
SetShowLunar(bool lunar)71 void DatePickerModelImpl::SetShowLunar(bool lunar)
72 {
73 JSViewSetProperty(&PickerDateComponent::SetShowLunar, lunar);
74 }
75
SetHour24(bool value)76 void DatePickerModelImpl::SetHour24(bool value)
77 {
78 JSViewSetProperty(&PickerTimeComponent::SetHour24, value);
79 }
80
SetOnChange(DateChangeEvent && onChange)81 void DatePickerModelImpl::SetOnChange(DateChangeEvent&& onChange)
82 {
83 auto datePicker = EventMarker([func = std::move(onChange)](const BaseEventInfo* info) { func(info); });
84 JSViewSetProperty(&PickerBaseComponent::SetOnChange, std::move(datePicker));
85 }
86
SetBackgroundColor(const Color & color)87 void DatePickerModelImpl::SetBackgroundColor(const Color& color)
88 {
89 auto pickerBase = AceType::DynamicCast<PickerBaseComponent>(ViewStackProcessor::GetInstance()->GetMainComponent());
90 if (!pickerBase) {
91 LOGE("PickerBaseComponent is null");
92 return;
93 }
94
95 pickerBase->SetHasBackgroundColor(true);
96 }
97
SetDatePickerDialogShow(PickerDialogInfo & pickerDialog,NG::DatePickerSettingData & settingData,std::function<void ()> && onCancel,std::function<void (const std::string &)> && onAccept,std::function<void (const std::string &)> && onDateAccept,std::function<void (const std::string &)> && onDateChange,std::function<void (const std::string &)> && onChange,DatePickerType pickerType,PickerDialogEvent & pickerDialogEvent,const std::vector<ButtonInfo> & buttonInfos)98 void DatePickerDialogModelImpl::SetDatePickerDialogShow(PickerDialogInfo& pickerDialog,
99 NG::DatePickerSettingData& settingData, std::function<void()>&& onCancel,
100 std::function<void(const std::string&)>&& onAccept, std::function<void(const std::string&)>&& onDateAccept,
101 std::function<void(const std::string&)>&& onDateChange, std::function<void(const std::string&)>&& onChange,
102 DatePickerType pickerType, PickerDialogEvent& pickerDialogEvent, const std::vector<ButtonInfo>& buttonInfos)
103 {
104 std::string name;
105 RefPtr<Component> component;
106 switch (pickerType) {
107 case DatePickerType::TIME: {
108 auto timePicker = AceType::MakeRefPtr<PickerTimeComponent>();
109 if (pickerDialog.isSelectedDate == true) {
110 timePicker->SetSelectedTime(pickerDialog.pickerTime);
111 }
112 timePicker->SetIsDialog(true);
113 timePicker->SetIsCreateDialogComponent(true);
114 timePicker->SetHour24(settingData.useMilitary);
115 component = timePicker;
116 name = "TimePickerDialog";
117 break;
118 }
119 case DatePickerType::DATE: {
120 auto datePicker = AceType::MakeRefPtr<PickerDateComponent>();
121 auto startDays = pickerDialog.parseStartDate.ToDays();
122 auto endDays = pickerDialog.parseEndDate.ToDays();
123 auto selectedDays = pickerDialog.parseSelectedDate.ToDays();
124 if (startDays > endDays || selectedDays < startDays || selectedDays > endDays) {
125 LOGE("date error");
126 }
127 if (pickerDialog.isStartDate == true) {
128 datePicker->SetStartDate(pickerDialog.parseStartDate);
129 }
130 if (pickerDialog.isEndDate == true) {
131 datePicker->SetEndDate(pickerDialog.parseEndDate);
132 }
133 if (pickerDialog.isSelectedDate) {
134 datePicker->SetSelectedDate(pickerDialog.parseSelectedDate);
135 }
136 datePicker->SetIsDialog(true);
137 datePicker->SetIsCreateDialogComponent(true);
138 datePicker->SetShowLunar(settingData.isLunar);
139
140 component = datePicker;
141 name = "DatePickerDialog";
142 break;
143 }
144 default: {
145 LOGE("Undefined date picker type.");
146 return;
147 }
148 }
149 auto datePicker = AceType::DynamicCast<PickerBaseComponent>(component);
150 DialogProperties properties {};
151 properties.alignment = Container::LessThanAPIVersion(PlatformVersion::VERSION_ELEVEN) ? DialogAlignment::CENTER
152 : DialogAlignment::DEFAULT;
153 properties.customComponent = datePicker;
154 properties.customStyle = true;
155 auto acceptId = EventMarker(std::move(onAccept));
156 datePicker->SetDialogAcceptEvent(acceptId);
157 auto cancelId = EventMarker(std::move(onCancel));
158 datePicker->SetDialogCancelEvent(cancelId);
159 auto changeId = EventMarker(std::move(onChange));
160 datePicker->SetDialogChangeEvent(changeId);
161 datePicker->SetDialogName(name);
162 datePicker->OpenDialog(properties);
163 }
164 } // namespace OHOS::Ace::Framework
165