[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