You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
5.7 KiB
112 lines
5.7 KiB
/*****************************************************************************
|
|
* VLCLibraryCollectionView.m: MacOS X interface module
|
|
*****************************************************************************
|
|
* Copyright (C) 2024 VLC authors and VideoLAN
|
|
*
|
|
* Authors: Claudio Cambra <developer@claudiocambra.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
#import "VLCLibraryCollectionView.h"
|
|
|
|
#import "library/VLCLibraryCollectionViewDelegate.h"
|
|
#import "library/VLCLibraryCollectionViewFlowLayout.h"
|
|
#import "library/VLCLibraryUIUnits.h"
|
|
|
|
NSString * const VLCLibraryCollectionViewItemAdjustmentBigger = @"VLCLibraryCollectionViewItemAdjustmentBigger";
|
|
NSString * const VLCLibraryCollectionViewItemAdjustmentSmaller = @"VLCLibraryCollectionViewItemAdjustmentSmaller";
|
|
|
|
@implementation VLCLibraryCollectionView
|
|
|
|
- (void)layout
|
|
{
|
|
// Manually invalidate the collection view layout when we are going to layout the view; this
|
|
// fixes issues with the collection view item size calculations not always being updated when
|
|
// they should be
|
|
[self.collectionViewLayout invalidateLayout];
|
|
[super layout];
|
|
}
|
|
|
|
- (void)keyDown:(NSEvent *)event
|
|
{
|
|
if (![self.collectionViewLayout isKindOfClass:VLCLibraryCollectionViewFlowLayout.class] ||
|
|
![self.delegate isKindOfClass:VLCLibraryCollectionViewDelegate.class] ||
|
|
!(event.modifierFlags & NSCommandKeyMask)) {
|
|
return;
|
|
}
|
|
|
|
const unichar key = [event.charactersIgnoringModifiers.lowercaseString characterAtIndex:0];
|
|
if (key != '+' && key != '-') {
|
|
return;
|
|
}
|
|
|
|
VLCLibraryCollectionViewFlowLayout * const layout =
|
|
(VLCLibraryCollectionViewFlowLayout *)self.collectionViewLayout;
|
|
VLCLibraryCollectionViewDelegate * const delegate =
|
|
(VLCLibraryCollectionViewDelegate *)self.delegate;
|
|
VLCCollectionViewItemSizing * const currentRowItemSizing =
|
|
[VLCLibraryUIUnits adjustedItemSizingForCollectionView:self
|
|
withLayout:layout
|
|
withItemsAspectRatio:delegate.itemsAspectRatio];
|
|
if (currentRowItemSizing.rowItemCount <= VLCLibraryUIUnits.collectionViewMinItemsInRow && key == '+') {
|
|
return;
|
|
} else if (currentRowItemSizing.itemSize.width <= VLCLibraryUIUnits.collectionViewItemMinimumWidth && key == '-') {
|
|
return;
|
|
}
|
|
|
|
NSUserDefaults * const defaults = NSUserDefaults.standardUserDefaults;
|
|
NSInteger collectionViewAdjustment =
|
|
[defaults integerForKey:VLCLibraryCollectionViewItemAdjustmentKey];
|
|
NSNotification *notification;
|
|
if (key == '+') {
|
|
collectionViewAdjustment--;
|
|
notification =
|
|
[NSNotification notificationWithName:VLCLibraryCollectionViewItemAdjustmentBigger
|
|
object:self];
|
|
} else if (key == '-') {
|
|
if (currentRowItemSizing.rowItemCount == VLCLibraryUIUnits.collectionViewMinItemsInRow && currentRowItemSizing.unclampedRowItemCount <= VLCLibraryUIUnits.collectionViewMinItemsInRow) {
|
|
// The adjustment works independently of the size of the collection view, which can lead
|
|
// to situations where the adjustment is very negative and is being clamped to ensure we
|
|
// do not go below the minimum items in row value. However, that means that when trying
|
|
// to make collection view items smaller via a larger adjustment value, the user could
|
|
// press CMD - multiple times before any change is visible to them (this can happen when
|
|
// the collection view size has shrunk, for instance).
|
|
//
|
|
// To work around this we make a big adjustment that immediately provides visual
|
|
// feedback. To do this we calculate what the adjustment must be to get the row item
|
|
// count to be the minimum row item count value + 1.
|
|
//
|
|
// The unclampedRowItemCount is the number of items in row post-adjustment, so we need
|
|
// to retrieve the original, unclamped, unadjusted row item count. We then work out the
|
|
// difference between the unclamped&unadjusted row item count and the minimum row item
|
|
// count:
|
|
// <adjustment> = <min items in row> - (<unclamped row item count> - <old adjustment>)
|
|
//
|
|
// To finish, we add 1 to visually change the row item count and show more items.
|
|
collectionViewAdjustment = VLCLibraryUIUnits.collectionViewMinItemsInRow - (currentRowItemSizing.unclampedRowItemCount - collectionViewAdjustment) + 1;
|
|
} else {
|
|
++collectionViewAdjustment;
|
|
}
|
|
notification =
|
|
[NSNotification notificationWithName:VLCLibraryCollectionViewItemAdjustmentSmaller
|
|
object:self];
|
|
}
|
|
[defaults setInteger:collectionViewAdjustment forKey:VLCLibraryCollectionViewItemAdjustmentKey];
|
|
[NSNotificationCenter.defaultCenter postNotification:notification];
|
|
[self.collectionViewLayout invalidateLayout];
|
|
}
|
|
|
|
@end
|
|
|