[vlc-commits] [Git][videolan/vlc][master] 4 commits: macosx: Show queue playlist creation only from play queue background
Steve Lhomme (@robUx4)
gitlab at videolan.org
Sat Jul 25 08:00:56 UTC 2026
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
980fe458 by Serhii Bykov at 2026-07-25T07:45:33+00:00
macosx: Show queue playlist creation only from play queue background
- - - - -
d22dd14f by Serhii Bykov at 2026-07-25T07:45:33+00:00
macosx: Add playlist submenu to play queue item menu
- - - - -
1bba2cca by Serhii Bykov at 2026-07-25T07:45:33+00:00
macosx: Share Add to Playlist menu item creation
- - - - -
e4c213b6 by Serhii Bykov at 2026-07-25T07:45:33+00:00
macosx: clarify play queue context menu preparation
- - - - -
6 changed files:
- modules/gui/macosx/library/VLCLibraryAddToPlaylistMenuController.h
- modules/gui/macosx/library/VLCLibraryAddToPlaylistMenuController.m
- modules/gui/macosx/library/VLCLibraryMenuController.m
- modules/gui/macosx/playqueue/VLCPlayQueueMenuController.h
- modules/gui/macosx/playqueue/VLCPlayQueueMenuController.m
- modules/gui/macosx/playqueue/VLCPlayQueueTableView.m
Changes:
=====================================
modules/gui/macosx/library/VLCLibraryAddToPlaylistMenuController.h
=====================================
@@ -25,12 +25,16 @@
NS_ASSUME_NONNULL_BEGIN
@class VLCLibraryRepresentedItem;
+ at class VLCMediaLibraryMediaItem;
@interface VLCLibraryAddToPlaylistMenuController : NSObject
@property (readonly) NSMenu *addToPlaylistMenu;
@property (copy, nullable) NSArray<VLCLibraryRepresentedItem *> *representedItems;
+ at property (copy, nullable) NSArray<VLCMediaLibraryMediaItem *> *representedMediaItems;
+
+- (NSMenuItem *)createAddToPlaylistMenuItem;
@end
=====================================
modules/gui/macosx/library/VLCLibraryAddToPlaylistMenuController.m
=====================================
@@ -22,6 +22,7 @@
#import "VLCLibraryAddToPlaylistMenuController.h"
+#import "extensions/NSMenuItem+VLCAdditions.h"
#import "extensions/NSString+Helpers.h"
#import "library/VLCLibraryController.h"
@@ -48,6 +49,16 @@
return self;
}
+- (NSMenuItem *)createAddToPlaylistMenuItem
+{
+ NSMenuItem * const item = [[NSMenuItem alloc] initWithTitle:_NS("Add to Playlist")
+ action:nil
+ keyEquivalent:@""];
+ [item setSubmenu:self.addToPlaylistMenu];
+ [item vlc_setActionImageWithSystemSymbolName:@"text.badge.plus"];
+ return item;
+}
+
#pragma mark - Helpers
- (nullable NSArray<VLCMediaLibraryPlaylist *> *)writablePlaylists
@@ -77,6 +88,10 @@
- (NSArray<VLCMediaLibraryMediaItem *> *)selectedMediaItems
{
+ if (self.representedMediaItems.count > 0) {
+ return self.representedMediaItems;
+ }
+
NSMutableArray<VLCMediaLibraryMediaItem *> * const mediaItems =
[NSMutableArray arrayWithCapacity:self.representedItems.count];
for (VLCLibraryRepresentedItem * const representedItem in self.representedItems) {
=====================================
modules/gui/macosx/library/VLCLibraryMenuController.m
=====================================
@@ -113,10 +113,7 @@
self.favoriteItem.target = self;
_addToPlaylistMenuController = [[VLCLibraryAddToPlaylistMenuController alloc] init];
- _addToPlaylistItem = [[NSMenuItem alloc] initWithTitle:_NS("Add to Playlist")
- action:nil
- keyEquivalent:@""];
- [_addToPlaylistItem setSubmenu:_addToPlaylistMenuController.addToPlaylistMenu];
+ _addToPlaylistItem = [_addToPlaylistMenuController createAddToPlaylistMenuItem];
_removeFromPlaylistItem = [[NSMenuItem alloc] initWithTitle:_NS("Remove from Playlist")
action:@selector(removeFromPlaylist:)
@@ -125,7 +122,6 @@
[playItem vlc_setActionImageWithSystemSymbolName:@"play.fill"];
[appendItem vlc_setActionImageWithSystemSymbolName:@"text.line.last.and.arrowtriangle.forward"];
- [_addToPlaylistItem vlc_setActionImageWithSystemSymbolName:@"text.badge.plus"];
[_removeFromPlaylistItem vlc_setActionImageWithSystemSymbolName:@"minus.circle"];
[self.favoriteItem vlc_setActionImageWithSystemSymbolName:@"heart"];
[bookmarkItem vlc_setActionImageWithSystemSymbolName:@"bookmark"];
=====================================
modules/gui/macosx/playqueue/VLCPlayQueueMenuController.h
=====================================
@@ -26,11 +26,18 @@
NS_ASSUME_NONNULL_BEGIN
+typedef NS_ENUM(NSUInteger, VLCPlayQueueContextMenuTarget) {
+ VLCPlayQueueContextMenuTargetRow,
+ VLCPlayQueueContextMenuTargetBackground,
+};
+
@interface VLCPlayQueueMenuController : NSObject
@property (readwrite, weak, nonatomic) NSTableView *playQueueTableView;
@property (readonly) NSMenu *playQueueMenu;
+- (void)prepareForContextMenuTarget:(VLCPlayQueueContextMenuTarget)target;
+
@end
NS_ASSUME_NONNULL_END
=====================================
modules/gui/macosx/playqueue/VLCPlayQueueMenuController.m
=====================================
@@ -27,7 +27,9 @@
#import "extensions/NSString+Helpers.h"
#import "extensions/NSMenu+VLCAdditions.h"
#import "extensions/NSMenuItem+VLCAdditions.h"
+#import "library/VLCLibraryAddToPlaylistMenuController.h"
#import "library/VLCLibraryController.h"
+#import "library/VLCLibraryDataTypes.h"
#import "main/VLCMain.h"
#import "playqueue/VLCPlayQueueController.h"
#import "playqueue/VLCPlayQueueModel.h"
@@ -40,12 +42,14 @@
{
VLCPlayQueueController *_playQueueController;
VLCPlayQueueSortingMenuController *_playQueueSortingMenuController;
+ VLCLibraryAddToPlaylistMenuController *_addToPlaylistMenuController;
VLCInformationWindowController *_informationWindowController;
NSMenuItem *_playMenuItem;
NSMenuItem *_removeMenuItem;
NSMenuItem *_informationMenuItem;
NSMenuItem *_revealInFinderMenuItem;
+ NSMenuItem *_addToPlaylistMenuItem;
NSMenuItem *_addFilesToPlayQueueMenuItem;
NSMenuItem *_clearPlayQueueMenuItem;
NSMenuItem *_sortMenuItem;
@@ -54,6 +58,7 @@
@property (readwrite, atomic) NSArray<NSMenuItem *> *items;
@property (readwrite, atomic) NSArray<NSMenuItem *> *multipleSelectionItems;
+ at property (readwrite, atomic) NSArray<NSMenuItem *> *backgroundItems;
@end
@@ -83,6 +88,9 @@
_informationMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Information...") action:@selector(showInformationPanel:) keyEquivalent:@""];
_informationMenuItem.target = self;
+ _addToPlaylistMenuController = [[VLCLibraryAddToPlaylistMenuController alloc] init];
+ _addToPlaylistMenuItem = [_addToPlaylistMenuController createAddToPlaylistMenuItem];
+
_addFilesToPlayQueueMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Add File...") action:@selector(addFilesToPlayQueue:) keyEquivalent:@""];
_addFilesToPlayQueueMenuItem.target = self;
@@ -110,16 +118,23 @@
_removeMenuItem,
_revealInFinderMenuItem,
_informationMenuItem,
+ _addToPlaylistMenuItem,
NSMenuItem.separatorItem,
_addFilesToPlayQueueMenuItem,
_clearPlayQueueMenuItem,
- _createPlaylistMenuItem,
_sortMenuItem
];
self.multipleSelectionItems = @[
_removeMenuItem,
+ _addToPlaylistMenuItem,
NSMenuItem.separatorItem,
+ _addFilesToPlayQueueMenuItem,
+ _clearPlayQueueMenuItem,
+ _sortMenuItem
+ ];
+
+ self.backgroundItems = @[
_addFilesToPlayQueueMenuItem,
_clearPlayQueueMenuItem,
_createPlaylistMenuItem,
@@ -147,6 +162,43 @@
}
+- (NSArray<VLCMediaLibraryMediaItem *> *)selectedMediaLibraryItems
+{
+ NSIndexSet * const selectedIndexes = self.playQueueTableView.selectedRowIndexes;
+ NSMutableArray<VLCMediaLibraryMediaItem *> * const mediaItems =
+ [NSMutableArray arrayWithCapacity:selectedIndexes.count];
+
+ [selectedIndexes enumerateIndexesUsingBlock:^(const NSUInteger idx, BOOL * const __unused stop) {
+ VLCPlayQueueItem * const item =
+ [self->_playQueueController.playQueueModel playQueueItemAtIndex:idx];
+ VLCMediaLibraryMediaItem * const mediaLibraryItem = item.mediaLibraryItem;
+ if (mediaLibraryItem != nil) {
+ [mediaItems addObject:mediaLibraryItem];
+ }
+ }];
+
+ return mediaItems.copy;
+}
+
+- (void)updateAddToPlaylistMenuItem
+{
+ NSArray<VLCMediaLibraryMediaItem *> * const mediaItems = [self selectedMediaLibraryItems];
+ _addToPlaylistMenuController.representedMediaItems = mediaItems;
+ _addToPlaylistMenuItem.enabled = mediaItems.count > 0;
+}
+
+- (void)prepareForContextMenuTarget:(VLCPlayQueueContextMenuTarget)target
+{
+ if (target == VLCPlayQueueContextMenuTargetRow) {
+ [self updateAddToPlaylistMenuItem];
+ const BOOL multipleSelection = self.playQueueTableView.selectedRowIndexes.count > 1;
+ self.playQueueMenu.itemArray = multipleSelection ? self.multipleSelectionItems : self.items;
+ } else {
+ _addToPlaylistMenuController.representedMediaItems = nil;
+ self.playQueueMenu.itemArray = self.backgroundItems;
+ }
+}
+
- (void)play:(id)sender
{
NSInteger selectedRow = self.playQueueTableView.selectedRow;
@@ -218,23 +270,7 @@
- (void)createPlaylistFromQueue:(id)sender
{
- NSIndexSet * const selectedIndexes = self.playQueueTableView.selectedRowIndexes;
-
- NSArray<VLCPlayQueueItem *> *items = nil;
- if (selectedIndexes.count > 0) {
- NSMutableArray<VLCPlayQueueItem *> * const selectedItems = [NSMutableArray arrayWithCapacity:selectedIndexes.count];
- [selectedIndexes enumerateIndexesUsingBlock:^(const NSUInteger idx, BOOL * const __unused stop) {
- VLCPlayQueueItem * const item = [_playQueueController.playQueueModel playQueueItemAtIndex:idx];
- if (item) {
- [selectedItems addObject:item];
- }
- }];
- items = selectedItems.copy;
- } else {
- items = _playQueueController.playQueueModel.playQueueItems;
- }
-
- [VLCMain.sharedInstance.libraryController showCreatePlaylistDialogForPlayQueueItems:items];
+ [VLCMain.sharedInstance.libraryController showCreatePlaylistDialogForPlayQueueItems:_playQueueController.playQueueModel.playQueueItems];
}
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
@@ -248,6 +284,9 @@
} else if (menuItem == _createPlaylistMenuItem) {
return (self.playQueueTableView.numberOfRows > 0);
+ } else if (menuItem == _addToPlaylistMenuItem) {
+ return _addToPlaylistMenuController.representedMediaItems.count > 0;
+
} else if (menuItem == _removeMenuItem ||
menuItem == _playMenuItem ||
menuItem == _informationMenuItem) {
@@ -273,6 +312,7 @@
} else {
self.playQueueMenu.itemArray = self.items;
}
+ [self updateAddToPlaylistMenuItem];
}
@end
=====================================
modules/gui/macosx/playqueue/VLCPlayQueueTableView.m
=====================================
@@ -49,6 +49,10 @@
if (row != -1 && ![[self selectedRowIndexes] containsIndex: row])
[self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
+ const VLCPlayQueueContextMenuTarget target =
+ row != -1 ? VLCPlayQueueContextMenuTargetRow : VLCPlayQueueContextMenuTargetBackground;
+ [self.menuController prepareForContextMenuTarget:target];
+
return self.menuController.playQueueMenu;
}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/270e8b014e711573d272eae4355d1a3623a4893a...e4c213b6c12260dfcdb586d0304231ee1282d058
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/270e8b014e711573d272eae4355d1a3623a4893a...e4c213b6c12260dfcdb586d0304231ee1282d058
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help
More information about the vlc-commits
mailing list