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_button_ffi.h"
17 
18 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
19 #include "bridge/common/utils/utils.h"
20 #include "core/components_ng/base/view_abstract_model.h"
21 #include "core/components_ng/pattern/button/button_model.h"
22 #include "core/gestures/click_recognizer.h"
23 
24 using namespace OHOS::Ace;
25 using namespace OHOS::Ace::Framework;
26 
27 namespace {
28 const std::vector<BorderStyle> BORDER_STYLES = { BorderStyle::SOLID, BorderStyle::DASHED, BorderStyle::DOTTED };
29 const std::vector<FontStyle> FONT_STYLES = { FontStyle::NORMAL, FontStyle::ITALIC };
30 const std::vector<ButtonType> BUTTON_TYPES = { ButtonType::NORMAL, ButtonType::CAPSULE, ButtonType::CIRCLE };
31 } // namespace
32 
33 extern "C" {
FfiOHOSAceFrameworkButtonCreateWithChild()34 void FfiOHOSAceFrameworkButtonCreateWithChild()
35 {
36     CreateWithPara params;
37     params.parseSuccess = false;
38     params.optionSetFirst = false;
39     ButtonModel::GetInstance()->CreateWithChild(params);
40     ViewAbstractModel::GetInstance()->SetHoverEffect(HoverEffectType::SCALE);
41 }
42 
FfiOHOSAceFrameworkButtonCreateWithLabel(const char * label)43 void FfiOHOSAceFrameworkButtonCreateWithLabel(const char* label)
44 {
45     CreateWithPara params;
46     LOGI("done create params");
47     params.label = label;
48     params.parseSuccess = true;
49     params.optionSetFirst = false;
50     LOGI("done set label");
51     auto model = ButtonModel::GetInstance();
52     if (!model) {
53         LOGE("ButtonModel::GetInstance returns null");
54         return;
55     }
56     LOGI("before create");
57     std::list<RefPtr<Component>> children;
58     model->CreateWithLabel(params, children);
59     model->Create(params, children);
60     LOGI("done create with child");
61     ViewAbstractModel::GetInstance()->SetHoverEffect(HoverEffectType::SCALE);
62     LOGI("done set hover effect");
63 }
64 
FfiOHOSAceFrameworkButtonSetFontSize(double fontSize,int32_t unit)65 void FfiOHOSAceFrameworkButtonSetFontSize(double fontSize, int32_t unit)
66 {
67     Dimension value(fontSize, static_cast<DimensionUnit>(unit));
68     ButtonModel::GetInstance()->SetFontSize(value);
69 }
70 
FfiOHOSAceFrameworkButtonSetFontWeight(const char * fontWeight)71 void FfiOHOSAceFrameworkButtonSetFontWeight(const char* fontWeight)
72 {
73     ButtonModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(fontWeight));
74 }
75 
FfiOHOSAceFrameworkButtonSetFontColor(uint32_t color)76 void FfiOHOSAceFrameworkButtonSetFontColor(uint32_t color)
77 {
78     ButtonModel::GetInstance()->SetFontColor(Color(color));
79 }
80 
FfiOHOSAceFrameworkButtonSetRadius(double radius,int32_t unit)81 void FfiOHOSAceFrameworkButtonSetRadius(double radius, int32_t unit)
82 {
83     Dimension value(radius, static_cast<DimensionUnit>(unit));
84     ButtonModel::GetInstance()->SetBorderRadius(value);
85 }
86 
FfiOHOSAceFrameworkButtonSetAllBorderRadius(CJBorderRadius value)87 void FfiOHOSAceFrameworkButtonSetAllBorderRadius(CJBorderRadius value)
88 {
89     CalcDimension topLeft(value.topLeft, static_cast<DimensionUnit>(value.topLeftUnit));
90     CalcDimension topRight(value.topRight, static_cast<DimensionUnit>(value.topRightUnit));
91     CalcDimension bottomLeft(value.bottomLeft, static_cast<DimensionUnit>(value.bottomLeftUnit));
92     CalcDimension bottomRight(value.bottomRight, static_cast<DimensionUnit>(value.bottomRightUnit));
93     ButtonModel::GetInstance()->SetBorderRadius(topLeft, topRight, bottomLeft, bottomRight);
94 }
95 
FfiOHOSAceFrameworkButtonSetBorder(CJBorder params)96 void FfiOHOSAceFrameworkButtonSetBorder(CJBorder params)
97 {
98     Dimension widthDime(params.width, static_cast<DimensionUnit>(params.widthUnit));
99     Dimension radiusDime(params.radius, static_cast<DimensionUnit>(params.radiusUnit));
100     if (!Utils::CheckParamsValid(params.style, BORDER_STYLES.size())) {
101         LOGE("invalid value for border style");
102         return;
103     }
104 
105     ViewAbstractModel::GetInstance()->SetBorderWidth(widthDime);
106     ViewAbstractModel::GetInstance()->SetBorderColor(Color(params.color));
107     ButtonModel::GetInstance()->SetBorderRadius(radiusDime);
108     ViewAbstractModel::GetInstance()->SetBorderStyle(BORDER_STYLES[params.style]);
109 }
110 
FfiOHOSAceFrameworkButtonSetBackgroundColor(uint32_t color)111 void FfiOHOSAceFrameworkButtonSetBackgroundColor(uint32_t color)
112 {
113     ViewAbstractModel::GetInstance()->SetBackgroundColor(Color(color));
114 }
115 
FfiOHOSAceFrameworkButtonSetHeight(double height,int32_t unit)116 void FfiOHOSAceFrameworkButtonSetHeight(double height, int32_t unit)
117 {
118     Dimension value(height, static_cast<DimensionUnit>(unit));
119     ViewAbstractModel::GetInstance()->SetHeight(value);
120 }
121 
FfiOHOSAceFrameworkButtonSetWidth(double width,int32_t unit)122 void FfiOHOSAceFrameworkButtonSetWidth(double width, int32_t unit)
123 {
124     Dimension value(width, static_cast<DimensionUnit>(unit));
125     ViewAbstractModel::GetInstance()->SetWidth(value);
126 }
127 
FfiOHOSAceFrameworkButtonSetFontStyle(int32_t fontStyle)128 void FfiOHOSAceFrameworkButtonSetFontStyle(int32_t fontStyle)
129 {
130     if (!Utils::CheckParamsValid(fontStyle, FONT_STYLES.size())) {
131         LOGE("invalid value for font style");
132         return;
133     }
134     ButtonModel::GetInstance()->SetFontStyle(FONT_STYLES[fontStyle]);
135 }
136 
FfiOHOSAceFrameworkButtonSetFontFamily(const char * fontFamily)137 void FfiOHOSAceFrameworkButtonSetFontFamily(const char* fontFamily)
138 {
139     std::vector<std::string> fontFamilies;
140     fontFamilies = ConvertStrToFontFamilies(fontFamily);
141     ButtonModel::GetInstance()->SetFontFamily(fontFamilies);
142 }
143 
FfiOHOSAceFrameworkButtonSetType(int32_t shape)144 void FfiOHOSAceFrameworkButtonSetType(int32_t shape)
145 {
146     if (!Utils::CheckParamsValid(shape, BUTTON_TYPES.size())) {
147         LOGE("invalid value for button type");
148         return;
149     }
150     ButtonModel::GetInstance()->SetType(static_cast<int>(BUTTON_TYPES[shape]));
151 }
152 
FfiOHOSAceFrameworkButtonSetPadding(double top,int32_t topUnit,double right,int32_t rightUnit,double bottom,int32_t bottomUnit,double left,int32_t leftUnit)153 void FfiOHOSAceFrameworkButtonSetPadding(double top, int32_t topUnit, double right, int32_t rightUnit, double bottom,
154     int32_t bottomUnit, double left, int32_t leftUnit)
155 {
156     Dimension topValue(top, static_cast<DimensionUnit>(topUnit));
157     Dimension rightValue(right, static_cast<DimensionUnit>(rightUnit));
158     Dimension bottomValue(bottom, static_cast<DimensionUnit>(bottomUnit));
159     Dimension leftValue(left, static_cast<DimensionUnit>(leftUnit));
160     ViewAbstractModel::GetInstance()->SetPaddings(topValue, rightValue, bottomValue, leftValue);
161 }
162 
FfiOHOSAceFrameworkButtonSetSize(double width,int32_t widthUnit,double height,int32_t heightUnit)163 void FfiOHOSAceFrameworkButtonSetSize(double width, int32_t widthUnit, double height, int32_t heightUnit)
164 {
165     FfiOHOSAceFrameworkViewAbstractSetSize(width, widthUnit, height, heightUnit);
166 }
167 
FfiOHOSAceFrameworkButtonSetStateEffect(bool stateEffect)168 void FfiOHOSAceFrameworkButtonSetStateEffect(bool stateEffect)
169 {
170     ButtonModel::GetInstance()->SetStateEffect(stateEffect);
171 }
172 }
173