mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-05 04:10:16 +00:00
* [Yoga] Rewrite YOGA_TREE_CONTIGUOUS mode with support for mixing with ASLayoutSpec. After experimentation with the ASYogaLayoutSpec (or non-contiguous) approach to integrating Yoga, test results and feedback from the authors of Yoga have shown that this approach can't be made completely correct, There are issues with some of the features required to represent Web-style flexbox; in particular: padding, margins, and border handling have varience. This diff is a first step towards a truly correct and elegant implementation of Yoga integration with Texture. In addition to reducing the footprint of the integration, which is an explicit goal of work at this stage, these changes already support improved behavior - including mixing between ASLayoutSpecs even as subnodes of Yoga layout-driven nodes, in addition to above them. Yoga may be used for any set of nodes. Because Yoga usage is limited at this time, it's safe to merge this diff and further improvements will be refinements in this direction. * [ASDKgram] Add Yoga layout implementation for PhotoCellNode. * [Yoga] Final fixes for the upgraded implementation of the Contiguous layout mode. * [Yoga] Add CHANGELOG.md entry and fix for Yoga rounding to screen scale. * [Yoga] Minor cleanup to remove old comments and generalize utility methods.
82 lines
3.0 KiB
Objective-C
82 lines
3.0 KiB
Objective-C
//
|
|
// ASYogaUtilities.h
|
|
// Texture
|
|
//
|
|
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
|
|
#import <AsyncDisplayKit/ASAvailability.h>
|
|
|
|
#if YOGA /* YOGA */
|
|
|
|
#import <AsyncDisplayKit/ASLayout.h>
|
|
#import <AsyncDisplayKit/ASDisplayNode+Beta.h>
|
|
|
|
#define ASYogaLog(...) //NSLog(__VA_ARGS__)
|
|
|
|
@interface ASDisplayNode (YogaHelpers)
|
|
|
|
+ (ASDisplayNode *)yogaNode;
|
|
+ (ASDisplayNode *)verticalYogaStack;
|
|
+ (ASDisplayNode *)horizontalYogaStack;
|
|
|
|
@end
|
|
|
|
extern void ASDisplayNodePerformBlockOnEveryYogaChild(ASDisplayNode *node, void(^block)(ASDisplayNode *node));
|
|
|
|
ASDISPLAYNODE_EXTERN_C_BEGIN
|
|
|
|
#pragma mark - Yoga Type Conversion Helpers
|
|
|
|
YGAlign yogaAlignItems(ASStackLayoutAlignItems alignItems);
|
|
YGJustify yogaJustifyContent(ASStackLayoutJustifyContent justifyContent);
|
|
YGAlign yogaAlignSelf(ASStackLayoutAlignSelf alignSelf);
|
|
YGFlexDirection yogaFlexDirection(ASStackLayoutDirection direction);
|
|
float yogaFloatForCGFloat(CGFloat value);
|
|
float yogaDimensionToPoints(ASDimension dimension);
|
|
float yogaDimensionToPercent(ASDimension dimension);
|
|
ASDimension dimensionForEdgeWithEdgeInsets(YGEdge edge, ASEdgeInsets insets);
|
|
|
|
void ASLayoutElementYogaUpdateMeasureFunc(YGNodeRef yogaNode, id <ASLayoutElement> layoutElement);
|
|
YGSize ASLayoutElementYogaMeasureFunc(YGNodeRef yogaNode,
|
|
float width, YGMeasureMode widthMode,
|
|
float height, YGMeasureMode heightMode);
|
|
|
|
#pragma mark - Yoga Style Setter Helpers
|
|
|
|
#define YGNODE_STYLE_SET_DIMENSION(yogaNode, property, dimension) \
|
|
if (dimension.unit == ASDimensionUnitPoints) { \
|
|
YGNodeStyleSet##property(yogaNode, yogaDimensionToPoints(dimension)); \
|
|
} else if (dimension.unit == ASDimensionUnitFraction) { \
|
|
YGNodeStyleSet##property##Percent(yogaNode, yogaDimensionToPercent(dimension)); \
|
|
} else { \
|
|
YGNodeStyleSet##property(yogaNode, YGUndefined); \
|
|
}\
|
|
|
|
#define YGNODE_STYLE_SET_DIMENSION_WITH_EDGE(yogaNode, property, dimension, edge) \
|
|
if (dimension.unit == ASDimensionUnitPoints) { \
|
|
YGNodeStyleSet##property(yogaNode, edge, yogaDimensionToPoints(dimension)); \
|
|
} else if (dimension.unit == ASDimensionUnitFraction) { \
|
|
YGNodeStyleSet##property##Percent(yogaNode, edge, yogaDimensionToPercent(dimension)); \
|
|
} else { \
|
|
YGNodeStyleSet##property(yogaNode, edge, YGUndefined); \
|
|
} \
|
|
|
|
#define YGNODE_STYLE_SET_FLOAT_WITH_EDGE(yogaNode, property, dimension, edge) \
|
|
if (dimension.unit == ASDimensionUnitPoints) { \
|
|
YGNodeStyleSet##property(yogaNode, edge, yogaDimensionToPoints(dimension)); \
|
|
} else if (dimension.unit == ASDimensionUnitFraction) { \
|
|
ASDisplayNodeAssert(NO, @"Unexpected Fraction value in applying ##property## values to YGNode"); \
|
|
} else { \
|
|
YGNodeStyleSet##property(yogaNode, edge, YGUndefined); \
|
|
} \
|
|
|
|
ASDISPLAYNODE_EXTERN_C_END
|
|
|
|
#endif /* YOGA */
|