]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/playlist.m
s/pl_Yield/pl_Hold/
[vlc] / modules / gui / macosx / playlist.m
index 5dad4232cebfdd276e66f79fca47ce0d4d0ac883..9ee7912296720df01bef6599e29fa1d2f2845129 100644 (file)
 }
 - (void)awakeFromNib
 {
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     [o_outline_view setTarget: self];
     [o_outline_view setDelegate: self];
     [o_outline_view setDataSource: self];
 {
     int i_return = 0;
     playlist_item_t *p_item = NULL;
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     assert( outlineView == o_outline_view );
 
     if( !item )
 {
     playlist_item_t *p_return = NULL, *p_item = NULL;
     NSValue *o_value;
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
 
+    PL_LOCK;
     if( item == nil )
     {
         /* root object */
     }
     if( p_item && index < p_item->i_children && index >= 0 )
         p_return = p_item->pp_children[index];
+    PL_UNLOCK;
+
     vlc_object_release( p_playlist );
 
     o_value = [o_outline_dict objectForKey:[NSString stringWithFormat: @"%p", p_return]];
 - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
 {
     int i_return = 0;
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
 
     if( item == nil )
     {
 
 - (void)awakeFromNib
 {
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
 
     int i;
 
     [o_mi_selectall setTitle: _NS("Select All")];
     [o_mi_info setTitle: _NS("Information...")];
     [o_mi_preparse setTitle: _NS("Fetch Meta Data")];
+    [o_mi_revealInFinder setTitle: _NS("Reveal in Finder")];
+    [o_mm_mi_revealInFinder setTitle: _NS("Reveal in Finder")];
+    [[o_mm_mi_revealInFinder menu] setAutoenablesItems: NO];
     [o_mi_sort_name setTitle: _NS("Sort Node by Name")];
     [o_mi_sort_author setTitle: _NS("Sort Node by Author")];
     [o_mi_services setTitle: _NS("Services discovery")];
     [[[[VLCMain sharedInstance] getWizard] getPlaylistWizard] reloadOutlineView];
     [[[[VLCMain sharedInstance] getBookmarks] getDataTable] reloadData];
 
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
 
     if( playlist_CurrentSize( p_playlist ) >= 2 )
     {
 
 - (void)playModeUpdated
 {
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
 
     bool loop = var_GetBool( p_playlist, "loop" );
     bool repeat = var_GetBool( p_playlist, "repeat" );
     {
         /* update our info-panel to reflect the new item */
         [[[VLCMain sharedInstance] getInfo] updatePanelWithItem:p_item->p_input];
+        
+        /* update the state of our Reveal-in-Finder menu items */
+        NSMutableString *o_mrl;
+        char *psz_uri = input_item_GetURI( p_item->p_input );
+        if( psz_uri )
+        {
+            o_mrl = [NSMutableString stringWithUTF8String: psz_uri];
+        
+            /* perform some checks whether it is a file and if it is local at all... */
+            NSRange prefix_range = [o_mrl rangeOfString: @"file:"];
+            if( prefix_range.location != NSNotFound )
+                [o_mrl deleteCharactersInRange: prefix_range];
+            
+            if( [o_mrl characterAtIndex:0] == '/' )
+            {
+                [o_mi_revealInFinder setEnabled: YES];
+                [o_mm_mi_revealInFinder setEnabled: YES];
+                return;
+            }
+        }
+        [o_mi_revealInFinder setEnabled: NO];
+        [o_mm_mi_revealInFinder setEnabled: NO];
     }
 }
 
     unsigned int j;
 
     // FIXME: unsafe
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
     playlist_item_t *p_item, *p_temp_item;
     NSMutableArray *o_array = [NSMutableArray array];
 
                     locked:(BOOL)b_locked
 
 {
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     playlist_item_t *p_temp_item = p_item;
 
     if( p_node == p_item )
 
 - (IBAction)savePlaylist:(id)sender
 {
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
 
     NSSavePanel *o_save_panel = [NSSavePanel savePanel];
     NSString * o_name = [NSString stringWithFormat: @"%@", _NS("Untitled")];
 - (IBAction)playItem:(id)sender
 {
     intf_thread_t * p_intf = VLCIntf;
-    playlist_t * p_playlist = pl_Yield( p_intf );
+    playlist_t * p_playlist = pl_Hold( p_intf );
 
     playlist_item_t *p_item;
     playlist_item_t *p_node = NULL;
     vlc_object_release( p_playlist );
 }
 
+- (IBAction)revealItemInFinder:(id)sender
+{
+    playlist_item_t * p_item = [[o_outline_view itemAtRow:[o_outline_view selectedRow]] pointerValue];
+    NSMutableString * o_mrl = nil;
+
+    if(! p_item || !p_item->p_input )
+        return;
+    
+    char *psz_uri = input_item_GetURI( p_item->p_input );
+    if( psz_uri )
+        o_mrl = [NSMutableString stringWithUTF8String: psz_uri];
+
+    /* perform some checks whether it is a file and if it is local at all... */
+    NSRange prefix_range = [o_mrl rangeOfString: @"file:"];
+    if( prefix_range.location != NSNotFound )
+        [o_mrl deleteCharactersInRange: prefix_range];
+    
+    if( [o_mrl characterAtIndex:0] == '/' )
+        [[NSWorkspace sharedWorkspace] selectFile: o_mrl inFileViewerRootedAtPath: o_mrl];
+}    
+
 /* When called retrieves the selected outlineview row and plays that node or item */
 - (IBAction)preparseItem:(id)sender
 {
     int i_count;
     NSMutableArray *o_to_preparse;
     intf_thread_t * p_intf = VLCIntf;
-    playlist_t * p_playlist = pl_Yield( p_intf );
+    playlist_t * p_playlist = pl_Hold( p_intf );
  
     o_to_preparse = [NSMutableArray arrayWithArray:[[o_outline_view selectedRowEnumerator] allObjects]];
     i_count = [o_to_preparse count];
 {
     NSMenuItem *o_mi = (NSMenuItem *)sender;
     NSString *o_string = [o_mi representedObject];
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     if( !playlist_IsServicesDiscoveryLoaded( p_playlist, [o_string UTF8String] ) )
         playlist_ServicesDiscoveryAdd( p_playlist, [o_string UTF8String] );
     else
     o_to_delete = [NSMutableArray arrayWithArray:[[o_outline_view selectedRowEnumerator] allObjects]];
     i_count = [o_to_delete count];
 
-    p_playlist = pl_Yield( p_intf );
+    p_playlist = pl_Hold( p_intf );
 
     PL_LOCK;
     for( int i = 0; i < i_count; i++ )
 
 - (void)sortNode:(int)i_mode
 {
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     playlist_item_t * p_item;
 
     if( [o_outline_view selectedRow] > -1 )
 - (input_item_t *)createItem:(NSDictionary *)o_one_item
 {
     intf_thread_t * p_intf = VLCIntf;
-    playlist_t * p_playlist = pl_Yield( p_intf );
+    playlist_t * p_playlist = pl_Hold( p_intf );
 
     input_item_t *p_input;
     int i;
 - (void)appendArray:(NSArray*)o_array atPos:(int)i_position enqueue:(BOOL)b_enqueue
 {
     int i_item;
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
 
     PL_LOCK;
     for( i_item = 0; i_item < (int)[o_array count]; i_item++ )
 
         if( i_item == 0 && !b_enqueue )
         {
-            playlist_item_t *p_item;
+            playlist_item_t *p_item = NULL;
+            playlist_item_t *p_node = NULL;
             p_item = playlist_ItemGetByInput( p_playlist, p_input, pl_Locked );
-            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, NULL, p_item );
+            if( p_item )
+            {
+                if( p_item->i_children == -1 )
+                    p_node = p_item->p_parent;
+                else
+                {
+                    p_node = p_item;
+                    if( p_node->i_children > 0 && p_node->pp_children[0]->i_children == -1 )
+                        p_item = p_node->pp_children[0];
+                    else
+                        p_item = NULL;
+                }
+                playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, p_node, p_item );
+            }
         }
         vlc_gc_decref( p_input );
     }
 - (void)appendNodeArray:(NSArray*)o_array inNode:(playlist_item_t *)p_node atPos:(int)i_position enqueue:(BOOL)b_enqueue
 {
     int i_item;
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
 
     for( i_item = 0; i_item < (int)[o_array count]; i_item++ )
     {
         {
             playlist_item_t *p_item;
             p_item = playlist_ItemGetByInput( p_playlist, p_input, pl_Locked );
-            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, NULL, p_item );
+            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, p_node, p_item );
         }
         PL_UNLOCK;
         vlc_gc_decref( p_input );
 
 - (NSMutableArray *)subSearchItem:(playlist_item_t *)p_item
 {
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
     playlist_item_t *p_selected_item;
     int i_current, i_selected_row;
 
 
 - (IBAction)searchItem:(id)sender
 {
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     id o_result;
 
     unsigned int i;
     int i_mode = 0, i_type;
     intf_thread_t *p_intf = VLCIntf;
 
-    playlist_t *p_playlist = pl_Yield( p_intf );
+    playlist_t *p_playlist = pl_Hold( p_intf );
 
     /* Check whether the selected table column header corresponds to a
        sortable table column*/
         i_type = ORDER_NORMAL;
     }
 
-    vlc_object_lock( p_playlist );
+    PL_LOCK;
     playlist_RecursiveNodeSort( p_playlist, p_playlist->p_root_category, i_mode, i_type );
-    vlc_object_unlock( p_playlist );
+    PL_UNLOCK;
 
     vlc_object_release( p_playlist );
     [self playlistUpdated];
                                 forTableColumn:(NSTableColumn *)tableColumn
                                 item:(id)item
 {
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
 
     id o_playing_item;
 
     NSAutoreleasePool * ourPool = [[NSAutoreleasePool alloc] init];
 
     /* simply adds a new node to the end of the playlist */
-    playlist_t * p_playlist = pl_Yield( VLCIntf );
+    playlist_t * p_playlist = pl_Hold( VLCIntf );
     vlc_thread_set_priority( p_playlist, VLC_THREAD_PRIORITY_LOW );
 
     int ret_v;
 - (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item
 {
     id o_value = [super outlineView: outlineView child: index ofItem: item];
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
 
     if( playlist_CurrentSize( p_playlist )  >= 2 )
     {
 - (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard
 {
     unsigned int i;
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
 
     /* First remove the items that were moved during the last drag & drop
        operation */
            (Service Discovery) */
         if( ![self isItem: [o_item pointerValue] inNode:
                         p_playlist->p_local_category checkItemExistence: NO] &&
-            var_CreateGetBool( p_playlist, "media-library" ) &&
+            var_CreateGetBool( p_playlist, "media-library" ) &&
             ![self isItem: [o_item pointerValue] inNode:
-                        p_playlist->p_ml_category checkItemExistence: NO]) )
+                        p_playlist->p_ml_category checkItemExistence: NO] ||
+            [o_item pointerValue] == p_playlist->p_local_category ||
+            [o_item pointerValue] == p_playlist->p_ml_category )
         {
             vlc_object_release(p_playlist);
             return NO;
 
 - (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id <NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(int)index
 {
-    playlist_t *p_playlist = pl_Yield( VLCIntf );
+    playlist_t *p_playlist = pl_Hold( VLCIntf );
     NSPasteboard *o_pasteboard = [info draggingPasteboard];
 
     if( !p_playlist ) return NSDragOperationNone;
 
 - (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(int)index
 {
-    playlist_t * p_playlist =  pl_Yield( VLCIntf );
+    playlist_t * p_playlist =  pl_Hold( VLCIntf );
     NSPasteboard *o_pasteboard = [info draggingPasteboard];
 
     /* Drag & Drop inside the playlist */