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