Hibit_iOS/Pods/IGListKit/Source/IGListKit/IGListSectionController.m
2024-06-07 17:54:29 +08:00

133 lines
4.4 KiB
Objective-C

/*
* Copyright (c) Meta Platforms, Inc. and 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"
#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)
#import "IGListAssert.h"
#import "IGListMacros.h"
#else
#import <IGListDiffKit/IGListAssert.h>
#import <IGListDiffKit/IGListMacros.h>
#endif
static NSString * const kIGListSectionControllerThreadKey = @"kIGListSectionControllerThreadKey";
@interface IGListSectionControllerThreadContext : NSObject
@property (nonatomic, weak) UIViewController *viewController;
@property (nonatomic, weak) id<IGListCollectionContext> collectionContext;
@end
@implementation IGListSectionControllerThreadContext
@end
static NSMutableArray<IGListSectionControllerThreadContext *> *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<IGListCollectionContext> 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 {}
- (BOOL)shouldSelectItemAtIndex:(NSInteger)index {
return YES;
}
- (BOOL)shouldDeselectItemAtIndex:(NSInteger)index {
return YES;
}
- (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__);
}
- (void)willDisplayCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter {
[self.displayDelegate listAdapter:listAdapter willDisplaySectionController:self cell:cell atIndex:index];
}
- (void)didEndDisplayingCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter {
[self.displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:self cell:cell atIndex:index];
}
- (void)willDisplaySectionControllerWithListAdapter:(IGListAdapter *)listAdapter {
[self.displayDelegate listAdapter:listAdapter willDisplaySectionController:self];
}
- (void)didEndDisplayingSectionControllerWithListAdapter:(IGListAdapter *)listAdapter {
[self.displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:self];
}
@end