• 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_PAINT_METHOD_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_PAINT_METHOD_H
18 
19 #include <utility>
20 
21 #include "base/geometry/axis.h"
22 #include "base/memory/referenced.h"
23 #include "core/components_ng/pattern/slider/slider_content_modifier.h"
24 #include "core/components_ng/pattern/slider/slider_paint_property.h"
25 #include "core/components_ng/pattern/slider/slider_tip_modifier.h"
26 #include "core/components_ng/render/drawing.h"
27 #include "core/components_ng/render/node_paint_method.h"
28 #include "core/components_ng/render/paragraph.h"
29 #include "core/pipeline/pipeline_base.h"
30 
31 namespace OHOS::Ace::NG {
32 class ACE_EXPORT SliderPaintMethod : public NodePaintMethod {
33     DECLARE_ACE_TYPE(SliderPaintMethod, NodePaintMethod)
34 
35 public:
36     struct TipParameters {
37         SizeF bubbleSize_;
38         OffsetF bubbleOffset_;
39         OffsetF textOffset_;
40         bool isDrawTip_ = false;
41     };
SliderPaintMethod(const RefPtr<SliderContentModifier> & sliderContentModifier,const SliderContentModifier::Parameters & parameters,float sliderLength,float borderBlank,const RefPtr<SliderTipModifier> & sliderTipModifier,RefPtr<NG::Paragraph> paragraph,const TipParameters & tipParameters)42     explicit SliderPaintMethod(const RefPtr<SliderContentModifier>& sliderContentModifier,
43         const SliderContentModifier::Parameters& parameters, float sliderLength, float borderBlank,
44         const RefPtr<SliderTipModifier>& sliderTipModifier, RefPtr<NG::Paragraph> paragraph,
45         const TipParameters& tipParameters)
46         : sliderContentModifier_(sliderContentModifier), parameters_(parameters), sliderTipModifier_(sliderTipModifier),
47           paragraph_(std::move(paragraph)), tipParameters_(tipParameters)
48     {}
49     ~SliderPaintMethod() override = default;
50 
GetContentModifier(PaintWrapper * paintWrapper)51     RefPtr<Modifier> GetContentModifier(PaintWrapper* paintWrapper) override
52     {
53         CHECK_NULL_RETURN(sliderContentModifier_, nullptr);
54         return sliderContentModifier_;
55     }
56 
UpdateContentModifier(PaintWrapper * paintWrapper)57     void UpdateContentModifier(PaintWrapper* paintWrapper) override
58     {
59         CHECK_NULL_VOID(sliderContentModifier_);
60         auto paintProperty = DynamicCast<SliderPaintProperty>(paintWrapper->GetPaintProperty());
61         CHECK_NULL_VOID(paintProperty);
62         auto pipeline = PipelineBase::GetCurrentContext();
63         CHECK_NULL_VOID(pipeline);
64         auto sliderTheme = pipeline->GetTheme<SliderTheme>();
65         CHECK_NULL_VOID(sliderTheme);
66         sliderContentModifier_->UpdateData(parameters_);
67         sliderContentModifier_->JudgeNeedAimate(paintProperty);
68         sliderContentModifier_->SetDirection(paintProperty->GetDirectionValue(Axis::HORIZONTAL));
69         sliderContentModifier_->SetBackgroundSize(parameters_.backStart, parameters_.backEnd);
70         sliderContentModifier_->SetSelectSize(parameters_.selectStart, parameters_.selectEnd);
71         sliderContentModifier_->SetCircleCenter(parameters_.circleCenter);
72         sliderContentModifier_->SetSelectColor(parameters_.selectColor);
73         sliderContentModifier_->SetTrackBackgroundColor(parameters_.trackBackgroundColor);
74         sliderContentModifier_->SetBlockColor(parameters_.blockColor);
75         sliderContentModifier_->SetTrackThickness(parameters_.trackThickness);
76         sliderContentModifier_->SetBlockDiameter(parameters_.blockDiameter);
77         sliderContentModifier_->SetStepRatio(parameters_.stepRatio);
78         sliderContentModifier_->SetShowSteps(paintProperty->GetShowStepsValue(false));
79         sliderContentModifier_->SetBoardColor();
80     }
81 
GetOverlayModifier(PaintWrapper * paintWrapper)82     RefPtr<Modifier> GetOverlayModifier(PaintWrapper* paintWrapper) override
83     {
84         CHECK_NULL_RETURN(sliderTipModifier_, nullptr);
85         sliderTipModifier_->SetBoundsRect(UpdateOverlayRect(paintWrapper));
86         return sliderTipModifier_;
87     }
88 
UpdateOverlayModifier(PaintWrapper * paintWrapper)89     void UpdateOverlayModifier(PaintWrapper* paintWrapper) override
90     {
91         CHECK_NULL_VOID(sliderTipModifier_);
92         auto paintProperty = DynamicCast<SliderPaintProperty>(paintWrapper->GetPaintProperty());
93         if (paintProperty) {
94             sliderTipModifier_->SetDirection(paintProperty->GetDirectionValue(Axis::HORIZONTAL));
95             sliderTipModifier_->SetTipColor(paintProperty->GetTipColorValue(Color::BLACK));
96         }
97         sliderTipModifier_->SetTipFlag(tipParameters_.isDrawTip_);
98         sliderTipModifier_->SetParagraph(paragraph_);
99         sliderTipModifier_->SetContentOffset(paintWrapper->GetContentOffset());
100         sliderTipModifier_->SetBubbleSize(tipParameters_.bubbleSize_);
101         sliderTipModifier_->SetBubbleOffset(tipParameters_.bubbleOffset_);
102         sliderTipModifier_->SetTextOffset(tipParameters_.textOffset_);
103     }
104 
UpdateOverlayRect(PaintWrapper * paintWrapper)105     RectF UpdateOverlayRect(PaintWrapper* paintWrapper) const
106     {
107         constexpr float HALF = 0.5;
108         auto contentSize = paintWrapper->GetContentSize();
109         auto pipeline = PipelineBase::GetCurrentContext();
110         CHECK_NULL_RETURN(pipeline, RectF());
111         auto theme = pipeline->GetTheme<SliderTheme>();
112         CHECK_NULL_RETURN(theme, RectF());
113         auto distance = static_cast<float>(theme->GetBubbleToCircleCenterDistance().ConvertToPx());
114         auto axis =
115             DynamicCast<SliderPaintProperty>(paintWrapper->GetPaintProperty())->GetDirectionValue(Axis::HORIZONTAL);
116         RectF rect;
117         if (axis == Axis::HORIZONTAL) {
118             rect.SetOffset(
119                 OffsetF(-tipParameters_.bubbleSize_.Width(), -tipParameters_.bubbleSize_.Height() - distance));
120             rect.SetSize(SizeF(contentSize.Width() + tipParameters_.bubbleSize_.Width() / HALF,
121                 contentSize.Height() * HALF + tipParameters_.bubbleSize_.Height() + distance));
122         } else {
123             rect.SetOffset(
124                 OffsetF(-tipParameters_.bubbleSize_.Width() - distance, -tipParameters_.bubbleSize_.Height()));
125             rect.SetSize(SizeF(contentSize.Width() * HALF + tipParameters_.bubbleSize_.Width() + distance,
126                 contentSize.Height() + tipParameters_.bubbleSize_.Height() / HALF));
127         }
128         return rect;
129     }
130 
131 private:
132     RefPtr<SliderContentModifier> sliderContentModifier_;
133     SliderContentModifier::Parameters parameters_;
134 
135     RefPtr<SliderTipModifier> sliderTipModifier_;
136     RefPtr<NG::Paragraph> paragraph_;
137     TipParameters tipParameters_;
138     ACE_DISALLOW_COPY_AND_MOVE(SliderPaintMethod);
139 };
140 } // namespace OHOS::Ace::NG
141 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_SLIDER_SLIDER_PAINT_METHOD_H
142