1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_select_ffi.h"
17 
18 #include <vector>
19 
20 #include "cj_lambda.h"
21 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
22 #include "bridge/common/utils/utils.h"
23 #include "bridge/declarative_frontend/view_stack_processor.h"
24 #include "core/components/chart/chart_component.h"
25 #include "core/components_ng/pattern/select/select_model_ng.h"
26 
27 using namespace OHOS::Ace;
28 using namespace OHOS::Ace::Framework;
29 
30 extern "C" {
FFICJCreateVectorNativeSelectOption(int64_t size)31 VectorNativeSelectOptionHandle FFICJCreateVectorNativeSelectOption(int64_t size)
32 {
33     LOGI("Create NativeSelectOption Vector");
34     return new std::vector<NativeSelectOption>(size);
35 }
36 
FFICJVectorNativeSelectOptionSetElement(VectorNativeSelectOptionHandle vec,int64_t index,NativeSelectOption selectOption)37 void FFICJVectorNativeSelectOptionSetElement(
38     VectorNativeSelectOptionHandle vec, int64_t index, NativeSelectOption selectOption)
39 {
40     LOGI("NativeSelectOption Vector Set Element");
41     auto actualVec = reinterpret_cast<std::vector<NativeSelectOption>*>(vec);
42     (*actualVec)[index] = selectOption;
43     LOGI("NativeSelectOption Vector Set Element Success");
44 }
45 
FFICJVectorNativeSelectOptionDelete(VectorNativeSelectOptionHandle vec)46 void FFICJVectorNativeSelectOptionDelete(VectorNativeSelectOptionHandle vec)
47 {
48     auto actualVec = reinterpret_cast<std::vector<NativeSelectOption>*>(vec);
49     delete actualVec;
50 }
51 
FfiOHOSAceFrameworkSelectCreate(VectorStringPtr vecContent)52 void FfiOHOSAceFrameworkSelectCreate(VectorStringPtr vecContent)
53 {
54     auto nativeSelectOptionVec = *reinterpret_cast<std::vector<NativeSelectOption>*>(vecContent);
55     std::vector<SelectParam> params(nativeSelectOptionVec.size());
56     for (size_t i = 0; i < nativeSelectOptionVec.size(); i++) {
57         params[i] = { nativeSelectOptionVec[i].value, nativeSelectOptionVec[i].icon };
58     }
59     SelectModel::GetInstance()->Create(params);
60 }
61 
FfiOHOSAceFrameworkSelectSetSelected(int32_t value)62 void FfiOHOSAceFrameworkSelectSetSelected(int32_t value)
63 {
64     SelectModel::GetInstance()->SetSelected(value);
65 }
66 
FfiOHOSAceFrameworkSelectSetValue(const char * value)67 void FfiOHOSAceFrameworkSelectSetValue(const char* value)
68 {
69     SelectModel::GetInstance()->SetValue(value);
70 }
71 
FfiOHOSAceFrameworkSelectSetFont(int32_t style,const char * weight,double size,int32_t sizeUnit,const char * family)72 void FfiOHOSAceFrameworkSelectSetFont(
73     int32_t style, const char* weight, double size, int32_t sizeUnit, const char* family)
74 {
75     SelectModel::GetInstance()->SetFontSize(Dimension(size, static_cast<DimensionUnit>(sizeUnit)));
76     SelectModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(weight));
77     SelectModel::GetInstance()->SetFontFamily(ConvertStrToFontFamilies(family));
78     SelectModel::GetInstance()->SetItalicFontStyle(static_cast<FontStyle>(style));
79 }
80 
FfiOHOSAceFrameworkSelectSetFontColor(uint32_t color)81 void FfiOHOSAceFrameworkSelectSetFontColor(uint32_t color)
82 {
83     SelectModel::GetInstance()->SetFontColor(Color(color));
84 }
85 
FfiOHOSAceFrameworkSelectSetSelectedOptionBgColor(uint32_t color)86 void FfiOHOSAceFrameworkSelectSetSelectedOptionBgColor(uint32_t color)
87 {
88     SelectModel::GetInstance()->SetSelectedOptionBgColor(Color(color));
89 }
90 
FfiOHOSAceFrameworkSelectSetSelectedOptionFont(int32_t style,const char * weight,double size,int32_t sizeUnit,const char * family)91 void FfiOHOSAceFrameworkSelectSetSelectedOptionFont(
92     int32_t style, const char* weight, double size, int32_t sizeUnit, const char* family)
93 {
94     SelectModel::GetInstance()->SetSelectedOptionFontSize(Dimension(size, static_cast<DimensionUnit>(sizeUnit)));
95     SelectModel::GetInstance()->SetSelectedOptionFontWeight(ConvertStrToFontWeight(weight));
96     SelectModel::GetInstance()->SetSelectedOptionFontFamily(ConvertStrToFontFamilies(family));
97     SelectModel::GetInstance()->SetSelectedOptionItalicFontStyle(static_cast<FontStyle>(style));
98 }
99 
FfiOHOSAceFrameworkSelectSetSelectedOptionFontColor(uint32_t color)100 void FfiOHOSAceFrameworkSelectSetSelectedOptionFontColor(uint32_t color)
101 {
102     SelectModel::GetInstance()->SetSelectedOptionFontColor(Color(color));
103 }
104 
FfiOHOSAceFrameworkSelectSetOptionBgColor(uint32_t color)105 void FfiOHOSAceFrameworkSelectSetOptionBgColor(uint32_t color)
106 {
107     SelectModel::GetInstance()->SetOptionBgColor(Color(color));
108 }
109 
FfiOHOSAceFrameworkSelectSetOptionFont(int32_t style,const char * weight,double size,int32_t sizeUnit,const char * family)110 void FfiOHOSAceFrameworkSelectSetOptionFont(
111     int32_t style, const char* weight, double size, int32_t sizeUnit, const char* family)
112 {
113     SelectModel::GetInstance()->SetOptionFontSize(Dimension(size, static_cast<DimensionUnit>(sizeUnit)));
114     SelectModel::GetInstance()->SetOptionFontWeight(ConvertStrToFontWeight(weight));
115     SelectModel::GetInstance()->SetOptionFontFamily(ConvertStrToFontFamilies(family));
116     SelectModel::GetInstance()->SetOptionItalicFontStyle(static_cast<FontStyle>(style));
117 }
118 
FfiOHOSAceFrameworkSelectSetOptionFontColor(uint32_t color)119 void FfiOHOSAceFrameworkSelectSetOptionFontColor(uint32_t color)
120 {
121     SelectModel::GetInstance()->SetOptionFontColor(Color(color));
122 }
123 
FfiOHOSAceFrameworkSelectSetSpace(double width,int32_t widthUnit)124 void FfiOHOSAceFrameworkSelectSetSpace(double width, int32_t widthUnit)
125 {
126     Dimension dimStrokeWidth(width, static_cast<DimensionUnit>(widthUnit));
127     SelectModel::GetInstance()->SetSpace(dimStrokeWidth);
128 }
129 
FfiOHOSAceFrameworkSelectSetArrowPosition(int32_t value)130 void FfiOHOSAceFrameworkSelectSetArrowPosition(int32_t value)
131 {
132     if (static_cast<ArrowPosition>(value) != ArrowPosition::START &&
133         static_cast<ArrowPosition>(value) != ArrowPosition::END) {
134         value = 0;
135     }
136     SelectModel::GetInstance()->SetArrowPosition(static_cast<ArrowPosition>(value));
137 }
138 
FfiOHOSAceFrameworkSelectSetMenuAlign(int32_t value,double dx,int32_t dxUnit,double dy,int32_t dyUnit)139 void FfiOHOSAceFrameworkSelectSetMenuAlign(
140     int32_t value, double dx, int32_t dxUnit, double dy, int32_t dyUnit)
141 {
142     Dimension dimensionX(dx, static_cast<DimensionUnit>(dxUnit));
143     Dimension dimensionY(dy, static_cast<DimensionUnit>(dyUnit));
144 
145     MenuAlign menuAlignObj;
146     menuAlignObj.alignType = static_cast<MenuAlignType>(value);
147     menuAlignObj.offset = DimensionOffset(dimensionX, dimensionY);
148     SelectModel::GetInstance()->SetMenuAlign(menuAlignObj);
149 }
150 
FfiOHOSAceFrameworkSelectSetOptionWidth(double width,int32_t widthUnit)151 void FfiOHOSAceFrameworkSelectSetOptionWidth(double width, int32_t widthUnit)
152 {
153     SelectModel::GetInstance()->SetHasOptionWidth(true);
154     Dimension dimStrokeWidth(width, static_cast<DimensionUnit>(widthUnit));
155     SelectModel::GetInstance()->SetOptionWidth(dimStrokeWidth);
156 }
157 
FfiOHOSAceFrameworkSelectSetOptionWidthWithMode(const char * value)158 void FfiOHOSAceFrameworkSelectSetOptionWidthWithMode(const char* value)
159 {
160     SelectModel::GetInstance()->SetHasOptionWidth(true);
161     std::string modeFlag(value);
162     if (modeFlag.compare("fit_content") == 0) {
163         SelectModel::GetInstance()->SetOptionWidthFitTrigger(false);
164     } else if (modeFlag.compare("fit_trigger") == 0) {
165         SelectModel::GetInstance()->SetOptionWidthFitTrigger(true);
166     } else {
167         LOGE("OptionWidth is null or undefined");
168         SelectModel::GetInstance()->SetHasOptionWidth(false);
169         CalcDimension dimension;
170         SelectModel::GetInstance()->SetOptionWidth(dimension);
171     }
172 }
173 
FfiOHOSAceFrameworkSelectSetOptionHeight(double height,int32_t heightUnit)174 void FfiOHOSAceFrameworkSelectSetOptionHeight(double height, int32_t heightUnit)
175 {
176     Dimension dimStrokeWidth(height, static_cast<DimensionUnit>(heightUnit));
177     SelectModel::GetInstance()->SetOptionHeight(dimStrokeWidth);
178 }
179 
FfiOHOSAceFrameworkSelectSetMenuBackgroundColor(uint32_t color)180 void FfiOHOSAceFrameworkSelectSetMenuBackgroundColor(uint32_t color)
181 {
182     SelectModel::GetInstance()->SetMenuBackgroundColor(Color(color));
183 }
184 
FfiOHOSAceFrameworkSelectSetMenuBackgroundBlurStyle(int32_t value)185 void FfiOHOSAceFrameworkSelectSetMenuBackgroundBlurStyle(int32_t value)
186 {
187     BlurStyleOption styleOption;
188     if (value >= static_cast<int>(BlurStyle::NO_MATERIAL) &&
189         value <= static_cast<int>(BlurStyle::COMPONENT_ULTRA_THICK)) {
190         styleOption.blurStyle = static_cast<BlurStyle>(value);
191         SelectModel::GetInstance()->SetMenuBackgroundBlurStyle(styleOption);
192     }
193 }
194 
FfiOHOSAceFrameworkSelectOnSelect(void (* callback)(int32_t index,const char * value))195 void FfiOHOSAceFrameworkSelectOnSelect(void (*callback)(int32_t index, const char* value))
196 {
197     auto onSelect = [lambda = CJLambda::Create(callback)](int32_t index,
198         const std::string& value) -> void { lambda(index, value.c_str()); };
199     SelectModel::GetInstance()->SetOnSelect(std::move(onSelect));
200 }
201 }
202