mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-08 13:42:51 +00:00
Initial attempt to get display traits working with ASEnvironment. To get proper ASDisplayTraits support, you must use an ASViewController. The ASViewController implements UITraitCollection-related methods (`traitCollectionDidChange:`, `willTransitionToTraitCollection:withTransitionCoordinator:`, viewWillTransitionToSize:withTransitionCoordinator`) to update the internal ASDisplayTraits and propagate them to subnodes. ASTableNode and ASCollectionNode don't actually have their cells as subnodes, so a little bit of trickery is involved (on `setEnvironment:` the table/collection node gets its data controllers completedNodes and propagates the new traits. see `ASDisplayTraitsCollectionTableSetEnvironmentState`). The data controller also passes the current display traits when creating new cells. ASViewController also supports the ability to return a custom set of display traits. So if you have a modal dialog that should always be told it is in a compact size class, you can set the override block before displaying the VC. A new example, called Display Traits, has been added. It shows how display traits can be used in a ASViewController with a normal ASDisplayNode as its root, as well as in ASViewControllers hosting table nodes and collection nodes. There is also an example of overriding the default display traits of a VC. Please provide feedback!
80 lines
3.5 KiB
Objective-C
80 lines
3.5 KiB
Objective-C
/*
|
|
* 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 "ASEnvironment.h"
|
|
|
|
#pragma once
|
|
|
|
BOOL ASEnvironmentStateUpwardPropagationEnabled();
|
|
BOOL ASEnvironmentStateDownwardPropagationEnabled();
|
|
|
|
|
|
#pragma mark - Set and get extensible values for layout options
|
|
|
|
void _ASEnvironmentLayoutOptionsExtensionSetBoolAtIndex(id<ASEnvironment> object, int idx, BOOL value);
|
|
BOOL _ASEnvironmentLayoutOptionsExtensionGetBoolAtIndex(id<ASEnvironment> object, int idx);
|
|
|
|
void _ASEnvironmentLayoutOptionsExtensionSetIntegerAtIndex(id<ASEnvironment> object, int idx, NSInteger value);
|
|
NSInteger _ASEnvironmentLayoutOptionsExtensionGetIntegerAtIndex(id<ASEnvironment> object, int idx);
|
|
|
|
void _ASEnvironmentLayoutOptionsExtensionSetEdgeInsetsAtIndex(id<ASEnvironment> object, int idx, UIEdgeInsets value);
|
|
UIEdgeInsets _ASEnvironmentLayoutOptionsExtensionGetEdgeInsetsAtIndex(id<ASEnvironment> object, int idx);
|
|
|
|
|
|
#pragma mark - Traversing an ASEnvironment Tree
|
|
|
|
void ASEnvironmentPerformBlockOnObjectAndChildren(id<ASEnvironment> object, void(^block)(id<ASEnvironment> object));
|
|
void ASEnvironmentPerformBlockOnObjectAndParents(id<ASEnvironment> object, void(^block)(id<ASEnvironment> object));
|
|
|
|
|
|
#pragma mark -
|
|
|
|
enum class ASEnvironmentStatePropagation { DOWN, UP };
|
|
|
|
|
|
#pragma mark - Merging
|
|
|
|
static const struct ASEnvironmentStateExtensions ASEnvironmentDefaultStateExtensions = {};
|
|
|
|
static const struct ASEnvironmentLayoutOptionsState ASEnvironmentDefaultLayoutOptionsState = {};
|
|
ASEnvironmentState ASEnvironmentMergeObjectAndState(ASEnvironmentState environmentState, ASEnvironmentLayoutOptionsState state, ASEnvironmentStatePropagation propagation);
|
|
|
|
static const struct ASEnvironmentHierarchyState ASEnvironmentDefaultHierarchyState = {};
|
|
ASEnvironmentState ASEnvironmentMergeObjectAndState(ASEnvironmentState environmentState, ASEnvironmentHierarchyState state, ASEnvironmentStatePropagation propagation);
|
|
|
|
static const struct ASDisplayTraits ASEnvironmentDefaultDisplayTraits = {};
|
|
ASEnvironmentState ASEnvironmentMergeObjectAndState(ASEnvironmentState environmentState, ASDisplayTraits state, ASEnvironmentStatePropagation propagation);
|
|
|
|
|
|
#pragma mark - Propagation
|
|
|
|
template <typename ASEnvironmentStateType>
|
|
void ASEnvironmentStatePropagateDown(id<ASEnvironment> object, ASEnvironmentStateType state) {
|
|
ASEnvironmentPerformBlockOnObjectAndChildren(object, ^(id<ASEnvironment> node) {
|
|
object.environmentState = ASEnvironmentMergeObjectAndState(object.environmentState, state, ASEnvironmentStatePropagation::DOWN);
|
|
});
|
|
}
|
|
|
|
template <typename ASEnvironmentStateType>
|
|
void ASEnvironmentStatePropagateUp(id<ASEnvironment> object, ASEnvironmentStateType state) {
|
|
ASEnvironmentPerformBlockOnObjectAndParents(object, ^(id<ASEnvironment> node) {
|
|
object.environmentState = ASEnvironmentMergeObjectAndState(object.environmentState, state, ASEnvironmentStatePropagation::UP);
|
|
});
|
|
}
|
|
|
|
template <typename ASEnvironmentStateType>
|
|
void ASEnvironmentStateApply(id<ASEnvironment> object, ASEnvironmentStateType& state, ASEnvironmentStatePropagation propagate) {
|
|
if (propagate == ASEnvironmentStatePropagation::DOWN) {
|
|
ASEnvironmentStatePropagateUp(object, state);
|
|
} else if (propagate == ASEnvironmentStatePropagation::UP) {
|
|
ASEnvironmentStatePropagateDown(object, state);
|
|
}
|
|
}
|