1 /*
2  * Copyright (c) 2023 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_SCROLL_SCROLL_EDGE_EFFECT_BASE_NG_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_SCROLL_SCROLL_EDGE_EFFECT_BASE_NG_H
18 
19 #include <functional>
20 
21 #include "base/memory/ace_type.h"
22 #include "core/components/common/layout/constants.h"
23 #include "core/components/common/properties/color.h"
24 #include "core/components_ng/pattern/scrollable/scrollable.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 using EdgeCallback = std::function<double()>;
29 
30 class ScrollEdgeEffectBase : public AceType {
31     DECLARE_ACE_TYPE(ScrollEdgeEffectBase, AceType);
32 
33 public:
ScrollEdgeEffectBase(EdgeEffect edgeEffect)34     explicit ScrollEdgeEffectBase(EdgeEffect edgeEffect) : edgeEffect_(edgeEffect) {}
35 
ScrollEdgeEffectBase()36     ScrollEdgeEffectBase() : edgeEffect_(EdgeEffect::SPRING) {}
37 
~ScrollEdgeEffectBase()38     ~ScrollEdgeEffectBase() override
39     {
40         scrollable_ = nullptr;
41     }
42 
GetEdgeEffect()43     EdgeEffect GetEdgeEffect() const
44     {
45         return edgeEffect_;
46     }
47 
48     // support layout out of boundary fill with blank
IsRestrictBoundary()49     bool IsRestrictBoundary() const
50     {
51         return edgeEffect_ != EdgeEffect::SPRING;
52     }
53 
IsFadeEffect()54     bool IsFadeEffect() const
55     {
56         return edgeEffect_ == EdgeEffect::FADE;
57     }
58 
IsNoneEffect()59     bool IsNoneEffect() const
60     {
61         return edgeEffect_ == EdgeEffect::NONE;
62     }
63 
IsSpringEffect()64     bool IsSpringEffect() const
65     {
66         return edgeEffect_ == EdgeEffect::SPRING;
67     }
68 
SetScrollable(const RefPtr<Scrollable> & scrollable)69     void SetScrollable(const RefPtr<Scrollable>& scrollable)
70     {
71         scrollable_ = scrollable;
72     }
73 
SetCurrentPositionCallback(const EdgeCallback & currentPositionCallback)74     void SetCurrentPositionCallback(const EdgeCallback& currentPositionCallback)
75     {
76         currentPositionCallback_ = currentPositionCallback;
77     }
78 
SetLeadingCallback(const EdgeCallback & leadingCallback)79     void SetLeadingCallback(const EdgeCallback& leadingCallback)
80     {
81         leadingCallback_ = leadingCallback;
82     }
83 
SetTrailingCallback(const EdgeCallback & trainingCallback)84     void SetTrailingCallback(const EdgeCallback& trainingCallback)
85     {
86         trailingCallback_ = trainingCallback;
87     }
88 
SetInitLeadingCallback(const EdgeCallback & initLeadingCallback)89     void SetInitLeadingCallback(const EdgeCallback& initLeadingCallback)
90     {
91         initLeadingCallback_ = initLeadingCallback;
92     }
93 
SetInitTrailingCallback(const EdgeCallback & initTrainingCallback)94     void SetInitTrailingCallback(const EdgeCallback& initTrainingCallback)
95     {
96         initTrailingCallback_ = initTrainingCallback;
97     }
98 
99     // common use
InitialEdgeEffect()100     virtual void InitialEdgeEffect() {}
101 
102     // fade effect use
CalculateOverScroll(double oldPosition,bool isReachMax)103     virtual double CalculateOverScroll(double oldPosition, bool isReachMax)
104     {
105         return 0.0;
106     }
107 
108     // spring effect use
RegisterSpringCallback()109     virtual void RegisterSpringCallback() {}
110 
ProcessScrollOver(double velocity)111     virtual void ProcessScrollOver(double velocity) {}
ProcessSpringUpdate()112     virtual void ProcessSpringUpdate() {}
113 protected:
114     RefPtr<Scrollable> scrollable_;
115     EdgeCallback currentPositionCallback_; // get current position
116     EdgeCallback leadingCallback_; // get stable min extent
117     EdgeCallback trailingCallback_; // get stable max extent
118     EdgeCallback initLeadingCallback_; // get current min extent
119     EdgeCallback initTrailingCallback_; // get current max extent
120 private:
121     EdgeEffect edgeEffect_;
122 };
123 
124 } // namespace OHOS::Ace
125 
126 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_SCROLL_SCROLL_EDGE_EFFECT_BASE_NG_H