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 #include "core/interfaces/native/node/marquee_modifier.h"
16 
17 #include "bridge/common/utils/utils.h"
18 #include "core/components/common/layout/constants.h"
19 #include "core/components/common/properties/text_style.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/base/view_abstract.h"
22 #include "core/components_ng/pattern/marquee/marquee_model_ng.h"
23 #include "core/pipeline/base/element_register.h"
24 
25 namespace OHOS::Ace::NG {
26 constexpr bool DEFAULT_ALLOW_SCALE = true;
27 constexpr Ace::FontWeight DEFAULT_FONT_WEIGHT = Ace::FontWeight::NORMAL;
28 const std::string DEFAULT_FONT_FAMILY = "cursive";
29 
SetMarqueeFontSize(ArkUINodeHandle node,ArkUI_Float32 fontSize,int unit)30 void SetMarqueeFontSize(ArkUINodeHandle node, ArkUI_Float32 fontSize, int unit)
31 {
32     auto* frameNode = reinterpret_cast<FrameNode*>(node);
33     CHECK_NULL_VOID(frameNode);
34     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
35 
36     if (fontSize < 0 || unitEnum < OHOS::Ace::DimensionUnit::PX || unitEnum > OHOS::Ace::DimensionUnit::CALC ||
37         unitEnum == OHOS::Ace::DimensionUnit::PERCENT) {
38         auto pipelineContext = PipelineBase::GetCurrentContext();
39         CHECK_NULL_VOID(pipelineContext);
40         auto theme = pipelineContext->GetTheme<TextTheme>();
41         CHECK_NULL_VOID(theme);
42         CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
43         MarqueeModelNG::SetFontSize(frameNode, fontSize);
44     } else {
45         MarqueeModelNG::SetFontSize(frameNode, Dimension(fontSize, static_cast<OHOS::Ace::DimensionUnit>(unit)));
46     }
47 }
48 
ResetMarqueeFontSize(ArkUINodeHandle node)49 void ResetMarqueeFontSize(ArkUINodeHandle node)
50 {
51     auto* frameNode = reinterpret_cast<FrameNode*>(node);
52     CHECK_NULL_VOID(frameNode);
53     auto pipelineContext = PipelineBase::GetCurrentContext();
54     CHECK_NULL_VOID(pipelineContext);
55     auto theme = pipelineContext->GetTheme<TextTheme>();
56     CHECK_NULL_VOID(theme);
57     CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
58     MarqueeModelNG::SetFontSize(frameNode, fontSize);
59 }
60 
SetMarqueeFontColor(ArkUINodeHandle node,uint32_t color)61 void SetMarqueeFontColor(ArkUINodeHandle node, uint32_t color)
62 {
63     auto* frameNode = reinterpret_cast<FrameNode*>(node);
64     CHECK_NULL_VOID(frameNode);
65     MarqueeModelNG::SetTextColor(frameNode, Color(color));
66 }
ResetMarqueeFontColor(ArkUINodeHandle node)67 void ResetMarqueeFontColor(ArkUINodeHandle node)
68 {
69     auto* frameNode = reinterpret_cast<FrameNode*>(node);
70     CHECK_NULL_VOID(frameNode);
71     std::optional<Color> colorOpt;
72     MarqueeModelNG::SetTextColor(frameNode, colorOpt);
73 }
SetMarqueeAllowScale(ArkUINodeHandle node,ArkUI_Bool allowScale)74 void SetMarqueeAllowScale(ArkUINodeHandle node, ArkUI_Bool allowScale)
75 {
76     auto* frameNode = reinterpret_cast<FrameNode*>(node);
77     CHECK_NULL_VOID(frameNode);
78     MarqueeModelNG::SetAllowScale(frameNode, allowScale);
79 }
80 
ResetMarqueeAllowScale(ArkUINodeHandle node)81 void ResetMarqueeAllowScale(ArkUINodeHandle node)
82 {
83     auto* frameNode = reinterpret_cast<FrameNode*>(node);
84     CHECK_NULL_VOID(frameNode);
85     MarqueeModelNG::SetAllowScale(frameNode, DEFAULT_ALLOW_SCALE);
86 }
87 
SetMarqueeFontWeight(ArkUINodeHandle node,const char * fontWeight)88 void SetMarqueeFontWeight(ArkUINodeHandle node, const char* fontWeight)
89 {
90     auto* frameNode = reinterpret_cast<FrameNode*>(node);
91     CHECK_NULL_VOID(frameNode);
92     MarqueeModelNG::SetFontWeight(frameNode, Framework::ConvertStrToFontWeight(fontWeight));
93 }
94 
ResetMarqueeFontWeight(ArkUINodeHandle node)95 void ResetMarqueeFontWeight(ArkUINodeHandle node)
96 {
97     auto* frameNode = reinterpret_cast<FrameNode*>(node);
98     CHECK_NULL_VOID(frameNode);
99     MarqueeModelNG::SetFontWeight(frameNode, DEFAULT_FONT_WEIGHT);
100 }
101 
SetMarqueeFontFamily(ArkUINodeHandle node,const char * fontFamily)102 void SetMarqueeFontFamily(ArkUINodeHandle node, const char* fontFamily)
103 {
104     auto* frameNode = reinterpret_cast<FrameNode*>(node);
105     CHECK_NULL_VOID(frameNode);
106     std::string familiesStr = fontFamily;
107     std::vector<std::string> fontFamilyResult = Framework::ConvertStrToFontFamilies(familiesStr);
108     MarqueeModelNG::SetFontFamily(frameNode, fontFamilyResult);
109 }
110 
ResetMarqueeFontFamily(ArkUINodeHandle node)111 void ResetMarqueeFontFamily(ArkUINodeHandle node)
112 {
113     auto* frameNode = reinterpret_cast<FrameNode*>(node);
114     CHECK_NULL_VOID(frameNode);
115     std::string familiesStr = DEFAULT_FONT_FAMILY;
116     std::vector<std::string> fontFamilyResult = Framework::ConvertStrToFontFamilies(familiesStr);
117     MarqueeModelNG::SetFontFamily(frameNode, fontFamilyResult);
118 }
119 
SetMarqueeUpdateStrategy(ArkUINodeHandle node,ArkUI_Uint32 value)120 void SetMarqueeUpdateStrategy(ArkUINodeHandle node, ArkUI_Uint32 value)
121 {
122     auto* frameNode = reinterpret_cast<FrameNode*>(node);
123     CHECK_NULL_VOID(frameNode);
124     MarqueeModelNG::SetMarqueeUpdateStrategy(frameNode, static_cast<OHOS::Ace::MarqueeUpdateStrategy>(value));
125 }
126 
ResetMarqueeUpdateStrategy(ArkUINodeHandle node)127 void ResetMarqueeUpdateStrategy(ArkUINodeHandle node)
128 {
129     auto* frameNode = reinterpret_cast<FrameNode*>(node);
130     CHECK_NULL_VOID(frameNode);
131     MarqueeModelNG::SetMarqueeUpdateStrategy(frameNode, OHOS::Ace::MarqueeUpdateStrategy::DEFAULT);
132 }
133 
SetMarqueeOnStart(ArkUINodeHandle node,void * callback)134 void SetMarqueeOnStart(ArkUINodeHandle node, void* callback)
135 {
136     auto* frameNode = reinterpret_cast<FrameNode*>(node);
137     CHECK_NULL_VOID(frameNode);
138     if (callback) {
139         auto onStart = reinterpret_cast<std::function<void()>*>(callback);
140         MarqueeModelNG::SetOnStart(frameNode, std::move(*onStart));
141     } else {
142         MarqueeModelNG::SetOnStart(frameNode, nullptr);
143     }
144 }
145 
ResetMarqueeOnStart(ArkUINodeHandle node)146 void ResetMarqueeOnStart(ArkUINodeHandle node)
147 {
148     auto* frameNode = reinterpret_cast<FrameNode*>(node);
149     CHECK_NULL_VOID(frameNode);
150     MarqueeModelNG::SetOnStart(frameNode, nullptr);
151 }
152 
SetMarqueeOnBounce(ArkUINodeHandle node,void * callback)153 void SetMarqueeOnBounce(ArkUINodeHandle node, void* callback)
154 {
155     auto* frameNode = reinterpret_cast<FrameNode*>(node);
156     CHECK_NULL_VOID(frameNode);
157     if (callback) {
158         auto onBounce = reinterpret_cast<std::function<void()>*>(callback);
159         MarqueeModelNG::SetOnBounce(frameNode, std::move(*onBounce));
160     } else {
161         MarqueeModelNG::SetOnBounce(frameNode, nullptr);
162     }
163 }
164 
ResetMarqueeOnBounce(ArkUINodeHandle node)165 void ResetMarqueeOnBounce(ArkUINodeHandle node)
166 {
167     auto* frameNode = reinterpret_cast<FrameNode*>(node);
168     CHECK_NULL_VOID(frameNode);
169     MarqueeModelNG::SetOnBounce(frameNode, nullptr);
170 }
171 
SetMarqueeOnFinish(ArkUINodeHandle node,void * callback)172 void SetMarqueeOnFinish(ArkUINodeHandle node, void* callback)
173 {
174     auto* frameNode = reinterpret_cast<FrameNode*>(node);
175     CHECK_NULL_VOID(frameNode);
176     if (callback) {
177         auto onFinish = reinterpret_cast<std::function<void()>*>(callback);
178         MarqueeModelNG::SetOnFinish(frameNode, std::move(*onFinish));
179     } else {
180         MarqueeModelNG::SetOnFinish(frameNode, nullptr);
181     }
182 }
183 
ResetMarqueeOnFinish(ArkUINodeHandle node)184 void ResetMarqueeOnFinish(ArkUINodeHandle node)
185 {
186     auto* frameNode = reinterpret_cast<FrameNode*>(node);
187     CHECK_NULL_VOID(frameNode);
188     MarqueeModelNG::SetOnFinish(frameNode, nullptr);
189 }
190 
SetMarqueeSrcValue(ArkUINodeHandle node,ArkUI_CharPtr src)191 void SetMarqueeSrcValue(ArkUINodeHandle node, ArkUI_CharPtr src)
192 {
193     auto* frameNode = reinterpret_cast<FrameNode*>(node);
194     CHECK_NULL_VOID(frameNode);
195     CHECK_NULL_VOID(src);
196     MarqueeModelNG::SetValue(frameNode, std::optional<std::string>(src));
197 }
198 
ResetMarqueeSrcValue(ArkUINodeHandle node)199 void ResetMarqueeSrcValue(ArkUINodeHandle node)
200 {
201     auto* frameNode = reinterpret_cast<FrameNode*>(node);
202     CHECK_NULL_VOID(frameNode);
203     MarqueeModelNG::ResetValue(frameNode);
204 }
205 
SetMarqueePlayerStatus(ArkUINodeHandle node,ArkUI_Bool start)206 void SetMarqueePlayerStatus(ArkUINodeHandle node, ArkUI_Bool start)
207 {
208     auto* frameNode = reinterpret_cast<FrameNode*>(node);
209     CHECK_NULL_VOID(frameNode);
210     MarqueeModelNG::SetPlayerStatus(frameNode, std::optional<bool>(start));
211 }
212 
ResetMarqueePlayerStatus(ArkUINodeHandle node)213 void ResetMarqueePlayerStatus(ArkUINodeHandle node)
214 {
215     auto* frameNode = reinterpret_cast<FrameNode*>(node);
216     CHECK_NULL_VOID(frameNode);
217     MarqueeModelNG::ResetPlayerStatus(frameNode);
218 }
219 
SetMarqueeScrollAmount(ArkUINodeHandle node,ArkUI_Float64 step)220 void SetMarqueeScrollAmount(ArkUINodeHandle node, ArkUI_Float64 step)
221 {
222     auto* frameNode = reinterpret_cast<FrameNode*>(node);
223     CHECK_NULL_VOID(frameNode);
224     MarqueeModelNG::SetScrollAmount(frameNode, std::optional<double>(step));
225 }
226 
ResetMarqueeScrollAmount(ArkUINodeHandle node)227 void ResetMarqueeScrollAmount(ArkUINodeHandle node)
228 {
229     auto* frameNode = reinterpret_cast<FrameNode*>(node);
230     CHECK_NULL_VOID(frameNode);
231     MarqueeModelNG::ResetScrollAmount(frameNode);
232 }
233 
SetMarqueeLoop(ArkUINodeHandle node,ArkUI_Int32 loop)234 void SetMarqueeLoop(ArkUINodeHandle node, ArkUI_Int32 loop)
235 {
236     auto* frameNode = reinterpret_cast<FrameNode*>(node);
237     CHECK_NULL_VOID(frameNode);
238     MarqueeModelNG::SetLoop(frameNode, std::optional<int32_t>(loop));
239 }
240 
ResetMarqueeLoop(ArkUINodeHandle node)241 void ResetMarqueeLoop(ArkUINodeHandle node)
242 {
243     auto* frameNode = reinterpret_cast<FrameNode*>(node);
244     CHECK_NULL_VOID(frameNode);
245     MarqueeModelNG::ResetLoop(frameNode);
246 }
247 
SetMarqueeDirection(ArkUINodeHandle node,ArkUI_Int32 direction)248 void SetMarqueeDirection(ArkUINodeHandle node, ArkUI_Int32 direction)
249 {
250     auto* frameNode = reinterpret_cast<FrameNode*>(node);
251     CHECK_NULL_VOID(frameNode);
252     MarqueeModelNG::SetDirection(frameNode, std::optional<MarqueeDirection>(static_cast<MarqueeDirection>(direction)));
253 }
254 
ResetMarqueeDirection(ArkUINodeHandle node)255 void ResetMarqueeDirection(ArkUINodeHandle node)
256 {
257     auto* frameNode = reinterpret_cast<FrameNode*>(node);
258     CHECK_NULL_VOID(frameNode);
259     MarqueeModelNG::ResetDirection(frameNode);
260 }
261 namespace NodeModifier {
GetMarqueeModifier()262 const ArkUIMarqueeModifier* GetMarqueeModifier()
263 {
264     static const ArkUIMarqueeModifier modifier = {
265         SetMarqueeFontSize, ResetMarqueeFontSize, SetMarqueeFontColor,
266         ResetMarqueeFontColor, SetMarqueeAllowScale, ResetMarqueeAllowScale, SetMarqueeFontWeight,
267         ResetMarqueeFontWeight, SetMarqueeFontFamily, ResetMarqueeFontFamily, SetMarqueeUpdateStrategy,
268         ResetMarqueeUpdateStrategy, SetMarqueeOnStart, ResetMarqueeOnStart,
269         SetMarqueeOnBounce, ResetMarqueeOnBounce, SetMarqueeOnFinish, ResetMarqueeOnFinish, SetMarqueeSrcValue,
270         ResetMarqueeSrcValue, SetMarqueePlayerStatus, ResetMarqueePlayerStatus, SetMarqueeScrollAmount,
271         ResetMarqueeScrollAmount, SetMarqueeLoop, ResetMarqueeLoop, SetMarqueeDirection, ResetMarqueeDirection };
272     return &modifier;
273 }
274 
GetCJUIMarqueeModifier()275 const CJUIMarqueeModifier* GetCJUIMarqueeModifier()
276 {
277     static const CJUIMarqueeModifier modifier = {
278         SetMarqueeFontSize, ResetMarqueeFontSize, SetMarqueeFontColor,
279         ResetMarqueeFontColor, SetMarqueeAllowScale, ResetMarqueeAllowScale, SetMarqueeFontWeight,
280         ResetMarqueeFontWeight, SetMarqueeFontFamily, ResetMarqueeFontFamily, SetMarqueeUpdateStrategy,
281         ResetMarqueeUpdateStrategy, SetMarqueeOnStart, ResetMarqueeOnStart,
282         SetMarqueeOnBounce, ResetMarqueeOnBounce, SetMarqueeOnFinish, ResetMarqueeOnFinish };
283     return &modifier;
284 }
285 }
286 } // namespace OHOS::Ace::NG
287