Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
8d15cd84 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Add VLCCollectionViewItemSizing class

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
1d67fa94 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Add method to UI units to retrieve both item size and number of items 
in row

Also use this for the old item size method

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
7c21557c by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: More efficiently calculate item sizing for dynamic collection views

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
6c83be93 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Prevent resizing collection view items beyond two items in row

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
e4e20d86 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Prevent resizing collection view items beyond unreasonable small size

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
783fe646 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Prevent crash from trying to access collectionViewContentSize before 
layout finalised

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
465920a2 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Provide unclamped row item count in item sizing object

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
049391fa by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Fix pressing CMD - having no visual effect after collection view 
becomes smaller

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
e839c874 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Move kMinItemsInCollectionViewRow into a property of VLCLibraryUIUnits

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
97980fd4 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Prevent uint overflow causing item sizing to get crushed

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
d9076332 by Claudio Cambra at 2025-02-11T09:20:40+00:00
macosx: Fix wrong operator used in calculation of collection view adjustment

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -


3 changed files:

- modules/gui/macosx/library/VLCLibraryCollectionView.m
- modules/gui/macosx/library/VLCLibraryUIUnits.h
- modules/gui/macosx/library/VLCLibraryUIUnits.m


Changes:

=====================================
modules/gui/macosx/library/VLCLibraryCollectionView.m
=====================================
@@ -22,6 +22,7 @@
 
 #import "VLCLibraryCollectionView.h"
 
+#import "library/VLCLibraryCollectionViewDelegate.h"
 #import "library/VLCLibraryCollectionViewFlowLayout.h"
 #import "library/VLCLibraryUIUnits.h"
 
@@ -42,6 +43,7 @@ NSString * const 
VLCLibraryCollectionViewItemAdjustmentSmaller = @"VLCLibraryCol
 - (void)keyDown:(NSEvent *)event
 {
     if (![self.collectionViewLayout 
isKindOfClass:VLCLibraryCollectionViewFlowLayout.class] ||
+        ![self.delegate isKindOfClass:VLCLibraryCollectionViewDelegate.class] 
||
         !(event.modifierFlags & NSCommandKeyMask)) {
         return;
     }
@@ -51,6 +53,20 @@ NSString * const 
VLCLibraryCollectionViewItemAdjustmentSmaller = @"VLCLibraryCol
         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];
@@ -61,7 +77,29 @@ NSString * const 
VLCLibraryCollectionViewItemAdjustmentSmaller = @"VLCLibraryCol
             [NSNotification 
notificationWithName:VLCLibraryCollectionViewItemAdjustmentBigger
                                           object:self];
     } else if (key == '-') {
-        collectionViewAdjustment++;
+        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];


=====================================
modules/gui/macosx/library/VLCLibraryUIUnits.h
=====================================
@@ -33,6 +33,14 @@ NS_ASSUME_NONNULL_BEGIN
 
 extern NSString * const VLCLibraryCollectionViewItemAdjustmentKey;
 
+@interface VLCCollectionViewItemSizing: NSObject
+
+@property (readwrite) NSInteger unclampedRowItemCount;
+@property (readwrite) NSUInteger rowItemCount;
+@property (readwrite) NSSize itemSize;
+
+@end
+
 @interface VLCLibraryUIUnits : NSObject
 
 // Note that these values are not necessarily linked to the layout defined in 
the .xib files.
@@ -58,6 +66,8 @@ extern NSString * const 
VLCLibraryCollectionViewItemAdjustmentKey;
 
 @property (class, readonly) const CGFloat 
dynamicCollectionViewItemMinimumWidth;
 @property (class, readonly) const CGFloat 
dynamicCollectionViewItemMaximumWidth;
+@property (class, readonly) const CGFloat collectionViewItemMinimumWidth;
+@property (class, readonly) const unsigned short collectionViewMinItemsInRow;
 
 @property (class, readonly) const CGFloat collectionViewItemSpacing;
 @property (class, readonly) const NSEdgeInsets collectionViewSectionInsets;
@@ -88,6 +98,10 @@ extern NSString * const 
VLCLibraryCollectionViewItemAdjustmentKey;
                                                      
withLayout:(VLCLibraryCollectionViewFlowLayout *)collectionViewLayout
                                            
withItemsAspectRatio:(VLCLibraryCollectionViewItemAspectRatio)itemsAspectRatio;
 
++ (VLCCollectionViewItemSizing 
*)adjustedItemSizingForCollectionView:(NSCollectionView *)collectionView
+                                                          
withLayout:(VLCLibraryCollectionViewFlowLayout *)collectionViewLayout
+                                                
withItemsAspectRatio:(VLCLibraryCollectionViewItemAspectRatio)itemsAspectRatio;
+
 @end
 
 NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/library/VLCLibraryUIUnits.m
=====================================
@@ -36,6 +36,9 @@
 
 NSString * const VLCLibraryCollectionViewItemAdjustmentKey = 
@"VLCLibraryCollectionViewItemAdjustmentKey";
 
+@implementation VLCCollectionViewItemSizing
+@end
+
 @implementation VLCLibraryUIUnits
 
 + (const CGFloat)largeSpacing
@@ -113,6 +116,16 @@ NSString * const VLCLibraryCollectionViewItemAdjustmentKey 
= @"VLCLibraryCollect
     return 200;
 }
 
