[vlc-commits] [Git][videolan/vlc][master] 5 commits: macosx: Add property to define if a library segment requires the media library
Steve Lhomme (@robUx4)
gitlab at videolan.org
Fri Apr 10 14:51:49 UTC 2026
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
6d3cf7ca by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Add property to define if a library segment requires the media library
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
10fba686 by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Disable library segments that have a hard dependency on the media library
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
b19257e6 by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Prevent selection of disabled segment on startup
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
180ba1af by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Initialise the status notifier view as hidden
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
f0b23ca5 by Claudio Cambra at 2026-04-10T14:37:17+00:00
macosx: Display warning if the media library module was not loaded
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
5 changed files:
- modules/gui/macosx/library/VLCLibraryController.m
- modules/gui/macosx/library/VLCLibrarySegment.h
- modules/gui/macosx/library/VLCLibrarySegment.m
- modules/gui/macosx/library/VLCLibraryWindowNavigationSidebarViewController.m
- modules/gui/macosx/views/VLCStatusNotifierView.m
Changes:
=====================================
modules/gui/macosx/library/VLCLibraryController.m
=====================================
@@ -56,8 +56,32 @@ typedef int (*folder_action_f)(vlc_medialibrary_t*, const char*);
_p_libraryInstance = vlc_ml_instance_get(getIntf());
if (!_p_libraryInstance) {
msg_Info(getIntf(), "VLC runs without media library support");
+
+ NSUserDefaults * const defaults = NSUserDefaults.standardUserDefaults;
+ NSString * const suppressKey = @"VLCSuppressMediaLibraryFailedAlert";
+ if (![defaults boolForKey:suppressKey]) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ NSAlert * const alert = [[NSAlert alloc] init];
+ alert.messageText = _NS("Media Library Unavailable");
+ alert.informativeText = _NS("The media library module could not be loaded. "
+ "Library features such as browsing your media "
+ "collection will not be available.");
+ alert.alertStyle = NSAlertStyleWarning;
+ [alert addButtonWithTitle:_NS("OK")];
+ alert.showsSuppressionButton = YES;
+ alert.suppressionButton.title = _NS("Do not show this message again");
+ [alert runModal];
+ if (alert.suppressionButton.state == NSControlStateValueOn) {
+ [defaults setBool:YES forKey:suppressKey];
+ }
+ });
+ }
+
return self;
}
+
+ // Reset suppression so the alert reappears if a future load fails.
+ [NSUserDefaults.standardUserDefaults removeObjectForKey:@"VLCSuppressMediaLibraryFailedAlert"];
_libraryModel = [[VLCLibraryModel alloc] initWithLibrary:_p_libraryInstance];
_unsorted = YES;
=====================================
modules/gui/macosx/library/VLCLibrarySegment.h
=====================================
@@ -64,6 +64,7 @@ typedef NS_ENUM(NSInteger, VLCLibrarySegmentType) {
@property (readonly, nullable) Class libraryViewControllerClass;
@property (readwrite) NSInteger viewMode;
@property (readonly) NSUInteger toolbarDisplayFlags;
+ at property (readonly) BOOL mediaLibraryRequired;
+ (instancetype)segmentWithSegmentType:(VLCLibrarySegmentType)segmentType;
+ (instancetype)segmentForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
=====================================
modules/gui/macosx/library/VLCLibrarySegment.m
=====================================
@@ -100,6 +100,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
@property (nullable) void (^internalSaveViewModePreference)(NSInteger);
@property (nullable) NSInteger (^internalGetViewModePreference)(void);
@property VLCLibraryWindowToolbarDisplayFlags internalToolbarDisplayFlags;
+ at property BOOL internalMediaLibraryRequired;
- (instancetype)initWithSegmentType:(VLCLibrarySegmentType)segmentType;
@@ -146,6 +147,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"bw-home"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryHomeViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryHomeViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -184,6 +186,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"bw-home"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryFavoritesViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryFavoritesViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -226,6 +229,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryVideoViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -260,6 +264,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryVideoViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -298,6 +303,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryVideoViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -342,6 +348,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -380,6 +387,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -418,6 +426,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -456,6 +465,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -494,6 +504,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryAudioViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -534,6 +545,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-music"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryPlaylistViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryPlaylistViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -572,6 +584,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"sidebar-movie"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryPlaylistViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryPlaylistViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -610,6 +623,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"NSListViewTemplate"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryPlaylistViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryPlaylistViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -657,6 +671,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"NSTouchBarTagIcon"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryGroupsViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryGroupsViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -695,6 +710,7 @@ NSArray<NSString *> *defaultBookmarkedLocations()
self.internalDisplayImage = [NSImage imageNamed:@"NSTouchBarTagIcon"];
self.internalDisplayImage.template = YES;
}
+ self.internalMediaLibraryRequired = YES;
self.internalLibraryViewControllerClass = VLCLibraryGroupsViewController.class;
self.internalLibraryViewControllerCreator = ^{
return [[VLCLibraryGroupsViewController alloc] initWithLibraryWindow:VLCMain.sharedInstance.libraryWindow];
@@ -1056,4 +1072,9 @@ NSArray<NSString *> *defaultBookmarkedLocations()
return self.internalToolbarDisplayFlags;
}
+- (BOOL)mediaLibraryRequired
+{
+ return self.internalMediaLibraryRequired;
+}
+
@end
=====================================
modules/gui/macosx/library/VLCLibraryWindowNavigationSidebarViewController.m
=====================================
@@ -29,6 +29,10 @@
#import "library/VLCLibraryWindow.h"
#import "library/VLCLibraryWindowNavigationSidebarOutlineView.h"
+#import "library/VLCLibraryController.h"
+
+#import "main/VLCMain.h"
+
#import "extensions/NSColor+VLCAdditions.h"
#import "extensions/NSWindow+VLCAdditions.h"
@@ -311,6 +315,12 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
return;
}
+ VLCLibrarySegment * const segment = [VLCLibrarySegment segmentWithSegmentType:segmentType];
+ if (segment.mediaLibraryRequired &&
+ VLCMain.sharedInstance.libraryController.libraryModel == nil) {
+ segmentType = VLCLibraryBrowseSegmentType;
+ }
+
self.libraryWindow.librarySegmentType = segmentType;
if (segmentType == VLCLibraryMusicSegmentType) {
@@ -344,6 +354,18 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
cellView.imageView.contentTintColor = NSColor.VLCAccentColor;
}
+ NSTreeNode * const treeNode = (NSTreeNode *)item;
+ VLCLibrarySegment * const segment = (VLCLibrarySegment *)treeNode.representedObject;
+ const BOOL mediaLibraryUnavailable =
+ segment.mediaLibraryRequired &&
+ VLCMain.sharedInstance.libraryController.libraryModel == nil;
+ if (mediaLibraryUnavailable) {
+ cellView.textField.textColor = NSColor.tertiaryLabelColor;
+ if (@available(macOS 10.14, *)) {
+ cellView.imageView.contentTintColor = NSColor.tertiaryLabelColor;
+ }
+ }
+
return cellView;
}
@@ -358,6 +380,13 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
if (segment.segmentType == VLCLibraryHeaderSegmentType) {
return NSIndexSet.indexSet;
}
+
+ const BOOL mediaLibraryUnavailable =
+ segment.mediaLibraryRequired &&
+ VLCMain.sharedInstance.libraryController.libraryModel == nil;
+ if (mediaLibraryUnavailable) {
+ return [outlineView selectedRowIndexes];
+ }
}
return proposedSelectionIndexes;
=====================================
modules/gui/macosx/views/VLCStatusNotifierView.m
=====================================
@@ -65,6 +65,8 @@ NSString * const VLCMessageTimeoutTimerUserInfoMessageKey = @"VLCMessageTimeoutT
self.label.stringValue = _NS("Idle");
self.progressIndicator.hidden = YES;
self.infoImageView.hidden = NO;
+ self.hidden = YES;
+ self.alphaValue = 0;
NSNotificationCenter * const defaultCenter = NSNotificationCenter.defaultCenter;
[defaultCenter addObserver:self selector:@selector(updateStatus:) name:nil object:nil];
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/a02b93fd0bb43d7d42c5a9e9486f3486781ae976...f0b23ca5e3a4d7b86cba39bb4710a623aa3d70aa
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/a02b93fd0bb43d7d42c5a9e9486f3486781ae976...f0b23ca5e3a4d7b86cba39bb4710a623aa3d70aa
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list