[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