diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj b/extras/package/macosx/VLC.xcodeproj/project.pbxproj index a5d6ad34d0bd9e72d6319414fcd6510d90e0b811..7afc0f126cec990ff940521ef88e5f85fc868629 100644 --- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj +++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj @@ -104,6 +104,7 @@ 7D0F64062202047900FDB91F /* VLCLibraryCollectionViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0F64042202047900FDB91F /* VLCLibraryCollectionViewItem.m */; }; 7D0F640C2202163E00FDB91F /* VLCPlaylistDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0F640B2202163E00FDB91F /* VLCPlaylistDataSource.m */; }; 7D1BF28A22A153E20027C50F /* VLCRoundedCornerTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D1BF28922A153E20027C50F /* VLCRoundedCornerTextField.m */; }; + 7D1BF28D22A192000027C50F /* VLCPlaylistSortingMenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D1BF28C22A192000027C50F /* VLCPlaylistSortingMenuController.m */; }; 7D20081A2289835C002679DF /* VLCTrackingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D2008192289835C002679DF /* VLCTrackingView.m */; }; 7D28E6362275B4820098D30E /* NSColor+VLCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D28E6352275B4820098D30E /* NSColor+VLCAdditions.m */; }; 7D28E6392275B7340098D30E /* NSFont+VLCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D28E6382275B7340098D30E /* NSFont+VLCAdditions.m */; }; @@ -452,6 +453,8 @@ 7D0F640B2202163E00FDB91F /* VLCPlaylistDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCPlaylistDataSource.m; sourceTree = "<group>"; }; 7D1BF28822A153E20027C50F /* VLCRoundedCornerTextField.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCRoundedCornerTextField.h; sourceTree = "<group>"; }; 7D1BF28922A153E20027C50F /* VLCRoundedCornerTextField.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCRoundedCornerTextField.m; sourceTree = "<group>"; }; + 7D1BF28B22A192000027C50F /* VLCPlaylistSortingMenuController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCPlaylistSortingMenuController.h; sourceTree = "<group>"; }; + 7D1BF28C22A192000027C50F /* VLCPlaylistSortingMenuController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCPlaylistSortingMenuController.m; sourceTree = "<group>"; }; 7D2008182289835C002679DF /* VLCTrackingView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCTrackingView.h; sourceTree = "<group>"; }; 7D2008192289835C002679DF /* VLCTrackingView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCTrackingView.m; sourceTree = "<group>"; }; 7D28E6342275B4820098D30E /* NSColor+VLCAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSColor+VLCAdditions.h"; sourceTree = "<group>"; }; @@ -1048,6 +1051,8 @@ 7D445D832202524D00263D34 /* VLCPlaylistItem.m */, 7D445D8C2203375100263D34 /* VLCPlaylistMenuController.h */, 7D445D8D2203375100263D34 /* VLCPlaylistMenuController.m */, + 7D1BF28B22A192000027C50F /* VLCPlaylistSortingMenuController.h */, + 7D1BF28C22A192000027C50F /* VLCPlaylistSortingMenuController.m */, 7D445D852202574B00263D34 /* VLCPlaylistModel.h */, 7D445D862202574B00263D34 /* VLCPlaylistModel.m */, 7D0F63FD2201F63400FDB91F /* VLCPlaylistTableCellView.h */, @@ -1682,6 +1687,7 @@ 7D66D43C2200D6090040D04A /* VLCDetachedVideoWindow.m in Sources */, 1C31138E1E508C6900D4DD76 /* VLCAboutWindowController.m in Sources */, 1C3113901E508C6900D4DD76 /* VLCHelpWindowController.m in Sources */, + 7D1BF28D22A192000027C50F /* VLCPlaylistSortingMenuController.m in Sources */, 1C3113921E508C6900D4DD76 /* VLCAddonListItem.m in Sources */, 7DFBDCB7226CDFD600B700A5 /* VLCImageView.m in Sources */, 7D404ABF2281892C00B28EF4 /* NSView+VLCAdditions.m in Sources */, diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am index d8f313a29d9d83f8b13c80eed1c3439967e4cd06..f47f77bdc8e76f2f2451b73d6c62a0983afaf128 100644 --- a/modules/gui/macosx/Makefile.am +++ b/modules/gui/macosx/Makefile.am @@ -149,6 +149,8 @@ libmacosx_plugin_la_SOURCES = \ gui/macosx/playlist/VLCPlaylistMenuController.m \ gui/macosx/playlist/VLCPlaylistModel.h \ gui/macosx/playlist/VLCPlaylistModel.m \ + gui/macosx/playlist/VLCPlaylistSortingMenuController.h \ + gui/macosx/playlist/VLCPlaylistSortingMenuController.m \ gui/macosx/playlist/VLCPlaylistTableCellView.h \ gui/macosx/playlist/VLCPlaylistTableCellView.m \ gui/macosx/playlist/VLCPlaylistTableView.h \ diff --git a/modules/gui/macosx/UI/VLCLibraryWindow.xib b/modules/gui/macosx/UI/VLCLibraryWindow.xib index 86049f80a8d6b4b5f5d01357fb19e2bc67cb3b87..05a1187a453bcdb6f3f4bcaaf6d4a0dbf03384f8 100644 --- a/modules/gui/macosx/UI/VLCLibraryWindow.xib +++ b/modules/gui/macosx/UI/VLCLibraryWindow.xib @@ -23,7 +23,7 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W1M-0o-qYG"> - <rect key="frame" x="212.5" y="333" width="56" height="23"/> + <rect key="frame" x="212" y="333" width="56" height="23"/> <segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedRounded" trackingMode="selectOne" id="Twg-gp-8ng"> <font key="font" metaFont="system"/> <segments> @@ -196,7 +196,7 @@ <font key="font" metaFont="system"/> </buttonCell> <connections> - <action selector="repeatAction:" target="QvC-M9-y7g" id="r9L-pE-b8A"/> + <action selector="sortPlaylist:" target="QvC-M9-y7g" id="sBc-0X-g5C"/> </connections> </button> </subviews> diff --git a/modules/gui/macosx/library/VLCLibraryWindow.h b/modules/gui/macosx/library/VLCLibraryWindow.h index 01ca4893ffcea9ec77b9f6112c7924743bd212e3..7d1ac8fed67aa286ee34dc0e494efb83c8c50a37 100644 --- a/modules/gui/macosx/library/VLCLibraryWindow.h +++ b/modules/gui/macosx/library/VLCLibraryWindow.h @@ -73,6 +73,7 @@ NS_ASSUME_NONNULL_BEGIN - (IBAction)shuffleAction:(id)sender; - (IBAction)repeatAction:(id)sender; - (IBAction)clearPlaylist:(id)sender; +- (IBAction)sortPlaylist:(id)sender; - (IBAction)openMedia:(id)sender; - (IBAction)showAndHidePlaylist:(id)sender; diff --git a/modules/gui/macosx/library/VLCLibraryWindow.m b/modules/gui/macosx/library/VLCLibraryWindow.m index f9bf5fa6463a4d8ca1e2110edc472e4e050cca4b..24bff720a5477f5fe2b6a1e944ce333187d89201 100644 --- a/modules/gui/macosx/library/VLCLibraryWindow.m +++ b/modules/gui/macosx/library/VLCLibraryWindow.m @@ -29,6 +29,7 @@ #import "playlist/VLCPlaylistController.h" #import "playlist/VLCPlaylistDataSource.h" +#import "playlist/VLCPlaylistSortingMenuController.h" #import "library/VLCLibraryController.h" #import "library/VLCLibraryAudioDataSource.h" @@ -68,6 +69,7 @@ const CGFloat VLCLibraryWindowDefaultPlaylistWidth = 340.; VLCLibraryGroupDataSource *_libraryAudioGroupDataSource; VLCMediaSourceDataSource *_mediaSourceDataSource; VLCLibraryAlternativeAudioViewController *_alternativeAudioViewController; + VLCPlaylistSortingMenuController *_playlistSortingMenuController; VLCPlaylistController *_playlistController; @@ -403,6 +405,14 @@ const CGFloat VLCLibraryWindowDefaultPlaylistWidth = 340.; [_playlistController clearPlaylist]; } +- (IBAction)sortPlaylist:(id)sender +{ + if (!_playlistSortingMenuController) { + _playlistSortingMenuController = [[VLCPlaylistSortingMenuController alloc] init]; + } + [NSMenu popUpContextMenu:_playlistSortingMenuController.playlistSortingMenu withEvent:[NSApp currentEvent] forView:sender]; +} + - (IBAction)openMedia:(id)sender { [[[VLCMain sharedInstance] open] openFileGeneric]; diff --git a/modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.h b/modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.h new file mode 100644 index 0000000000000000000000000000000000000000..0483ccadd62095774b9a690bfb5efa50497151dc --- /dev/null +++ b/modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.h @@ -0,0 +1,33 @@ +/***************************************************************************** + * VLCPlaylistSortingMenuController.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2002-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 + +@interface VLCPlaylistSortingMenuController : NSObject + +@property (readonly) NSMenu *playlistSortingMenu; + +@end + +NS_ASSUME_NONNULL_END diff --git a/modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.m b/modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.m new file mode 100644 index 0000000000000000000000000000000000000000..0ba9f6bd4683896f05e2f2baf82ec8fdc60bfa0e --- /dev/null +++ b/modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.m @@ -0,0 +1,131 @@ +/***************************************************************************** + * VLCPlaylistSortingMenuController.m: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2002-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 "VLCPlaylistSortingMenuController.h" + +#import "extensions/NSString+Helpers.h" +#import "main/VLCMain.h" +#import "playlist/VLCPlaylistController.h" + +@interface VLCPlaylistSortingMenuController () <NSMenuDelegate> +{ + VLCPlaylistController *_playlistController; +} +@end + +@implementation VLCPlaylistSortingMenuController + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self createMenu]; + _playlistController = [[VLCMain sharedInstance] playlistController]; + } + return self; +} + +- (void)createMenu +{ + _playlistSortingMenu = [[NSMenu alloc] init]; + + NSArray *titles = @[_NS("Title"), + _NS("Duration"), + _NS("Artist"), + _NS("Album"), + _NS("Album Artist"), + _NS("Genre"), + _NS("Date"), + _NS("Track Number"), + _NS("Disc Number"), + _NS("URL"), + _NS("Rating")]; + NSUInteger count = titles.count; + for (NSUInteger x = 0; x < count; x++) { + NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:titles[x] action:@selector(selectSortKey:) keyEquivalent:@""]; + menuItem.target = self; + menuItem.tag = x; + [_playlistSortingMenu addItem:menuItem]; + } + + [_playlistSortingMenu addItem:[NSMenuItem separatorItem]]; + + titles = @[_NS("Ascending"), + _NS("Descending")]; + count = titles.count; + for (NSUInteger x = 0; x < count; x++) { + NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:titles[x] action:@selector(selectSortOrder:) keyEquivalent:@""]; + menuItem.target = self; + menuItem.tag = x + 100; + [_playlistSortingMenu addItem:menuItem]; + } + + _playlistSortingMenu.delegate = self; +} + +- (void)menuNeedsUpdate:(NSMenu *)menu +{ + if (_playlistController.unsorted) { + return; + } + NSInteger count = _playlistSortingMenu.numberOfItems; + for (NSInteger x = 0; x < count; x++) { + NSMenuItem *menuItem = [_playlistSortingMenu itemAtIndex:x]; + menuItem.state = NSOffState; + } + + NSMenuItem *menuItem = [_playlistSortingMenu itemWithTag:_playlistController.lastSortKey]; + menuItem.state = NSOnState; + + menuItem = [_playlistSortingMenu itemWithTag:_playlistController.lastSortOrder + 100]; + menuItem.state = NSOnState; +} + +- (void)selectSortKey:(id)sender +{ + enum vlc_playlist_sort_key sortKey = (enum vlc_playlist_sort_key)[sender tag]; + enum vlc_playlist_sort_order sortOrder; + if (_playlistController.unsorted) { + /* we don't have an order and the user can only do a single selection - pick the most popular */ + sortOrder = VLC_PLAYLIST_SORT_ORDER_ASCENDING; + } else { + sortOrder = _playlistController.lastSortOrder; + } + + [_playlistController sortByKey:sortKey andOrder:sortOrder]; +} + +- (void)selectSortOrder:(id)sender +{ + enum vlc_playlist_sort_key sortKey; + enum vlc_playlist_sort_order sortOrder = (enum vlc_playlist_sort_order)([sender tag] - 100); + if (_playlistController.unsorted) { + /* we don't have a key and the user can only do a single selection - pick the most popular */ + sortKey = VLC_PLAYLIST_SORT_KEY_TITLE; + } else { + sortKey = _playlistController.lastSortKey; + } + + [_playlistController sortByKey:sortKey andOrder:sortOrder]; +} + +@end diff --git a/po/POTFILES.in b/po/POTFILES.in index 49171fb386c90d937cdc1177be5fc9282d3e9ce2..f30a4eeeb2dcbabf1fb95708af3a7219003d3e0e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -553,6 +553,8 @@ modules/gui/macosx/playlist/VLCPlaylistMenuController.h modules/gui/macosx/playlist/VLCPlaylistMenuController.m modules/gui/macosx/playlist/VLCPlaylistModel.h modules/gui/macosx/playlist/VLCPlaylistModel.m +modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.h +modules/gui/macosx/playlist/VLCPlaylistSortingMenuController.m modules/gui/macosx/playlist/VLCPlaylistTableCellView.h modules/gui/macosx/playlist/VLCPlaylistTableCellView.m modules/gui/macosx/playlist/VLCPlaylistTableView.h