ComponentKit/Core/CKComponentEvents.mm (76 lines of code) (raw):
/*
* 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 "CKComponentEvents.h"
#import <ComponentKit/CKInternalHelpers.h>
#import "CKComponentInternal.h"
#import "CKComponentControllerInternal.h"
#import "CKComponentSubclass.h"
#import "CKComponentProtocol.h"
#import "CKDataSourceItem.h"
#import "CKDataSourceState.h"
BOOL CKComponentBoundsAnimationPredicate(id<CKComponentProtocol> component)
{
if ([component.class isSubclassOfClass:[CKComponent class]]) {
return [(CKComponent *)component hasBoundsAnimations];
} else {
return NO;
}
}
/** Filter components that their controllers override the 'didPrepareLayout:ForComponent:' method. */
BOOL CKComponentDidPrepareLayoutForComponentToControllerPredicate(id<CKComponentProtocol> component)
{
if ([component.class isSubclassOfClass:[CKComponent class]]) {
return [(CKComponent *)component controllerOverridesDidPrepareLayout];
} else {
return NO;
}
}
auto CKComponentHasAnimationsOnInitialMountPredicate(id<CKMountable> const c) -> BOOL
{
if ([c.class isSubclassOfClass:[CKComponent class]]) {
return [(CKComponent *)c hasInitialMountAnimations];
} else {
return NO;
}
}
auto CKComponentHasAnimationsFromPreviousComponentPredicate(id<CKMountable> const c) -> BOOL
{
if ([c.class isSubclassOfClass:[CKComponent class]]) {
return [(CKComponent *)c hasAnimations];
} else {
return NO;
}
}
auto CKComponentHasAnimationsOnFinalUnmountPredicate(id<CKMountable> const c) -> BOOL
{
if ([c.class isSubclassOfClass:[CKComponent class]]) {
return [(CKComponent *)c hasFinalUnmountAnimations];
} else {
return NO;
}
}
void CKComponentSendDidPrepareLayoutForComponent(id<CKComponentScopeEnumeratorProvider> scopeEnumeratorProvider, const CKComponentRootLayout &layout)
{
// Iterate over the components that their controllers override the 'didPrepareLayoutForComponent' method.
[scopeEnumeratorProvider enumerateComponentsMatchingPredicate:&CKComponentDidPrepareLayoutForComponentToControllerPredicate
block:^(id<CKComponentProtocol> c) {
CKComponent *component = (CKComponent *)c;
const RCLayout componentLayout = layout.cachedLayoutForComponent(component);
[component.controller didPrepareLayout:componentLayout forComponent:component];
}];
}
void CKComponentSendDidPrepareLayoutForComponentsWithIndexPaths(id<NSFastEnumeration> indexPaths,
CKDataSourceState *state)
{
for (NSIndexPath *indexPath in indexPaths) {
CKDataSourceItem *item = [state objectAtIndexPath:indexPath];
CKComponentSendDidPrepareLayoutForComponent(item.scopeRoot, item.rootLayout);
}
}
void CKComponentUpdateComponentForComponentControllerWithIndexPaths(id<NSFastEnumeration> indexPaths,
CKDataSourceState *state)
{
for (NSIndexPath *indexPath in indexPaths) {
CKDataSourceItem *item = [state objectAtIndexPath:indexPath];
item.rootLayout.enumerateCachedLayout(^(const RCLayout &layout) {
const auto component = (CKComponent *)layout.component;
component.controller.latestComponent = component;
});
}
}