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_BASE_GEOMETRY_ANIMATABLE_DIMENSION_H
17 #define FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_ANIMATABLE_DIMENSION_H
18 
19 #include "base/geometry/dimension.h"
20 #include "base/geometry/calc_dimension.h"
21 #include "core/animation/animator.h"
22 #include "core/animation/curve_animation.h"
23 #include "core/components/common/properties/animation_option.h"
24 
25 namespace OHOS::Ace {
26 
27 using RenderNodeAnimationCallback = std::function<void()>;
28 
29 /*
30  * AnimatableDimension is a Dimension with AnimationOption and Animator.
31  */
32 class ACE_FORCE_EXPORT AnimatableDimension : public CalcDimension {
33 public:
34     AnimatableDimension() = default;
35     ~AnimatableDimension() = default;
36 
37     explicit AnimatableDimension(
38         double value, DimensionUnit unit = DimensionUnit::PX, const AnimationOption& option = AnimationOption())
39         : CalcDimension(value, unit), animationOption_(option)
40     {}
41 
42     explicit AnimatableDimension(
43         const std::string& value, DimensionUnit unit = DimensionUnit::CALC,
44         const AnimationOption& option = AnimationOption())
45         : CalcDimension(value, unit), animationOption_(option)
46     {}
47 
48     explicit AnimatableDimension(const Dimension& dimension, const AnimationOption& option = AnimationOption())
49         : CalcDimension(dimension), animationOption_(option)
50     {}
51 
52     explicit AnimatableDimension(const CalcDimension& dimension, const AnimationOption& option = AnimationOption())
53         : CalcDimension(dimension), animationOption_(option)
54     {}
55 
SetContextAndCallback(const WeakPtr<PipelineBase> & context,const RenderNodeAnimationCallback & callback)56     void SetContextAndCallback(const WeakPtr<PipelineBase>& context, const RenderNodeAnimationCallback& callback)
57     {
58         context_ = context;
59         animationCallback_ = callback;
60     }
61 
SetContextAndCallbackAfterFirstAssign(const WeakPtr<PipelineBase> & context,const RenderNodeAnimationCallback & callback)62     void SetContextAndCallbackAfterFirstAssign(
63         const WeakPtr<PipelineBase>& context, const RenderNodeAnimationCallback& callback)
64     {
65         context_ = context;
66         animationCallback_ = callback;
67         isFirstAssign_ = false;
68     }
69 
GetAnimationOption()70     const AnimationOption& GetAnimationOption() const
71     {
72         return animationOption_;
73     }
74 
SetAnimationOption(const AnimationOption & option)75     void SetAnimationOption(const AnimationOption& option)
76     {
77         animationOption_ = option;
78     }
79 
SetAnimationStopCallback(const RenderNodeAnimationCallback & callback)80     void SetAnimationStopCallback(const RenderNodeAnimationCallback& callback)
81     {
82         stopCallback_ = callback;
83     }
84 
GetAnimationStatus()85     Animator::Status GetAnimationStatus() const
86     {
87         if (!animationController_) {
88             return Animator::Status::IDLE;
89         }
90         return animationController_->GetStatus();
91     }
92 
SetEvaluator(const RefPtr<Evaluator<double>> & evaluator)93     void SetEvaluator(const RefPtr<Evaluator<double>>& evaluator)
94     {
95         evaluator_ = evaluator;
96     }
97 
98     AnimatableDimension& operator=(const Dimension& newDimension);
99 
100     AnimatableDimension& operator=(const CalcDimension& newDimension);
101 
102     AnimatableDimension& operator=(const AnimatableDimension& newDimension);
103 
104     void MoveTo(double target);
105 
106 private:
107     void AnimateTo(double endValue);
108     void ResetController();
109     void OnAnimationCallback(double value);
110     void ResetAnimatableDimension();
111 
112 private:
113     bool isFirstAssign_ = true;
114     AnimationOption animationOption_;
115     RefPtr<Animator> animationController_;
116     WeakPtr<PipelineBase> context_;
117     RenderNodeAnimationCallback animationCallback_;
118     RenderNodeAnimationCallback stopCallback_;
119     RefPtr<Evaluator<double>> evaluator_;
120 };
121 
122 } // namespace OHOS::Ace
123 
124 #endif // FOUNDATION_ACE_FRAMEWORKS_BASE_GEOMETRY_ANIMATABLE_DIMENSION_H
125