1 /*
2  * Copyright (c) 2021-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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_RENDER_LOADING_PROGRESS_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_RENDER_LOADING_PROGRESS_H
18 
19 #include <vector>
20 
21 #include "core/animation/animator.h"
22 #include "core/animation/picture_animation.h"
23 #include "core/components/progress/loading_progress_component.h"
24 #include "core/pipeline/base/render_node.h"
25 
26 namespace OHOS::Ace {
27 
28 constexpr int32_t TOTAL_FRAME_NUMBER = 60;
29 constexpr int32_t MODE_DRAG = 0;
30 constexpr int32_t MODE_LOOP = 1;
31 constexpr int32_t MODE_EXIT = 2;
32 
33 class RenderLoadingProgress : public RenderNode {
34     DECLARE_ACE_TYPE(RenderLoadingProgress, RenderNode);
35 
36 public:
37     RenderLoadingProgress();
38     ~RenderLoadingProgress() override = default;
39 
40     void Update(const RefPtr<Component>& component) override;
41 
SetDiameter(const Dimension & diameter)42     void SetDiameter(const Dimension& diameter)
43     {
44         // Refresh will set new diameter when window size changed.
45         if (!NearEqual(NormalizeToPx(diameter), diameter_)) {
46             diameterDimension_ = diameter;
47             if (ringController_) {
48                 ringController_->Stop();
49                 ringController_->ClearStopListeners();
50                 ringController_ = nullptr;
51             }
52             if (cometController_) {
53                 cometController_->Stop();
54                 cometController_->ClearStopListeners();
55                 cometController_ = nullptr;
56             }
57             usedScale_ = 0.0;
58             SetNeedLayout(true);
59         }
60     }
61 
GetLoadingMode()62     int32_t GetLoadingMode() const
63     {
64         return loadingMode_;
65     }
66 
GetProgressColor()67     Color GetProgressColor() const
68     {
69         return progressColor_;
70     }
71 
72     void SetLoadingMode(int32_t mode);
73 
74     void SetDragRange(double minDistance, double maxDistance);
75 
76     void SetDragDistance(double distance);
77 
78     void PerformLayout() override;
79 
80     static RefPtr<RenderNode> Create();
81 
82 protected:
83     void CalculateCirclePosition();
84     void OnVisibleChanged() override;
85     void OnHiddenChanged(bool hidden) override;
86     void AnimationChanged();
87 
88     void UpdateLoadingSize(double diameter);
89     void CalculateValue(int32_t start, int32_t end, double percent = 1.0);
90     void UpdateRingAnimation();
91     void UpdateCometAnimation();
92     void DoCometTailAnimation();
93     void DoCometLoopAnimation();
94     void UpdateCometParams();
95     float GetCometScaleByDegree(double degree);
96     float GetCometAlphaByDegree(double degree);
97 
98     Offset center_;
99     double diameter_ = 0.0;
100     Dimension diameterDimension_;
101     Dimension ringRadiusDimension_;
102     Dimension orbitRadiusDimension_;
103     RefPtr<Animator> ringController_;
104     RefPtr<Animator> cometController_;
105 
106     // Prop for refresh.
107     int32_t loadingMode_ = MODE_LOOP;
108     double minDistance_ = 0.0;
109     double maxDistance_ = 0.0;
110     double curDistance_ = 0.0;
111     double dragScale_ = 1.0; // Scale effect for ring
112     double dragAlpha_ = 1.0; // Alpha effect for ring and comet
113     double exitScale_ = 1.0; // Scale effect for ring and comet when exit from refresh.
114     double exitAlpha_ = 1.0; // Alpha effect for ring and comet when exit from refresh.
115 
116     double scale_ = 0.0;
117     double usedScale_ = 0.0;
118     double moveRatio_ = MOVE_RATIO;
119     double ringWidth_ = 0.0;
120     double ringRadius_ = 0.0;
121     Offset ringOffset_;
122     struct CometParam {
123         uint8_t alpha = UINT8_MAX;
124         double scale = 1.0;
125         double angular = 0.0;
126     };
127     std::vector<CometParam> cometParams_;
128     double orbitRadius_ = 0.0;
129     double cometRadius_ = 0.0;
130     uint8_t cometAlpha_ = UINT8_MAX;
131     int32_t cometCount_ = COMET_COUNT;
132     double cometCurTail_ = 0.0;
133     double cometTailLen_ = COMET_TAIL_LEN;
134     BaseId::IdType moveStopId_ = 0;
135     BaseId::IdType tailStopId_ = 0;
136     Color progressColor_ = PROGRESS_COLOR; // When Dark: Color(0xffffffff)
137 
138     // Use when Dark/night Mode.
139     double ringBgWidth_ = 0.0;
140     double ringBlurRadius_ = 0.0;
141     double ringBgBlurRadius_ = 0.0;
142 };
143 
144 } // namespace OHOS::Ace
145 
146 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PROGRESS_RENDER_LOADING_PROGRESS_H
147