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_ng/pattern/progress/progress_paint_method.h" 17 18 #include <algorithm> 19 #include <optional> 20 21 #include "base/geometry/ng/point_t.h" 22 #include "base/geometry/ng/rect_t.h" 23 #include "base/utils/utils.h" 24 #include "core/components/picker/picker_option_component.h" 25 #include "core/components/progress/progress_theme.h" 26 #include "core/components/theme/theme_manager.h" 27 #include "core/components_ng/pattern/progress/progress_pattern.h" 28 29 namespace OHOS::Ace::NG { GetThemeData()30void ProgressPaintMethod::GetThemeData() 31 { 32 auto pipeline = PipelineBase::GetCurrentContext(); 33 CHECK_NULL_VOID(pipeline); 34 auto progressTheme = pipeline->GetTheme<ProgressTheme>(); 35 CHECK_NULL_VOID(progressTheme); 36 color_ = progressTheme->GetTrackSelectedColor(); 37 if (progressType_ == ProgressType::CAPSULE) { 38 color_ = progressTheme->GetCapsuleSelectColor(); 39 bgColor_ = progressTheme->GetCapsuleBgColor(); 40 } else if (progressType_ == ProgressType::RING) { 41 bgColor_ = progressTheme->GetRingProgressBgColor(); 42 } else { 43 bgColor_ = progressTheme->GetTrackBgColor(); 44 } 45 scaleWidth_ = progressTheme->GetScaleWidth().ConvertToPx(); 46 scaleCount_ = progressTheme->GetScaleNumber(); 47 borderColor_ = progressTheme->GetBorderColor(); 48 capsuleBorderWidth_ = progressTheme->GetBorderWidth(); 49 ringProgressEndSideColor_ = progressTheme->GetRingProgressEndSideColor(); 50 ringProgressBeginSideColor_ = progressTheme->GetRingProgressBeginSideColor(); 51 } 52 CalculateStrokeWidth(const SizeF & contentSize)53void ProgressPaintMethod::CalculateStrokeWidth(const SizeF& contentSize) 54 { 55 auto length = std::min(contentSize.Width(), contentSize.Height()); 56 constexpr float HALF = 0.5; 57 switch (progressType_) { 58 case ProgressType::LINEAR: 59 strokeWidth_ = std::min(strokeWidth_, length); 60 break; 61 case ProgressType::RING: 62 case ProgressType::SCALE: 63 if (strokeWidth_ >= length * HALF) { 64 strokeWidth_ = length * HALF * HALF; 65 } 66 break; 67 case ProgressType::MOON: 68 case ProgressType::CAPSULE: 69 default: 70 break; 71 } 72 } 73 GenerateRingProgressColor(PaintWrapper * paintWrapper)74Gradient ProgressPaintMethod::GenerateRingProgressColor(PaintWrapper* paintWrapper) 75 { 76 auto paintProperty = DynamicCast<ProgressPaintProperty>(paintWrapper->GetPaintProperty()); 77 if (paintProperty->HasGradientColor()) { 78 return paintProperty->GetGradientColorValue(); 79 } 80 81 Gradient gradient; 82 GradientColor gradientColorEnd; 83 GradientColor gradientColorStart; 84 if (paintProperty->HasColor()) { 85 Color color = paintProperty->GetColorValue(); 86 gradientColorEnd.SetLinearColor(LinearColor(color)); 87 gradientColorStart.SetLinearColor(LinearColor(color)); 88 } else { 89 gradientColorEnd.SetLinearColor(LinearColor(ringProgressEndSideColor_)); 90 gradientColorStart.SetLinearColor(LinearColor(ringProgressBeginSideColor_)); 91 } 92 gradientColorEnd.SetDimension(Dimension(0.0)); 93 gradient.AddColor(gradientColorEnd); 94 gradientColorStart.SetDimension(Dimension(1.0)); 95 gradient.AddColor(gradientColorStart); 96 return gradient; 97 } 98 99 } // namespace OHOS::Ace::NG 100