Felix Paul Kühne pushed to branch master at VideoLAN / VLC
Commits:
be39cc3b by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Add custom invalidation behaviour for
VLCLibraryCollectionViewFlowLayout on bounds change
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
11603dbc by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Make audio collection view items dynamically sized
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
d2d58ff1 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Move item size calculation to own method
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
80ed297c by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Dynamically change number of collection view items in row depending on
available width
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
926f07f9 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Fix jittering when resizing in the boundary between one item more or
less being added to the layout row
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
d2de90cc by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Further extract collection view item size calculation to own method
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
bb044a1b by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Create new VLCLibraryCollectionViewDelegate class to unify all VLC
library collection view delegate behaviour
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
288039a5 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Move dynamic collection view item sizing to new delegate class, convert
for proper use in a delegate class
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
f546c78e by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Move remaining delegate methods from VLCLibraryAudioDataSource to
VLCLibraryCollectionViewDelegate
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
55c0d493 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Separate more of audio collection view setup from
VLCLibraryAudioDataSource, move into more logical VLCLibraryAudioViewController
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
106c1b67 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Add a VLCLibraryCollectionViewDataSource with method allowing for
polymorphic access to underlying data item
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
623d1226 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Make audio library collection view data source and video library
collection view data source compliant with VLCLibraryCollectionViewDataSource
protocol
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
b069be45 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Move delegate methods in
VLCLibraryVideoCollectionViewContainerViewDataSource to general
VLCLibraryCollectionViewDelegate
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
a53ae489 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Set new VLCLibraryCollectionViewDelegate as delegate for video library
collection views
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
6279fcd1 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Add ability to disable dynamic item sizing in
VLCLibraryCollectionViewDelegate
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
274ac2e0 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Disable dynamic collection view item sizing in horizontal carousel
video collection view
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
b087bd1f by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Publicly declare collection view delegate object as readonly property
in VLCLibraryVideoCollectionViewContainerView
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
7948204c by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Add ability to set static item size in VLCLibraryCollectionViewDelegate
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
43f32991 by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Make setter for VLCLibraryVideoCollectionViewsStackViewController
collectionViewItemSize property set the static item size in the container's
collection view delegate
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
c315516b by Claudio Cambra at 2022-12-25T00:03:43+00:00
macosx: Calculate horizontal video collection view using static item size in
collection view delegate
Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>
- - - - -
15 changed files:
- extras/package/macosx/VLC.xcodeproj/project.pbxproj
- modules/gui/macosx/Makefile.am
- + modules/gui/macosx/library/VLCLibraryCollectionViewDataSource.h
- + modules/gui/macosx/library/VLCLibraryCollectionViewDelegate.h
- + modules/gui/macosx/library/VLCLibraryCollectionViewDelegate.m
- modules/gui/macosx/library/VLCLibraryCollectionViewFlowLayout.m
- modules/gui/macosx/library/VLCLibraryWindow.m
- modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.h
- modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m
- modules/gui/macosx/library/audio-library/VLCLibraryAudioViewController.m
-
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerView.h
-
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerView.m
-
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerViewDataSource.h
-
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerViewDataSource.m
-
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewsStackViewController.m
Changes:
=====================================
extras/package/macosx/VLC.xcodeproj/project.pbxproj
=====================================
@@ -77,10 +77,8 @@
1CCC89052078A3D500E5626F /* TextfieldPanel.xib in Sources */ =
{isa = PBXBuildFile; fileRef = 6B8224151E4D2A9000833BE1 /* TextfieldPanel.xib
*/; };
1CCC89062078A3D500E5626F /* TimeSelectionPanel.xib in Sources
*/ = {isa = PBXBuildFile; fileRef = 6B8224161E4D2A9000833BE1 /*
TimeSelectionPanel.xib */; };
1CFE8D591EA0D42A00E94451 /* VLCErrorWindowController.m in
Sources */ = {isa = PBXBuildFile; fileRef = 1CFE8D581EA0D42A00E94451 /*
VLCErrorWindowController.m */; };
+ 5317FE04294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.m
in Sources */ = {isa = PBXBuildFile; fileRef = 5317FE03294E3DD3001702F0 /*
VLCLibraryCollectionViewDelegate.m */; };
5325C57D29302E6800B2B63A /* VLCLibraryAudioViewController.m in
Sources */ = {isa = PBXBuildFile; fileRef = 5325C57B29302E6800B2B63A /*
VLCLibraryAudioViewController.m */; };
- 5325C56A292D59FB00B2B63A /*
VLCLibraryVideoCollectionViewContainerViewDataSource.m in Sources */ = {isa =
PBXBuildFile; fileRef = 5325C569292D59FB00B2B63A /*
VLCLibraryVideoCollectionViewContainerViewDataSource.m */; };
- 5325C56D292D5CEB00B2B63A /* VLCLibraryVideoGroupDescriptor.m in
Sources */ = {isa = PBXBuildFile; fileRef = 5325C56C292D5CEB00B2B63A /*
VLCLibraryVideoGroupDescriptor.m */; };
- 5325C570292D5E8F00B2B63A /*
VLCLibraryVideoCollectionViewContainerView.m in Sources */ = {isa =
PBXBuildFile; fileRef = 5325C56F292D5E8F00B2B63A /*
VLCLibraryVideoCollectionViewContainerView.m */; };
5362550D293FD639005D64FA /* VLCLibraryWindowController.m in
Sources */ = {isa = PBXBuildFile; fileRef = 5362550C293FD639005D64FA /*
VLCLibraryWindowController.m */; };
536283F0291146BC00640C15 /* VLCLibraryTableView.m in Sources */
= {isa = PBXBuildFile; fileRef = 536283DE291146BC00640C15 /*
VLCLibraryTableView.m */; };
536283F1291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.m
in Sources */ = {isa = PBXBuildFile; fileRef = 536283DF291146BC00640C15 /*
VLCLibraryAlbumTracksDataSource.m */; };
@@ -238,14 +236,11 @@
1CFE8D561EA0D3D300E94451 /* ErrorPanel.xib */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path =
ErrorPanel.xib; sourceTree = "<group>"; };
1CFE8D571EA0D42A00E94451 /* VLCErrorWindowController.h */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h;
path = VLCErrorWindowController.h; sourceTree = "<group>"; };
1CFE8D581EA0D42A00E94451 /* VLCErrorWindowController.m */ =
{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = VLCErrorWindowController.m; sourceTree = "<group>"; };
+ 5317FE02294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.h
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
VLCLibraryCollectionViewDelegate.h; sourceTree = "<group>"; };
+ 5317FE03294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.m
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
VLCLibraryCollectionViewDelegate.m; sourceTree = "<group>"; };
+ 5317FE05294E8D1A001702F0 /*
VLCLibraryCollectionViewDataSource.h */ = {isa = PBXFileReference;
lastKnownFileType = sourcecode.c.h; path =
VLCLibraryCollectionViewDataSource.h; sourceTree = "<group>"; };
5325C57B29302E6800B2B63A /* VLCLibraryAudioViewController.m */
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = VLCLibraryAudioViewController.m; sourceTree =
"<group>"; };
5325C57C29302E6800B2B63A /* VLCLibraryAudioViewController.h */
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.h; path = VLCLibraryAudioViewController.h; sourceTree = "<group>";
};
- 5325C568292D59FB00B2B63A /*
VLCLibraryVideoCollectionViewContainerViewDataSource.h */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
VLCLibraryVideoCollectionViewContainerViewDataSource.h; sourceTree = "<group>";
};
- 5325C569292D59FB00B2B63A /*
VLCLibraryVideoCollectionViewContainerViewDataSource.m */ = {isa =
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
VLCLibraryVideoCollectionViewContainerViewDataSource.m; sourceTree = "<group>";
};
- 5325C56B292D5CEB00B2B63A /* VLCLibraryVideoGroupDescriptor.h */
= {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
VLCLibraryVideoGroupDescriptor.h; sourceTree = "<group>"; };
- 5325C56C292D5CEB00B2B63A /* VLCLibraryVideoGroupDescriptor.m */
= {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
VLCLibraryVideoGroupDescriptor.m; sourceTree = "<group>"; };
- 5325C56E292D5E8F00B2B63A /*
VLCLibraryVideoCollectionViewContainerView.h */ = {isa = PBXFileReference;
lastKnownFileType = sourcecode.c.h; path =
VLCLibraryVideoCollectionViewContainerView.h; sourceTree = "<group>"; };
- 5325C56F292D5E8F00B2B63A /*
VLCLibraryVideoCollectionViewContainerView.m */ = {isa = PBXFileReference;
lastKnownFileType = sourcecode.c.objc; path =
VLCLibraryVideoCollectionViewContainerView.m; sourceTree = "<group>"; };
5362550B293FD639005D64FA /* VLCLibraryWindowController.h */ =
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path =
VLCLibraryWindowController.h; sourceTree = "<group>"; };
5362550C293FD639005D64FA /* VLCLibraryWindowController.m */ =
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path =
VLCLibraryWindowController.m; sourceTree = "<group>"; };
536283DC291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.h
*/ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.h; path = VLCLibraryAlbumTracksDataSource.h; sourceTree =
"<group>"; };
@@ -1155,6 +1150,9 @@
7D713D312201AE350042BEB7 /* VLCLibraryWindow.m
*/,
5362550B293FD639005D64FA /*
VLCLibraryWindowController.h */,
5362550C293FD639005D64FA /*
VLCLibraryWindowController.m */,
+ 5317FE02294E3DD3001702F0 /*
VLCLibraryCollectionViewDelegate.h */,
+ 5317FE03294E3DD3001702F0 /*
VLCLibraryCollectionViewDelegate.m */,
+ 5317FE05294E8D1A001702F0 /*
VLCLibraryCollectionViewDataSource.h */,
);
path = library;
sourceTree = "<group>";
@@ -1308,16 +1306,16 @@
53B447EB293BB47A00857588 /* video-library */ = {
isa = PBXGroup;
children = (
+ 53B447F1293BB47A00857588 /*
VLCLibraryVideoCollectionViewContainerView.h */,
53B447EC293BB47A00857588 /*
VLCLibraryVideoCollectionViewContainerView.m */,
+ 53B447F2293BB47A00857588 /*
VLCLibraryVideoCollectionViewContainerViewDataSource.h */,
53B447ED293BB47A00857588 /*
VLCLibraryVideoCollectionViewContainerViewDataSource.m */,
- 53B447EE293BB47A00857588 /*
VLCLibraryVideoTableViewDataSource.h */,
+ 53B447F5293BB47B00857588 /*
VLCLibraryVideoCollectionViewsStackViewController.h */,
53B447EF293BB47A00857588 /*
VLCLibraryVideoCollectionViewsStackViewController.m */,
53B447F0293BB47A00857588 /*
VLCLibraryVideoGroupDescriptor.h */,
- 53B447F1293BB47A00857588 /*
VLCLibraryVideoCollectionViewContainerView.h */,
- 53B447F2293BB47A00857588 /*
VLCLibraryVideoCollectionViewContainerViewDataSource.h */,
- 53B447F3293BB47A00857588 /*
VLCLibraryVideoTableViewDataSource.m */,
53B447F4293BB47A00857588 /*
VLCLibraryVideoGroupDescriptor.m */,
- 53B447F5293BB47B00857588 /*
VLCLibraryVideoCollectionViewsStackViewController.h */,
+ 53B447EE293BB47A00857588 /*
VLCLibraryVideoTableViewDataSource.h */,
+ 53B447F3293BB47A00857588 /*
VLCLibraryVideoTableViewDataSource.m */,
);
path = "video-library";
sourceTree = "<group>";
@@ -1842,6 +1840,7 @@
1CCC88FD2078A3D500E5626F /* Open.xib in Sources
*/,
1CCC88FE2078A3D500E5626F /*
PlaylistAccessoryView.xib in Sources */,
1CCC89002078A3D500E5626F /* PopupPanel.xib in
Sources */,
+ 5317FE04294E3DD3001702F0 /*
VLCLibraryCollectionViewDelegate.m in Sources */,
53628402291147C500640C15 /* VLCBasicView.m in
Sources */,
7DFBDCAB2269E77F00B700A5 /* VLCLibraryModel.m
in Sources */,
1CCC89012078A3D500E5626F /* Preferences.xib in
Sources */,
=====================================
modules/gui/macosx/Makefile.am
=====================================
@@ -58,6 +58,9 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/imported/SPMediaKeyTap/SPMediaKeyTap.m \
gui/macosx/library/VLCInputItem.h \
gui/macosx/library/VLCInputItem.m \
+ gui/macosx/library/VLCLibraryCollectionViewDataSource.h \
+ gui/macosx/library/VLCLibraryCollectionViewDelegate.h \
+ gui/macosx/library/VLCLibraryCollectionViewDelegate.m \
gui/macosx/library/VLCLibraryCollectionViewFlowLayout.h \
gui/macosx/library/VLCLibraryCollectionViewFlowLayout.m \
gui/macosx/library/VLCLibraryCollectionViewItem.h \
=====================================
modules/gui/macosx/library/VLCLibraryCollectionViewDataSource.h
=====================================
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ * VLCLibraryCollectionViewDataSource.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2022 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 <Cocoa/Cocoa.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol VLCMediaLibraryItemProtocol;
+
+@protocol VLCLibraryCollectionViewDataSource <NSCollectionViewDataSource>
+
+- (id<VLCMediaLibraryItemProtocol>)libraryItemAtIndexPath:(NSIndexPath
*)indexPath
+ forCollectionView:(NSCollectionView
*)collectionView;
+
+@end
+
+NS_ASSUME_NONNULL_END
=====================================
modules/gui/macosx/library/VLCLibraryCollectionViewDelegate.h
=====================================
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ * VLCLibraryCollectionViewDelegate.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2022 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 <Cocoa/Cocoa.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface VLCLibraryCollectionViewDelegate : NSObject
<NSCollectionViewDelegate, NSCollectionViewDelegateFlowLayout>
+
+@property (readwrite, assign) BOOL dynamicItemSizing;
+@property (readwrite, assign) NSSize staticItemSize;
+
+@end
+
+NS_ASSUME_NONNULL_END
=====================================
modules/gui/macosx/library/VLCLibraryCollectionViewDelegate.m
=====================================
@@ -0,0 +1,178 @@
+/*****************************************************************************
+ * VLCLibraryCollectionViewDelegate.m: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2022 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryCollectionViewDelegate.h"
+
+#import "VLCLibraryCollectionViewDataSource.h"
+#import "VLCLibraryCollectionViewFlowLayout.h"
+#import "VLCLibraryDataTypes.h"
+
+@implementation VLCLibraryCollectionViewDelegate
+
+- (instancetype)init
+{
+ self = [super init];
+ if (self) {
+ _dynamicItemSizing = YES;
+ _staticItemSize = NSMakeSize(214, 260);
+ }
+ return self;
+}
+
+- (void)collectionView:(NSCollectionView *)collectionView
didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+{
+ NSIndexPath *indexPath = indexPaths.anyObject;
+ if (!indexPath) {
+ return;
+ }
+
+ VLCLibraryCollectionViewFlowLayout *collectionViewFlowLayout =
(VLCLibraryCollectionViewFlowLayout*)collectionView.collectionViewLayout;
+ if(collectionViewFlowLayout) {
+ [collectionViewFlowLayout expandDetailSectionAtIndex:indexPath];
+ }
+}
+
+- (void)collectionView:(NSCollectionView *)collectionView
didDeselectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+{
+ NSIndexPath *indexPath = indexPaths.anyObject;
+ if (!indexPath) {
+ return;
+ }
+
+ VLCLibraryCollectionViewFlowLayout *collectionViewFlowLayout =
(VLCLibraryCollectionViewFlowLayout*)collectionView.collectionViewLayout;
+ if (collectionViewFlowLayout) {
+ [collectionViewFlowLayout collapseDetailSectionAtIndex:indexPath];
+ }
+}
+
+- (NSSize)collectionView:(NSCollectionView *)collectionView
+ layout:(NSCollectionViewLayout *)collectionViewLayout
+ sizeForItemAtIndexPath:(NSIndexPath *)indexPath
+{
+ if (!_dynamicItemSizing) {
+ return _staticItemSize;
+ }
+
+ VLCLibraryCollectionViewFlowLayout *collectionViewFlowLayout =
(VLCLibraryCollectionViewFlowLayout*)collectionViewLayout;
+ if (collectionViewLayout) {
+ VLCLibraryCollectionViewFlowLayout *collectionViewFlowLayout =
(VLCLibraryCollectionViewFlowLayout*)collectionViewLayout;
+ return [self adjustedItemSizeForCollectionView:collectionView
+
withLayout:collectionViewFlowLayout];
+ }
+
+ return NSZeroSize;
+}
+
+- (NSSize)adjustedItemSizeForCollectionView:(NSCollectionView *)collectionView
+
withLayout:(VLCLibraryCollectionViewFlowLayout *)collectionViewLayout
+{
+ static const CGFloat maxItemWidth = 280;
+ static const CGFloat minItemWidth = 180;
+
+ static uint numItemsInRow = 5;
+
+ NSSize itemSize = [self itemSizeForCollectionView:collectionView
+ withLayout:collectionViewLayout
+ withNumberOfItemsInRow:numItemsInRow];
+
+ while (itemSize.width > maxItemWidth) {
+ ++numItemsInRow;
+ itemSize = [self itemSizeForCollectionView:collectionView
+ withLayout:collectionViewLayout
+ withNumberOfItemsInRow:numItemsInRow];
+ }
+ while (itemSize.width < minItemWidth) {
+ --numItemsInRow;
+ itemSize = [self itemSizeForCollectionView:collectionView
+ withLayout:collectionViewLayout
+ withNumberOfItemsInRow:numItemsInRow];
+ }
+
+ return itemSize;
+}
+
+- (NSSize)itemSizeForCollectionView:(NSCollectionView *)collectionView
+ withLayout:(VLCLibraryCollectionViewFlowLayout
*)collectionViewLayout
+ withNumberOfItemsInRow:(uint)numItemsInRow
+{
+ NSParameterAssert(numItemsInRow > 0);
+ NSParameterAssert(collectionView);
+ NSParameterAssert(collectionViewLayout);
+
+ const NSEdgeInsets sectionInsets = collectionViewLayout.sectionInset;
+ const CGFloat interItemSpacing =
collectionViewLayout.minimumInteritemSpacing;
+
+ const CGFloat rowOfItemsWidth = collectionView.bounds.size.width -
+ (sectionInsets.left +
+ sectionInsets.right +
+ (interItemSpacing * (numItemsInRow - 1)) +
+ 1);
+
+ const CGFloat itemWidth = rowOfItemsWidth / numItemsInRow;
+ return NSMakeSize(itemWidth, itemWidth + 46); // Text fields height needed
+}
+
+- (BOOL)collectionView:(NSCollectionView *)collectionView
+canDragItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+ withEvent:(NSEvent *)event
+{
+ return YES;
+}
+
+- (BOOL)collectionView:(NSCollectionView *)collectionView
+writeItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+ toPasteboard:(NSPasteboard *)pasteboard
+{
+ if (![collectionView.dataSource
conformsToProtocol:@protocol(VLCLibraryCollectionViewDataSource)]) {
+ return NO;
+ }
+
+ NSObject<VLCLibraryCollectionViewDataSource> *vlcDataSource =
(NSObject<VLCLibraryCollectionViewDataSource>*)collectionView.dataSource;
+
+ NSUInteger numberOfIndexPaths = indexPaths.count;
+ NSMutableArray *encodedLibraryItemsArray = [NSMutableArray
arrayWithCapacity:numberOfIndexPaths];
+ NSMutableArray *filePathsArray = [NSMutableArray
arrayWithCapacity:numberOfIndexPaths];
+
+ for (NSIndexPath *indexPath in indexPaths) {
+
+ id<VLCMediaLibraryItemProtocol> libraryItem = [vlcDataSource
libraryItemAtIndexPath:indexPath
+
forCollectionView:collectionView];
+
+ VLCMediaLibraryMediaItem *mediaItem = libraryItem.firstMediaItem;
+ [encodedLibraryItemsArray addObject:mediaItem];
+
+ VLCMediaLibraryFile *file = mediaItem.files.firstObject;
+ if (file) {
+ NSURL *url = [NSURL URLWithString:file.MRL];
+ [filePathsArray addObject:url.path];
+ }
+ }
+
+ NSData *data = [NSKeyedArchiver
archivedDataWithRootObject:encodedLibraryItemsArray];
+ [pasteboard declareTypes:@[VLCMediaLibraryMediaItemPasteboardType,
NSFilenamesPboardType] owner:self];
+ [pasteboard setPropertyList:filePathsArray forType:NSFilenamesPboardType];
+ [pasteboard setData:data forType:VLCMediaLibraryMediaItemPasteboardType];
+
+ return YES;
+}
+
+@end
=====================================
modules/gui/macosx/library/VLCLibraryCollectionViewFlowLayout.m
=====================================
@@ -68,6 +68,8 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef
displayLink,
VLCExpandAnimationType _animationType;
CGFloat _prevProvidedAnimationStep;
+
+ BOOL _invalidateAll;
}
@property (nonatomic, readwrite) BOOL detailViewIsAnimating;
@@ -88,6 +90,8 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef
displayLink,
_animationType = VLCExpandAnimationTypeDefault;
_prevProvidedAnimationStep = 0;
+
+ _invalidateAll = NO;
[self resetLayout];
}
@@ -173,6 +177,25 @@ static CVReturn
detailViewAnimationCallback(CVDisplayLinkRef displayLink,
return contentSize;
}
+- (BOOL)shouldInvalidateLayoutForBoundsChange:(NSRect)newBounds
+{
+ [super shouldInvalidateLayoutForBoundsChange:newBounds];
+ _invalidateAll = YES;
+ return YES;
+}
+
+- (void)invalidateLayoutWithContext:(NSCollectionViewLayoutInvalidationContext
*)context
+{
+ NSCollectionViewFlowLayoutInvalidationContext *flowLayoutContext =
(NSCollectionViewFlowLayoutInvalidationContext *)context;
+ if (flowLayoutContext && _invalidateAll) {
+ flowLayoutContext.invalidateFlowLayoutAttributes = YES;
+ flowLayoutContext.invalidateFlowLayoutDelegateMetrics = YES;
+ _invalidateAll = NO;
+ }
+
+ [super invalidateLayoutWithContext:context];
+}
+
- (NSCollectionViewLayoutAttributes
*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSCollectionViewLayoutAttributes *attributes = [super
layoutAttributesForItemAtIndexPath:indexPath];
=====================================
modules/gui/macosx/library/VLCLibraryWindow.m
=====================================
@@ -342,7 +342,6 @@ static void addShadow(NSImageView *__unsafe_unretained
imageView)
const NSEdgeInsets collectionViewSectionInset = NSEdgeInsetsMake(20., 20.,
20., 20.);
NSCollectionViewFlowLayout *audioLibraryCollectionViewLayout =
_audioLibraryCollectionView.collectionViewLayout;
- audioLibraryCollectionViewLayout.itemSize = CGSizeMake(214., 260.);
audioLibraryCollectionViewLayout.minimumLineSpacing =
collectionItemSpacing;
audioLibraryCollectionViewLayout.minimumInteritemSpacing =
collectionItemSpacing;
audioLibraryCollectionViewLayout.sectionInset = collectionViewSectionInset;
=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.h
=====================================
@@ -23,6 +23,7 @@
#import <Cocoa/Cocoa.h>
#import "library/VLCLibraryTableView.h"
+#import "library/VLCLibraryCollectionViewDataSource.h"
NS_ASSUME_NONNULL_BEGIN
@@ -37,7 +38,7 @@ typedef NS_ENUM(NSUInteger, VLCAudioLibrarySegment) {
VLCAudioLibraryGenresSegment
};
-@interface VLCLibraryAudioDataSource : NSObject
<VLCLibraryTableViewDataSource, NSTableViewDelegate,
NSCollectionViewDataSource, NSCollectionViewDelegate>
+@interface VLCLibraryAudioDataSource : NSObject
<VLCLibraryTableViewDataSource, NSTableViewDelegate,
VLCLibraryCollectionViewDataSource>
@property (readwrite, assign) VLCLibraryModel *libraryModel;
@property (readwrite, assign) VLCLibraryGroupDataSource *groupDataSource;
=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m
=====================================
@@ -69,7 +69,6 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
@interface VLCLibraryAudioDataSource ()
{
- VLCLibraryCollectionViewFlowLayout *_collectionViewFlowLayout;
NSArray *_displayedCollection;
enum vlc_ml_parent_type _currentParentType;
@@ -258,7 +257,7 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
NSSet *indexPathSet = [NSSet setWithObject:newIndexPath];
[_collectionView selectItemsAtIndexPaths:indexPathSet
scrollPosition:NSCollectionViewScrollPositionTop];
// selectItemsAtIndexPaths does not call any delegate methods so we do it
manually
- [self collectionView:_collectionView
didSelectItemsAtIndexPaths:indexPathSet];
+ [_collectionView.delegate collectionView:_collectionView
didSelectItemsAtIndexPaths:indexPathSet];
_selectedCollectionViewItem = nil;
}
@@ -306,7 +305,6 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
- (void)setupCollectionView
{
_collectionView.dataSource = self;
- _collectionView.delegate = self;
[_collectionView registerClass:[VLCLibraryCollectionViewItem class]
forItemWithIdentifier:VLCLibraryCellIdentifier];
@@ -324,9 +322,6 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
[_collectionView registerNib:mediaItemSupplementaryDetailView
forSupplementaryViewOfKind:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind
withIdentifier:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewIdentifier];
-
- _collectionViewFlowLayout = [[VLCLibraryCollectionViewFlowLayout alloc]
init];
- _collectionView.collectionViewLayout = _collectionViewFlowLayout;
}
- (void)setupTableViews
@@ -431,7 +426,11 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
- (void)reloadViews
{
- [_collectionViewFlowLayout resetLayout];
+ VLCLibraryCollectionViewFlowLayout *collectionViewFlowLayout =
(VLCLibraryCollectionViewFlowLayout *)_collectionView.collectionViewLayout;
+ if (collectionViewFlowLayout) {
+ [collectionViewFlowLayout resetLayout];
+ }
+
[self.collectionView reloadData];
[self.collectionSelectionTableView reloadData];
[self.groupSelectionTableView reloadData];
@@ -632,7 +631,7 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
[VLCMain.sharedInstance.libraryController appendItemToPlaylist:mediaItem
playImmediately:YES];
}
-#pragma mark - collection view data source and delegation
+#pragma mark - collection view data source
- (NSInteger)collectionView:(NSCollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
@@ -653,26 +652,6 @@ static NSString *VLCLibraryYearSortDescriptorKey =
@"VLCLibraryYearSortDescripto
return viewItem;
}
-- (void)collectionView:(NSCollectionView *)collectionView
didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
-{
- NSIndexPath *indexPath = indexPaths.anyObject;
- if (!indexPath) {
- return;
- }
-
- [_collectionViewFlowLayout expandDetailSectionAtIndex:indexPath];
-}
-
-- (void)collectionView:(NSCollectionView *)collectionView
didDeselectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
-{
- NSIndexPath *indexPath = indexPaths.anyObject;
- if (!indexPath) {
- return;
- }
-
- [_collectionViewFlowLayout collapseDetailSectionAtIndex:indexPath];
-}
-
- (NSView *)collectionView:(NSCollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
atIndexPath:(NSIndexPath *)indexPath
@@ -715,6 +694,12 @@
viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
return nil;
}
+- (id<VLCMediaLibraryItemProtocol>)libraryItemAtIndexPath:(NSIndexPath
*)indexPath
+ forCollectionView:(NSCollectionView
*)collectionView
+{
+ return _displayedCollection[indexPath.item];
+}
+
@end
@implementation VLCLibraryGroupDataSource
=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioViewController.m
=====================================
@@ -24,6 +24,8 @@
#import "main/VLCMain.h"
#import "extensions/NSString+Helpers.h"
+#import "library/VLCLibraryCollectionViewDelegate.h"
+#import "library/VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibraryNavigationStack.h"
@@ -34,6 +36,8 @@
{
NSArray<NSString *> *_placeholderImageNames;
NSArray<NSString *> *_placeholderLabelStrings;
+
+ VLCLibraryCollectionViewDelegate *_audioLibraryCollectionViewDelegate;
}
@end
@@ -100,6 +104,11 @@
_audioLibraryCollectionView.selectable = YES;
_audioLibraryCollectionView.allowsMultipleSelection = NO;
_audioLibraryCollectionView.allowsEmptySelection = YES;
+
+ _audioLibraryCollectionViewDelegate = [[VLCLibraryCollectionViewDelegate
alloc] init];
+ _audioLibraryCollectionView.delegate = _audioLibraryCollectionViewDelegate;
+
+ _audioLibraryCollectionView.collectionViewLayout =
[[VLCLibraryCollectionViewFlowLayout alloc] init];
}
- (void)setupAudioTableViews
=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerView.h
=====================================
@@ -25,6 +25,7 @@
#import "library/video-library/VLCLibraryVideoGroupDescriptor.h"
@class VLCSubScrollView;
+@class VLCLibraryCollectionViewDelegate;
@class VLCLibraryCollectionViewFlowLayout;
@class VLCLibraryVideoCollectionViewGroupDescriptor;
@class VLCLibraryVideoCollectionViewContainerViewDataSource;
@@ -34,6 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface VLCLibraryVideoCollectionViewContainerView : NSView
@property (readonly) NSCollectionView *collectionView;
+@property (readonly) VLCLibraryCollectionViewDelegate *collectionViewDelegate;
@property (readonly) VLCLibraryCollectionViewFlowLayout *collectionViewLayout;
@property (readonly) VLCSubScrollView *scrollView;
@property (readonly) VLCLibraryVideoCollectionViewContainerViewDataSource
*dataSource;
=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerView.m
=====================================
@@ -22,6 +22,7 @@
#import "VLCLibraryVideoCollectionViewContainerView.h"
+#import "library/VLCLibraryCollectionViewDelegate.h"
#import "library/VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryCollectionViewSupplementaryElementView.h"
@@ -101,7 +102,6 @@
{
_collectionViewLayout = [[VLCLibraryCollectionViewFlowLayout alloc] init];
_collectionViewLayout.headerReferenceSize =
[VLCLibraryCollectionViewSupplementaryElementView defaultHeaderSize];
- _collectionViewLayout.itemSize = CGSizeMake(214., 260.);
_collectionView = [[NSCollectionView alloc] initWithFrame:NSZeroRect];
_collectionView.postsFrameChangedNotifications = YES;
@@ -109,6 +109,9 @@
_collectionView.selectable = YES;
_collectionView.allowsEmptySelection = YES;
_collectionView.allowsMultipleSelection = NO;
+
+ _collectionViewDelegate = [[VLCLibraryCollectionViewDelegate alloc] init];
+ _collectionView.delegate = _collectionViewDelegate;
}
- (void)setupScrollView
@@ -146,6 +149,7 @@
NSCollectionViewScrollDirectionHorizontal :
NSCollectionViewScrollDirectionVertical;
_scrollView.scrollSelf = _groupDescriptor.isHorizontalBarCollectionView;
+ _collectionViewDelegate.dynamicItemSizing =
!_groupDescriptor.isHorizontalBarCollectionView;
}
- (void)setVideoGroup:(VLCLibraryVideoGroup)group
@@ -180,6 +184,7 @@
scrollViewInsets.bottom +
collectionViewLayoutInset.top +
collectionViewLayoutInset.bottom;
+ const CGFloat itemHeight = _collectionViewDelegate.staticItemSize.height;
const CGFloat width = scrollViewInsets.left +
scrollViewInsets.right +
collectionViewLayoutInset.left +
@@ -190,14 +195,12 @@
// If we don't return a size larger than 0 then we run into issues
with the collection
// view layout not trying to properly calculate its size. So let's
return something
NSLog(@"Unable to provide accurate height for container -- providing
rough size");
- const CGFloat roughValue = _collectionViewLayout.itemSize.height +
insetsHeight;
+ const CGFloat roughValue = itemHeight + insetsHeight;
return NSMakeSize(width, roughValue);
}
if (_groupDescriptor.isHorizontalBarCollectionView) {
- const CGFloat viewHeight = _collectionViewLayout.itemSize.height +
- insetsHeight +
- 15; // Account for horizontal scrollbar
+ const CGFloat viewHeight = itemHeight + insetsHeight + 15; // Account
for horizontal scrollbar
return NSMakeSize(width, viewHeight);
}
=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerViewDataSource.h
=====================================
@@ -22,12 +22,14 @@
#import <Cocoa/Cocoa.h>
+#import "library/VLCLibraryCollectionViewDataSource.h"
+
@class VLCLibraryVideoCollectionViewContainerView;
@class VLCLibraryVideoCollectionViewGroupDescriptor;
NS_ASSUME_NONNULL_BEGIN
-@interface VLCLibraryVideoCollectionViewContainerViewDataSource : NSObject
<NSCollectionViewDataSource, NSCollectionViewDelegate>
+@interface VLCLibraryVideoCollectionViewContainerViewDataSource : NSObject
<VLCLibraryCollectionViewDataSource>
@property (readwrite, assign) NSCollectionView *collectionView;
@property (readwrite, assign, nonatomic)
VLCLibraryVideoCollectionViewGroupDescriptor *groupDescriptor;
=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerViewDataSource.m
=====================================
@@ -104,7 +104,6 @@
_collectionViewFlowLayout = collectionViewLayout;
_collectionView.dataSource = self;
- _collectionView.delegate = self;
[_collectionView registerClass:[VLCLibraryCollectionViewItem class]
forItemWithIdentifier:VLCLibraryCellIdentifier];
@@ -165,60 +164,10 @@
viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
return nil;
}
-- (void)collectionView:(NSCollectionView *)collectionView
didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+- (id<VLCMediaLibraryItemProtocol>)libraryItemAtIndexPath:(NSIndexPath
*)indexPath
+ forCollectionView:(NSCollectionView
*)collectionView
{
- NSIndexPath *indexPath = indexPaths.anyObject;
- if (!indexPath) {
- NSLog(@"Bad index path on item selection");
- return;
- }
-
- [_collectionViewFlowLayout expandDetailSectionAtIndex:indexPath];
-}
-
-- (void)collectionView:(NSCollectionView *)collectionView
didDeselectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
-{
- NSIndexPath *indexPath = indexPaths.anyObject;
- if (!indexPath) {
- NSLog(@"Bad index path on item deselection");
- return;
- }
-
- [_collectionViewFlowLayout collapseDetailSectionAtIndex:indexPath];
-}
-
-
-- (BOOL)collectionView:(NSCollectionView *)collectionView
-canDragItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
- withEvent:(NSEvent *)event
-{
- return YES;
-}
-
-- (BOOL)collectionView:(NSCollectionView *)collectionView
-writeItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
- toPasteboard:(NSPasteboard *)pasteboard
-{
- NSUInteger numberOfIndexPaths = indexPaths.count;
- NSMutableArray *encodedLibraryItemsArray = [NSMutableArray
arrayWithCapacity:numberOfIndexPaths];
- NSMutableArray *filePathsArray = [NSMutableArray
arrayWithCapacity:numberOfIndexPaths];
- for (NSIndexPath *indexPath in indexPaths) {
- VLCMediaLibraryMediaItem *mediaItem = _collectionArray[indexPath.item];
- [encodedLibraryItemsArray addObject:mediaItem];
-
- VLCMediaLibraryFile *file = mediaItem.files.firstObject;
- if (file) {
- NSURL *url = [NSURL URLWithString:file.MRL];
- [filePathsArray addObject:url.path];
- }
- }
-
- NSData *data = [NSKeyedArchiver
archivedDataWithRootObject:encodedLibraryItemsArray];
- [pasteboard declareTypes:@[VLCMediaLibraryMediaItemPasteboardType,
NSFilenamesPboardType] owner:self];
- [pasteboard setPropertyList:filePathsArray forType:NSFilenamesPboardType];
- [pasteboard setData:data forType:VLCMediaLibraryMediaItemPasteboardType];
-
- return YES;
+ return _collectionArray[indexPath.item];
}
@end
=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoCollectionViewsStackViewController.m
=====================================
@@ -22,6 +22,7 @@
#import "VLCLibraryVideoCollectionViewsStackViewController.h"
+#import "library/VLCLibraryCollectionViewDelegate.h"
#import "library/VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryCollectionViewSupplementaryElementView.h"
#import "library/VLCLibraryModel.h"
@@ -139,7 +140,7 @@
_collectionViewItemSize = collectionViewItemSize;
for (VLCLibraryVideoCollectionViewContainerView *containerView in
_collectionViewContainers) {
- containerView.collectionViewLayout.itemSize = collectionViewItemSize;
+ containerView.collectionViewDelegate.staticItemSize =
collectionViewItemSize;
}
}
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/84f13e3a85e863afb0b456282746c801a5cad813...c315516b95b9b0a0cb7555e25ab80f29fb5f33e6
--
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/84f13e3a85e863afb0b456282746c801a5cad813...c315516b95b9b0a0cb7555e25ab80f29fb5f33e6
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits