libs-gui/Source/NSCollectionViewLayout.m

492 lines
11 KiB
Objective-C

/* Implementation of class NSCollectionViewLayout
Copyright (C) 2021 Free Software Foundation, Inc.
By: Gregory John Casamento
Date: 30-05-2021
This file is part of the GNUstep Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110 USA.
*/
#import "AppKit/NSCollectionViewLayout.h"
#import "AppKit/NSCollectionViewItem.h"
#import "GSFastEnumeration.h"
@interface NSCollectionView (__NSCollectionViewLayout__)
- (NSMapTable *) itemsToAttributes;
@end
@implementation NSCollectionView (__NSCollectionViewLayout__)
- (NSMapTable *) itemsToAttributes
{
return _itemsToAttributes;
}
@end
@implementation NSCollectionViewLayoutAttributes
// Initializers
+ (instancetype) layoutAttributesForItemWithIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
+ (instancetype) layoutAttributesForInterItemGapBeforeIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
+ (instancetype) layoutAttributesForSupplementaryViewOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
withIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
+ (instancetype)layoutAttributesForDecorationViewOfKind: (NSCollectionViewDecorationElementKind)decorationViewKind
withIndexPath: (NSIndexPath*)indexPath
{
return nil;
}
// Properties
- (NSRect) frame
{
return _frame;
}
- (void) setFrame: (NSRect)frame
{
_frame = frame;
}
- (NSSize) size
{
return _size;
}
- (void) setSize: (NSSize)size
{
_size = size;
}
- (CGFloat) alpha
{
return _alpha;
}
- (void) setAlpha: (CGFloat)alpha
{
_alpha = alpha;
}
- (BOOL) isHidden
{
return _hidden;
}
- (void) setHidden: (BOOL)hidden
{
_hidden = hidden;
}
- (NSIndexPath *) indexPath
{
return _indexPath;
}
- (void) setIndexPath: (NSIndexPath *)indexPath
{
_indexPath = indexPath;
}
- (NSInteger) zIndex
{
return _zIndex;
}
- (void) setZIndex: (NSInteger)zIndex
{
_zIndex = zIndex;
}
- (NSCollectionElementCategory) representedElementCategory
{
return _representedElementCategory;
}
- (NSString *) representedElementKind
{
return _representedElementKind;
}
// Copying
- (id) copyWithZone: (NSZone *)z
{
NSCollectionViewLayoutAttributes *a = [[NSCollectionViewLayoutAttributes allocWithZone: z] init];
[a setFrame: [self frame]];
[a setSize: [self size]];
[a setAlpha: [self alpha]];
[a setHidden: [self isHidden]];
[a setIndexPath: [self indexPath]];
[a setZIndex: [self zIndex]];
return self;
}
- (NSString *) description
{
return [NSString stringWithFormat: @"%@ - f = %@, s = %@, alpha = %f, z = %ld",
[super description], NSStringFromRect(_frame), NSStringFromSize(_size),
_alpha, _zIndex];
}
@end
@implementation NSCollectionViewUpdateItem
- (NSIndexPath *) indexPathBeforeUpdate
{
return _indexPathBeforeUpdate;
}
- (NSIndexPath *) indexPathAfterUpdate
{
return _indexPathAfterUpdate;
}
- (NSCollectionUpdateAction) updateAction
{
return _updateAction;
}
@end
@implementation NSCollectionViewLayoutInvalidationContext
// Initializers
- (void)invalidateItemsAtIndexPaths: (NSSet *)indexPaths
{
}
- (void)invalidateSupplementaryElementsOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
atIndexPaths: (NSSet *)indexPaths
{
}
- (void)invalidateDecorationElementsOfKind: (NSCollectionViewDecorationElementKind)elementKind
atIndexPaths: (NSSet *)indexPaths
{
}
// Properties
- (BOOL) invalidateEverything
{
return YES;
}
- (BOOL) invalidateDataSourceCounts
{
return YES;
}
- (NSSet *) invalidatedItemIndexPaths
{
return _invalidatedItemIndexPaths;
}
- (NSPoint) contentOffsetAdjustment
{
return _contentOffsetAdjustment;
}
- (void) setContentOffsetAdjustment: (NSPoint)point
{
_contentOffsetAdjustment = point;
}
- (NSSize) contentSizeAdjustment
{
return _contentSizeAdjustment;
}
- (void) setContentSizeAdjustment: (NSSize)size
{
_contentSizeAdjustment = size;
}
- (NSDictionary *) invalidatedSupplementaryIndexPaths
{
return _invalidatedSupplementaryIndexPaths;
}
- (NSDictionary *) invalidatedDecorationIndexPaths
{
return _invalidatedDecorationIndexPaths;
}
@end
@implementation NSCollectionViewLayout
// Initializers
- (void) _initDefaults
{
// _itemsToAttributes = [[NSMutableDictionary alloc] init];
}
- (void)invalidateLayout
{
_valid = NO;
[_collectionView reloadData];
}
- (void)invalidateLayoutWithContext:(NSCollectionViewLayoutInvalidationContext *)context
{
}
- (void)registerClass: (Class)viewClass
forDecorationViewOfKind: (NSCollectionViewDecorationElementKind)elementKind
{
}
- (void)registerNib: (NSNib *)nib
forDecorationViewOfKind: (NSCollectionViewDecorationElementKind)elementKind
{
}
// Properties
- (NSCollectionView *) collectionView
{
return _collectionView;
}
- (void) setCollectionView: (NSCollectionView *)cv
{
_collectionView = cv;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
}
- (instancetype) initWithCoder: (NSCoder *)coder
{
self = [super init];
if (self != nil)
{
[self _initDefaults];
}
return self;
}
@end
@implementation NSCollectionViewLayout (NSSubclassingHooks)
// Methods to override for specific layouts...
- (void) prepareLayout
{
_valid = YES;
}
- (NSArray *) layoutAttributesForElementsInRect: (NSRect)rect
{
NSMutableArray *result = [NSMutableArray array];
NSArray *items = [_collectionView visibleItems];
NSMapTable *itemsToAttributes = [_collectionView itemsToAttributes];
FOR_IN(NSCollectionViewItem*, i, items)
{
NSView *v = [i view];
NSRect f = [v frame];
BOOL intersects = NSIntersectsRect(f, rect);
if (intersects)
{
NSCollectionViewLayoutAttributes *a = [itemsToAttributes objectForKey: i];
[result addObject: a]; // add item since it intersects
}
}
END_FOR_IN(items);
return result;
}
- (NSCollectionViewLayoutAttributes *) layoutAttributesForItemAtIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)
layoutAttributesForSupplementaryViewOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
atIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)
layoutAttributesForDecorationViewOfKind: (NSCollectionViewDecorationElementKind)elementKind
atIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)layoutAttributesForDropTargetAtPoint: (NSPoint)pointInCollectionView
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)layoutAttributesForInterItemGapBeforeIndexPath: (NSIndexPath *)indexPath
{
return nil;
}
- (BOOL) shouldInvalidateLayoutForBoundsChange: (NSRect)newBounds
{
return NO;
}
- (NSCollectionViewLayoutInvalidationContext *)invalidationContextForBoundsChange: (NSRect)newBounds
{
return nil;
}
- (BOOL)shouldInvalidateLayoutForPreferredLayoutAttributes: (NSCollectionViewLayoutAttributes *)preferredAttributes
withOriginalAttributes: (NSCollectionViewLayoutAttributes *)originalAttributes
{
return NO;
}
- (NSCollectionViewLayoutInvalidationContext *)
invalidationContextForPreferredLayoutAttributes: (NSCollectionViewLayoutAttributes *)preferredAttributes
withOriginalAttributes: (NSCollectionViewLayoutAttributes *)originalAttributes
{
return nil;
}
- (NSPoint) targetContentOffsetForProposedContentOffset: (NSPoint)proposedContentOffset
withScrollingVelocity: (NSPoint)velocity
{
return NSZeroPoint;
}
- (NSPoint) targetContentOffsetForProposedContentOffset: (NSPoint)proposedContentOffset
{
return NSZeroPoint;
}
- (NSSize) collectionViewContentSize
{
return [_collectionView frame].size;
}
@end
@implementation NSCollectionViewLayout (NSUpdateSupportHooks)
// Update support
- (void) prepareForCollectionViewUpdates: (NSArray *)updateItems
{
}
- (void) finalizeCollectionViewUpdates
{
}
- (void) prepareForAnimatedBoundsChange: (NSRect)oldBounds
{
}
- (void) finalizeAnimatedBoundsChange
{
}
- (void) prepareForTransitionToLayout: (NSCollectionViewLayout *)newLayout
{
}
- (void) prepareForTransitionFromLayout: (NSCollectionViewLayout *)oldLayout
{
}
- (void) finalizeLayoutTransition
{
}
- (NSCollectionViewLayoutAttributes *) initialLayoutAttributesForAppearingItemAtIndexPath: (NSIndexPath *)itemIndexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *) finalLayoutAttributesForDisappearingItemAtIndexPath: (NSIndexPath *)itemIndexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)
initialLayoutAttributesForAppearingSupplementaryElementOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
atIndexPath: (NSIndexPath *)elementIndexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)
finalLayoutAttributesForDisappearingSupplementaryElementOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
atIndexPath: (NSIndexPath *)elementIndexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)
initialLayoutAttributesForAppearingDecorationElementOfKind: (NSCollectionViewDecorationElementKind)elementKind
atIndexPath: (NSIndexPath *)decorationIndexPath
{
return nil;
}
- (NSCollectionViewLayoutAttributes *)
finalLayoutAttributesForDisappearingDecorationElementOfKind: (NSCollectionViewDecorationElementKind)elementKind
atIndexPath: (NSIndexPath *)decorationIndexPath
{
return nil;
}
- (NSSet *)indexPathsToDeleteForSupplementaryViewOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
{
return nil;
}
- (NSSet *)indexPathsToDeleteForDecorationViewOfKind: (NSCollectionViewDecorationElementKind)elementKind
{
return nil;
}
- (NSSet *)indexPathsToInsertForSupplementaryViewOfKind: (NSCollectionViewSupplementaryElementKind)elementKind
{
return nil;
}
- (NSSet *)indexPathsToInsertForDecorationViewOfKind: (NSCollectionViewDecorationElementKind)elementKind
{
return nil;
}
@end