VLC_EXPORT( int, playlist_NodeRemoveItem, (playlist_t *,playlist_item_t*,playlist_item_t *) );
VLC_EXPORT( int, playlist_NodeChildrenCount, (playlist_t *,playlist_item_t* ) );
VLC_EXPORT( playlist_item_t *, playlist_ChildSearchName, (playlist_item_t*, const char* ) );
-VLC_EXPORT( int, playlist_NodeDelete, ( playlist_t *, playlist_item_t *, vlc_bool_t ) );
+VLC_EXPORT( int, playlist_NodeDelete, ( playlist_t *, playlist_item_t *, vlc_bool_t , vlc_bool_t ) );
VLC_EXPORT( int, playlist_NodeEmpty, ( playlist_t *, playlist_item_t *, vlc_bool_t ) );
/* Tree walking */
// if current item is in selected node and is playing then stop playlist
playlist_Stop( p_playlist );
}
- playlist_NodeDelete( p_playlist, p_item, VLC_TRUE);
+ playlist_NodeDelete( p_playlist, p_item, VLC_TRUE, VLC_FALSE );
}
else
{
p_saved_item = NULL;
- /* Update the playlist */
- Rebuild();
/* We want to be noticed of playlist changes */
var_AddCallback( p_playlist, "item-append", ItemAppended, this );
var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this );
- vlc_object_release( p_playlist );
-
+ /* Update the playlist */
+ Rebuild();
+ vlc_object_release( p_playlist );
}
Playlist::~Playlist()
new PlaylistItem( p_node->pp_children[i]) );
UpdateTreeItem( p_playlist, item );
-
- treectrl->SetItemImage( item,
- p_node->pp_children[i]->input.i_type );
}
else
{
}
}
-/* Set current item */
-void Playlist::SetCurrentItem( wxTreeItemId item )
-{
- if( item.IsOk() )
- {
- treectrl->SetItemBold( item, true );
- treectrl->EnsureVisible( item );
- }
-}
-
/* Update an item in the tree */
void Playlist::UpdateTreeItem( playlist_t *p_playlist, wxTreeItemId item )
{
+ if( ! item.IsOk() ) return;
+
playlist_item_t *p_item =
((PlaylistItem *)treectrl->GetItemData( item ))->p_item;
if( p_playlist->status.p_item == p_item )
{
- SetCurrentItem( item );
+ treectrl->SetItemBold( item, true );
+ treectrl->EnsureVisible( item );
}
else
{
p_wxcurrent = (PlaylistItem *)treectrl->GetItemData( root );
- if( !p_item )
+ if( !p_item || !p_wxcurrent )
{
wxTreeItemId dummy;
return dummy;
{
return;
}
+
+ /* We can remove the callbacks before locking, anyway, we won't
+ * miss anything */
+ var_DelCallback( p_playlist, "item-change", ItemChanged, this );
+ var_DelCallback( p_playlist, "playlist-current", PlaylistNext, this );
+ var_DelCallback( p_playlist, "intf-change", PlaylistChanged, this );
+ var_DelCallback( p_playlist, "item-append", ItemAppended, this );
+ var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this );
+
/* ...and rebuild it */
vlc_mutex_lock( &p_playlist->object_lock );
wxTreeItemId root = treectrl->GetRootItem();
UpdateNode( p_playlist, p_view->p_root, root );
+/*
wxTreeItemId item;
if( p_playlist->status.p_item != NULL )
{
{
SetCurrentItem( item );
}
-
+*/
int i_count = CountItems( treectrl->GetRootItem() );
if( i_count < p_playlist->i_size && !b_changed_view )
p_playlist->i_size ), 0 );
}
+ /* Put callbacks back online */
+ var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this );
+ var_AddCallback( p_playlist, "playlist-current", PlaylistNext, this );
+ var_AddCallback( p_playlist, "item-change", ItemChanged, this );
+ var_AddCallback( p_playlist, "item-append", ItemAppended, this );
+ var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this );
+
vlc_mutex_unlock( &p_playlist->object_lock );
vlc_object_release( p_playlist );
return;
}
- playlist_NodeDelete( p_playlist, p_item, VLC_TRUE );
+ playlist_NodeDelete( p_playlist, p_item, VLC_TRUE , VLC_FALSE );
vlc_object_release( p_playlist );
}
}
else
{
+ wxMutexGuiLeave();
playlist_ServicesDiscoveryRemove( p_playlist,
pp_sds[event.GetId() - FirstSD_Event] );
+ wxMutexGuiEnter();
}
}
vlc_object_release( p_playlist );
void UpdateNodeChildren( playlist_t *, playlist_item_t*, wxTreeItemId );
void CreateNode( playlist_t *, playlist_item_t*, wxTreeItemId );
void UpdateTreeItem( playlist_t *, wxTreeItemId );
- void SetCurrentItem( wxTreeItemId );
/* Search (internal) */
int CountItems( wxTreeItemId);
if( p_playlist )
{
- playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE );
+ playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE, VLC_TRUE );
vlc_object_release( p_playlist );
}
services_discovery_sys_t *p_sys = malloc(
sizeof( services_discovery_sys_t ) );
+ vlc_value_t val;
playlist_t *p_playlist;
playlist_view_t *p_view;
p_view = playlist_ViewFind( p_playlist, VIEW_CATEGORY );
p_sys->p_node = playlist_NodeCreate( p_playlist, VIEW_CATEGORY,
_("Devices"), p_view->p_root );
+
+ p_sys->p_node->i_flags |= PLAYLIST_RO_FLAG;
+ val.b_bool = VLC_TRUE;
+ var_Set( p_playlist, "intf-change", val );
+
vlc_object_release( p_playlist );
return VLC_SUCCESS;
*****************************************************************************/
static void Close( vlc_object_t *p_this )
{
- services_discovery_t *p_sd = ( services_discovery_t* )p_sd;
- services_discovery_sys_t *p_sys = malloc(
- sizeof( services_discovery_sys_t ) );
+ services_discovery_t *p_sd = ( services_discovery_t* )p_this;
+ services_discovery_sys_t *p_sys = p_sd->p_sys;
+ playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_sd,
+ VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+ if( p_playlist )
+ {
+ playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE, VLC_TRUE );
+ vlc_object_release( p_playlist );
+ }
free( p_sys );
}
if( p_playlist )
{
- playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE );
+ playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE , VLC_TRUE );
vlc_object_release( p_playlist );
}
void playlist_NodeDump( playlist_t *p_playlist, playlist_item_t *p_item,
int i_level );
-int playlist_NodeDeleteInternal( playlist_t *p_playlist,
- playlist_item_t *p_root,
- vlc_bool_t b_delete_items, vlc_bool_t b_force );
-
-
/**********************************************************************
* Exported View management functions
**********************************************************************/
*/
int playlist_ViewDelete( playlist_t *p_playlist,playlist_view_t *p_view )
{
- playlist_NodeDeleteInternal( p_playlist, p_view->p_root, VLC_TRUE,
- VLC_TRUE );
+ playlist_NodeDelete( p_playlist, p_view->p_root, VLC_TRUE, VLC_TRUE );
REMOVE_ELEM( p_playlist->pp_views, p_playlist->i_views, 0 );
return VLC_SUCCESS;
}
if( p_root->pp_children[i]->i_children > -1 )
{
playlist_NodeDelete( p_playlist, p_root->pp_children[i],
- b_delete_items );
+ b_delete_items , VLC_FALSE );
}
else if( b_delete_items )
{
* \return VLC_SUCCESS or an error
*/
int playlist_NodeDelete( playlist_t *p_playlist, playlist_item_t *p_root,
- vlc_bool_t b_delete_items )
-{
- return playlist_NodeDeleteInternal( p_playlist, p_root,
- b_delete_items, VLC_FALSE );
-}
-
-int playlist_NodeDeleteInternal( playlist_t *p_playlist,
- playlist_item_t *p_root,
- vlc_bool_t b_delete_items, vlc_bool_t b_force )
+ vlc_bool_t b_delete_items, vlc_bool_t b_force )
{
int i;
if( p_root->i_children == -1 )
if( p_root->pp_children[i]->i_children > -1 )
{
playlist_NodeDelete( p_playlist, p_root->pp_children[i],
- b_delete_items );
+ b_delete_items , b_force );
}
else if( b_delete_items )
{
}
-
/**
* Adds an item to the childs of a node
*