• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #include "core/components/refresh/render_refresh_target.h"
17 
18 namespace OHOS::Ace {
19 
FindRefreshParent(const WeakPtr<RenderNode> & node)20 void RenderRefreshTarget::FindRefreshParent(const WeakPtr<RenderNode>& node)
21 {
22     auto childNode = node.Upgrade();
23     if (!childNode) {
24         return;
25     }
26     auto parent = childNode->GetParent().Upgrade();
27     while (parent) {
28         auto refresh = AceType::DynamicCast<RenderRefresh>(parent);
29         if (refresh) {
30             refreshParent_ = AceType::WeakClaim(AceType::RawPtr(refresh));
31             break;
32         }
33         parent = parent->GetParent().Upgrade();
34     }
35 }
36 
HandleRefreshEffect(double delta,int32_t source,double currentOffset)37 bool RenderRefreshTarget::HandleRefreshEffect(double delta, int32_t source, double currentOffset)
38 {
39     auto refresh = refreshParent_.Upgrade();
40     if (!refresh) {
41         LOGD("not support refresh");
42         return false;
43     }
44     refresh->SetHasScrollableChild(true);
45     if ((LessOrEqual(currentOffset, 0.0) && source == SCROLL_FROM_UPDATE) || inLinkRefresh_) {
46         refresh->UpdateScrollableOffset(delta);
47         inLinkRefresh_ = true;
48     }
49     if (refresh->GetStatus() != RefreshStatus::INACTIVE) {
50         return true;
51     }
52     return false;
53 }
54 
InitializeScrollable(const RefPtr<Scrollable> & scrollable)55 void RenderRefreshTarget::InitializeScrollable(const RefPtr<Scrollable>& scrollable)
56 {
57     if (!scrollable) {
58         return;
59     }
60     scrollable->SetDragEndCallback([weakRefreshBase = AceType::WeakClaim(this)]() {
61         auto refreshBase = weakRefreshBase.Upgrade();
62         if (refreshBase) {
63             auto refresh = refreshBase->refreshParent_.Upgrade();
64             if (refresh && refreshBase->inLinkRefresh_) {
65                 refresh->HandleDragEnd();
66                 refreshBase->inLinkRefresh_ = false;
67             }
68         }
69     });
70     scrollable->SetDragCancelCallback([weakRefreshBase = AceType::WeakClaim(this)]() {
71         auto refreshBase = weakRefreshBase.Upgrade();
72         if (refreshBase) {
73             auto refresh = refreshBase->refreshParent_.Upgrade();
74             if (refresh && refreshBase->inLinkRefresh_) {
75                 refresh->HandleDragCancel();
76                 refreshBase->inLinkRefresh_ = false;
77             }
78         }
79     });
80 }
81 
82 } // namespace OHOS::Ace
83