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