++ (const CGFloat)collectionViewItemMinimumWidth
+{
+    return 40;
+}
+
++ (const unsigned short)collectionViewMinItemsInRow
+{
+    return 2;
+}
+
 + (const CGFloat)collectionViewItemSpacing
 {
     return [self largeSpacing];
@@ -128,40 +141,41 @@ NSString * const 
VLCLibraryCollectionViewItemAdjustmentKey = @"VLCLibraryCollect
                                                      
withLayout:(VLCLibraryCollectionViewFlowLayout *)collectionViewLayout
                                            
withItemsAspectRatio:(VLCLibraryCollectionViewItemAspectRatio)itemsAspectRatio
 {
-    uint numItemsInRow = 5;
-    static const uint kMinItemsInCollectionViewRow = 1;
-
-    NSSize itemSize = [self itemSizeForCollectionView:collectionView
-                                           withLayout:collectionViewLayout
-                                 withItemsAspectRatio:itemsAspectRatio
-                               withNumberOfItemsInRow:numItemsInRow];
-
-    while (itemSize.width > 
VLCLibraryUIUnits.dynamicCollectionViewItemMaximumWidth) {
-        ++numItemsInRow;
-        itemSize = [self itemSizeForCollectionView:collectionView
-                                        withLayout:collectionViewLayout
-                              withItemsAspectRatio:itemsAspectRatio
-                            withNumberOfItemsInRow:numItemsInRow];
-    }
-    while (itemSize.width < 
VLCLibraryUIUnits.dynamicCollectionViewItemMinimumWidth && numItemsInRow > 
kMinItemsInCollectionViewRow) {
-        --numItemsInRow;
-        itemSize = [self itemSizeForCollectionView:collectionView
-                                        withLayout:collectionViewLayout
-                              withItemsAspectRatio:itemsAspectRatio
-                            withNumberOfItemsInRow:numItemsInRow];
-    }
+    return [self adjustedItemSizingForCollectionView:collectionView
+                                          withLayout:collectionViewLayout
+                                
withItemsAspectRatio:itemsAspectRatio].itemSize;
+}
+
++ (VLCCollectionViewItemSizing 
*)adjustedItemSizingForCollectionView:(NSCollectionView *)collectionView
+                                                          
withLayout:(VLCLibraryCollectionViewFlowLayout *)collectionViewLayout
+                                                
withItemsAspectRatio:(VLCLibraryCollectionViewItemAspectRatio)itemsAspectRatio
+{
+    const NSEdgeInsets sectionInsets = collectionViewLayout.sectionInset;
+    const CGFloat interItemSpacing = 
collectionViewLayout.minimumInteritemSpacing;
+    const CGFloat availableWidth =
+        collectionView.bounds.size.width - (sectionInsets.left + 
sectionInsets.right);
+    const float maxPossibleNumItemsInRow =
+        floor(availableWidth / 
(VLCLibraryUIUnits.dynamicCollectionViewItemMinimumWidth + interItemSpacing));
+    const float minPossibleNumItemsInRow =
+        MIN(ceil(availableWidth / 
(VLCLibraryUIUnits.dynamicCollectionViewItemMaximumWidth + interItemSpacing)), 
maxPossibleNumItemsInRow);
 
     const NSInteger adjustment =
         [NSUserDefaults.standardUserDefaults 
integerForKey:VLCLibraryCollectionViewItemAdjustmentKey];
-    if (adjustment != 0 && numItemsInRow + adjustment > 
kMinItemsInCollectionViewRow) {
-        numItemsInRow += adjustment;
-        itemSize = [self itemSizeForCollectionView:collectionView
-                                        withLayout:collectionViewLayout
-                              withItemsAspectRatio:itemsAspectRatio
-                            withNumberOfItemsInRow:numItemsInRow];
-    }
+    const uint midPossibleNumItemsInRow =
+        round((minPossibleNumItemsInRow + maxPossibleNumItemsInRow) / 2.0);
+
+    const int unclampedNumItemsInRow = midPossibleNumItemsInRow + adjustment;
+    const uint numItemsInRow = MAX(unclampedNumItemsInRow, 
VLCLibraryUIUnits.collectionViewMinItemsInRow);
+    const NSSize itemSize = [self itemSizeForCollectionView:collectionView
+                                                 
withLayout:collectionViewLayout
+                                       withItemsAspectRatio:itemsAspectRatio
+                                     withNumberOfItemsInRow:numItemsInRow];
 
-    return itemSize;
+    VLCCollectionViewItemSizing * const itemSizing = 
[[VLCCollectionViewItemSizing alloc] init];
+    itemSizing.itemSize = itemSize;
+    itemSizing.rowItemCount = numItemsInRow;
+    itemSizing.unclampedRowItemCount = unclampedNumItemsInRow;
+    return itemSizing;
 }
 
 + (const NSSize)itemSizeForCollectionView:(NSCollectionView *)collectionView
@@ -169,9 +183,7 @@ NSString * const VLCLibraryCollectionViewItemAdjustmentKey 
= @"VLCLibraryCollect
                      
withItemsAspectRatio:(VLCLibraryCollectionViewItemAspectRatio)itemsAspectRatio
                    withNumberOfItemsInRow:(uint)numItemsInRow
 {
-    NSParameterAssert(numItemsInRow > 0);
-    NSParameterAssert(collectionView);
-    NSParameterAssert(collectionViewLayout);
+    NSParameterAssert(numItemsInRow > 0 && collectionView && 
collectionViewLayout);
 
     const NSEdgeInsets sectionInsets = collectionViewLayout.sectionInset;
     const CGFloat interItemSpacing = 
collectionViewLayout.minimumInteritemSpacing;



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/adfdbcb0f334a23f8d4e8756b203233e64f25078...d90763320fca2b8ae04fad6d0ae8bb7e117ce2cc

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/adfdbcb0f334a23f8d4e8756b203233e64f25078...d90763320fca2b8ae04fad6d0ae8bb7e117ce2cc
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to