]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/playlist.m
* Start cleaning up libvlc playlist API (Refs:#457)
[vlc] / modules / gui / macosx / playlist.m
index d9f137089516f811bc0a3a673e69a568d2812319..c21d79d72e13d5d29146d9008ee2727cb834a2f5 100644 (file)
@@ -50,7 +50,7 @@
 #import "controls.h"
 #import "vlc_osd.h"
 #import "misc.h"
-#import <vlc_interaction.h>
+#import <vlc_interface.h>
 
 /*****************************************************************************
  * VLCPlaylistView implementation 
@@ -242,7 +242,6 @@ NSLog( @"expandable" );
 - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)o_tc byItem:(id)item
 {
     id o_value = nil;
-    intf_thread_t *p_intf = VLCIntf;
     playlist_item_t *p_item;
     
     if( item == nil || ![item isKindOfClass: [NSValue class]] ) return( @"error" );
@@ -256,11 +255,15 @@ NSLog( @"expandable" );
     
     if( [[o_tc identifier] isEqualToString:@"1"] )
     {
-        o_value = [NSString stringWithUTF8String:
-            p_item->p_input->psz_name];
-        if( o_value == NULL )
-            o_value = [NSString stringWithCString:
+        /* sanity check to prevent the NSString class from crashing */
+        if( p_item->p_input->psz_name != NULL )
+        {
+            o_value = [NSString stringWithUTF8String:
                 p_item->p_input->psz_name];
+            if( o_value == NULL )
+                o_value = [NSString stringWithCString:
+                    p_item->p_input->psz_name];
+        }
     }
     else if( [[o_tc identifier] isEqualToString:@"2"] && p_item->p_input->p_meta &&
         p_item->p_input->p_meta->psz_artist && *p_item->p_input->p_meta->psz_artist )
@@ -364,40 +367,44 @@ NSLog( @"expandable" );
 
     for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
-        NSMenuItem * o_lmi;
-        module_t * p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+        vlc_bool_t  b_enabled;
+        char        *objectname;
+        NSMenuItem  *o_lmi;
+        module_t    *p_parser = (module_t *)p_list->p_values[i_index].p_object ;
 
         if( !strcmp( p_parser->psz_capability, "services_discovery" ) )
         {
-            /* create the menu entries used in the playlist menu */
+            /* Check for submodules */
+            int i = -1;
+            while( p_parser->pp_shortcuts[++i] != NULL ); i--;
+
+            /* Check whether to enable these menuitems */
+            objectname = i>=0 ? (char *)p_parser->pp_shortcuts[i] : (char *)p_parser->psz_object_name;
+            b_enabled = playlist_IsServicesDiscoveryLoaded( p_playlist, objectname );
+            
+            /* Create the menu entries used in the playlist menu */
             o_lmi = [[o_mi_services submenu] addItemWithTitle:
                      [NSString stringWithUTF8String:
                      p_parser->psz_longname ? p_parser->psz_longname :
                      ( p_parser->psz_shortname ? p_parser->psz_shortname:
-                     p_parser->psz_object_name)]
+                     objectname)]
                                              action: @selector(servicesChange:)
                                              keyEquivalent: @""];
             [o_lmi setTarget: self];
-            [o_lmi setRepresentedObject:
-                   [NSString stringWithCString: p_parser->psz_object_name]];
-            if( playlist_IsServicesDiscoveryLoaded( p_playlist,
-                    p_parser->psz_object_name ) )
-                [o_lmi setState: NSOnState];
+            [o_lmi setRepresentedObject: [NSString stringWithCString: objectname]];
+            if( b_enabled ) [o_lmi setState: NSOnState];
                 
-            /* create the menu entries for the main menu */
+            /* Create the menu entries for the main menu */
             o_lmi = [[o_mm_mi_services submenu] addItemWithTitle:
                      [NSString stringWithUTF8String:
                      p_parser->psz_longname ? p_parser->psz_longname :
                      ( p_parser->psz_shortname ? p_parser->psz_shortname:
-                     p_parser->psz_object_name)]
+                     objectname)]
                                              action: @selector(servicesChange:)
                                              keyEquivalent: @""];
             [o_lmi setTarget: self];
-            [o_lmi setRepresentedObject:
-                   [NSString stringWithCString: p_parser->psz_object_name]];
-            if( playlist_IsServicesDiscoveryLoaded( p_playlist,
-                    p_parser->psz_object_name ) )
-                [o_lmi setState: NSOnState];
+            [o_lmi setRepresentedObject: [NSString stringWithCString:objectname]];
+            if( b_enabled ) [o_lmi setState: NSOnState];
         }
     }
     vlc_list_release( p_list );
@@ -460,21 +467,18 @@ NSLog( @"expandable" );
 
     playlist_t *p_playlist = pl_Yield( VLCIntf );
 
-    if( p_playlist->i_size >= 2 )
+    if( playlist_CurrentSize( p_playlist ) >= 2 )
     {
         [o_status_field setStringValue: [NSString stringWithFormat:
-                    _NS("%i items in the playlist"), p_playlist->i_size]];
+                    _NS("%i items in the playlist"),
+                               playlist_CurrentSize( p_playlist )]];
     }
     else
     {
-        if( p_playlist->i_size == 0 )
-        {
+        if( playlist_IsEmpty( p_playlist ) )
             [o_status_field setStringValue: _NS("No items in the playlist")];
-        }
         else
-        {
             [o_status_field setStringValue: _NS("1 item in the playlist")];
-        }
     }
     vlc_object_release( p_playlist );
 }
