• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_stepper_bridge.h"
16 
17 namespace OHOS::Ace::NG {
18 constexpr int32_t NUM_0 = 0;
19 constexpr int32_t NUM_1 = 1;
20 constexpr int32_t NUM_2 = 2;
SetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)21 ArkUINativeModuleValue StepperBridge::SetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
22 {
23     EcmaVM* vm = runtimeCallInfo->GetVM();
24     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
25     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
26     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
27     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
28     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
29     auto nodeModifiers = GetArkUINodeModifiers();
30     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
31     if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
32         nodeModifiers->getStepperModifier()->resetStepperOnFinish(nativeNode);
33         return panda::JSValueRef::Undefined(vm);
34     }
35     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
36     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
37     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
38     std::function<void()> OnFinish = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
39         panda::LocalScope pandaScope(vm);
40         panda::TryCatch trycatch(vm);
41         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
42         func->Call(vm, func.ToLocal(), nullptr, NUM_0);
43     };
44     nodeModifiers->getStepperModifier()->setStepperOnFinish(nativeNode, reinterpret_cast<void*>(&OnFinish));
45     return panda::JSValueRef::Undefined(vm);
46 }
ResetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)47 ArkUINativeModuleValue StepperBridge::ResetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
48 {
49     EcmaVM* vm = runtimeCallInfo->GetVM();
50     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
51     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
52     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
53     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
54     auto nodeModifiers = GetArkUINodeModifiers();
55     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
56     nodeModifiers->getStepperModifier()->resetStepperOnFinish(nativeNode);
57     return panda::JSValueRef::Undefined(vm);
58 }
SetOnSkip(ArkUIRuntimeCallInfo * runtimeCallInfo)59 ArkUINativeModuleValue StepperBridge::SetOnSkip(ArkUIRuntimeCallInfo* runtimeCallInfo)
60 {
61     EcmaVM* vm = runtimeCallInfo->GetVM();
62     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
63     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
64     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
65     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
66     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
67     auto nodeModifiers = GetArkUINodeModifiers();
68     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
69     if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
70         nodeModifiers->getStepperModifier()->resetStepperOnSkip(nativeNode);
71         return panda::JSValueRef::Undefined(vm);
72     }
73     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
74     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
75     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
76     std::function<void()> OnSkip = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
77         panda::LocalScope pandaScope(vm);
78         panda::TryCatch trycatch(vm);
79         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
80         func->Call(vm, func.ToLocal(), nullptr, NUM_0);
81     };
82     nodeModifiers->getStepperModifier()->setStepperOnSkip(nativeNode, reinterpret_cast<void*>(&OnSkip));
83     return panda::JSValueRef::Undefined(vm);
84 }
ResetOnSkip(ArkUIRuntimeCallInfo * runtimeCallInfo)85 ArkUINativeModuleValue StepperBridge::ResetOnSkip(ArkUIRuntimeCallInfo* runtimeCallInfo)
86 {
87     EcmaVM* vm = runtimeCallInfo->GetVM();
88     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
89     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
90     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
91     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
92     auto nodeModifiers = GetArkUINodeModifiers();
93     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
94     nodeModifiers->getStepperModifier()->resetStepperOnSkip(nativeNode);
95     return panda::JSValueRef::Undefined(vm);
96 }
97 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)98 ArkUINativeModuleValue StepperBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
99 {
100     EcmaVM* vm = runtimeCallInfo->GetVM();
101     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
102     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
103     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
104     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
105     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
106     auto nodeModifiers = GetArkUINodeModifiers();
107     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
108     if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
109         nodeModifiers->getStepperModifier()->resetStepperOnChange(nativeNode);
110         return panda::JSValueRef::Undefined(vm);
111     }
112     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
113     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
114     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
115     std::function<void(int32_t, int32_t)> OnChange = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
116                                                          int32_t prevIndex, int32_t index) {
117         panda::LocalScope pandaScope(vm);
118         panda::TryCatch trycatch(vm);
119         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
120 
121         panda::Local<panda::NumberRef> prevIndexParam = panda::NumberRef::New(vm, prevIndex);
122         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
123         panda::Local<panda::JSValueRef> params[NUM_2] = { prevIndexParam, indexParam };
124         func->Call(vm, func.ToLocal(), params, NUM_2);
125     };
126     nodeModifiers->getStepperModifier()->setStepperOnChange(nativeNode, reinterpret_cast<void*>(&OnChange));
127     return panda::JSValueRef::Undefined(vm);
128 }
129 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)130 ArkUINativeModuleValue StepperBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
131 {
132     EcmaVM* vm = runtimeCallInfo->GetVM();
133     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
134     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
135     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
136     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
137     auto nodeModifiers = GetArkUINodeModifiers();
138     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
139     nodeModifiers->getStepperModifier()->resetStepperOnChange(nativeNode);
140     return panda::JSValueRef::Undefined(vm);
141 }
142 
SetOnNext(ArkUIRuntimeCallInfo * runtimeCallInfo)143 ArkUINativeModuleValue StepperBridge::SetOnNext(ArkUIRuntimeCallInfo* runtimeCallInfo)
144 {
145     EcmaVM* vm = runtimeCallInfo->GetVM();
146     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
147     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
148     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
149     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
150     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
151     auto nodeModifiers = GetArkUINodeModifiers();
152     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
153     if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
154         nodeModifiers->getStepperModifier()->resetStepperOnNext(nativeNode);
155         return panda::JSValueRef::Undefined(vm);
156     }
157     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
158     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
159     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
160     std::function<void(int32_t, int32_t)> OnNext = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
161                                                        int32_t index, int32_t pendingIndex) {
162         panda::LocalScope pandaScope(vm);
163         panda::TryCatch trycatch(vm);
164         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
165 
166         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
167         panda::Local<panda::NumberRef> pendingIndexPram = panda::NumberRef::New(vm, pendingIndex);
168         panda::Local<panda::JSValueRef> params[NUM_2] = { indexParam, pendingIndexPram };
169         func->Call(vm, func.ToLocal(), params, NUM_2);
170     };
171     nodeModifiers->getStepperModifier()->setStepperOnNext(nativeNode, reinterpret_cast<void*>(&OnNext));
172     return panda::JSValueRef::Undefined(vm);
173 }
174 
ResetOnNext(ArkUIRuntimeCallInfo * runtimeCallInfo)175 ArkUINativeModuleValue StepperBridge::ResetOnNext(ArkUIRuntimeCallInfo* runtimeCallInfo)
176 {
177     EcmaVM* vm = runtimeCallInfo->GetVM();
178     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
179     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
180     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
181     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
182     auto nodeModifiers = GetArkUINodeModifiers();
183     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
184     nodeModifiers->getStepperModifier()->resetStepperOnNext(nativeNode);
185     return panda::JSValueRef::Undefined(vm);
186 }
187 
SetOnPrevious(ArkUIRuntimeCallInfo * runtimeCallInfo)188 ArkUINativeModuleValue StepperBridge::SetOnPrevious(ArkUIRuntimeCallInfo* runtimeCallInfo)
189 {
190     EcmaVM* vm = runtimeCallInfo->GetVM();
191     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
192     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
193     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
194     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
195     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
196     auto nodeModifiers = GetArkUINodeModifiers();
197     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
198     if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
199         nodeModifiers->getStepperModifier()->resetStepperOnPrevious(nativeNode);
200         return panda::JSValueRef::Undefined(vm);
201     }
202     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
203     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
204     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
205     std::function<void(int32_t, int32_t)> OnPrevious = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
206                                                            int32_t index, int32_t pendingIndex) {
207         panda::LocalScope pandaScope(vm);
208         panda::TryCatch trycatch(vm);
209         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
210 
211         panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
212         panda::Local<panda::NumberRef> pendingIndexPram = panda::NumberRef::New(vm, pendingIndex);
213         panda::Local<panda::JSValueRef> params[NUM_2] = { indexParam, pendingIndexPram };
214         func->Call(vm, func.ToLocal(), params, NUM_2);
215     };
216     nodeModifiers->getStepperModifier()->setStepperOnPrevious(
217         nativeNode, reinterpret_cast<void*>(&OnPrevious));
218     return panda::JSValueRef::Undefined(vm);
219 }
220 
ResetOnPrevious(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue StepperBridge::ResetOnPrevious(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223     EcmaVM* vm = runtimeCallInfo->GetVM();
224     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
225     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
226     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
227     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
228     auto nodeModifiers = GetArkUINodeModifiers();
229     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
230     nodeModifiers->getStepperModifier()->resetStepperOnPrevious(nativeNode);
231     return panda::JSValueRef::Undefined(vm);
232 }
233 } // namespace OHOS::Ace::NG