• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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