@@ -593,10 +597,10 @@ NSLog( @"expandable" );
         /* Since outlineView: willDisplayCell:... may call this function with
            p_items that don't exist anymore, first check if the item is still
            in the playlist. Any cleaner solution welcomed. */
-            for( i = 0; i < p_playlist->i_all_size; i++ )
+            for( i = 0; i < p_playlist->all_items.i_size; i++ )
             {
-                if( p_playlist->pp_all_items[i] == p_item ) break;
-                else if ( i == p_playlist->i_all_size - 1 )
+                if( ARRAY_VAL( p_playlist->all_items, i) == p_item ) break;
+                else if ( i == p_playlist->all_items.i_size - 1 )
                 {
                     vlc_object_release( p_playlist );
                     vlc_mutex_unlock( &p_playlist->object_lock );
@@ -742,7 +746,7 @@ NSLog( @"expandable" );
                 p_item = NULL;
             }
         }
-        playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, p_node, p_item );
+        playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, p_node, p_item );
     }
     vlc_object_release( p_playlist );
 }
@@ -850,7 +854,7 @@ NSLog( @"expandable" );
         }
         else
         {
-            playlist_LockDelete( p_playlist, p_item->i_id );
+            playlist_DeleteFromInput( p_playlist, p_item->p_input->i_id, VLC_FALSE );
         }
     }
     [self playlistUpdated];
@@ -1006,20 +1010,21 @@ NSLog( @"expandable" );
         }
 
         /* Add the item */
-        playlist_PlaylistAddInput( p_playlist, p_input, PLAYLIST_INSERT,
-                        i_position == -1 ? PLAYLIST_END : i_position + i_item );
+        playlist_AddInput( p_playlist, p_input, PLAYLIST_INSERT,
+             i_position == -1 ? PLAYLIST_END : i_position + i_item, VLC_TRUE,
+            VLC_FALSE );
 
         if( i_item == 0 && !b_enqueue )
         {
             playlist_item_t *p_item;
-            p_item = playlist_ItemGetByInput( p_playlist, p_input );
-            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, NULL, p_item );
+            p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, NULL, p_item );
         }
         else
         {
             playlist_item_t *p_item;
-            p_item = playlist_ItemGetByInput( p_playlist, p_input );
-            playlist_Control( p_playlist, PLAYLIST_PREPARSE, p_item );
+            p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+            playlist_Control( p_playlist, PLAYLIST_PREPARSE, VLC_TRUE, p_item );
         }
     }
     [self playlistUpdated];
@@ -1054,14 +1059,14 @@ NSLog( @"expandable" );
         if( i_item == 0 && !b_enqueue )
         {
             playlist_item_t *p_item;
-            p_item = playlist_ItemGetByInput( p_playlist, p_input );
-            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, NULL, p_item );
+            p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+            playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, NULL, p_item );
         }
         else
         {
             playlist_item_t *p_item;
-            p_item = playlist_ItemGetByInput( p_playlist, p_input );
-            playlist_Control( p_playlist, PLAYLIST_PREPARSE, p_item );
+            p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+            playlist_Control( p_playlist, PLAYLIST_PREPARSE, VLC_TRUE, p_item );
         }
     }
     [self playlistUpdated];
@@ -1337,15 +1342,19 @@ NSLog( @"expandable" );
     playlist_item_t * p_item;
     ret_v = intf_UserStringInput( p_playlist, _("New Node"), 
         _("Please enter a name for the new node."), &psz_name );
+
     if( psz_name != NULL && psz_name != "" )
         p_item = playlist_NodeCreate( p_playlist, psz_name, 
-                                            p_playlist->p_local_category );
-    else
+                                            p_playlist->p_local_category, 0 );
+    else if(! config_GetInt( p_playlist, "interact" ) )
+    {
+        /* in case that the interaction is disabled, just give it a bogus name */
         p_item = playlist_NodeCreate( p_playlist, _("Empty Folder"), 
-                                            p_playlist->p_local_category );
+                                            p_playlist->p_local_category, 0 );
+    }
 
     if(! p_item )
-        msg_Warn( VLCIntf, "node creation failed" );
+        msg_Warn( VLCIntf, "node creation failed or cancelled by user" );
 
     vlc_object_release( p_playlist );
     [ourPool release];
@@ -1360,17 +1369,15 @@ NSLog( @"expandable" );
     id o_value = [super outlineView: outlineView child: index ofItem: item];
     playlist_t *p_playlist = pl_Yield( VLCIntf );
 
-    /* FIXME: playlist->i_size doesn't provide the correct number of items anymore
-     * check the playlist API for the fixed function, once zorglub implemented it -- fpk, 9/17/06 */
-
-    if( p_playlist->i_size >= 2 )
+    if( playlist_CurrentSize( p_playlist )  >= 2 )
     {
         [o_status_field setStringValue: [NSString stringWithFormat:
-                    _NS("%i items in the playlist"), p_playlist->i_size]];
+                    _NS("%i items in the playlist"),
+                       playlist_CurrentSize( p_playlist )]];
     }
     else
     {
-        if( p_playlist->i_size == 0 )
+        if( playlist_IsEmpty( p_playlist ) )
         {
             [o_status_field setStringValue: _NS("No items in the playlist")];
         }