diff --git a/YogaKit/YGLayout.m b/YogaKit/YGLayout.m index 221b4cde..23cee161 100644 --- a/YogaKit/YGLayout.m +++ b/YogaKit/YGLayout.m @@ -10,69 +10,94 @@ #import "YGLayout+Private.h" #import "UIView+Yoga.h" -#define YG_STYLE_PROPERTY_IMPL(type, lowercased_name, capitalized_name) \ -- (type)lowercased_name \ -{ \ - return YGNodeStyleGet##capitalized_name(self.node); \ -} \ - \ -- (void)set##capitalized_name:(type)lowercased_name \ -{ \ - YGNodeStyleSet##capitalized_name(self.node, lowercased_name); \ +#define YG_PROPERTY(type, lowercased_name, capitalized_name) \ +- (type)lowercased_name \ +{ \ + return YGNodeStyleGet##capitalized_name(self.node); \ +} \ + \ +- (void)set##capitalized_name:(type)lowercased_name \ +{ \ + YGNodeStyleSet##capitalized_name(self.node, lowercased_name); \ } -#define YG_STYLE_EDGE_PROPERTY_IMPL(lowercased_name, capitalized_name, property, edge) \ -- (CGFloat)lowercased_name { \ - return YGNodeStyleGet##property(self.node, edge); \ -} \ - \ -- (void)set##capitalized_name:(CGFloat)lowercased_name { \ - YGNodeStyleSet##property(self.node, edge, lowercased_name); \ +#define YG_VALUE_PROPERTY(lowercased_name, capitalized_name) \ +- (CGFloat)lowercased_name \ +{ \ + YGValue value = YGNodeStyleGet##capitalized_name(self.node); \ + if (value.unit == YGUnitPixel) { \ + return value.value; \ + } else { \ + return YGUndefined; \ + } \ +} \ + \ +- (void)set##capitalized_name:(CGFloat)lowercased_name \ +{ \ + YGNodeStyleSet##capitalized_name(self.node, lowercased_name); \ } -#define YG_STYLE_VALUE_PROPERTY_IMPL(lowercased_name, capitalized_name) \ -- (CGFloat)lowercased_name \ -{ \ - YGValue value = YGNodeStyleGet##capitalized_name(self.node); \ - if (value.unit == YGUnitPixel) { \ - return value.value; \ - } else { \ - return YGUndefined; \ - } \ -} \ - \ -- (void)set##capitalized_name:(CGFloat)lowercased_name \ -{ \ - YGNodeStyleSet##capitalized_name(self.node, lowercased_name); \ +#define YG_EDGE_PROPERTY_GETTER(lowercased_name, capitalized_name, property, edge) \ +- (CGFloat)lowercased_name \ +{ \ + return YGNodeStyleGet##property(self.node, edge); \ } -#define YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(objc_lowercased_name, objc_capitalized_name, c_name, edge) \ -- (CGFloat)objc_lowercased_name \ -{ \ - if (edge <= YGEdgeEnd) { \ - YGValue value = YGNodeStyleGet##c_name(self.node, edge); \ - if (value.unit == YGUnitPixel) { \ - return value.value; \ - } \ - } \ - return YGUndefined; \ -} \ - \ -- (void)set##objc_capitalized_name:(CGFloat)objc_lowercased_name \ -{ \ - YGNodeStyleSet##c_name(self.node, edge, objc_lowercased_name); \ +#define YG_SHORTHAND_EDGE_PROPERTY_GETTER(lowercased_name) \ +- (CGFloat)lowercased_name \ +{ \ + return YGUndefined; \ } -#define YG_STYLE_ALL_EDGE_PROPERTY_UNIT_IMPL(lowercased_name, capitalized_name) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Left, capitalized_name##Left, capitalized_name, YGEdgeLeft) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Top, capitalized_name##Top, capitalized_name, YGEdgeTop) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Right, capitalized_name##Right, capitalized_name, YGEdgeRight) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Bottom, capitalized_name##Bottom, capitalized_name, YGEdgeBottom) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Start, capitalized_name##Start, capitalized_name, YGEdgeStart) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##End, capitalized_name##End, capitalized_name, YGEdgeEnd) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Horizontal, capitalized_name##Horizontal, capitalized_name, YGEdgeHorizontal) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name##Vertical, capitalized_name##Vertical, capitalized_name, YGEdgeVertical) \ -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name, capitalized_name, capitalized_name, YGEdgeAll) +#define YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) \ +- (void)set##capitalized_name:(CGFloat)lowercased_name \ +{ \ + YGNodeStyleSet##property(self.node, edge, lowercased_name); \ +} + +#define YG_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \ +YG_EDGE_PROPERTY_GETTER(lowercased_name, capitalized_name, property, edge) \ +YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) + +#define YG_SHORTHAND_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \ +YG_SHORTHAND_EDGE_PROPERTY_GETTER(lowercased_name) \ +YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) + +#define YG_VALUE_EDGE_PROPERTY_GETTER(objc_lowercased_name, objc_capitalized_name, c_name, edge) \ +- (CGFloat)objc_lowercased_name \ +{ \ + YGValue value = YGNodeStyleGet##c_name(self.node, edge); \ + if (value.unit == YGUnitPixel) { \ + return value.value; \ + } else { \ + return YGUndefined; \ + } \ +} + +#define YG_VALUE_EDGE_PROPERTY_SETTER(objc_lowercased_name, objc_capitalized_name, c_name, edge) \ +- (void)set##objc_capitalized_name:(CGFloat)objc_lowercased_name \ +{ \ + YGNodeStyleSet##c_name(self.node, edge, objc_lowercased_name); \ +} + +#define YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \ +YG_VALUE_EDGE_PROPERTY_GETTER(lowercased_name, capitalized_name, property, edge) \ +YG_VALUE_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) + +#define YG_VALUE_SHORTHAND_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \ +YG_SHORTHAND_EDGE_PROPERTY_GETTER(lowercased_name) \ +YG_VALUE_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) + +#define YG_VALUE_EDGES_PROPERTIES(lowercased_name, capitalized_name) \ +YG_VALUE_EDGE_PROPERTY(lowercased_name##Left, capitalized_name##Left, capitalized_name, YGEdgeLeft) \ +YG_VALUE_EDGE_PROPERTY(lowercased_name##Top, capitalized_name##Top, capitalized_name, YGEdgeTop) \ +YG_VALUE_EDGE_PROPERTY(lowercased_name##Right, capitalized_name##Right, capitalized_name, YGEdgeRight) \ +YG_VALUE_EDGE_PROPERTY(lowercased_name##Bottom, capitalized_name##Bottom, capitalized_name, YGEdgeBottom) \ +YG_VALUE_EDGE_PROPERTY(lowercased_name##Start, capitalized_name##Start, capitalized_name, YGEdgeStart) \ +YG_VALUE_EDGE_PROPERTY(lowercased_name##End, capitalized_name##End, capitalized_name, YGEdgeEnd) \ +YG_VALUE_SHORTHAND_EDGE_PROPERTY(lowercased_name##Horizontal, capitalized_name##Horizontal, capitalized_name, YGEdgeHorizontal) \ +YG_VALUE_SHORTHAND_EDGE_PROPERTY(lowercased_name##Vertical, capitalized_name##Vertical, capitalized_name, YGEdgeVertical) \ +YG_VALUE_SHORTHAND_EDGE_PROPERTY(lowercased_name, capitalized_name, capitalized_name, YGEdgeAll) @interface YGLayout () @@ -148,43 +173,43 @@ YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(lowercased_name, capitalized_name, capitalized_ YGNodeStyleSetPositionType(self.node, position); } -YG_STYLE_PROPERTY_IMPL(YGDirection, direction, Direction) -YG_STYLE_PROPERTY_IMPL(YGFlexDirection, flexDirection, FlexDirection) -YG_STYLE_PROPERTY_IMPL(YGJustify, justifyContent, JustifyContent) -YG_STYLE_PROPERTY_IMPL(YGAlign, alignContent, AlignContent) -YG_STYLE_PROPERTY_IMPL(YGAlign, alignItems, AlignItems) -YG_STYLE_PROPERTY_IMPL(YGAlign, alignSelf, AlignSelf) -YG_STYLE_PROPERTY_IMPL(YGWrap, flexWrap, FlexWrap) -YG_STYLE_PROPERTY_IMPL(YGOverflow, overflow, Overflow) +YG_PROPERTY(YGDirection, direction, Direction) +YG_PROPERTY(YGFlexDirection, flexDirection, FlexDirection) +YG_PROPERTY(YGJustify, justifyContent, JustifyContent) +YG_PROPERTY(YGAlign, alignContent, AlignContent) +YG_PROPERTY(YGAlign, alignItems, AlignItems) +YG_PROPERTY(YGAlign, alignSelf, AlignSelf) +YG_PROPERTY(YGWrap, flexWrap, FlexWrap) +YG_PROPERTY(YGOverflow, overflow, Overflow) -YG_STYLE_PROPERTY_IMPL(CGFloat, flexGrow, FlexGrow) -YG_STYLE_PROPERTY_IMPL(CGFloat, flexShrink, FlexShrink) -YG_STYLE_VALUE_PROPERTY_IMPL(flexBasis, FlexBasis) +YG_PROPERTY(CGFloat, flexGrow, FlexGrow) +YG_PROPERTY(CGFloat, flexShrink, FlexShrink) +YG_VALUE_PROPERTY(flexBasis, FlexBasis) -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(left, Left, Position, YGEdgeLeft) -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(top, Top, Position, YGEdgeTop) -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(right, Right, Position, YGEdgeRight) -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(bottom, Bottom, Position, YGEdgeBottom) -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(start, Start, Position, YGEdgeStart) -YG_STYLE_EDGE_PROPERTY_UNIT_IMPL(end, End, Position, YGEdgeEnd) -YG_STYLE_ALL_EDGE_PROPERTY_UNIT_IMPL(margin, Margin) -YG_STYLE_ALL_EDGE_PROPERTY_UNIT_IMPL(padding, Padding) +YG_VALUE_EDGE_PROPERTY(left, Left, Position, YGEdgeLeft) +YG_VALUE_EDGE_PROPERTY(top, Top, Position, YGEdgeTop) +YG_VALUE_EDGE_PROPERTY(right, Right, Position, YGEdgeRight) +YG_VALUE_EDGE_PROPERTY(bottom, Bottom, Position, YGEdgeBottom) +YG_VALUE_EDGE_PROPERTY(start, Start, Position, YGEdgeStart) +YG_VALUE_EDGE_PROPERTY(end, End, Position, YGEdgeEnd) +YG_VALUE_EDGES_PROPERTIES(margin, Margin) +YG_VALUE_EDGES_PROPERTIES(padding, Padding) -YG_STYLE_EDGE_PROPERTY_IMPL(borderLeftWidth, BorderLeftWidth, Border, YGEdgeLeft) -YG_STYLE_EDGE_PROPERTY_IMPL(borderTopWidth, BorderTopWidth, Border, YGEdgeTop) -YG_STYLE_EDGE_PROPERTY_IMPL(borderRightWidth, BorderRightWidth, Border, YGEdgeRight) -YG_STYLE_EDGE_PROPERTY_IMPL(borderBottomWidth, BorderBottomWidth, Border, YGEdgeBottom) -YG_STYLE_EDGE_PROPERTY_IMPL(borderStartWidth, BorderStartWidth, Border, YGEdgeStart) -YG_STYLE_EDGE_PROPERTY_IMPL(borderEndWidth, BorderEndWidth, Border, YGEdgeEnd) -YG_STYLE_EDGE_PROPERTY_IMPL(borderWidth, BorderWidth, Border, YGEdgeAll) +YG_EDGE_PROPERTY(borderLeftWidth, BorderLeftWidth, Border, YGEdgeLeft) +YG_EDGE_PROPERTY(borderTopWidth, BorderTopWidth, Border, YGEdgeTop) +YG_EDGE_PROPERTY(borderRightWidth, BorderRightWidth, Border, YGEdgeRight) +YG_EDGE_PROPERTY(borderBottomWidth, BorderBottomWidth, Border, YGEdgeBottom) +YG_EDGE_PROPERTY(borderStartWidth, BorderStartWidth, Border, YGEdgeStart) +YG_EDGE_PROPERTY(borderEndWidth, BorderEndWidth, Border, YGEdgeEnd) +YG_SHORTHAND_EDGE_PROPERTY(borderWidth, BorderWidth, Border, YGEdgeAll) -YG_STYLE_VALUE_PROPERTY_IMPL(width, Width) -YG_STYLE_VALUE_PROPERTY_IMPL(height, Height) -YG_STYLE_VALUE_PROPERTY_IMPL(minWidth, MinWidth) -YG_STYLE_VALUE_PROPERTY_IMPL(minHeight, MinHeight) -YG_STYLE_VALUE_PROPERTY_IMPL(maxWidth, MaxWidth) -YG_STYLE_VALUE_PROPERTY_IMPL(maxHeight, MaxHeight) -YG_STYLE_PROPERTY_IMPL(CGFloat, aspectRatio, AspectRatio) +YG_VALUE_PROPERTY(width, Width) +YG_VALUE_PROPERTY(height, Height) +YG_VALUE_PROPERTY(minWidth, MinWidth) +YG_VALUE_PROPERTY(minHeight, MinHeight) +YG_VALUE_PROPERTY(maxWidth, MaxWidth) +YG_VALUE_PROPERTY(maxHeight, MaxHeight) +YG_PROPERTY(CGFloat, aspectRatio, AspectRatio) #pragma mark - Layout and Sizing