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