1 /*
2  * Copyright (c) 2022-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 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SCROLL_SCROLL_EVENT_HUB_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SCROLL_SCROLL_EVENT_HUB_H
18 
19 #include "core/components_ng/pattern/scrollable/scrollable_event_hub.h"
20 
21 namespace OHOS::Ace::NG {
22 
23 // which edge is reached
24 enum class ScrollEdge {
25     TOP = 0,
26     LEFT,
27     BOTTOM,
28     RIGHT,
29 };
30 
31 struct TwoDimensionScrollResult {
32     Dimension xOffset;
33     Dimension yOffset;
34 
35     bool operator==(const TwoDimensionScrollResult& scrollRes) const
36     {
37         return xOffset == scrollRes.xOffset && yOffset == scrollRes.yOffset;
38     }
39 };
40 
41 using ScrollEvent = std::function<void(Dimension, Dimension)>;
42 using ScrollEventWithState = std::function<void(Dimension, Dimension, ScrollState)>;
43 using ScrollEventWithReturn = std::function<TwoDimensionScrollResult(Dimension, Dimension, ScrollState, ScrollSource)>;
44 using ScrollEdgeEvent = std::function<void(ScrollEdge)>;
45 using ScrollEndEvent = std::function<void()>;
46 
47 class ScrollEventHub : public ScrollableEventHub {
48     DECLARE_ACE_TYPE(ScrollEventHub, ScrollableEventHub)
49 
50 public:
51     ScrollEventHub() = default;
52     ~ScrollEventHub() override = default;
53 
GetOnScrollEvent()54     const ScrollEvent& GetOnScrollEvent()
55     {
56         return onScroll_;
57     }
58 
SetOnScroll(ScrollEvent && onScroll)59     void SetOnScroll(ScrollEvent&& onScroll)
60     {
61         onScroll_ = std::move(onScroll);
62     }
63 
GetOnWillScrollEvent()64     const ScrollEventWithReturn& GetOnWillScrollEvent() const
65     {
66         return onWillScroll_;
67     }
68 
SetOnWillScrollEvent(ScrollEventWithReturn && onWillScroll)69     void SetOnWillScrollEvent(ScrollEventWithReturn&& onWillScroll)
70     {
71         onWillScroll_ = std::move(onWillScroll);
72     }
73 
GetOnDidScrollEvent()74     const ScrollEventWithState& GetOnDidScrollEvent() const
75     {
76         return onDidScroll_;
77     }
78 
SetOnDidScrollEvent(ScrollEventWithState && onDidScroll)79     void SetOnDidScrollEvent(ScrollEventWithState&& onDidScroll)
80     {
81         onDidScroll_ = std::move(onDidScroll);
82     }
83 
GetScrollEdgeEvent()84     const ScrollEdgeEvent& GetScrollEdgeEvent()
85     {
86         return onScrollEdge_;
87     }
88 
SetOnScrollEdge(ScrollEdgeEvent && event)89     void SetOnScrollEdge(ScrollEdgeEvent&& event)
90     {
91         onScrollEdge_ = std::move(event);
92     }
93 
GetScrollEndEvent()94     const ScrollEndEvent& GetScrollEndEvent()
95     {
96         return onScrollEnd_;
97     }
98 
SetOnScrollEnd(ScrollEndEvent && event)99     void SetOnScrollEnd(ScrollEndEvent&& event)
100     {
101         onScrollEnd_ = std::move(event);
102     }
103 
GetScrollBeginEvent()104     const OnScrollBeginEvent& GetScrollBeginEvent()
105     {
106         return onScrollBegin_;
107     }
108 
SetOnScrollBegin(OnScrollBeginEvent && event)109     void SetOnScrollBegin(OnScrollBeginEvent&& event)
110     {
111         onScrollBegin_ = std::move(event);
112     }
113 
114 private:
115     ScrollEvent onScroll_;
116     ScrollEventWithReturn onWillScroll_;
117     ScrollEventWithState onDidScroll_;
118     OnScrollBeginEvent onScrollBegin_;
119     ScrollEndEvent onScrollEnd_;
120     ScrollEdgeEvent onScrollEdge_;
121 
122     ACE_DISALLOW_COPY_AND_MOVE(ScrollEventHub);
123 };
124 
125 } // namespace OHOS::Ace::NG
126 
127 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SCROLL_SCROLL_EVENT_HUB_H