]> git.sesse.net Git - vlc/commitdiff
Qt4: fix #3113: crash after a playlist item is removed by another plugin
authorJakob Leben <jleben@videolan.org>
Tue, 27 Oct 2009 21:04:34 +0000 (22:04 +0100)
committerJakob Leben <jleben@videolan.org>
Tue, 27 Oct 2009 21:36:34 +0000 (22:36 +0100)
modules/gui/qt4/components/playlist/playlist_model.cpp
modules/gui/qt4/components/playlist/playlist_model.hpp

index d07f306e8c088daa64e90de9420db4b1854fd59e..62cbcc522e50e5b0b2ebd2dd8ec0d1c62d4619fb 100644 (file)
@@ -653,9 +653,6 @@ void PLModel::processInputItemUpdate( input_item_t *p_item )
 void PLModel::processItemRemoval( int i_id )
 {
     if( i_id <= 0 ) return;
-    if( i_id == i_cached_id ) i_cached_id = -1;
-    i_cached_input_id = -1;
-
     removeItem( i_id );
 }
 
@@ -760,13 +757,22 @@ void PLModel::removeItem( PLItem *item )
 {
     if( !item ) return;
 
+    if( item->i_id == i_cached_id ) i_cached_id = -1;
+    i_cached_input_id = -1;
+
     if( currentItem == item )
     {
         currentItem = NULL;
         emit currentChanged( QModelIndex() );
     }
 
-    if( item->parentItem ) item->parentItem->removeChild( item );
+    if( item->parentItem ) {
+        int i = item->parentItem->children.indexOf( item );
+        beginRemoveRows( index( item->parentItem, 0), i, i );
+        item->parentItem->children.removeAt(i);
+        delete item;
+        endRemoveRows();
+    }
     else delete item;
 
     if(item == rootItem)
@@ -862,11 +868,9 @@ void PLModel::doDeleteItem( PLItem *item, QModelIndexList *fullList )
     else
         playlist_NodeDelete( p_playlist, p_item, true, false );
     PL_UNLOCK;
+
     /* And finally, remove it from the tree */
-    int itemIndex = item->parentItem->children.indexOf( item );
-    beginRemoveRows( index( item->parentItem, 0), itemIndex, itemIndex );
     removeItem( item );
-    endRemoveRows();
 }
 
 /******* Volume III: Sorting and searching ********/
index f48a9ae73a597dd18ce1ec027e84b246c3efbe22..10697fb95a704b2367677827749c3c69eab925f2 100644 (file)
@@ -151,12 +151,12 @@ private:
     void recurseDelete( QList<PLItem*> children, QModelIndexList *fullList );
     void doDeleteItem( PLItem *item, QModelIndexList *fullList );
     void updateTreeItem( PLItem * );
+    void removeItem ( PLItem * );
     void takeItem( PLItem * ); //will not delete item
     void insertChildren( PLItem *node, QList<PLItem*>& items, int i_pos );
     void dropAppendCopy( QByteArray& data, PLItem *target );
     void dropMove( QByteArray& data, PLItem *target, int new_pos );
     /* The following actions will not signal the view! */
-    void removeItem ( PLItem * );
     void updateChildren( PLItem * );
     void updateChildren( playlist_item_t *, PLItem * );