[vlc-commits] [Git][videolan/vlc][master] 3 commits: macosx: Add method to set specific favorite value on media library item

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Sun Jul 6 08:12:28 UTC 2025



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


Commits:
1b614165 by Claudio Cambra at 2025-07-06T07:58:56+00:00
macosx: Add method to set specific favorite value on media library item

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
b67ad854 by Claudio Cambra at 2025-07-06T07:58:56+00:00
macosx: Add table view row swipe action to append item to play queue

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
87247e6c by Claudio Cambra at 2025-07-06T07:58:56+00:00
macosx: Add favorite swipe action from trailing edge of table view

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -


3 changed files:

- modules/gui/macosx/library/VLCLibraryDataTypes.h
- modules/gui/macosx/library/VLCLibraryDataTypes.m
- modules/gui/macosx/library/VLCLibraryTableViewDelegate.m


Changes:

=====================================
modules/gui/macosx/library/VLCLibraryDataTypes.h
=====================================
@@ -335,6 +335,7 @@ typedef NS_ENUM(NSUInteger, VLCMediaLibraryParentGroupType) {
 @property (readonly) int trackNumber;
 @property (readonly) int discNumber;
 
+- (int)setFavorite:(BOOL)favorite;
 - (int)toggleFavorite;
 
 @end


=====================================
modules/gui/macosx/library/VLCLibraryDataTypes.m
=====================================
@@ -1576,19 +1576,23 @@ static NSString *genreArrayDisplayString(NSArray<VLCMediaLibraryGenre *> * const
     return self.internalLabels;
 }
 
-- (int)toggleFavorite
+- (int)setFavorite:(BOOL)favorite
 {
     const int64_t mediaItemId = self.libraryID;
-    const bool b_favorite = self.favorited;
     vlc_medialibrary_t * const p_ml = vlc_ml_instance_get(getIntf());
-    const int result = vlc_ml_media_set_favorite(p_ml, mediaItemId, !b_favorite);
+    const int result = vlc_ml_media_set_favorite(p_ml, mediaItemId, favorite);
     if (result == VLC_SUCCESS)
-        _favorited = !_favorited;
+        _favorited = favorite;
     else
         NSLog(@"Unable to set favorite status of media item: %lli", mediaItemId);
     return result;
 }
 
+- (int)toggleFavorite
+{
+    return [self setFavorite:!self.favorited];
+}
+
 @end
 
 @implementation VLCMediaLibraryShow


=====================================
modules/gui/macosx/library/VLCLibraryTableViewDelegate.m
=====================================
@@ -22,11 +22,20 @@
 
 #import "VLCLibraryTableViewDelegate.h"
 
+#import "extensions/NSColor+VLCAdditions.h"
+#import "extensions/NSString+Helpers.h"
+
+#import "library/VLCInputItem.h"
+#import "library/VLCLibraryController.h"
+#import "library/VLCLibraryDataTypes.h"
+#import "library/VLCLibraryRepresentedItem.h"
 #import "library/VLCLibraryTableCellView.h"
 #import "library/VLCLibraryTableCellViewProtocol.h"
 #import "library/VLCLibraryTableViewDataSource.h"
-#import "library/VLCLibraryDataTypes.h"
-#import "library/VLCLibraryRepresentedItem.h"
+
+#include "main/VLCMain.h"
+
+#import "playqueue/VLCPlayQueueController.h"
 
 @implementation VLCLibraryTableViewDelegate
 
@@ -66,4 +75,58 @@
     return cellView;
 }
 
+- (NSArray<NSTableViewRowAction *> *)tableView:(NSTableView *)tableView
+                              rowActionsForRow:(NSInteger)row
+                                          edge:(NSTableRowActionEdge)edge
+{
+    if (![tableView.dataSource conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
+        return @[];
+    }
+
+    NSObject<VLCLibraryTableViewDataSource> * const vlcDataSource =
+        (NSObject<VLCLibraryTableViewDataSource>*)tableView.dataSource;
+    NSAssert(vlcDataSource != nil, @"Should be a valid data source");
+
+    NSObject<VLCMediaLibraryItemProtocol> * const libraryItem =
+        [vlcDataSource libraryItemAtRow:row forTableView:tableView];
+
+    if (edge == NSTableRowActionEdgeLeading) {
+        NSTableViewRowAction * const appendToPlayQueueAction =
+            [NSTableViewRowAction rowActionWithStyle:NSTableViewRowActionStyleRegular
+                                               title:_NS("Append to Play Queue")
+                                             handler:^(NSTableViewRowAction *action, NSInteger r) {
+                VLCLibraryController * const libraryController = VLCMain.sharedInstance.libraryController;
+                for (VLCMediaLibraryMediaItem *mediaItem in libraryItem.mediaItems) {
+                    [libraryController appendItemToPlayQueue:mediaItem playImmediately:NO];
+                }
+        }];
+        appendToPlayQueueAction.backgroundColor = NSColor.VLCAccentColor;
+        return @[appendToPlayQueueAction];
+    } else if (edge == NSTableRowActionEdgeTrailing) {
+        __block BOOL anyUnfavorited = NO;
+        for (VLCMediaLibraryMediaItem * const item in libraryItem.mediaItems) {
+            if (!item.favorited) {
+                anyUnfavorited = YES;
+                break;
+            }
+        }
+        NSString * const displayString =
+            anyUnfavorited ? _NS("Add to Favorites") : _NS("Remove from Favorites");
+
+        NSTableViewRowAction * const favoriteAction =
+            [NSTableViewRowAction rowActionWithStyle:NSTableViewRowActionStyleRegular
+                                               title:displayString
+                                             handler:^(NSTableViewRowAction *action, NSInteger r) {
+            [libraryItem iterateMediaItemsWithBlock:^(VLCMediaLibraryMediaItem *const mediaItem) {
+                const BOOL setFavorited = !mediaItem.favorited;
+                [mediaItem setFavorite:setFavorited];
+            }];
+        }];
+        favoriteAction.backgroundColor =
+            anyUnfavorited ? NSColor.systemRedColor : NSColor.systemBlueColor;
+        return @[favoriteAction];
+    }
+    return @[];
+}
+
 @end



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/fe2328a408cec775a9fc2bc7fcbfd1f1d50c083f...87247e6cf3a275680ebf50304969c3b72f0826a5

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/fe2328a408cec775a9fc2bc7fcbfd1f1d50c083f...87247e6cf3a275680ebf50304969c3b72f0826a5
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list