[vlc-commits] macosx: add basic implementation to drag library items from the library view to the playlist

Felix Paul Kühne git at videolan.org
Fri Jul 5 15:45:54 CEST 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Fri Jul  5 15:43:55 2019 +0200| [6764184e8b30e2a54e3eb6d447c53ec81a321a76] | committer: Felix Paul Kühne

macosx: add basic implementation to drag library items from the library view to the playlist

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6764184e8b30e2a54e3eb6d447c53ec81a321a76
---

 .../gui/macosx/library/VLCLibraryVideoDataSource.m | 35 ++++++++++++++++++
 modules/gui/macosx/library/VLCLibraryWindow.m      |  1 +
 .../gui/macosx/playlist/VLCPlaylistDataSource.h    |  1 +
 .../gui/macosx/playlist/VLCPlaylistDataSource.m    | 41 +++++++++++++++++++++-
 4 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/modules/gui/macosx/library/VLCLibraryVideoDataSource.m b/modules/gui/macosx/library/VLCLibraryVideoDataSource.m
index f99d37ffd9..fd3f6afb09 100644
--- a/modules/gui/macosx/library/VLCLibraryVideoDataSource.m
+++ b/modules/gui/macosx/library/VLCLibraryVideoDataSource.m
@@ -25,6 +25,7 @@
 #import "library/VLCLibraryCollectionViewItem.h"
 #import "library/VLCLibraryCollectionViewSupplementaryElementView.h"
 #import "library/VLCLibraryModel.h"
+#import "library/VLCLibraryDataTypes.h"
 
 #import "main/CompatibilityFixes.h"
 #import "extensions/NSString+Helpers.h"
@@ -83,4 +84,38 @@ viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
     NSLog(@"library selection changed: %@", indexPaths);
 }
 
+#pragma mark - drag and drop support
+
+- (BOOL)collectionView:(NSCollectionView *)collectionView
+canDragItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+             withEvent:(NSEvent *)event
+{
+    return YES;
+}
+
+- (BOOL)collectionView:(NSCollectionView *)collectionView
+writeItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
+          toPasteboard:(NSPasteboard *)pasteboard
+{
+    NSArray *mediaArray;
+    if (collectionView == self.recentMediaCollectionView) {
+        mediaArray = [_libraryModel listOfRecentMedia];
+    } else {
+        mediaArray = [_libraryModel listOfVideoMedia];
+    }
+
+    NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:indexPaths.count];
+    for (NSIndexPath *indexPath in indexPaths) {
+        VLCMediaLibraryMediaItem *mediaItem = mediaArray[indexPath.item];
+        [mutableArray addObject:mediaItem];
+    }
+
+    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutableArray];
+    NSString *pasteboardType = NSStringFromClass([VLCMediaLibraryMediaItem class]);
+    [pasteboard declareTypes:@[pasteboardType] owner:self];
+    [pasteboard setData:data forType:pasteboardType];
+
+    return YES;
+}
+
 @end
diff --git a/modules/gui/macosx/library/VLCLibraryWindow.m b/modules/gui/macosx/library/VLCLibraryWindow.m
index 79d4b2d8ed..500cebcd55 100644
--- a/modules/gui/macosx/library/VLCLibraryWindow.m
+++ b/modules/gui/macosx/library/VLCLibraryWindow.m
@@ -196,6 +196,7 @@ static int ShowController(vlc_object_t *p_this, const char *psz_variable,
     _playlistDataSource.tableView = _playlistTableView;
     _playlistDataSource.dragDropView = _playlistDragDropView;
     _playlistDataSource.counterTextField = _playlistCounterTextField;
+    [_playlistDataSource prepareForUse];
     _playlistController.playlistDataSource = _playlistDataSource;
 
     _playlistTableView.dataSource = _playlistDataSource;
diff --git a/modules/gui/macosx/playlist/VLCPlaylistDataSource.h b/modules/gui/macosx/playlist/VLCPlaylistDataSource.h
index 884e195d0b..119fed075c 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistDataSource.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistDataSource.h
@@ -34,6 +34,7 @@ NS_ASSUME_NONNULL_BEGIN
 @property (readwrite, assign) VLCDragDropView *dragDropView;
 @property (readwrite, assign) NSTextField *counterTextField;
 
+- (void)prepareForUse;
 - (void)playlistUpdated;
 
 @end
diff --git a/modules/gui/macosx/playlist/VLCPlaylistDataSource.m b/modules/gui/macosx/playlist/VLCPlaylistDataSource.m
index 5ccef8232a..c3110fde3c 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistDataSource.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistDataSource.m
@@ -28,6 +28,8 @@
 #import "playlist/VLCPlaylistItem.h"
 #import "playlist/VLCPlaylistModel.h"
 #import "views/VLCDragDropView.h"
+#import "library/VLCLibraryDataTypes.h"
+#import "library/VLCInputItem.h"
 
 static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
 
@@ -45,6 +47,12 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
     _playlistModel = _playlistController.playlistModel;
 }
 
+- (void)prepareForUse
+{
+    NSString *pasteboardType = NSStringFromClass([VLCMediaLibraryMediaItem class]);
+    [_tableView registerForDraggedTypes:@[pasteboardType]];
+}
+
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
 {
     return _playlistModel.numberOfPlaylistItems;
@@ -94,5 +102,36 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
     [_tableView reloadData];
 }
 
- at end
+- (NSDragOperation)tableView:(NSTableView *)tableView
+                validateDrop:(id<NSDraggingInfo>)info
+                 proposedRow:(NSInteger)row
+       proposedDropOperation:(NSTableViewDropOperation)dropOperation
+{
+    return NSDragOperationCopy;
+}
 
+- (BOOL)tableView:(NSTableView *)tableView
+       acceptDrop:(id<NSDraggingInfo>)info
+              row:(NSInteger)row
+    dropOperation:(NSTableViewDropOperation)dropOperation
+{
+    NSString *pasteboardType = NSStringFromClass([VLCMediaLibraryMediaItem class]);
+    NSData *data = [info.draggingPasteboard dataForType:pasteboardType];
+    if (!data) {
+        return NO;
+    }
+    NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
+    if (!data) {
+        return NO;
+    }
+    NSUInteger arrayCount = array.count;
+
+    for (NSUInteger x = 0; x < arrayCount; x++) {
+        VLCMediaLibraryMediaItem *mediaItem = array[x];
+        [_playlistController addInputItem:mediaItem.inputItem.vlcInputItem atPosition:row startPlayback:NO];
+    }
+
+    return YES;
+}
+
+ at end



More information about the vlc-commits mailing list