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