From 45b7ec95dcdb3783cdc0c6b91a3994c842e7b710 Mon Sep 17 00:00:00 2001 From: David Hart Date: Sun, 18 Dec 2016 21:05:43 +0100 Subject: [PATCH] first step in replacing the prefix in objc from YG to YK to allow redefining enums without the Count item --- YogaKit/UIView+Yoga.h | 72 --------- YogaKit/UIView+YogaKit.h | 72 +++++++++ YogaKit/{UIView+Yoga.m => UIView+YogaKit.m} | 144 +++++++++--------- YogaKit/YKEnums.h | 96 ++++++++++++ .../YogaKit/YogaKit.xcodeproj/project.pbxproj | 70 +++------ .../UserInterfaceState.xcuserstate | Bin 17371 -> 24126 bytes YogaKit/YogaKit/YogaKit/YogaKit.h | 4 +- .../YogaKit/YogaKitSample/ViewController.m | 21 ++- enums.py | 25 ++- 9 files changed, 293 insertions(+), 211 deletions(-) delete mode 100644 YogaKit/UIView+Yoga.h create mode 100644 YogaKit/UIView+YogaKit.h rename YogaKit/{UIView+Yoga.m => UIView+YogaKit.m} (62%) create mode 100644 YogaKit/YKEnums.h diff --git a/YogaKit/UIView+Yoga.h b/YogaKit/UIView+Yoga.h deleted file mode 100644 index 386416b2..00000000 --- a/YogaKit/UIView+Yoga.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2014-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -@interface UIView (Yoga) - -/** - The property that decides if we should include this view when calculating layout. Defaults to YES. - */ -@property (nonatomic, readwrite, assign, setter=yg_setIncludeInLayout:) BOOL yg_includeInLayout; - -/** - The property that decides during layout/sizing whether or not yg_* properties should be applied. Defaults to NO. - */ -@property (nonatomic, readwrite, assign, setter=yg_setUsesYoga:) BOOL yg_usesYoga; - -- (void)yg_setDirection:(YGDirection)direction; -- (void)yg_setFlexDirection:(YGFlexDirection)flexDirection; -- (void)yg_setJustifyContent:(YGJustify)justifyContent; -- (void)yg_setAlignContent:(YGAlign)alignContent; -- (void)yg_setAlignItems:(YGAlign)alignItems; -- (void)yg_setAlignSelf:(YGAlign)alignSelf; -- (void)yg_setPositionType:(YGPositionType)positionType; -- (void)yg_setFlexWrap:(YGWrap)flexWrap; - -- (void)yg_setFlexGrow:(CGFloat)flexGrow; -- (void)yg_setFlexShrink:(CGFloat)flexShrink; -- (void)yg_setFlexBasis:(CGFloat)flexBasis; - -- (void)yg_setPosition:(CGFloat)position forEdge:(YGEdge)edge; -- (void)yg_setMargin:(CGFloat)margin forEdge:(YGEdge)edge; -- (void)yg_setPadding:(CGFloat)padding forEdge:(YGEdge)edge; - -- (void)yg_setWidth:(CGFloat)width; -- (void)yg_setHeight:(CGFloat)height; -- (void)yg_setMinWidth:(CGFloat)minWidth; -- (void)yg_setMinHeight:(CGFloat)minHeight; -- (void)yg_setMaxWidth:(CGFloat)maxWidth; -- (void)yg_setMaxHeight:(CGFloat)maxHeight; - -// Yoga specific properties, not compatible with flexbox specification -- (void)yg_setAspectRatio:(CGFloat)aspectRatio; - -/** - Get the resolved direction of this node. This won't be YGDirectionInherit - */ -- (YGDirection)yg_resolvedDirection; - -/** - Perform a layout calculation and update the frames of the views in the hierarchy with the results - */ -- (void)yg_applyLayout; - -/** - Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; - */ -- (CGSize)yg_intrinsicSize; - -/** - Returns the number of children that are using Flexbox. - */ -- (NSUInteger)yg_numberOfChildren; - -@end diff --git a/YogaKit/UIView+YogaKit.h b/YogaKit/UIView+YogaKit.h new file mode 100644 index 00000000..08fc4bd0 --- /dev/null +++ b/YogaKit/UIView+YogaKit.h @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import "YKEnums.h" + +@interface UIView (YogaKit) + +/** + The property that decides if we should include this view when calculating layout. Defaults to YES. + */ +@property (nonatomic, readwrite, assign, setter=yk_setIncludeInLayout:) BOOL yk_includeInLayout; + +/** + The property that decides during layout/sizing whether or not yk_* properties should be applied. Defaults to NO. + */ +@property (nonatomic, readwrite, assign, setter=yk_setUsesYoga:) BOOL yk_usesYoga; + +- (void)yk_setDirection:(YKDirection)direction; +- (void)yk_setFlexDirection:(YKFlexDirection)flexDirection; +- (void)yk_setJustifyContent:(YKJustify)justifyContent; +- (void)yk_setAlignContent:(YKAlign)alignContent; +- (void)yk_setAlignItems:(YKAlign)alignItems; +- (void)yk_setAlignSelf:(YKAlign)alignSelf; +- (void)yk_setPositionType:(YKPositionType)positionType; +- (void)yk_setFlexWrap:(YKWrap)flexWrap; + +- (void)yk_setFlexGrow:(CGFloat)flexGrow; +- (void)yk_setFlexShrink:(CGFloat)flexShrink; +- (void)yk_setFlexBasis:(CGFloat)flexBasis; + +- (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge; +- (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge; +- (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge; + +- (void)yk_setWidth:(CGFloat)width; +- (void)yk_setHeight:(CGFloat)height; +- (void)yk_setMinWidth:(CGFloat)minWidth; +- (void)yk_setMinHeight:(CGFloat)minHeight; +- (void)yk_setMaxWidth:(CGFloat)maxWidth; +- (void)yk_setMaxHeight:(CGFloat)maxHeight; + +// Yoga specific properties, not compatible with flexbox specification +- (void)yk_setAspectRatio:(CGFloat)aspectRatio; + +/** + Get the resolved direction of this node. This won't be YGDirectionInherit + */ +- (YKDirection)yk_resolvedDirection; + +/** + Perform a layout calculation and update the frames of the views in the hierarchy with the results + */ +- (void)yk_applyLayout; + +/** + Returns the size of the view if no constraints were given. This could equivalent to calling [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; + */ +- (CGSize)yk_intrinsicSize; + +/** + Returns the number of children that are using Flexbox. + */ +- (NSUInteger)yk_numberOfChildren; + +@end diff --git a/YogaKit/UIView+Yoga.m b/YogaKit/UIView+YogaKit.m similarity index 62% rename from YogaKit/UIView+Yoga.m rename to YogaKit/UIView+YogaKit.m index 241ad33e..46239f8f 100644 --- a/YogaKit/UIView+Yoga.m +++ b/YogaKit/UIView+YogaKit.m @@ -7,8 +7,8 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "UIView+Yoga.h" - +#import +#import #import @interface YGNodeBridge : NSObject @@ -37,164 +37,164 @@ } @end -@implementation UIView (Yoga) +@implementation UIView (YogaKit) -- (BOOL)yg_usesYoga +- (BOOL)yk_usesYoga { - NSNumber *usesYoga = objc_getAssociatedObject(self, @selector(yg_usesYoga)); + NSNumber *usesYoga = objc_getAssociatedObject(self, @selector(yk_usesYoga)); return [usesYoga boolValue]; } -- (BOOL)yg_includeInLayout +- (BOOL)yk_includeInLayout { - NSNumber *includeInLayout = objc_getAssociatedObject(self, @selector(yg_includeInLayout)); + NSNumber *includeInLayout = objc_getAssociatedObject(self, @selector(yk_includeInLayout)); return (includeInLayout != nil) ? [includeInLayout boolValue] : YES; } -- (NSUInteger)yg_numberOfChildren +- (NSUInteger)yk_numberOfChildren { return YGNodeGetChildCount([self ygNode]); } #pragma mark - Setters -- (void)yg_setIncludeInLayout:(BOOL)includeInLayout +- (void)yk_setIncludeInLayout:(BOOL)includeInLayout { objc_setAssociatedObject( self, - @selector(yg_includeInLayout), + @selector(yk_includeInLayout), @(includeInLayout), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -- (void)yg_setUsesYoga:(BOOL)enabled +- (void)yk_setUsesYoga:(BOOL)enabled { objc_setAssociatedObject( self, - @selector(yg_usesYoga), + @selector(yk_usesYoga), @(enabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -- (void)yg_setDirection:(YGDirection)direction +- (void)yk_setDirection:(YKDirection)direction { - YGNodeStyleSetDirection([self ygNode], direction); + YGNodeStyleSetDirection([self ygNode], (YGDirection)direction); } -- (void)yg_setFlexDirection:(YGFlexDirection)flexDirection +- (void)yk_setFlexDirection:(YKFlexDirection)flexDirection { - YGNodeStyleSetFlexDirection([self ygNode], flexDirection); + YGNodeStyleSetFlexDirection([self ygNode], (YGFlexDirection)flexDirection); } -- (void)yg_setJustifyContent:(YGJustify)justifyContent +- (void)yk_setJustifyContent:(YKJustify)justifyContent { - YGNodeStyleSetJustifyContent([self ygNode], justifyContent); + YGNodeStyleSetJustifyContent([self ygNode], (YGJustify)justifyContent); } -- (void)yg_setAlignContent:(YGAlign)alignContent +- (void)yk_setAlignContent:(YKAlign)alignContent { - YGNodeStyleSetAlignContent([self ygNode], alignContent); + YGNodeStyleSetAlignContent([self ygNode], (YGAlign)alignContent); } -- (void)yg_setAlignItems:(YGAlign)alignItems +- (void)yk_setAlignItems:(YKAlign)alignItems { - YGNodeStyleSetAlignItems([self ygNode], alignItems); + YGNodeStyleSetAlignItems([self ygNode], (YGAlign)alignItems); } -- (void)yg_setAlignSelf:(YGAlign)alignSelf +- (void)yk_setAlignSelf:(YKAlign)alignSelf { - YGNodeStyleSetAlignSelf([self ygNode], alignSelf); + YGNodeStyleSetAlignSelf([self ygNode], (YGAlign)alignSelf); } -- (void)yg_setPositionType:(YGPositionType)positionType +- (void)yk_setPositionType:(YKPositionType)positionType { - YGNodeStyleSetPositionType([self ygNode], positionType); + YGNodeStyleSetPositionType([self ygNode], (YGPositionType)positionType); } -- (void)yg_setFlexWrap:(YGWrap)flexWrap +- (void)yk_setFlexWrap:(YKWrap)flexWrap { - YGNodeStyleSetFlexWrap([self ygNode], flexWrap); + YGNodeStyleSetFlexWrap([self ygNode], (YGWrap)flexWrap); } -- (void)yg_setFlexGrow:(CGFloat)flexGrow +- (void)yk_setFlexGrow:(CGFloat)flexGrow { YGNodeStyleSetFlexGrow([self ygNode], flexGrow); } -- (void)yg_setFlexShrink:(CGFloat)flexShrink +- (void)yk_setFlexShrink:(CGFloat)flexShrink { YGNodeStyleSetFlexShrink([self ygNode], flexShrink); } -- (void)yg_setFlexBasis:(CGFloat)flexBasis +- (void)yk_setFlexBasis:(CGFloat)flexBasis { YGNodeStyleSetFlexBasis([self ygNode], flexBasis); } -- (void)yg_setPosition:(CGFloat)position forEdge:(YGEdge)edge +- (void)yk_setPosition:(CGFloat)position forEdge:(YKEdge)edge { - YGNodeStyleSetPosition([self ygNode], edge, position); + YGNodeStyleSetPosition([self ygNode], (YGEdge)edge, position); } -- (void)yg_setMargin:(CGFloat)margin forEdge:(YGEdge)edge +- (void)yk_setMargin:(CGFloat)margin forEdge:(YKEdge)edge { - YGNodeStyleSetMargin([self ygNode], edge, margin); + YGNodeStyleSetMargin([self ygNode], (YGEdge)edge, margin); } -- (void)yg_setPadding:(CGFloat)padding forEdge:(YGEdge)edge +- (void)yk_setPadding:(CGFloat)padding forEdge:(YKEdge)edge { - YGNodeStyleSetPadding([self ygNode], edge, padding); + YGNodeStyleSetPadding([self ygNode], (YGEdge)edge, padding); } -- (void)yg_setWidth:(CGFloat)width +- (void)yk_setWidth:(CGFloat)width { YGNodeStyleSetWidth([self ygNode], width); } -- (void)yg_setHeight:(CGFloat)height +- (void)yk_setHeight:(CGFloat)height { YGNodeStyleSetHeight([self ygNode], height); } -- (void)yg_setMinWidth:(CGFloat)minWidth +- (void)yk_setMinWidth:(CGFloat)minWidth { YGNodeStyleSetMinWidth([self ygNode], minWidth); } -- (void)yg_setMinHeight:(CGFloat)minHeight +- (void)yk_setMinHeight:(CGFloat)minHeight { YGNodeStyleSetMinHeight([self ygNode], minHeight); } -- (void)yg_setMaxWidth:(CGFloat)maxWidth +- (void)yk_setMaxWidth:(CGFloat)maxWidth { YGNodeStyleSetMaxWidth([self ygNode], maxWidth); } -- (void)yg_setMaxHeight:(CGFloat)maxHeight +- (void)yk_setMaxHeight:(CGFloat)maxHeight { YGNodeStyleSetMaxHeight([self ygNode], maxHeight); } -- (void)yg_setAspectRatio:(CGFloat)aspectRatio +- (void)yk_setAspectRatio:(CGFloat)aspectRatio { YGNodeStyleSetAspectRatio([self ygNode], aspectRatio); } #pragma mark - Layout and Sizing -- (YGDirection)yg_resolvedDirection +- (YKDirection)yk_resolvedDirection { - return YGNodeLayoutGetDirection([self ygNode]); + return (YKDirection)YGNodeLayoutGetDirection([self ygNode]); } -- (void)yg_applyLayout +- (void)yk_applyLayout { [self calculateLayoutWithSize:self.bounds.size]; - YGApplyLayoutToViewHierarchy(self); + YKApplyLayoutToViewHierarchy(self); } -- (CGSize)yg_intrinsicSize +- (CGSize)yk_intrinsicSize { const CGSize constrainedSize = { .width = YGUndefined, @@ -220,9 +220,9 @@ - (CGSize)calculateLayoutWithSize:(CGSize)size { NSAssert([NSThread isMainThread], @"YG Layout calculation must be done on main."); - NSAssert([self yg_usesYoga], @"YG Layout is not enabled for this view."); + NSAssert([self yk_usesYoga], @"YG Layout is not enabled for this view."); - YGAttachNodesFromViewHierachy(self); + YKAttachNodesFromViewHierachy(self); const YGNodeRef node = [self ygNode]; YGNodeCalculateLayout( @@ -237,7 +237,7 @@ }; } -static YGSize YGMeasureView( +static YGSize YKMeasureView( YGNodeRef node, float width, YGMeasureMode widthMode, @@ -254,12 +254,12 @@ static YGSize YGMeasureView( }]; return (YGSize) { - .width = YGSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode), - .height = YGSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode), + .width = YKSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode), + .height = YKSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode), }; } -static CGFloat YGSanitizeMeasurement( +static CGFloat YKSanitizeMeasurement( CGFloat constrainedSize, CGFloat measuredSize, YGMeasureMode measureMode) @@ -276,20 +276,20 @@ static CGFloat YGSanitizeMeasurement( return result; } -static void YGAttachNodesFromViewHierachy(UIView *view) { +static void YKAttachNodesFromViewHierachy(UIView *view) { YGNodeRef node = [view ygNode]; // Only leaf nodes should have a measure function - if (![view yg_usesYoga] || view.subviews.count == 0) { - YGNodeSetMeasureFunc(node, YGMeasureView); - YGRemoveAllChildren(node); + if (![view yk_usesYoga] || view.subviews.count == 0) { + YGNodeSetMeasureFunc(node, YKMeasureView); + YKRemoveAllChildren(node); } else { YGNodeSetMeasureFunc(node, NULL); // Create a list of all the subviews that we are going to use for layout. NSMutableArray *subviewsToInclude = [[NSMutableArray alloc] initWithCapacity:view.subviews.count]; for (UIView *subview in view.subviews) { - if ([subview yg_includeInLayout]) { + if ([subview yk_includeInLayout]) { [subviewsToInclude addObject:subview]; } } @@ -307,18 +307,18 @@ static void YGAttachNodesFromViewHierachy(UIView *view) { } if (shouldReconstructChildList) { - YGRemoveAllChildren(node); + YKRemoveAllChildren(node); for (int i = 0 ; i < subviewsToInclude.count; i++) { UIView *const subview = subviewsToInclude[i]; YGNodeInsertChild(node, [subview ygNode], i); - YGAttachNodesFromViewHierachy(subview); + YKAttachNodesFromViewHierachy(subview); } } } } -static void YGRemoveAllChildren(const YGNodeRef node) +static void YKRemoveAllChildren(const YGNodeRef node) { if (node == NULL) { return; @@ -329,7 +329,7 @@ static void YGRemoveAllChildren(const YGNodeRef node) } } -static CGFloat YGRoundPixelValue(CGFloat value) +static CGFloat YKRoundPixelValue(CGFloat value) { static CGFloat scale; static dispatch_once_t onceToken; @@ -340,9 +340,9 @@ static CGFloat YGRoundPixelValue(CGFloat value) return round(value * scale) / scale; } -static void YGApplyLayoutToViewHierarchy(UIView *view) { +static void YKApplyLayoutToViewHierarchy(UIView *view) { NSCAssert([NSThread isMainThread], @"Framesetting should only be done on the main thread."); - if (![view yg_includeInLayout]) { + if (![view yk_includeInLayout]) { return; } @@ -359,19 +359,19 @@ static void YGApplyLayoutToViewHierarchy(UIView *view) { view.frame = (CGRect) { .origin = { - .x = YGRoundPixelValue(topLeft.x), - .y = YGRoundPixelValue(topLeft.y), + .x = YKRoundPixelValue(topLeft.x), + .y = YKRoundPixelValue(topLeft.y), }, .size = { - .width = YGRoundPixelValue(bottomRight.x) - YGRoundPixelValue(topLeft.x), - .height = YGRoundPixelValue(bottomRight.y) - YGRoundPixelValue(topLeft.y), + .width = YKRoundPixelValue(bottomRight.x) - YKRoundPixelValue(topLeft.x), + .height = YKRoundPixelValue(bottomRight.y) - YKRoundPixelValue(topLeft.y), }, }; - const BOOL isLeaf = ![view yg_usesYoga] || view.subviews.count == 0; + const BOOL isLeaf = ![view yk_usesYoga] || view.subviews.count == 0; if (!isLeaf) { for (NSUInteger i = 0; i < view.subviews.count; i++) { - YGApplyLayoutToViewHierarchy(view.subviews[i]); + YKApplyLayoutToViewHierarchy(view.subviews[i]); } } } diff --git a/YogaKit/YKEnums.h b/YogaKit/YKEnums.h new file mode 100644 index 00000000..cc148d2b --- /dev/null +++ b/YogaKit/YKEnums.h @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +typedef NS_ENUM(NSInteger, YKFlexDirection) { + YKFlexDirectionColumn, + YKFlexDirectionColumnReverse, + YKFlexDirectionRow, + YKFlexDirectionRowReverse, +}; + +typedef NS_ENUM(NSInteger, YKMeasureMode) { + YKMeasureModeUndefined, + YKMeasureModeExactly, + YKMeasureModeAtMost, +}; + +typedef NS_ENUM(NSInteger, YKPrintOptions) { + YKPrintOptionsLayout = 1, + YKPrintOptionsStyle = 2, + YKPrintOptionsChildren = 4, +}; + +typedef NS_ENUM(NSInteger, YKEdge) { + YKEdgeLeft, + YKEdgeTop, + YKEdgeRight, + YKEdgeBottom, + YKEdgeStart, + YKEdgeEnd, + YKEdgeHorizontal, + YKEdgeVertical, + YKEdgeAll, +}; + +typedef NS_ENUM(NSInteger, YKPositionType) { + YKPositionTypeRelative, + YKPositionTypeAbsolute, +}; + +typedef NS_ENUM(NSInteger, YKDimension) { + YKDimensionWidth, + YKDimensionHeight, +}; + +typedef NS_ENUM(NSInteger, YKJustify) { + YKJustifyFlexStart, + YKJustifyCenter, + YKJustifyFlexEnd, + YKJustifySpaceBetween, + YKJustifySpaceAround, +}; + +typedef NS_ENUM(NSInteger, YKDirection) { + YKDirectionInherit, + YKDirectionLeftToRight, + YKDirectionRightToLeft, +}; + +typedef NS_ENUM(NSInteger, YKLogLevel) { + YKLogLevelError, + YKLogLevelWarn, + YKLogLevelInfo, + YKLogLevelDebug, + YKLogLevelVerbose, +}; + +typedef NS_ENUM(NSInteger, YKWrap) { + YKWrapNoWrap, + YKWrapWrap, +}; + +typedef NS_ENUM(NSInteger, YKOverflow) { + YKOverflowVisible, + YKOverflowHidden, + YKOverflowScroll, +}; + +typedef NS_ENUM(NSInteger, YKExperimentalFeature) { + YKExperimentalFeatureRounding, + YKExperimentalFeatureWebFlexBasis, +}; + +typedef NS_ENUM(NSInteger, YKAlign) { + YKAlignAuto, + YKAlignFlexStart, + YKAlignCenter, + YKAlignFlexEnd, + YKAlignStretch, +}; + diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj index f45f99ff..011a3824 100644 --- a/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj +++ b/YogaKit/YogaKit/YogaKit.xcodeproj/project.pbxproj @@ -11,13 +11,6 @@ 13687D4B1DF8748400E7C260 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D4A1DF8748400E7C260 /* AppDelegate.m */; }; 13687D4E1DF8748400E7C260 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D4D1DF8748400E7C260 /* ViewController.m */; }; 13687D531DF8748400E7C260 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13687D521DF8748400E7C260 /* Assets.xcassets */; }; - 13687D781DF878C600E7C260 /* YGEnums.h in yoga */ = {isa = PBXBuildFile; fileRef = 13687D5E1DF8778F00E7C260 /* YGEnums.h */; }; - 13687D791DF878C600E7C260 /* YGMacros.h in yoga */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; }; - 13687D7A1DF878C600E7C260 /* Yoga.h in yoga */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; }; - 13687D7C1DF878DD00E7C260 /* UIView+Yoga.h in YogaKit */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+Yoga.h */; }; - 13687D801DF87CEC00E7C260 /* UIView+Yoga.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */; }; - 13687D811DF87CF200E7C260 /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D601DF8778F00E7C260 /* YGNodeList.c */; }; - 13687D821DF87CF200E7C260 /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D621DF8778F00E7C260 /* Yoga.c */; }; 13687D851DF87D1E00E7C260 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13687D841DF87D1E00E7C260 /* UIKit.framework */; }; 13687D871DF87D2400E7C260 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13687D861DF87D2400E7C260 /* Foundation.framework */; }; 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -25,12 +18,12 @@ 63EE08451E06ED3D00EE5F9A /* YogaKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D601DF8778F00E7C260 /* YGNodeList.c */; }; 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = 13687D621DF8778F00E7C260 /* Yoga.c */; }; - 63EE084C1E06EEB700EE5F9A /* UIView+Yoga.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */; }; - 63EE084D1E06EECB00EE5F9A /* YGEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5E1DF8778F00E7C260 /* YGEnums.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D611DF8778F00E7C260 /* YGNodeList.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 63EE08511E06EECB00EE5F9A /* UIView+Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+Yoga.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE084C1E06EEB700EE5F9A /* UIView+YogaKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */; }; + 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D5F1DF8778F00E7C260 /* YGMacros.h */; }; + 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D611DF8778F00E7C260 /* YGNodeList.h */; }; + 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D631DF8778F00E7C260 /* Yoga.h */; }; + 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 63EE08521E06F3D100EE5F9A /* YKEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,30 +37,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 13687D771DF878A000E7C260 /* yoga */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/yoga; - dstSubfolderSpec = 16; - files = ( - 13687D781DF878C600E7C260 /* YGEnums.h in yoga */, - 13687D791DF878C600E7C260 /* YGMacros.h in yoga */, - 13687D7A1DF878C600E7C260 /* Yoga.h in yoga */, - ); - name = yoga; - runOnlyForDeploymentPostprocessing = 0; - }; - 13687D7B1DF878CE00E7C260 /* YogaKit */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/YogaKit; - dstSubfolderSpec = 16; - files = ( - 13687D7C1DF878DD00E7C260 /* UIView+Yoga.h in YogaKit */, - ); - name = YogaKit; - runOnlyForDeploymentPostprocessing = 0; - }; 63EE08491E06ED3D00EE5F9A /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -90,19 +59,19 @@ 13687D4D1DF8748400E7C260 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 13687D521DF8748400E7C260 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 13687D571DF8748400E7C260 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 13687D5E1DF8778F00E7C260 /* YGEnums.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGEnums.h; sourceTree = ""; }; 13687D5F1DF8778F00E7C260 /* YGMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGMacros.h; sourceTree = ""; }; 13687D601DF8778F00E7C260 /* YGNodeList.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = YGNodeList.c; sourceTree = ""; }; 13687D611DF8778F00E7C260 /* YGNodeList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YGNodeList.h; sourceTree = ""; }; 13687D621DF8778F00E7C260 /* Yoga.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = Yoga.c; sourceTree = ""; }; 13687D631DF8778F00E7C260 /* Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Yoga.h; sourceTree = ""; }; - 13687D691DF8778F00E7C260 /* UIView+Yoga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UIView+Yoga.h"; path = "../../UIView+Yoga.h"; sourceTree = ""; }; - 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UIView+Yoga.m"; path = "../../UIView+Yoga.m"; sourceTree = ""; }; + 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "UIView+YogaKit.h"; path = "../../UIView+YogaKit.h"; sourceTree = ""; }; + 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UIView+YogaKit.m"; path = "../../UIView+YogaKit.m"; sourceTree = ""; }; 13687D841DF87D1E00E7C260 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 13687D861DF87D2400E7C260 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 63EE083D1E06ED3D00EE5F9A /* YogaKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YogaKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YogaKit.h; sourceTree = ""; }; 63EE08401E06ED3D00EE5F9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63EE08521E06F3D100EE5F9A /* YKEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YKEnums.h; path = ../../YKEnums.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -170,7 +139,6 @@ 13687D5D1DF8778F00E7C260 /* yoga */ = { isa = PBXGroup; children = ( - 13687D5E1DF8778F00E7C260 /* YGEnums.h */, 13687D5F1DF8778F00E7C260 /* YGMacros.h */, 13687D601DF8778F00E7C260 /* YGNodeList.c */, 13687D611DF8778F00E7C260 /* YGNodeList.h */, @@ -195,8 +163,9 @@ children = ( 13687D5D1DF8778F00E7C260 /* yoga */, 63EE083F1E06ED3D00EE5F9A /* YogaKit.h */, - 13687D691DF8778F00E7C260 /* UIView+Yoga.h */, - 13687D6A1DF8778F00E7C260 /* UIView+Yoga.m */, + 63EE08521E06F3D100EE5F9A /* YKEnums.h */, + 13687D691DF8778F00E7C260 /* UIView+YogaKit.h */, + 13687D6A1DF8778F00E7C260 /* UIView+YogaKit.m */, 63EE08401E06ED3D00EE5F9A /* Info.plist */, ); path = YogaKit; @@ -210,8 +179,8 @@ buildActionMask = 2147483647; files = ( 63EE08411E06ED3D00EE5F9A /* YogaKit.h in Headers */, - 63EE08511E06EECB00EE5F9A /* UIView+Yoga.h in Headers */, - 63EE084D1E06EECB00EE5F9A /* YGEnums.h in Headers */, + 63EE08531E06F3D100EE5F9A /* YKEnums.h in Headers */, + 63EE08511E06EECB00EE5F9A /* UIView+YogaKit.h in Headers */, 63EE084E1E06EECB00EE5F9A /* YGMacros.h in Headers */, 63EE084F1E06EECB00EE5F9A /* YGNodeList.h in Headers */, 63EE08501E06EECB00EE5F9A /* Yoga.h in Headers */, @@ -225,8 +194,6 @@ isa = PBXNativeTarget; buildConfigurationList = 13687D5A1DF8748400E7C260 /* Build configuration list for PBXNativeTarget "YogaKitSample" */; buildPhases = ( - 13687D771DF878A000E7C260 /* yoga */, - 13687D7B1DF878CE00E7C260 /* YogaKit */, 13687D3F1DF8748300E7C260 /* Sources */, 13687D401DF8748300E7C260 /* Frameworks */, 13687D411DF8748300E7C260 /* Resources */, @@ -266,7 +233,7 @@ 13687D3B1DF8748300E7C260 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0820; ORGANIZATIONNAME = facebook; TargetAttributes = { 13687D421DF8748300E7C260 = { @@ -321,11 +288,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 13687D801DF87CEC00E7C260 /* UIView+Yoga.m in Sources */, 13687D4E1DF8748400E7C260 /* ViewController.m in Sources */, 13687D4B1DF8748400E7C260 /* AppDelegate.m in Sources */, - 13687D821DF87CF200E7C260 /* Yoga.c in Sources */, - 13687D811DF87CF200E7C260 /* YGNodeList.c in Sources */, 13687D481DF8748400E7C260 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -336,7 +300,7 @@ files = ( 63EE084A1E06EEB700EE5F9A /* YGNodeList.c in Sources */, 63EE084B1E06EEB700EE5F9A /* Yoga.c in Sources */, - 63EE084C1E06EEB700EE5F9A /* UIView+Yoga.m in Sources */, + 63EE084C1E06EEB700EE5F9A /* UIView+YogaKit.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -369,6 +333,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -416,6 +381,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; diff --git a/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate b/YogaKit/YogaKit/YogaKit.xcodeproj/project.xcworkspace/xcuserdata/david.xcuserdatad/UserInterfaceState.xcuserstate index 0dc901d6216607cbef2d34b50cb95ba680df8b0c..33536713a50be1596623da79b922b35bc5b5f981 100644 GIT binary patch literal 24126 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 - - +#import diff --git a/YogaKit/YogaKit/YogaKitSample/ViewController.m b/YogaKit/YogaKit/YogaKitSample/ViewController.m index a13dae6f..40ab77b0 100644 --- a/YogaKit/YogaKit/YogaKitSample/ViewController.m +++ b/YogaKit/YogaKit/YogaKitSample/ViewController.m @@ -7,8 +7,7 @@ */ #import "ViewController.h" - -#import +#import @interface ViewController () @@ -20,17 +19,17 @@ { UIView *root = self.view; root.backgroundColor = [UIColor redColor]; - [root yg_setUsesYoga:YES]; - [root yg_setWidth:self.view.bounds.size.width]; - [root yg_setHeight:self.view.bounds.size.height]; - [root yg_setAlignItems:YGAlignCenter]; - [root yg_setJustifyContent:YGJustifyCenter]; + [root yk_setUsesYoga:YES]; + [root yk_setWidth:self.view.bounds.size.width]; + [root yk_setHeight:self.view.bounds.size.height]; + [root yk_setAlignItems:YKAlignCenter]; + [root yk_setJustifyContent:YKJustifyCenter]; UIView *child1 = [UIView new]; child1.backgroundColor = [UIColor blueColor]; - [child1 yg_setUsesYoga:YES]; - [child1 yg_setWidth:100]; - [child1 yg_setHeight:100]; + [child1 yk_setUsesYoga:YES]; + [child1 yk_setWidth:100]; + [child1 yk_setHeight:100]; UIView *child2 = [UIView new]; child2.backgroundColor = [UIColor greenColor]; @@ -53,7 +52,7 @@ [child2 addSubview:child3]; [root addSubview:child1]; [root addSubview:child2]; - [root yg_applyLayout]; + [root yk_applyLayout]; } diff --git a/enums.py b/enums.py index d2fc6dc0..b12203f0 100644 --- a/enums.py +++ b/enums.py @@ -89,6 +89,14 @@ ENUMS = { ], } +OBJC_ENUMS = { + 'Direction': [ + 'Inherit', + 'LeftToRight', + 'RightToLeft', + ] +} + LICENSE = """/** * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. @@ -111,7 +119,7 @@ def to_java_upper(symbol): return out -root = os.path.dirname(__file__) +root = os.path.dirname(os.path.abspath(__file__)) # write out C header with open(root + '/yoga/YGEnums.h', 'w') as f: @@ -187,3 +195,18 @@ for name, values in ENUMS.items(): f.write(' %s,\n' % value) f.write(' }\n') f.write('}\n') + +# write out objc files +with open(root + '/YogaKit/YKEnums.h', 'w') as f: + objc_enums = ENUMS + objc_enums.update(OBJC_ENUMS) + f.write(LICENSE) + for name, values in objc_enums.items(): + f.write('typedef NS_ENUM(NSInteger, YK%s) {\n' % name) + for value in values: + if isinstance(value, tuple): + f.write(' YK%s%s = %d,\n' % (name, value[0], value[1])) + else: + f.write(' YK%s%s,\n' % (name, value)) + f.write('};\n') + f.write('\n')