[vlc-commits] [Git][videolan/vlc][master] macosx: add songs table column visibility menu

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Sat Aug 29 10:32:27 UTC 2026



Felix Paul Kühne pushed to branch master at VideoLAN / VLC


Commits:
69a56ec6 by Serhii Bykov at 2026-08-29T12:16:48+02:00
macosx: add songs table column visibility menu

- - - - -


1 changed file:

- modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m


Changes:

=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m
=====================================
@@ -57,6 +57,9 @@
 #import "views/VLCSubScrollView.h"
 #import "views/VLCUIUnits.h"
 
+NSString * const VLCLibrarySongsTableViewAutosaveName = @"VLCLibrarySongsTableView";
+NSString * const VLCLibrarySongsTableViewHiddenColumnsPreferenceKey = @"VLCLibrarySongsTableViewHiddenColumns";
+
 NSString * const VLCLibrarySongsTableViewSongPlayingColumnIdentifier = @"VLCLibrarySongsTableViewSongPlayingColumnIdentifier";
 NSString * const VLCLibrarySongsTableViewTitleColumnIdentifier = @"VLCLibrarySongsTableViewTitleColumnIdentifier";
 NSString * const VLCLibrarySongsTableViewDurationColumnIdentifier = @"VLCLibrarySongsTableViewDurationColumnIdentifier";
@@ -76,10 +79,11 @@ NSString * const VLCLibraryYearSortDescriptorKey = @"VLCLibraryYearSortDescripto
 
 NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification = @"VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification";
 
- at interface VLCLibraryAudioDataSource ()
+ at interface VLCLibraryAudioDataSource () <NSMenuDelegate>
 
 @property (readwrite, atomic) NSMutableArray *displayedCollection;
 @property (readonly) BOOL displayAllArtistsGenresTableEntry;
+ at property (readwrite, strong) NSMenu *songsTableHeaderMenu;
 
 @end
 
@@ -468,9 +472,13 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
 
     self.songsTableView.target = self;
     self.songsTableView.doubleAction = @selector(songDoubleClickAction:);
+    self.songsTableView.autosaveName = VLCLibrarySongsTableViewAutosaveName;
+    self.songsTableView.autosaveTableColumns = YES;
 
     [self setupPrototypeSortDescriptorsForTableView:_songsTableView];
     [self setupExistingSortForTableView:_songsTableView];
+    [self setupColumnVisibilityMenuForSongsTableView];
+    [self restoreHiddenColumnsForSongsTableView];
 }
 
 - (void)setupPrototypeSortDescriptorsForTableView:(NSTableView *)tableView
@@ -546,6 +554,92 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
     return VLCLibraryTitleSortDescriptorKey;
 }
 
+- (void)setupColumnVisibilityMenuForSongsTableView
+{
+    NSMenu * const menu = [[NSMenu alloc] initWithTitle:_NS("Columns")];
+    menu.delegate = self;
+
+    for (NSTableColumn * const column in self.songsTableView.tableColumns) {
+        if ([column.identifier isEqualToString:VLCLibrarySongsTableViewSongPlayingColumnIdentifier]) {
+            continue;
+        }
+
+        NSString * const title = column.headerCell.stringValue;
+        NSMenuItem * const item = [[NSMenuItem alloc] initWithTitle:title
+                                                             action:@selector(toggleSongsTableColumnVisibility:)
+                                                      keyEquivalent:@""];
+        item.target = self;
+        item.representedObject = column;
+        [menu addItem:item];
+    }
+
+    self.songsTableHeaderMenu = menu;
+    self.songsTableView.headerView.menu = menu;
+}
+
+- (void)restoreHiddenColumnsForSongsTableView
+{
+    NSArray<NSString *> * const hiddenColumnIdentifiers =
+        [NSUserDefaults.standardUserDefaults arrayForKey:VLCLibrarySongsTableViewHiddenColumnsPreferenceKey];
+    NSSet<NSString *> * const hiddenColumns = [NSSet setWithArray:hiddenColumnIdentifiers];
+    for (NSTableColumn * const column in self.songsTableView.tableColumns) {
+        if ([column.identifier isEqualToString:VLCLibrarySongsTableViewSongPlayingColumnIdentifier] ||
+            [column.identifier isEqualToString:VLCLibrarySongsTableViewTitleColumnIdentifier]) {
+            column.hidden = NO;
+            continue;
+        }
+
+        column.hidden = [hiddenColumns containsObject:column.identifier];
+    }
+}
+
+- (void)persistHiddenColumnsForSongsTableView
+{
+    NSMutableArray<NSString *> * const hiddenColumnIdentifiers = NSMutableArray.array;
+    for (NSTableColumn * const column in self.songsTableView.tableColumns) {
+        if (column.isHidden &&
+            ![column.identifier isEqualToString:VLCLibrarySongsTableViewSongPlayingColumnIdentifier] &&
+            ![column.identifier isEqualToString:VLCLibrarySongsTableViewTitleColumnIdentifier]) {
+            [hiddenColumnIdentifiers addObject:column.identifier];
+        }
+    }
+
+    [NSUserDefaults.standardUserDefaults setObject:hiddenColumnIdentifiers
+                                            forKey:VLCLibrarySongsTableViewHiddenColumnsPreferenceKey];
+}
+
+- (void)toggleSongsTableColumnVisibility:(NSMenuItem *)sender
+{
+    NSTableColumn * const column = sender.representedObject;
+    if (![column isKindOfClass:NSTableColumn.class]) {
+        return;
+    }
+
+    if ([column.identifier isEqualToString:VLCLibrarySongsTableViewTitleColumnIdentifier]) {
+        return;
+    }
+
+    column.hidden = !column.isHidden;
+    [self persistHiddenColumnsForSongsTableView];
+}
+
+- (void)menuNeedsUpdate:(NSMenu *)menu
+{
+    if (menu != self.songsTableHeaderMenu) {
+        return;
+    }
+
+    for (NSMenuItem * const item in menu.itemArray) {
+        NSTableColumn * const column = item.representedObject;
+        if (![column isKindOfClass:NSTableColumn.class]) {
+            continue;
+        }
+
+        item.state = column.isHidden ? NSControlStateValueOff : NSControlStateValueOn;
+        item.enabled = ![column.identifier isEqualToString:VLCLibrarySongsTableViewTitleColumnIdentifier];
+    }
+}
+
 - (void)resetLayoutsForOperation:(void(^)(void))operation
 {
     VLCLibraryCollectionViewFlowLayout * const collectionViewFlowLayout = (VLCLibraryCollectionViewFlowLayout *)self.collectionView.collectionViewLayout;



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/69a56ec63860e6074fd370a461cc086e0f2756e3

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/69a56ec63860e6074fd370a461cc086e0f2756e3
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