1 /*
2 * Copyright (c) 2021 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_ANIMATION_PROPERTY_ANIMATABLE_HELPER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_ANIMATION_PROPERTY_ANIMATABLE_HELPER_H
18 
19 #include <functional>
20 
21 #include "base/geometry/dimension.h"
22 #include "core/components/common/properties/border.h"
23 #include "core/components/common/properties/edge.h"
24 #include "core/components/common/properties/radius.h"
25 
26 namespace OHOS::Ace {
27 
28 class BorderEdgeHelper {
29 public:
30     using Setter = void (Border::*)(const BorderEdge&);
31     using Getter = const BorderEdge& (Border::*)() const;
32 
BorderEdgeHelper(Setter setter,Getter getter)33     BorderEdgeHelper(Setter setter, Getter getter) : setter_(setter), getter_(getter) {}
34     ~BorderEdgeHelper() = default;
35 
Get(const Border & border)36     const BorderEdge& Get(const Border& border) const
37     {
38         return std::bind(getter_, &border)();
39     }
40 
Set(double value,Border * border)41     bool Set(double value, Border* border) const
42     {
43         if (LessNotEqual(value, 0.0)) {
44             return false;
45         }
46         BorderEdge edge = Get(*border);
47         Dimension width = edge.GetWidth();
48         if (NearEqual(value, width.Value())) {
49             return false;
50         }
51         width.SetValue(value);
52         edge.SetWidth(width);
53         std::bind(setter_, border, edge)();
54         return true;
55     }
56 
Set(Color value,Border * border)57     bool Set(Color value, Border* border) const
58     {
59         BorderEdge edge = Get(*border);
60         if (edge.GetColor() == value) {
61             return false;
62         }
63         edge.SetColor(value);
64         std::bind(setter_, border, edge)();
65         return true;
66     }
67 
Set(BorderStyle value,Border * border)68     bool Set(BorderStyle value, Border* border) const
69     {
70         BorderEdge edge = Get(*border);
71         if (edge.GetBorderStyle() == value) {
72             return false;
73         }
74         edge.SetStyle(value);
75         std::bind(setter_, border, edge)();
76         return true;
77     }
78 
79 private:
80     Setter setter_ = nullptr;
81     Getter getter_ = nullptr;
82 };
83 
84 class BorderRadiusHelper {
85 public:
86     using Setter = void (Border::*)(const Radius&);
87     using Getter = const Radius& (Border::*)() const;
88 
BorderRadiusHelper(Setter setter,Getter getter)89     BorderRadiusHelper(Setter setter, Getter getter) : setter_(setter), getter_(getter) {}
90     ~BorderRadiusHelper() = default;
91 
Get(const Border & border)92     float Get(const Border& border) const
93     {
94         return std::bind(getter_, &border)().GetX().Value();
95     }
96 
Set(double value,Border * border)97     bool Set(double value, Border* border) const
98     {
99         if (LessNotEqual(value, 0.0)) {
100             return false;
101         }
102         float oldValue = Get(*border);
103         if (NearEqual(oldValue, value)) {
104             return false;
105         }
106         std::bind(setter_, border, Radius(value))();
107         return true;
108     }
109 
110 private:
111     Setter setter_ = nullptr;
112     Getter getter_ = nullptr;
113 };
114 
115 class DimensionHelper {
116 public:
117     using Getter = const AnimatableDimension& (Edge::*)() const;
118     using Setter = void (Edge::*)(const AnimatableDimension&);
119 
DimensionHelper(Setter setter,Getter getter)120     DimensionHelper(Setter setter, Getter getter) : setter_(setter), getter_(getter) {}
121     ~DimensionHelper() = default;
122 
Get(const Edge & edge)123     const AnimatableDimension& Get(const Edge& edge) const
124     {
125         return std::bind(getter_, &edge)();
126     }
127 
Set(const AnimatableDimension & value,Edge * edge)128     bool Set(const AnimatableDimension& value, Edge* edge) const
129     {
130         if (LessNotEqual(value.Value(), 0.0)) {
131             return false;
132         }
133         AnimatableDimension old = Get(*edge);
134         if (old == value) {
135             return false;
136         }
137         std::bind(setter_, edge, value)();
138         return true;
139     }
140 
141 private:
142     Setter setter_ = nullptr;
143     Getter getter_ = nullptr;
144 };
145 
146 } // namespace OHOS::Ace
147 
148 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_ANIMATION_PROPERTY_ANIMATABLE_HELPER_H
149