/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "IGListSectionControllerInternal.h" #import #import static NSString * const kIGListSectionControllerThreadKey = @"kIGListSectionControllerThreadKey"; @interface IGListSectionControllerThreadContext : NSObject @property (nonatomic, weak) UIViewController *viewController; @property (nonatomic, weak) id collectionContext; @end @implementation IGListSectionControllerThreadContext @end static NSMutableArray *threadContextStack(void) { IGAssertMainThread(); NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; NSMutableArray *stack = threadDictionary[kIGListSectionControllerThreadKey]; if (stack == nil) { stack = [NSMutableArray new]; threadDictionary[kIGListSectionControllerThreadKey] = stack; } return stack; } void IGListSectionControllerPushThread(UIViewController *viewController, id collectionContext) { IGListSectionControllerThreadContext *context = [IGListSectionControllerThreadContext new]; context.viewController = viewController; context.collectionContext = collectionContext; [threadContextStack() addObject:context]; } void IGListSectionControllerPopThread(void) { NSMutableArray *stack = threadContextStack(); IGAssert(stack.count > 0, @"IGListSectionController thread stack is empty"); [stack removeLastObject]; } @implementation IGListSectionController - (instancetype)init { if (self = [super init]) { IGListSectionControllerThreadContext *context = [threadContextStack() lastObject]; _viewController = context.viewController; _collectionContext = context.collectionContext; if (_collectionContext == nil) { IGLKLog(@"Warning: Creating %@ outside of -[IGListAdapterDataSource listAdapter:sectionControllerForObject:]. Collection context and view controller will be set later.", NSStringFromClass([self class])); } _minimumInteritemSpacing = 0.0; _minimumLineSpacing = 0.0; _inset = UIEdgeInsetsZero; _section = NSNotFound; } return self; } - (NSInteger)numberOfItems { return 1; } - (CGSize)sizeForItemAtIndex:(NSInteger)index { return CGSizeZero; } - (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index { IGFailAssert(@"Section controller %@ must override %s:", self, __PRETTY_FUNCTION__); return nil; } - (void)didUpdateToObject:(id)object {} - (void)didSelectItemAtIndex:(NSInteger)index {} - (void)didDeselectItemAtIndex:(NSInteger)index {} - (void)didHighlightItemAtIndex:(NSInteger)index {} - (void)didUnhighlightItemAtIndex:(NSInteger)index {} - (BOOL)canMoveItemAtIndex:(NSInteger)index { return NO; } - (BOOL)canMoveItemAtIndex:(NSInteger)sourceItemIndex toIndex:(NSInteger)destinationItemIndex { return [self canMoveItemAtIndex:sourceItemIndex]; } - (void)moveObjectFromIndex:(NSInteger)sourceIndex toIndex:(NSInteger)destinationIndex { IGFailAssert(@"Section controller %@ must override %s if interactive reordering is enabled.", self, __PRETTY_FUNCTION__); } @end