• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 #include "core/components_ng/pattern/scroll/scroll_paint_method.h"
17 
18 #include "core/components_ng/pattern/arc_scroll/inner/arc_scroll_bar.h"
19 #include "core/components_ng/pattern/arc_scroll/inner/arc_scroll_bar_overlay_modifier.h"
20 
21 namespace OHOS::Ace::NG {
22 
GetForegroundDrawFunction(PaintWrapper * paintWrapper)23 CanvasDrawFunction ScrollPaintMethod::GetForegroundDrawFunction(PaintWrapper* paintWrapper)
24 {
25     auto paintFunc = [weak = WeakClaim(this), paintWrapper](RSCanvas& canvas) {
26         auto scroll = weak.Upgrade();
27         CHECK_NULL_VOID(scroll);
28         scroll->PaintScrollEffect(canvas, paintWrapper);
29     };
30 
31     return paintFunc;
32 }
33 
UpdateContentModifier(PaintWrapper * paintWrapper)34 void ScrollPaintMethod::UpdateContentModifier(PaintWrapper* paintWrapper)
35 {
36     auto renderContext = paintWrapper->GetRenderContext();
37     CHECK_NULL_VOID(renderContext);
38     UpdateFadingGradient(renderContext);
39     TryContentClip(paintWrapper);
40 }
41 
PaintScrollEffect(RSCanvas & canvas,PaintWrapper * paintWrapper) const42 void ScrollPaintMethod::PaintScrollEffect(RSCanvas& canvas, PaintWrapper* paintWrapper) const
43 {
44     auto scrollEdgeEffect = edgeEffect_.Upgrade();
45     CHECK_NULL_VOID(scrollEdgeEffect);
46     auto frameSize = paintWrapper->GetGeometryNode()->GetFrameSize();
47     scrollEdgeEffect->Paint(canvas, frameSize, { 0.0f, 0.0f });
48 }
49 
UpdateOverlayModifier(PaintWrapper * paintWrapper)50 void ScrollPaintMethod::UpdateOverlayModifier(PaintWrapper* paintWrapper)
51 {
52     if (scrollBar2d_.Upgrade()) {
53         UpdateOverlayModifier2d(paintWrapper);
54         return;
55     }
56     CHECK_NULL_VOID(paintWrapper);
57     auto scrollBarOverlayModifier = scrollBarOverlayModifier_.Upgrade();
58     CHECK_NULL_VOID(scrollBarOverlayModifier);
59     auto scrollBar = scrollBar_.Upgrade();
60     CHECK_NULL_VOID(scrollBar);
61     if (scrollBar->GetPositionModeUpdate()) {
62         scrollBarOverlayModifier->SetPositionMode(scrollBar->GetPositionMode());
63     }
64     auto shapeMode = scrollBar->GetShapeMode();
65     if (shapeMode == ShapeMode::ROUND) {
66         auto arcScrollBarOverlayModifier = AceType::DynamicCast<ArcScrollBarOverlayModifier>(scrollBarOverlayModifier);
67         CHECK_NULL_VOID(arcScrollBarOverlayModifier);
68         auto arcScrollBar = AceType::DynamicCast<ArcScrollBar>(scrollBar);
69         CHECK_NULL_VOID(arcScrollBar);
70         scrollBarOverlayModifier->SetBarColor(arcScrollBar->GetArcForegroundColor());
71         arcScrollBarOverlayModifier->SetBackgroundBarColor(arcScrollBar->GetArcBackgroundColor());
72         arcScrollBarOverlayModifier->StartArcBarAnimation(arcScrollBar->GetHoverAnimationType(),
73             arcScrollBar->GetOpacityAnimationType(), arcScrollBar->GetNeedAdaptAnimation(),
74             arcScrollBar->GetArcActiveRect(), arcScrollBar->GetArcBarRect());
75     } else {
76         scrollBarOverlayModifier->SetBarColor(scrollBar->GetForegroundColor());
77         scrollBarOverlayModifier->StartBarAnimation(scrollBar->GetHoverAnimationType(),
78             scrollBar->GetOpacityAnimationType(), scrollBar->GetNeedAdaptAnimation(), scrollBar->GetActiveRect());
79     }
80     scrollBar->SetHoverAnimationType(HoverAnimationType::NONE);
81     scrollBar->SetOpacityAnimationType(OpacityAnimationType::NONE);
82 }
83 
UpdateOverlayModifier2d(PaintWrapper * paintWrapper)84 void ScrollPaintMethod::UpdateOverlayModifier2d(PaintWrapper* paintWrapper)
85 {
86     CHECK_NULL_VOID(paintWrapper);
87     const auto scrollBar = scrollBar2d_.Upgrade();
88     auto&& overlay = scrollBar->GetPainter();
89     CHECK_NULL_VOID(overlay && scrollBar);
90     overlay->UpdateFrom(*scrollBar);
91     scrollBar->ResetAnimationSignals();
92 }
93 } // namespace OHOS::Ace::NG
94