]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/playlist.m
enable the macosx GUI to handle negative stop-time
[vlc] / modules / gui / macosx / playlist.m
index 63069e0f85eacd2e84bc14db7582c6e453b247db..e29644a8bb4429dba21c40cb1817b430c915b60b 100644 (file)
 
 - (void)playlistUpdated
 {
-    /* Clear indications of any existing column sorting */
-    NSUInteger count = [[o_outline_view tableColumns] count];
-    for (NSUInteger i = 0 ; i < count ; i++)
-        [o_outline_view setIndicatorImage:nil inTableColumn: [[o_outline_view tableColumns] objectAtIndex:i]];
-
-    [o_outline_view setHighlightedTableColumn:nil];
-    o_tc_sortColumn = nil;
-
     [o_outline_view reloadData];
-    [[[[VLCMain sharedInstance] wizard] playlistWizard] reloadOutlineView];
-
-    [o_outline_view selectRowIndexes:[NSIndexSet indexSetWithIndex:retainedRowSelection] byExtendingSelection:NO];
-
-    [self outlineViewSelectionDidChange: nil];
-    [[VLCMain sharedInstance] updateMainWindow];
 }
 
 - (void)outlineViewSelectionDidChange:(NSNotification *)notification
     return [o_outline_view selectedRow] == -1;
 }
 
-- (void)updateRowSelection
+- (void)currentlyPlayingItemChanged
 {
-    // FIXME: unsafe
-    playlist_t *p_playlist = pl_Get(VLCIntf);
-    playlist_item_t *p_item, *p_temp_item;
-    NSMutableArray *o_array = [NSMutableArray array];
+    PLItem *item = [[self model] currentlyPlayingItem];
+    if (!item)
+        return;
 
-    // TODO Rework
-//    PL_LOCK;
-//    p_item = playlist_CurrentPlayingItem(p_playlist);
-//    if (p_item == NULL) {
-//        PL_UNLOCK;
-//        return;
-//    }
-//
-//    p_temp_item = p_item;
-//    while(p_temp_item->p_parent) {
-//        [o_array insertObject: [NSValue valueWithPointer: p_temp_item] atIndex: 0];
-//        p_temp_item = p_temp_item->p_parent;
-//    }
-//    PL_UNLOCK;
-//
-//    NSUInteger count = [o_array count];
-//    for (NSUInteger j = 0; j < count - 1; j++) {
-//        id o_item;
-//        if ((o_item = [o_outline_dict objectForKey:
-//                            [NSString stringWithFormat: @"%p",
-//                            [[o_array objectAtIndex:j] pointerValue]]]) != nil) {
-//            [o_outline_view expandItem: o_item];
-//        }
-//    }
-//
-//    id o_item = [o_outline_dict objectForKey:[NSString stringWithFormat: @"%p", p_item]];
-//    NSInteger i_index = [o_outline_view rowForItem:o_item];
-//    [o_outline_view selectRowIndexes:[NSIndexSet indexSetWithIndex:i_index] byExtendingSelection:NO];
-//    [o_outline_view setNeedsDisplay:YES];
+    // select item
+    NSInteger itemIndex = [o_outline_view rowForItem:item];
+    if (itemIndex < 0) {
+        // expand if needed
+        while (item != nil) {
+            PLItem *parent = [item parent];
+
+            if (![o_outline_view isExpandable: parent])
+                break;
+            if (![o_outline_view isItemExpanded: parent])
+                [o_outline_view expandItem: parent];
+            item = parent;
+        }
+
+        // search for row again
+        itemIndex = [o_outline_view rowForItem:item];
+        if (itemIndex < 0) {
+            return;
+        }
+    }
+
+    [o_outline_view selectRowIndexes: [NSIndexSet indexSetWithIndex: itemIndex] byExtendingSelection: NO];
 }
 
 - (IBAction)savePlaylist:(id)sender
     [[[VLCMain sharedInstance] info] initPanel];
 }
 
+- (void)deletionCompleted
+{
+    // retain selection before deletion
+    [o_outline_view selectRowIndexes:[NSIndexSet indexSetWithIndex:retainedRowSelection] byExtendingSelection:NO];
+}
+
 - (IBAction)deleteItem:(id)sender
 {
-    int i_count;
-    NSIndexSet *o_selected_indexes;
-    intf_thread_t * p_intf = VLCIntf;
-    playlist_t * p_playlist = pl_Get(p_intf);
+    playlist_t * p_playlist = pl_Get(VLCIntf);
 
     // check if deletion is allowed
     if (![[self model] editAllowed])
         return;
 
-    o_selected_indexes = [o_outline_view selectedRowIndexes];
-    i_count = [o_selected_indexes count];
+    NSIndexSet *o_selected_indexes = [o_outline_view selectedRowIndexes];
     retainedRowSelection = [o_selected_indexes firstIndex];
     if (retainedRowSelection == NSNotFound)
         retainedRowSelection = 0;
 
+    [o_selected_indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
+        PLItem *o_item = [o_outline_view itemAtRow: idx];
+        if (!o_item)
+            return;
 
-    NSUInteger indexes[i_count];
-//    if (i_count == [o_outline_view numberOfRows]) {
-//        PL_LOCK;
-//        playlist_NodeDelete(p_playlist, [self currentPlaylistRoot], true, false);
-//        PL_UNLOCK;
-//        [self playlistUpdated];
-//        return;
-//    }
-    [o_selected_indexes getIndexes:indexes maxCount:i_count inIndexRange:nil];
-    for (int i = 0; i < i_count; i++) {
-        PLItem *o_item = [o_outline_view itemAtRow: indexes[i]];
-        [o_outline_view deselectRow: indexes[i]];
-
-        /// TODO
-//        if (p_item->i_children != -1) {
-//        //is a node and not an item
-//            if (playlist_Status(p_playlist) != PLAYLIST_STOPPED &&
-//                [self isItem: playlist_CurrentPlayingItem(p_playlist) inNode: ((playlist_item_t *)[o_item pointerValue])
-//                        checkItemExistence: NO locked:YES] == YES)
-//                // if current item is in selected node and is playing then stop playlist
-//                playlist_Control(p_playlist, PLAYLIST_STOP, pl_Locked);
-//
-//                playlist_NodeDelete(p_playlist, p_item, true, false);
-//        } else
-
-            playlist_DeleteFromInput(p_playlist, [o_item input], pl_Unlocked);
-//        [[o_item parent] deleteChild:o_item];
-//
-//        [o_outline_view reloadData];
-    }
-
-//    [self playlistUpdated];
+        // model deletion is done via callback
+        playlist_DeleteFromInput(p_playlist, [o_item input], pl_Unlocked);
+    }];
 }
 
 - (IBAction)sortNodeByName:(id)sender
     /* allow the user to over-write the start/stop/run-time */
     if (var_GetFloat(p_input_thread, "run-time") > 0 ||
         var_GetFloat(p_input_thread, "start-time") > 0 ||
-        var_GetFloat(p_input_thread, "stop-time") > 0) {
+        var_GetFloat(p_input_thread, "stop-time") != 0) {
         return;
     }