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