• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "frameworks/bridge/declarative_frontend/jsview/js_symbol.h"
16 
17 #include "core/components_ng/pattern/symbol/constants.h"
18 #include "frameworks/bridge/declarative_frontend/engine/bindings.h"
19 #include "frameworks/bridge/declarative_frontend/engine/js_ref_ptr.h"
20 #include "frameworks/bridge/declarative_frontend/jsview/js_interactable_view.h"
21 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
22 #include "frameworks/core/components_ng/pattern/symbol/symbol_model.h"
23 #include "frameworks/core/components_ng/pattern/symbol/symbol_model_ng.h"
24 
25 namespace OHOS::Ace {
26 
27 std::unique_ptr<SymbolModel> SymbolModel::instance_ = nullptr;
28 std::mutex SymbolModel::mutex_;
29 
GetInstance()30 SymbolModel* SymbolModel::GetInstance()
31 {
32     if (!instance_) {
33         std::lock_guard<std::mutex> lock(mutex_);
34         if (!instance_) {
35             instance_.reset(new NG::SymbolModelNG());
36         }
37     }
38     return instance_.get();
39 }
40 
41 } // namespace OHOS::Ace
42 
43 namespace OHOS::Ace::Framework {
44 
45 const std::map<std::string, Ace::SymbolEffectType> SYMBOL_EFFECT_TYPE_MAP = {
46     { "ScaleSymbolEffect", SymbolEffectType::SCALE },
47     { "HierarchicalSymbolEffect", SymbolEffectType::HIERARCHICAL },
48     { "AppearSymbolEffect", SymbolEffectType::APPEAR },
49     { "DisappearSymbolEffect", SymbolEffectType::DISAPPEAR },
50     { "BounceSymbolEffect", SymbolEffectType::BOUNCE },
51     { "ReplaceSymbolEffect", SymbolEffectType::REPLACE },
52     { "PulseSymbolEffect", SymbolEffectType::PULSE },
53 };
54 
JSBind(BindingTarget globalObj)55 void JSSymbol::JSBind(BindingTarget globalObj)
56 {
57     JSClass<JSSymbol>::Declare("SymbolGlyph");
58 
59     MethodOptions opt = MethodOptions::NONE;
60     JSClass<JSSymbol>::StaticMethod("create", &JSSymbol::Create, opt);
61     JSClass<JSSymbol>::StaticMethod("fontWeight", &JSSymbol::SetFontWeight, opt);
62     JSClass<JSSymbol>::StaticMethod("fontSize", &JSSymbol::SetFontSize, opt);
63     JSClass<JSSymbol>::StaticMethod("renderingStrategy", &JSSymbol::SetSymbolRenderingStrategy, opt);
64     JSClass<JSSymbol>::StaticMethod("fontColor", &JSSymbol::SetFontColor, opt);
65     JSClass<JSSymbol>::StaticMethod("effectStrategy", &JSSymbol::SetSymbolEffect, opt);
66     JSClass<JSSymbol>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
67     JSClass<JSSymbol>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
68     JSClass<JSSymbol>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
69     JSClass<JSSymbol>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
70     JSClass<JSSymbol>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
71     JSClass<JSSymbol>::StaticMethod("clip", &JSSymbol::JsClip);
72     JSClass<JSSymbol>::StaticMethod("symbolEffect", &JSSymbol::SetSymbolEffectOptions, opt);
73     JSClass<JSSymbol>::InheritAndBind<JSViewAbstract>(globalObj);
74 }
75 
Create(const JSCallbackInfo & info)76 void JSSymbol::Create(const JSCallbackInfo& info)
77 {
78     if (info[0]->IsUndefined()) {
79         SymbolModel::GetInstance()->Create(0);
80         return;
81     }
82     uint32_t symbolId;
83     RefPtr<ResourceObject> resourceObject;
84     ParseJsSymbolId(info[0], symbolId, resourceObject);
85     SymbolModel::GetInstance()->Create(symbolId);
86 }
87 
SetFontSize(const JSCallbackInfo & info)88 void JSSymbol::SetFontSize(const JSCallbackInfo& info)
89 {
90     if (info.Length() < 1) {
91         return;
92     }
93     auto theme = GetTheme<TextTheme>();
94     CHECK_NULL_VOID(theme);
95     CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
96     if (!ParseJsDimensionFpNG(info[0], fontSize, false)) {
97         fontSize = theme->GetTextStyle().GetFontSize();
98         SymbolModel::GetInstance()->SetFontSize(fontSize);
99         return;
100     }
101     if (fontSize.IsNegative()) {
102         fontSize = theme->GetTextStyle().GetFontSize();
103     }
104 
105     SymbolModel::GetInstance()->SetFontSize(fontSize);
106 }
107 
SetFontWeight(const std::string & value)108 void JSSymbol::SetFontWeight(const std::string& value)
109 {
110     SymbolModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(value));
111 }
112 
SetSymbolRenderingStrategy(const JSCallbackInfo & info)113 void JSSymbol::SetSymbolRenderingStrategy(const JSCallbackInfo& info)
114 {
115     uint32_t strategy = 0;
116     ParseJsInteger(info[0], strategy);
117     SymbolModel::GetInstance()->SetSymbolRenderingStrategy(strategy);
118 }
119 
SetFontColor(const JSCallbackInfo & info)120 void JSSymbol::SetFontColor(const JSCallbackInfo& info)
121 {
122     std::vector<Color> symbolColor;
123     if (!ParseJsSymbolColor(info[0], symbolColor)) {
124         return;
125     }
126     SymbolModel::GetInstance()->SetFontColor(symbolColor);
127 }
128 
SetSymbolEffect(const JSCallbackInfo & info)129 void JSSymbol::SetSymbolEffect(const JSCallbackInfo& info)
130 {
131     uint32_t strategy = 0;
132     ParseJsInteger(info[0], strategy);
133     SymbolModel::GetInstance()->SetSymbolEffect(strategy);
134 }
135 
JsClip(const JSCallbackInfo & info)136 void JSSymbol::JsClip(const JSCallbackInfo& info)
137 {
138     JSViewAbstract::JsClip(info);
139     if (info[0]->IsBoolean()) {
140         SymbolModel::GetInstance()->SetClipEdge();
141     }
142 }
143 
SetSymbolEffectOptions(const JSCallbackInfo & info)144 void JSSymbol::SetSymbolEffectOptions(const JSCallbackInfo& info)
145 {
146     if (info.Length() < 1 || !info[0]->IsObject()) {
147         return;
148     }
149 
150     auto symbolEffectObj = JSRef<JSObject>::Cast(info[0]);
151     NG::SymbolEffectOptions symbolEffectOptions;
152     parseSymbolEffect(symbolEffectObj, symbolEffectOptions);
153 
154     if (info.Length() > 1 && !info[1]->IsUndefined()) {
155         parseSymbolSwitch(info[1], symbolEffectOptions);
156     }
157 
158     SymbolModel::GetInstance()->SetSymbolEffectOptions(symbolEffectOptions);
159 }
160 
parseSymbolEffect(const JSRef<JSObject> symbolEffectObj,NG::SymbolEffectOptions & symbolEffectOptions)161 void JSSymbol::parseSymbolEffect(const JSRef<JSObject> symbolEffectObj, NG::SymbolEffectOptions& symbolEffectOptions)
162 {
163     auto typeParam = symbolEffectObj->GetProperty("type");
164     if (typeParam->IsString()) {
165         auto type = typeParam->ToString();
166         auto iter = SYMBOL_EFFECT_TYPE_MAP.find(type);
167         if (iter != SYMBOL_EFFECT_TYPE_MAP.end()) {
168             symbolEffectOptions.SetEffectType(iter->second);
169         }
170     }
171 
172     auto scopeTypeProperty = symbolEffectObj->GetProperty("scope");
173     if (scopeTypeProperty->IsNumber()) {
174         auto scopeTypeNum = scopeTypeProperty->ToNumber<uint32_t>();
175         if (scopeTypeNum >= static_cast<uint32_t>(ScopeType::LAYER) &&
176             scopeTypeNum <= static_cast<uint32_t>(ScopeType::WHOLE)) {
177             symbolEffectOptions.SetScopeType(static_cast<ScopeType>(scopeTypeNum));
178         }
179     }
180 
181     auto commonSubTypeProperty = symbolEffectObj->GetProperty("direction");
182     if (commonSubTypeProperty->IsNumber()) {
183         auto commonSubTypeNum = commonSubTypeProperty->ToNumber<uint32_t>();
184         if (commonSubTypeNum >= static_cast<uint32_t>(CommonSubType::DOWN) &&
185             commonSubTypeNum <= static_cast<uint32_t>(CommonSubType::UP)) {
186             symbolEffectOptions.SetCommonSubType(static_cast<CommonSubType>(commonSubTypeNum));
187         }
188     }
189 
190     auto fillStyleProperty = symbolEffectObj->GetProperty("fillStyle");
191     if (fillStyleProperty->IsNumber()) {
192         auto fillStyleNum = fillStyleProperty->ToNumber<uint32_t>();
193         if (fillStyleNum >= static_cast<uint32_t>(FillStyle::CUMULATIVE) &&
194             fillStyleNum <= static_cast<uint32_t>(FillStyle::ITERATIVE)) {
195             symbolEffectOptions.SetFillStyle(static_cast<FillStyle>(fillStyleNum));
196         }
197     }
198 }
199 
parseSymbolSwitch(const JSRef<JSVal> jsVal,NG::SymbolEffectOptions & symbolEffectOptions)200 void JSSymbol::parseSymbolSwitch(const JSRef<JSVal> jsVal, NG::SymbolEffectOptions& symbolEffectOptions)
201 {
202     if (jsVal->IsBoolean()) {
203         symbolEffectOptions.SetIsActive(jsVal->ToBoolean());
204     }
205 
206     if (jsVal->IsNumber()) {
207         int32_t triggerValue = -1;
208         ParseJsInteger(jsVal, triggerValue);
209         symbolEffectOptions.SetTriggerNum(triggerValue);
210     }
211 }
212 } // namespace OHOS::Ace::Framework