Commit 9c90fd45 authored by Antoine Cellerier's avatar Antoine Cellerier

modules/gui/wxwidgets/dialogs/playlist.cpp: add some more checks. Fixes...

modules/gui/wxwidgets/dialogs/playlist.cpp: add some more checks. Fixes infinite loop when draging an item outside the wxTreeCtrl widget.
src/playlist/item-ext.c: detach item from first matching parent node only.
parent 9d3c7419
...@@ -1154,6 +1154,8 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event ) ...@@ -1154,6 +1154,8 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event )
{ {
wxTreeItemId dest_tree_item = event.GetItem(); wxTreeItemId dest_tree_item = event.GetItem();
if( !dest_tree_item.IsOk() ) return;
/* check that we're not trying to move a node into one of it's children */ /* check that we're not trying to move a node into one of it's children */
wxTreeItemId parent = dest_tree_item; wxTreeItemId parent = dest_tree_item;
while( parent != treectrl->GetRootItem() ) while( parent != treectrl->GetRootItem() )
...@@ -1162,19 +1164,27 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event ) ...@@ -1162,19 +1164,27 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event )
parent = treectrl->GetItemParent( parent ); parent = treectrl->GetItemParent( parent );
} }
if( draged_tree_item != dest_tree_item )
{
LockPlaylist( p_intf->p_sys, p_playlist ); LockPlaylist( p_intf->p_sys, p_playlist );
PlaylistItem *p_wxdrageditem = PlaylistItem *p_wxdrageditem =
(PlaylistItem *)treectrl->GetItemData( draged_tree_item ); (PlaylistItem *)treectrl->GetItemData( draged_tree_item );
PlaylistItem *p_wxdestitem = PlaylistItem *p_wxdestitem =
(PlaylistItem *)treectrl->GetItemData( dest_tree_item ); (PlaylistItem *)treectrl->GetItemData( dest_tree_item );
if( !p_wxdrageditem || !p_wxdestitem )
{
UnlockPlaylist( p_intf->p_sys, p_playlist );
return;
}
playlist_item_t *p_drageditem = playlist_item_t *p_drageditem =
playlist_ItemGetById(p_playlist, p_wxdrageditem->i_id ); playlist_ItemGetById(p_playlist, p_wxdrageditem->i_id );
playlist_item_t *p_destitem = playlist_item_t *p_destitem =
playlist_ItemGetById(p_playlist, p_wxdestitem->i_id ); playlist_ItemGetById(p_playlist, p_wxdestitem->i_id );
if( !p_drageditem || !p_destitem )
{
UnlockPlaylist( p_intf->p_sys, p_playlist );
return;
}
if( p_destitem->i_children == -1 ) if( p_destitem->i_children == -1 )
/* this is a leaf */ /* this is a leaf */
...@@ -1182,8 +1192,18 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event ) ...@@ -1182,8 +1192,18 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event )
parent = treectrl->GetItemParent( dest_tree_item ); parent = treectrl->GetItemParent( dest_tree_item );
PlaylistItem *p_parent = PlaylistItem *p_parent =
(PlaylistItem *)treectrl->GetItemData( parent ); (PlaylistItem *)treectrl->GetItemData( parent );
if( !p_parent )
{
UnlockPlaylist( p_intf->p_sys, p_playlist );
return;
}
playlist_item_t *p_destitem2 = playlist_item_t *p_destitem2 =
playlist_ItemGetById( p_playlist, p_parent->i_id ); playlist_ItemGetById( p_playlist, p_parent->i_id );
if( !p_destitem2 )
{
UnlockPlaylist( p_intf->p_sys, p_playlist );
return;
}
int i; int i;
for( i = 0; i < p_destitem2->i_children; i++ ) for( i = 0; i < p_destitem2->i_children; i++ )
{ {
...@@ -1198,9 +1218,10 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event ) ...@@ -1198,9 +1218,10 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event )
playlist_TreeMove( p_playlist, p_drageditem, p_destitem, playlist_TreeMove( p_playlist, p_drageditem, p_destitem,
0, i_current_view ); 0, i_current_view );
} }
UnlockPlaylist( p_intf->p_sys, p_playlist ); UnlockPlaylist( p_intf->p_sys, p_playlist );
Rebuild( VLC_TRUE ); Rebuild( VLC_TRUE );
}
} }
/********************************************************************** /**********************************************************************
......
...@@ -878,6 +878,8 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos ) ...@@ -878,6 +878,8 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos )
/** /**
* Moves an item * Moves an item
* *
* This function must be entered with the playlist lock
*
* \param p_playlist the playlist * \param p_playlist the playlist
* \param p_item the item to move * \param p_item the item to move
* \param p_node the new parent of the item * \param p_node the new parent of the item
...@@ -907,6 +909,7 @@ int playlist_TreeMove( playlist_t * p_playlist, playlist_item_t *p_item, ...@@ -907,6 +909,7 @@ int playlist_TreeMove( playlist_t * p_playlist, playlist_item_t *p_item,
p_detach->i_serial++; p_detach->i_serial++;
free( p_item->pp_parents[i] ); free( p_item->pp_parents[i] );
REMOVE_ELEM( p_item->pp_parents, p_item->i_parents, i ); REMOVE_ELEM( p_item->pp_parents, p_item->i_parents, i );
break;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment