[vlc-commits] macosx: Implement deletion of multiple playlist items
David Fuhrmann
git at videolan.org
Fri May 31 11:01:25 CEST 2019
vlc | branch: master | David Fuhrmann <dfuhrmann at videolan.org> | Fri May 31 10:42:45 2019 +0200| [437032b2e936b47f2ad941dc489fc3fd6fce03f9] | committer: David Fuhrmann
macosx: Implement deletion of multiple playlist items
Avoids crash when deleting more than one index at once.
Uses playlist_RequestDelete to handle concurrent requests from
multiple UIs.
Fixes deletion also from context menu.
closes #22367
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=437032b2e936b47f2ad941dc489fc3fd6fce03f9
---
modules/gui/macosx/playlist/VLCPlaylistController.h | 6 +++---
modules/gui/macosx/playlist/VLCPlaylistController.m | 16 ++++++++++++++--
modules/gui/macosx/playlist/VLCPlaylistMenuController.m | 7 +++----
modules/gui/macosx/playlist/VLCPlaylistTableView.m | 10 ++--------
4 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/modules/gui/macosx/playlist/VLCPlaylistController.h b/modules/gui/macosx/playlist/VLCPlaylistController.h
index 7276a69ec5..eba43dd114 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistController.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistController.h
@@ -132,10 +132,10 @@ extern NSString *VLCPlaylistItemsRemoved;
startPlayback:(BOOL)startPlayback;
/**
- * Remove the item at the given index (if any)
- * @param index the index to remove
+ * Remove all items at the given index set
+ * @param indexes Set of indexes to remove
*/
-- (void)removeItemAtIndex:(size_t)index;
+- (void)removeItemsAtIndexes:(NSIndexSet *)indexes;
/**
* Clear the entire playlist
diff --git a/modules/gui/macosx/playlist/VLCPlaylistController.m b/modules/gui/macosx/playlist/VLCPlaylistController.m
index 1597b8ec00..1366004983 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistController.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistController.m
@@ -395,14 +395,26 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
return ret;
}
-- (void)removeItemAtIndex:(size_t)index
+- (void)removeItemsAtIndexes:(NSIndexSet *)indexes
{
+ if (indexes.count == 0)
+ return;
+
+ __block vlc_playlist_item_t **items = calloc(indexes.count, sizeof(vlc_playlist_item_t *));
+ __block NSUInteger pos = 0;
+ [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
+ VLCPlaylistItem *item = [_playlistModel playlistItemAtIndex:idx];
+ items[pos++] = item.playlistItem;
+ }];
+
/* note: we don't remove the cached data from the model here
* because this will be done asynchronously through the callback */
vlc_playlist_Lock(_p_playlist);
- vlc_playlist_Remove(_p_playlist, index, 1);
+ vlc_playlist_RequestRemove(_p_playlist, items, pos, indexes.firstIndex);
vlc_playlist_Unlock(_p_playlist);
+
+ free(items);
}
- (void)clearPlaylist
diff --git a/modules/gui/macosx/playlist/VLCPlaylistMenuController.m b/modules/gui/macosx/playlist/VLCPlaylistMenuController.m
index 4cebe5308b..b145780d47 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistMenuController.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistMenuController.m
@@ -72,11 +72,10 @@
- (IBAction)remove:(id)sender
{
- NSInteger selectedRow = self.playlistTableView.selectedRow;
+ if (self.playlistTableView.selectedRow == -1)
+ return;
- if (selectedRow != -1) {
- [_playlistController removeItemAtIndex:selectedRow];
- }
+ [_playlistController removeItemsAtIndexes:self.playlistTableView.selectedRowIndexes];
}
- (IBAction)revealInFinder:(id)sender
diff --git a/modules/gui/macosx/playlist/VLCPlaylistTableView.m b/modules/gui/macosx/playlist/VLCPlaylistTableView.m
index b3bb79a019..3a814cc2fb 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistTableView.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistTableView.m
@@ -70,14 +70,8 @@
case NSDeleteCharFunctionKey:
case NSBackspaceCharacter:
{
- if (selectedIndexes.count == 1) {
- [[[VLCMain sharedInstance] playlistController] removeItemAtIndex:indexOfSelectedItem];
- } else {
- VLCPlaylistController *playlistController = [[VLCMain sharedInstance] playlistController];
- [selectedIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
- [playlistController removeItemAtIndex:idx];
- }];
- }
+ VLCPlaylistController *playlistController = [[VLCMain sharedInstance] playlistController];
+ [playlistController removeItemsAtIndexes:selectedIndexes];
break;
}
More information about the vlc-commits
mailing list