• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "frameworks/bridge/declarative_frontend/jsview/js_marquee.h"
17 #include <limits>
18 #include <optional>
19 #include <string>
20 
21 #include "base/geometry/dimension.h"
22 #include "base/log/ace_scoring_log.h"
23 #include "base/utils/utils.h"
24 #include "bridge/declarative_frontend/engine/functions/js_function.h"
25 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
26 #include "bridge/declarative_frontend/jsview/models/marquee_model_impl.h"
27 #include "core/components/text/text_theme.h"
28 #include "core/components_ng/base/view_stack_processor.h"
29 #include "core/components_ng/pattern/marquee/marquee_model.h"
30 #include "core/components_ng/pattern/marquee/marquee_model_ng.h"
31 
32 namespace OHOS::Ace {
33 
34 std::unique_ptr<MarqueeModel> MarqueeModel::instance_ = nullptr;
35 std::mutex MarqueeModel::mutex_;
GetInstance()36 MarqueeModel* MarqueeModel::GetInstance()
37 {
38     if (!instance_) {
39         std::lock_guard<std::mutex> lock(mutex_);
40         if (!instance_) {
41 #ifdef NG_BUILD
42             instance_.reset(new NG::MarqueeModelNG());
43 #else
44             if (Container::IsCurrentUseNewPipeline()) {
45                 instance_.reset(new NG::MarqueeModelNG());
46             } else {
47                 instance_.reset(new Framework::MarqueeModelImpl());
48             }
49 #endif
50         }
51     }
52     return instance_.get();
53 }
54 } // namespace OHOS::Ace
55 
56 namespace OHOS::Ace::Framework {
57 
Create(const JSCallbackInfo & info)58 void JSMarquee::Create(const JSCallbackInfo& info)
59 {
60     if (info.Length() < 1 || !info[0]->IsObject()) {
61         return;
62     }
63 
64     MarqueeModel::GetInstance()->Create();
65     auto paramObject = JSRef<JSObject>::Cast(info[0]);
66     auto src = paramObject->GetProperty("src");
67     std::optional<std::string> srcOpt;
68     if (src->IsString()) {
69         srcOpt = src->ToString();
70     }
71     MarqueeModel::GetInstance()->SetValue(srcOpt);
72 
73     auto getStart = paramObject->GetProperty("start");
74     std::optional<bool> startOpt = getStart->IsBoolean() ? getStart->ToBoolean() : false;
75     MarqueeModel::GetInstance()->SetPlayerStatus(startOpt);
76 
77     auto getStep = paramObject->GetProperty("step");
78     std::optional<double> stepOpt;
79     if (getStep->IsNumber()) {
80         auto step = getStep->ToNumber<double>();
81         if (GreatNotEqual(step, 0.0)) {
82             stepOpt = Dimension(step, DimensionUnit::VP).ConvertToPx();
83         }
84     }
85     MarqueeModel::GetInstance()->SetScrollAmount(stepOpt);
86 
87     auto getLoop = paramObject->GetProperty("loop");
88     std::optional<int32_t> loopOpt;
89     if (getLoop->IsNumber()) {
90         auto loopDouble = getLoop->ToNumber<double>();
91         int32_t loop = -1;
92         if (GreatNotEqual(loopDouble, 0.0)) {
93             loop = static_cast<int32_t>(loopDouble);
94             if (loop == std::numeric_limits<int32_t>::max() || loop < 0) {
95                 loop = -1;
96             }
97         }
98         loopOpt = loop;
99     }
100     MarqueeModel::GetInstance()->SetLoop(loopOpt);
101 
102     auto getFromStart = paramObject->GetProperty("fromStart");
103     bool fromStart = getFromStart->IsBoolean() ? getFromStart->ToBoolean() : true;
104     std::optional<MarqueeDirection> directionOpt;
105     if (fromStart) {
106         directionOpt = MarqueeDirection::LEFT;
107     } else {
108         directionOpt = MarqueeDirection::RIGHT;
109     }
110     MarqueeModel::GetInstance()->SetDirection(directionOpt);
111 }
112 
JSBind(BindingTarget globalObj)113 void JSMarquee::JSBind(BindingTarget globalObj)
114 {
115     JSClass<JSMarquee>::Declare("Marquee");
116     MethodOptions opt = MethodOptions::NONE;
117     JSClass<JSMarquee>::StaticMethod("create", &JSMarquee::Create, opt);
118     JSClass<JSMarquee>::StaticMethod("allowScale", &JSMarquee::SetAllowScale);
119     JSClass<JSMarquee>::StaticMethod("fontColor", &JSMarquee::SetTextColor);
120     JSClass<JSMarquee>::StaticMethod("fontSize", &JSMarquee::SetFontSize);
121     JSClass<JSMarquee>::StaticMethod("fontWeight", &JSMarquee::SetFontWeight);
122     JSClass<JSMarquee>::StaticMethod("fontFamily", &JSMarquee::SetFontFamily);
123     JSClass<JSMarquee>::StaticMethod("onStart", &JSMarquee::OnStart);
124     JSClass<JSMarquee>::StaticMethod("onBounce", &JSMarquee::OnBounce);
125     JSClass<JSMarquee>::StaticMethod("onFinish", &JSMarquee::OnFinish);
126     JSClass<JSMarquee>::StaticMethod("onClick", &JSInteractableView::JsOnClick);
127     JSClass<JSMarquee>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
128     JSClass<JSMarquee>::StaticMethod("onKeyEvent", &JSInteractableView::JsOnKey);
129     JSClass<JSMarquee>::StaticMethod("onDeleteEvent", &JSInteractableView::JsOnDelete);
130     JSClass<JSMarquee>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
131     JSClass<JSMarquee>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
132     JSClass<JSMarquee>::InheritAndBind<JSViewAbstract>(globalObj);
133 }
134 
SetTextColor(const JSCallbackInfo & info)135 void JSMarquee::SetTextColor(const JSCallbackInfo& info)
136 {
137     if (info.Length() < 1) {
138         return;
139     }
140     std::optional<Color> colorOpt;
141     Color color;
142     if (ParseJsColor(info[0], color)) {
143         colorOpt = color;
144     }
145     MarqueeModel::GetInstance()->SetTextColor(colorOpt);
146 }
147 
SetFontSize(const JSCallbackInfo & info)148 void JSMarquee::SetFontSize(const JSCallbackInfo& info)
149 {
150     if (info.Length() < 1) {
151         return;
152     }
153     std::optional<Dimension> fontSizeOpt;
154     CalcDimension fontSize;
155     if (ParseJsDimensionFp(info[0], fontSize)) {
156         if (!fontSize.IsNegative() && fontSize.Unit() != DimensionUnit::PERCENT) {
157             fontSizeOpt = fontSize;
158         }
159     }
160     MarqueeModel::GetInstance()->SetFontSize(fontSizeOpt);
161 }
162 
SetAllowScale(const JSCallbackInfo & info)163 void JSMarquee::SetAllowScale(const JSCallbackInfo& info)
164 {
165     if (info.Length() < 1) {
166         return;
167     }
168     std::optional<bool> allowScaleOpt;
169     if (info[0]->IsBoolean()) {
170         allowScaleOpt = info[0]->ToBoolean();
171     }
172     MarqueeModel::GetInstance()->SetAllowScale(allowScaleOpt);
173 }
174 
SetFontWeight(const std::string & value)175 void JSMarquee::SetFontWeight(const std::string& value)
176 {
177     std::optional<FontWeight> fontWeightOpt = ConvertStrToFontWeight(value);
178     MarqueeModel::GetInstance()->SetFontWeight(fontWeightOpt);
179 }
180 
SetFontFamily(const JSCallbackInfo & info)181 void JSMarquee::SetFontFamily(const JSCallbackInfo& info)
182 {
183     if (info.Length() < 1) {
184         return;
185     }
186     std::optional<std::vector<std::string>> fontFamiliesOpt;
187     std::vector<std::string> fontFamilies;
188     if (ParseJsFontFamilies(info[0], fontFamilies)) {
189         fontFamiliesOpt = fontFamilies;
190     }
191     MarqueeModel::GetInstance()->SetFontFamily(fontFamiliesOpt);
192 }
193 
OnStart(const JSCallbackInfo & info)194 void JSMarquee::OnStart(const JSCallbackInfo& info)
195 {
196     if (!info[0]->IsFunction()) {
197         return;
198     }
199 
200     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
201     WeakPtr<NG::FrameNode> targetNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
202     auto onChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode]() {
203         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
204         ACE_SCORING_EVENT("Marquee.onStart");
205         PipelineContext::SetCallBackNode(node);
206         func->ExecuteJS();
207     };
208     MarqueeModel::GetInstance()->SetOnStart(std::move(onChange));
209 }
210 
OnBounce(const JSCallbackInfo & info)211 void JSMarquee::OnBounce(const JSCallbackInfo& info)
212 {
213     if (!info[0]->IsFunction()) {
214         return;
215     }
216 
217     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
218     WeakPtr<NG::FrameNode> targetNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
219     auto onChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode]() {
220         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
221         ACE_SCORING_EVENT("Marquee.onBounce");
222         PipelineContext::SetCallBackNode(node);
223         func->ExecuteJS();
224     };
225     MarqueeModel::GetInstance()->SetOnBounce(std::move(onChange));
226 }
227 
OnFinish(const JSCallbackInfo & info)228 void JSMarquee::OnFinish(const JSCallbackInfo& info)
229 {
230     if (!info[0]->IsFunction()) {
231         return;
232     }
233 
234     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
235     WeakPtr<NG::FrameNode> targetNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode();
236     auto onChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode]() {
237         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
238         ACE_SCORING_EVENT("Marquee.onFinish");
239         PipelineContext::SetCallBackNode(node);
240         func->ExecuteJS();
241     };
242     MarqueeModel::GetInstance()->SetOnFinish(std::move(onChange));
243 }
244 
245 } // namespace OHOS::Ace::Framework
246