diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj b/extras/package/macosx/VLC.xcodeproj/project.pbxproj index 79e27dcbaf5fe35d89965c2686d5b890d0691531..1f6a9b093092c06dfc2cc2d454758ec1b94dd7e4 100644 --- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj +++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj @@ -156,6 +156,7 @@ 7DD2F5C52081B73B007EE187 /* VLCRemoteControlService.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DD2F5C42081B73B007EE187 /* VLCRemoteControlService.m */; }; 7DE2F0442282C84A0040DD0A /* VLCLibraryAudioDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE2F0432282C84A0040DD0A /* VLCLibraryAudioDataSource.m */; }; 7DE2F0472282D5D10040DD0A /* VLCLibraryTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE2F0462282D5D10040DD0A /* VLCLibraryTableCellView.m */; }; + 7DE7E72F228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE7E72E228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.m */; }; 7DE82E7922843781002D341A /* VLCLibraryAlbumTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE82E7822843781002D341A /* VLCLibraryAlbumTableCellView.m */; }; 7DE9C7DD220728420089108F /* VLCPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE9C7DC220728420089108F /* VLCPlayerController.m */; }; 7DF14FBD2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF14FBB2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m */; }; @@ -544,6 +545,8 @@ 7DE2F0452282D5D10040DD0A /* VLCLibraryTableCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryTableCellView.h; sourceTree = "<group>"; }; 7DE2F0462282D5D10040DD0A /* VLCLibraryTableCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryTableCellView.m; sourceTree = "<group>"; }; 7DE2F0482282D7980040DD0A /* VLCLibraryTableCellView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCLibraryTableCellView.xib; sourceTree = "<group>"; }; + 7DE7E72D228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryAlternativeAudioViewController.h; sourceTree = "<group>"; }; + 7DE7E72E228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryAlternativeAudioViewController.m; sourceTree = "<group>"; }; 7DE82E7722843781002D341A /* VLCLibraryAlbumTableCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryAlbumTableCellView.h; sourceTree = "<group>"; }; 7DE82E7822843781002D341A /* VLCLibraryAlbumTableCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryAlbumTableCellView.m; sourceTree = "<group>"; }; 7DE82E7A228437AA002D341A /* VLCLibraryAlbumTableCellView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCLibraryAlbumTableCellView.xib; sourceTree = "<group>"; }; @@ -1003,6 +1006,8 @@ 7DBB7638227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.m */, 7D713D302201AE350042BEB7 /* VLCLibraryWindow.h */, 7D713D312201AE350042BEB7 /* VLCLibraryWindow.m */, + 7DE7E72D228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.h */, + 7DE7E72E228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.m */, 7DFBDCA62269E77400B700A5 /* VLCLibraryController.h */, 7DFBDCA72269E77500B700A5 /* VLCLibraryController.m */, 7DFBDCA92269E77F00B700A5 /* VLCLibraryModel.h */, @@ -1731,6 +1736,7 @@ 1C3113D31E508C6900D4DD76 /* VLCResumeDialogController.m in Sources */, 7D2FFA40227B8A5B0085D649 /* VLCLinearProgressIndicator.m in Sources */, 7DFBDCB1226A518400B700A5 /* VLCLibraryMenuController.m in Sources */, + 7DE7E72F228C795B00D6EA38 /* VLCLibraryAlternativeAudioViewController.m in Sources */, 1C3113D51E508C6900D4DD76 /* VLCTextfieldPanelController.m in Sources */, 7DFBDCAE2269ED0C00B700A5 /* VLCLibraryVideoDataSource.m in Sources */, 1C3113D71E508C6900D4DD76 /* VLCPopupPanelController.m in Sources */, diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am index 183c104dd486e127b7ab27dc8f2b7a44f177089b..e4ed2335dd53108072ba306137aecc0e9781da86 100644 --- a/modules/gui/macosx/Makefile.am +++ b/modules/gui/macosx/Makefile.am @@ -54,6 +54,8 @@ libmacosx_plugin_la_SOURCES = \ gui/macosx/library/VLCInputItem.m \ gui/macosx/library/VLCLibraryAlbumTableCellView.h \ gui/macosx/library/VLCLibraryAlbumTableCellView.m \ + gui/macosx/library/VLCLibraryAlternativeAudioViewController.h \ + gui/macosx/library/VLCLibraryAlternativeAudioViewController.m \ gui/macosx/library/VLCLibraryAudioDataSource.h \ gui/macosx/library/VLCLibraryAudioDataSource.m \ gui/macosx/library/VLCLibraryCollectionViewItem.h \ diff --git a/modules/gui/macosx/UI/VLCLibraryWindow.xib b/modules/gui/macosx/UI/VLCLibraryWindow.xib index b29b8c023fe090e90aff48192382c4d0cbe024f5..ce75a54a5b32d5aaa7736a40e3f378d415bc73f3 100644 --- a/modules/gui/macosx/UI/VLCLibraryWindow.xib +++ b/modules/gui/macosx/UI/VLCLibraryWindow.xib @@ -312,6 +312,9 @@ </constraints> </view> <connections> + <outlet property="alternativeAudioCollectionView" destination="QAt-jP-zE7" id="269-UN-dfM"/> + <outlet property="alternativeAudioSegmentedControl" destination="nzi-H5-fyv" id="AmI-6s-ALm"/> + <outlet property="alternativeAudioView" destination="k7f-ic-LrF" id="8Cp-d2-3UJ"/> <outlet property="audioCategorySelectionTableView" destination="dNP-8u-8iI" id="KiD-PX-T2p"/> <outlet property="audioCollectionSelectionTableView" destination="LNt-ot-2wU" id="eJS-WZ-Ri7"/> <outlet property="audioGroupSelectionTableView" destination="4ll-T2-J16" id="bjS-a8-ePC"/> @@ -646,6 +649,59 @@ </holdingPriorities> <point key="canvasLocation" x="109" y="-224.5"/> </splitView> + <customView id="k7f-ic-LrF"> + <rect key="frame" x="0.0" y="0.0" width="500" height="302"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <subviews> + <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nzi-H5-fyv"> + <rect key="frame" x="10" y="280" width="52" height="23"/> + <segmentedCell key="cell" borderStyle="border" alignment="left" style="smallSquare" trackingMode="selectOne" id="ic1-QN-Oy2"> + <font key="font" metaFont="system"/> + <segments> + <segment/> + <segment selected="YES" tag="1"/> + <segment> + <nil key="label"/> + </segment> + </segments> + </segmentedCell> + </segmentedControl> + <scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AYf-gS-P66"> + <rect key="frame" x="0.0" y="0.0" width="500" height="271"/> + <clipView key="contentView" id="2oa-WL-dxA"> + <rect key="frame" x="0.0" y="0.0" width="500" height="271"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <collectionView id="QAt-jP-zE7"> + <rect key="frame" x="0.0" y="0.0" width="500" height="158"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES"/> + <collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="oKT-Ic-UdV"> + <size key="itemSize" width="50" height="50"/> + </collectionViewFlowLayout> + <color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> + </collectionView> + </subviews> + </clipView> + <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Wb8-r8-xfF"> + <rect key="frame" x="1" y="144" width="233" height="15"/> + <autoresizingMask key="autoresizingMask"/> + </scroller> + <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="Lae-xQ-39f"> + <rect key="frame" x="234" y="1" width="15" height="143"/> + <autoresizingMask key="autoresizingMask"/> + </scroller> + </scrollView> + </subviews> + <constraints> + <constraint firstItem="nzi-H5-fyv" firstAttribute="top" secondItem="k7f-ic-LrF" secondAttribute="top" id="Hub-0d-koP"/> + <constraint firstItem="AYf-gS-P66" firstAttribute="top" secondItem="nzi-H5-fyv" secondAttribute="bottom" constant="10" id="IpM-PQ-9Lk"/> + <constraint firstAttribute="trailing" secondItem="AYf-gS-P66" secondAttribute="trailing" id="KEG-os-Mk9"/> + <constraint firstAttribute="bottom" secondItem="AYf-gS-P66" secondAttribute="bottom" id="Wkc-LW-FiO"/> + <constraint firstItem="nzi-H5-fyv" firstAttribute="leading" secondItem="k7f-ic-LrF" secondAttribute="leading" constant="10" id="thF-Jr-QPO"/> + <constraint firstItem="AYf-gS-P66" firstAttribute="leading" secondItem="k7f-ic-LrF" secondAttribute="leading" id="tqb-gA-coA"/> + </constraints> + <point key="canvasLocation" x="247" y="771"/> + </customView> </objects> <resources> <image name="backward-3btns" width="29" height="23"/> diff --git a/modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.h b/modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.h new file mode 100644 index 0000000000000000000000000000000000000000..e0e03db94231743e8ceb96809e0d56dff07f5605 --- /dev/null +++ b/modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.h @@ -0,0 +1,40 @@ +/***************************************************************************** + * VLCLibraryAlternativeAudioViewController.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2019 VLC authors and VideoLAN + * + * Authors: Felix Paul Kühne <fkuehne # videolan -dot- org> + * + * 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 + +@class VLCLibraryModel; + +@interface VLCLibraryAlternativeAudioViewController : NSObject + +@property (readwrite, assign) NSCollectionView *collectionView; +@property (readwrite, assign) NSSegmentedControl *segmentedControl; +@property (readwrite, assign) VLCLibraryModel *libraryModel; + +- (void)setupAppearance; +- (void)reloadAppearance; + +@end + +NS_ASSUME_NONNULL_END diff --git a/modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.m b/modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.m new file mode 100644 index 0000000000000000000000000000000000000000..d6ab05ffa4e18a3c6d558dca9b75fb128e3730be --- /dev/null +++ b/modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.m @@ -0,0 +1,170 @@ +/***************************************************************************** + * VLCLibraryAlternativeAudioViewController.m: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2019 VLC authors and VideoLAN + * + * Authors: Felix Paul Kühne <fkuehne # videolan -dot- org> + * + * 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 "VLCLibraryAlternativeAudioViewController.h" + +#import "library/VLCLibraryModel.h" +#import "library/VLCLibraryCollectionViewItem.h" +#import "library/VLCLibraryDataTypes.h" + +#import "extensions/NSString+Helpers.h" +#import "views/VLCImageView.h" + +@interface VLCLibraryAlternativeAudioViewController () <NSCollectionViewDelegate, NSCollectionViewDataSource> +{ + NSArray *_displayedCollection; + enum vlc_ml_parent_type _currentParentType; +} +@end + +@implementation VLCLibraryAlternativeAudioViewController + +- (void)setupAppearance +{ + NSArray *availableCollections = [VLCLibraryModel availableAudioCollections]; + NSUInteger availableCollectionsCount = availableCollections.count; + self.segmentedControl.segmentCount = availableCollectionsCount; + for (NSUInteger x = 0; x < availableCollectionsCount; x++) { + [self.segmentedControl setLabel:availableCollections[x] forSegment:x]; + } + [self.segmentedControl setTarget:self]; + [self.segmentedControl setAction:@selector(segmentedControlAction:)]; + + _collectionView.dataSource = self; + _collectionView.delegate = self; + [_collectionView registerClass:[VLCLibraryCollectionViewItem class] forItemWithIdentifier:VLCLibraryCellIdentifier]; + NSCollectionViewFlowLayout *flowLayout = _collectionView.collectionViewLayout; + flowLayout.itemSize = CGSizeMake(214., 260.); + flowLayout.sectionInset = NSEdgeInsetsMake(20., 20., 20., 20.); + flowLayout.minimumLineSpacing = 20.; + flowLayout.minimumInteritemSpacing = 20.; + + [self segmentedControlAction:nil]; +} + +- (void)reloadAppearance +{ + [self.collectionView reloadData]; +} + +- (IBAction)segmentedControlAction:(id)sender +{ + // FIXME: this relies on knowledge internal to VLCLibraryModel + switch (_segmentedControl.selectedSegment) { + case 0: + _displayedCollection = [self.libraryModel listOfArtists]; + _currentParentType = VLC_ML_PARENT_ARTIST; + break; + case 1: + _displayedCollection = [self.libraryModel listOfAlbums]; + _currentParentType = VLC_ML_PARENT_ALBUM; + break; + case 2: + _displayedCollection = [self.libraryModel listOfAudioMedia]; + _currentParentType = VLC_ML_PARENT_UNKNOWN; + break; + case 3: + _displayedCollection = [self.libraryModel listOfGenres]; + _currentParentType = VLC_ML_PARENT_GENRE; + break; + + default: + NSAssert(1, @"reached the unreachable"); + break; + } + [self.collectionView reloadData]; +} + +- (NSInteger)collectionView:(NSCollectionView *)collectionView + numberOfItemsInSection:(NSInteger)section +{ + return _displayedCollection.count; +} + +- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView +{ + return 1; +} + +- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView + itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath +{ + VLCLibraryCollectionViewItem *viewItem = [collectionView makeItemWithIdentifier:VLCLibraryCellIdentifier forIndexPath:indexPath]; + switch (_currentParentType) { + case VLC_ML_PARENT_ARTIST: + { + VLCMediaLibraryArtist *artist = _displayedCollection[indexPath.item]; + viewItem.mediaTitleTextField.stringValue = artist.name; + viewItem.durationTextField.stringValue = [NSString stringWithFormat:_NS("%u albums, %u songs"), artist.numberOfAlbums, artist.numberOfTracks]; + NSImage *image; + if (artist.artworkMRL.length > 0) { + image = [[NSImage alloc] initWithContentsOfURL:[NSURL URLWithString:artist.artworkMRL]]; + } + if (!image) { + image = [NSImage imageNamed: @"noart.png"]; + } + viewItem.mediaImageView.image = image; + break; + } + case VLC_ML_PARENT_ALBUM: + { + VLCMediaLibraryAlbum *album = _displayedCollection[indexPath.item]; + viewItem.mediaTitleTextField.stringValue = album.title; + viewItem.durationTextField.stringValue = [NSString stringWithFormat:_NS("%u songs"), album.numberOfTracks]; + NSImage *image; + if (album.artworkMRL.length > 0) { + image = [[NSImage alloc] initWithContentsOfURL:[NSURL URLWithString:album.artworkMRL]]; + } + if (!image) { + image = [NSImage imageNamed: @"noart.png"]; + } + viewItem.mediaImageView.image = image; + break; + } + case VLC_ML_PARENT_UNKNOWN: + { + VLCMediaLibraryMediaItem *mediaItem = _displayedCollection[indexPath.item]; + viewItem.representedMediaItem = mediaItem; + break; + } + case VLC_ML_PARENT_GENRE: + { + VLCMediaLibraryGenre *genre = _displayedCollection[indexPath.item]; + viewItem.mediaTitleTextField.stringValue = genre.name; + viewItem.durationTextField.stringValue = [NSString stringWithFormat:_NS("%u items"), genre.numberOfTracks]; + viewItem.mediaImageView.image = [NSImage imageNamed: @"noart.png"]; + } + + default: + break; + } + + return viewItem; +} + +- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths +{ + NSLog(@"library selection changed: %@", indexPaths); +} + + +@end diff --git a/modules/gui/macosx/library/VLCLibraryAudioDataSource.m b/modules/gui/macosx/library/VLCLibraryAudioDataSource.m index c251447c670a7c700073a738d24ea10cd058220c..c0713eb6c421321439ff1b44fa14095fab174568 100644 --- a/modules/gui/macosx/library/VLCLibraryAudioDataSource.m +++ b/modules/gui/macosx/library/VLCLibraryAudioDataSource.m @@ -44,7 +44,7 @@ static NSString *VLCAudioLibraryCellIdentifier = @"VLCAudioLibraryCellIdentifier { self = [super init]; if (self) { - _availableCollectionsArray = @[_NS("Artists"), _NS("Albums"), _NS("Songs"), _NS("Genres")]; + _availableCollectionsArray = [VLCLibraryModel availableAudioCollections]; } return self; } diff --git a/modules/gui/macosx/library/VLCLibraryModel.h b/modules/gui/macosx/library/VLCLibraryModel.h index 1f2f3b6d7201a0f4d12edfba4a5c5596e0581ee5..aa58e17fd9d0f10a244becba4a83ff0331bdd635 100644 --- a/modules/gui/macosx/library/VLCLibraryModel.h +++ b/modules/gui/macosx/library/VLCLibraryModel.h @@ -46,6 +46,8 @@ extern NSString *VLCLibraryModelMediaItemUpdated; @interface VLCLibraryModel : NSObject ++ (NSArray *)availableAudioCollections; + - (instancetype)initWithLibrary:(vlc_medialibrary_t *)library; @property (readwrite) VLCLibraryMode libraryMode; diff --git a/modules/gui/macosx/library/VLCLibraryModel.m b/modules/gui/macosx/library/VLCLibraryModel.m index bbd79b5c341d31007ca44f8cd730e5b222b5068d..2417ef85768420be212af8e97eb91c7c41649b45 100644 --- a/modules/gui/macosx/library/VLCLibraryModel.m +++ b/modules/gui/macosx/library/VLCLibraryModel.m @@ -24,6 +24,7 @@ #import "main/VLCMain.h" #import "library/VLCLibraryDataTypes.h" +#import "extensions/NSString+Helpers.h" NSString *VLCLibraryModelAudioMediaListUpdated = @"VLCLibraryModelAudioMediaListUpdated"; NSString *VLCLibraryModelArtistListUpdated = @"VLCLibraryModelArtistListUpdated"; @@ -123,6 +124,11 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event) [_defaultNotificationCenter removeObserver:self]; } ++ (NSArray *)availableAudioCollections +{ + return @[_NS("Artists"), _NS("Albums"), _NS("Songs"), _NS("Genres")]; +} + - (void)mediaItemWasUpdated:(VLCMediaLibraryMediaItem *)mediaItem { [_defaultNotificationCenter postNotificationName:VLCLibraryModelMediaItemUpdated object:mediaItem]; diff --git a/modules/gui/macosx/library/VLCLibraryWindow.h b/modules/gui/macosx/library/VLCLibraryWindow.h index fa062a35a75352fcd0788b4ec5f7dd5952e0eefc..29b7f1450579356873c0c0d1c2e6021658a4e25f 100644 --- a/modules/gui/macosx/library/VLCLibraryWindow.h +++ b/modules/gui/macosx/library/VLCLibraryWindow.h @@ -51,6 +51,9 @@ NS_ASSUME_NONNULL_BEGIN @property (readwrite, weak) IBOutlet NSBox *clearPlaylistSeparator; @property (readwrite, weak) IBOutlet NSButton *repeatPlaylistButton; @property (readwrite, weak) IBOutlet NSButton *shufflePlaylistButton; +@property (readwrite, weak) IBOutlet NSView *alternativeAudioView; +@property (readwrite, weak) IBOutlet NSCollectionView *alternativeAudioCollectionView; +@property (readwrite, weak) IBOutlet NSSegmentedControl *alternativeAudioSegmentedControl; @property (readonly) BOOL nativeFullscreenMode; @property (readwrite) BOOL nonembedded; diff --git a/modules/gui/macosx/library/VLCLibraryWindow.m b/modules/gui/macosx/library/VLCLibraryWindow.m index 92f7ecee0ced6b46965f6551dcee6928115dca5b..5eabfbad895ed1b09ed66e5c18be9d5a299a9493 100644 --- a/modules/gui/macosx/library/VLCLibraryWindow.m +++ b/modules/gui/macosx/library/VLCLibraryWindow.m @@ -36,6 +36,7 @@ #import "library/VLCLibraryCollectionViewItem.h" #import "library/VLCLibraryModel.h" #import "library/VLCLibraryCollectionViewSupplementaryElementView.h" +#import "library/VLCLibraryAlternativeAudioViewController.h" #import "media-source/VLCMediaSourceCollectionViewItem.h" #import "media-source/VLCMediaSourceDataSource.h" @@ -58,6 +59,7 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; VLCLibraryAudioDataSource *_libraryAudioDataSource; VLCLibraryGroupDataSource *_libraryAudioGroupDataSource; VLCMediaSourceDataSource *_mediaSourceDataSource; + VLCLibraryAlternativeAudioViewController *_alternativeAudioViewController; VLCPlaylistController *_playlistController; @@ -119,13 +121,14 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; _fspanel = [[VLCFSPanelController alloc] init]; [_fspanel showWindow:self]; - _segmentedTitleControl.segmentCount = 4; + _segmentedTitleControl.segmentCount = 5; [_segmentedTitleControl setTarget:self]; [_segmentedTitleControl setAction:@selector(segmentedControlAction:)]; [_segmentedTitleControl setLabel:_NS("Video") forSegment:0]; [_segmentedTitleControl setLabel:_NS("Music") forSegment:1]; - [_segmentedTitleControl setLabel:_NS("Local Network") forSegment:2]; - [_segmentedTitleControl setLabel:_NS("Internet") forSegment:3]; + [_segmentedTitleControl setLabel:_NS("Music") forSegment:2]; + [_segmentedTitleControl setLabel:_NS("Local Network") forSegment:3]; + [_segmentedTitleControl setLabel:_NS("Internet") forSegment:4]; [_segmentedTitleControl sizeToFit]; [_segmentedTitleControl setSelectedSegment:0]; @@ -185,6 +188,12 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; self.clearPlaylistButton.attributedTitle = attributedTitle; [self updateColorsBasedOnAppearance]; + _alternativeAudioViewController = [[VLCLibraryAlternativeAudioViewController alloc] init]; + _alternativeAudioViewController.collectionView = self.alternativeAudioCollectionView; + _alternativeAudioViewController.segmentedControl = self.alternativeAudioSegmentedControl; + _alternativeAudioViewController.libraryModel = mainInstance.libraryController.libraryModel; + [_alternativeAudioViewController setupAppearance]; + [self segmentedControlAction:nil]; [self repeatStateUpdated:nil]; [self shuffleStateUpdated:nil]; @@ -286,6 +295,9 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; if (_audioLibrarySplitView.superview != nil) { [_audioLibrarySplitView removeFromSuperview]; } + if (_alternativeAudioView.superview != nil) { + [_alternativeAudioView removeFromSuperview]; + } if (_videoLibraryStackView.superview == nil) { _videoLibraryStackView.translatesAutoresizingMaskIntoConstraints = NO; [_libraryTargetView addSubview:_videoLibraryStackView]; @@ -305,6 +317,9 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; if (_videoLibraryStackView.superview != nil) { [_videoLibraryStackView removeFromSuperview]; } + if (_alternativeAudioView.superview != nil) { + [_alternativeAudioView removeFromSuperview]; + } if (_audioLibrarySplitView.superview == nil) { _audioLibrarySplitView.translatesAutoresizingMaskIntoConstraints = NO; [_libraryTargetView addSubview:_audioLibrarySplitView]; @@ -316,6 +331,27 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; [_audioCollectionSelectionTableView reloadData]; break; + case 2: + _libraryVideoDataSource.libraryModel.libraryMode = VLCLibraryModeAudio; + if (_mediaSourceScrollView.superview != nil) { + [_mediaSourceScrollView removeFromSuperview]; + } + if (_videoLibraryStackView.superview != nil) { + [_videoLibraryStackView removeFromSuperview]; + } + if (_audioLibrarySplitView.superview != nil) { + [_audioLibrarySplitView removeFromSuperview]; + } + if (_alternativeAudioView.superview == nil) { + _alternativeAudioView.translatesAutoresizingMaskIntoConstraints = NO; + [_libraryTargetView addSubview:_alternativeAudioView]; + NSDictionary *dict = NSDictionaryOfVariableBindings(_alternativeAudioView); + [_libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_alternativeAudioView(>=572.)]|" options:0 metrics:0 views:dict]]; + [_libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_alternativeAudioView(>=444.)]|" options:0 metrics:0 views:dict]]; + } + [_alternativeAudioViewController reloadAppearance]; + break; + default: if (_videoLibraryStackView.superview != nil) { [_videoLibraryStackView removeFromSuperview]; @@ -323,6 +359,9 @@ const CGFloat VLCLibraryWindowLargeRowHeight = 50.; if (_audioLibrarySplitView.superview != nil) { [_audioLibrarySplitView removeFromSuperview]; } + if (_alternativeAudioView.superview != nil) { + [_alternativeAudioView removeFromSuperview]; + } if (_mediaSourceScrollView.superview == nil) { _mediaSourceScrollView.translatesAutoresizingMaskIntoConstraints = NO; [_libraryTargetView addSubview:_mediaSourceScrollView]; diff --git a/po/POTFILES.in b/po/POTFILES.in index 5c6b2725b2ad321cebcc53d0f5e417c7ce65d221..722fa705c8ecdccd6e4618c91aaa66737271f2c6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -462,6 +462,8 @@ modules/gui/macosx/library/VLCInputItem.h modules/gui/macosx/library/VLCInputItem.m modules/gui/macosx/library/VLCLibraryAlbumTableCellView.h modules/gui/macosx/library/VLCLibraryAlbumTableCellView.m +modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.h +modules/gui/macosx/library/VLCLibraryAlternativeAudioViewController.m modules/gui/macosx/library/VLCLibraryAudioDataSource.h modules/gui/macosx/library/VLCLibraryAudioDataSource.m modules/gui/macosx/library/VLCLibraryCollectionViewItem.h