1 /*
2 * Copyright (c) 2024 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/scroller_modifier.h"
16
17 #include "base/log/log_wrapper.h"
18 #include "bridge/common/utils/utils.h"
19 #include "core/components_ng/base/frame_node.h"
20 #include "core/components_ng/pattern/scroll/scroll_model_ng.h"
21 #include "core/components_ng/pattern/scroll_bar/proxy/scroll_bar_proxy.h"
22 #include "core/components_ng/pattern/scrollable/scrollable_controller.h"
23
24 namespace OHOS::Ace::NG {
25
GetScroller(ArkUINodeHandle node,ArkUINodeHandle proxy)26 ArkUINodeHandle GetScroller(ArkUINodeHandle node, ArkUINodeHandle proxy)
27 {
28 auto* frameNode = reinterpret_cast<FrameNode*>(node);
29 CHECK_NULL_RETURN(frameNode, nullptr);
30 auto controller = ScrollModelNG::GetOrCreateController(frameNode);
31 return reinterpret_cast<ArkUINodeHandle>(AceType::RawPtr(controller));
32 }
33
GetScrollerProxy(ArkUINodeHandle node)34 ArkUINodeHandle GetScrollerProxy(ArkUINodeHandle node)
35 {
36 TAG_LOGE(AceLogTag::ACE_SCROLL, "GetScrollerProxy not implemented");
37 return node;
38 }
39
SetScrollToIndex(ArkUINodeHandle node,ArkUI_Int32 index,ArkUI_Bool smooth,ArkUIScrollAlign align)40 void SetScrollToIndex(ArkUINodeHandle node, ArkUI_Int32 index, ArkUI_Bool smooth,
41 ArkUIScrollAlign align)
42 {
43 auto* scrollController = reinterpret_cast<NG::ScrollableController*>(node);
44 CHECK_NULL_VOID(scrollController);
45 scrollController->ScrollToIndex(index, smooth, static_cast<ScrollAlign>(align), std::nullopt);
46 }
47
ScrollBy(ArkUINodeHandle node,ArkUI_Float32 * values,ArkUI_Int32 * units)48 void ScrollBy(ArkUINodeHandle node, ArkUI_Float32* values, ArkUI_Int32* units)
49 {
50 auto* scrollController = reinterpret_cast<NG::ScrollableController*>(node);
51 CHECK_NULL_VOID(scrollController);
52 Dimension deltaX(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
53 Dimension deltaY(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
54 scrollController->ScrollBy(deltaX.Value(), deltaY.Value(), false);
55 }
56
GetCurrentOffset(ArkUINodeHandle node,ArkUI_Float32 * out)57 void GetCurrentOffset(ArkUINodeHandle node, ArkUI_Float32* out)
58 {
59 auto* scrollController = reinterpret_cast<NG::ScrollableController*>(node);
60 CHECK_NULL_VOID(scrollController);
61 auto offset = scrollController->GetCurrentOffset();
62 out[0] = offset.GetX();
63 out[1] = offset.GetY();
64 }
65
ScrollTo(ArkUINodeHandle node,ArkUI_Float32 * xOffsetArray,ArkUI_Float32 * yOffsetArray,ArkUI_Bool animation,const struct ArkUIScrollerAnimationType * animationType)66 void ScrollTo(ArkUINodeHandle node, ArkUI_Float32* xOffsetArray, ArkUI_Float32* yOffsetArray,
67 ArkUI_Bool animation, const struct ArkUIScrollerAnimationType* animationType)
68 {
69 auto* controller = reinterpret_cast<NG::ScrollableController*>(node);
70 CHECK_NULL_VOID(controller);
71 Dimension xOffset(xOffsetArray[0], static_cast<OHOS::Ace::DimensionUnit>(xOffsetArray[1]));
72 Dimension yOffset(yOffsetArray[0], static_cast<OHOS::Ace::DimensionUnit>(yOffsetArray[1]));
73 float duration = animationType->duration;
74 RefPtr<Curve> curve = Framework::CreateCurve(Framework::CurveIntToString(animationType->curve), false);
75 auto direction = controller->GetScrollDirection();
76 auto position = direction == Axis::VERTICAL ? yOffset : xOffset;
77 controller->AnimateTo(position, duration, curve, animation);
78 }
79
80 namespace NodeModifier {
GetScrollerModifier()81 const ArkUIScrollerModifier* GetScrollerModifier()
82 {
83 static const ArkUIScrollerModifier modifier = {
84 GetScroller,
85 GetScrollerProxy,
86 SetScrollToIndex,
87 ScrollBy,
88 GetCurrentOffset,
89 ScrollTo
90 };
91 return &modifier;
92 }
93
GetCJUIScrollerModifier()94 const CJUIScrollerModifier* GetCJUIScrollerModifier()
95 {
96 static const CJUIScrollerModifier modifier = {
97 GetScroller,
98 GetScrollerProxy,
99 SetScrollToIndex,
100 ScrollBy,
101 GetCurrentOffset,
102 ScrollTo
103 };
104 return &modifier;
105 }
106 }
107 }
108