• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SetJSFrameNodeOnScrollWillScroll(ScrollEventWithReturn && onScroll)114     void SetJSFrameNodeOnScrollWillScroll(ScrollEventWithReturn&& onScroll)
115     {
116         onJSFrameNodeWillScroll_ = std::move(onScroll);
117     }
118 
ClearJSFrameNodeOnScrollWillScroll()119     void ClearJSFrameNodeOnScrollWillScroll()
120     {
121         if (onJSFrameNodeWillScroll_) {
122             onJSFrameNodeWillScroll_ = nullptr;
123         }
124     }
125 
GetJSFrameNodeOnScrollWillScroll()126     const ScrollEventWithReturn& GetJSFrameNodeOnScrollWillScroll()
127     {
128         return onJSFrameNodeWillScroll_;
129     }
130 
SetJSFrameNodeOnScrollDidScroll(ScrollEventWithState && onScroll)131     void SetJSFrameNodeOnScrollDidScroll(ScrollEventWithState&& onScroll)
132     {
133         onJSFrameNodeDidScroll_ = std::move(onScroll);
134     }
135 
ClearJSFrameNodeOnScrollDidScroll()136     void ClearJSFrameNodeOnScrollDidScroll()
137     {
138         if (onJSFrameNodeDidScroll_) {
139             onJSFrameNodeDidScroll_ = nullptr;
140         }
141     }
142 
GetJSFrameNodeOnScrollDidScroll()143     const ScrollEventWithState& GetJSFrameNodeOnScrollDidScroll()
144     {
145         return onJSFrameNodeDidScroll_;
146     }
147 
SetOnDidZoom(std::function<void (float)> && event)148     void SetOnDidZoom(std::function<void(float)>&& event)
149     {
150         onDidZoom_ = std::move(event);
151     }
152 
FireOnDidZoom(float scale)153     void FireOnDidZoom(float scale)
154     {
155         if (onDidZoom_) {
156             onDidZoom_(scale);
157         }
158     }
159 
SetOnZoomStart(std::function<void ()> && event)160     void SetOnZoomStart(std::function<void()>&& event)
161     {
162         onZoomStart_ = std::move(event);
163     }
164 
FireOnZoomStart()165     void FireOnZoomStart()
166     {
167         if (onZoomStart_) {
168             onZoomStart_();
169         }
170     }
171 
SetOnZoomStop(std::function<void ()> && event)172     void SetOnZoomStop(std::function<void()>&& event)
173     {
174         onZoomStop_ = std::move(event);
175     }
176 
FireOnZoomStop()177     void FireOnZoomStop()
178     {
179         if (onZoomStop_) {
180             onZoomStop_();
181         }
182     }
183 
SetOnZoomScaleChange(std::function<void (float)> && event)184     void SetOnZoomScaleChange(std::function<void(float)>&& event)
185     {
186         onZoomScaleChange_ = std::move(event);
187     }
188 
FireOnZoomScaleChange(float scale)189     void FireOnZoomScaleChange(float scale)
190     {
191         if (onZoomScaleChange_) {
192             onZoomScaleChange_(scale);
193         }
194     }
195 
196 private:
197     ScrollEvent onScroll_;
198     ScrollEventWithReturn onWillScroll_;
199     ScrollEventWithState onDidScroll_;
200     ScrollEventWithReturn onJSFrameNodeWillScroll_;
201     ScrollEventWithState onJSFrameNodeDidScroll_;
202     OnScrollBeginEvent onScrollBegin_;
203     ScrollEndEvent onScrollEnd_;
204     ScrollEdgeEvent onScrollEdge_;
205     std::function<void(float)> onDidZoom_;
206     std::function<void()> onZoomStart_;
207     std::function<void()> onZoomStop_;
208     std::function<void(float)> onZoomScaleChange_;
209 
210     ACE_DISALLOW_COPY_AND_MOVE(ScrollEventHub);
211 };
212 
213 } // namespace OHOS::Ace::NG
214 
215 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SCROLL_SCROLL_EVENT_HUB_H