]> git.sesse.net Git - vlc/commitdiff
skins2: playlist, fix issues when deletion is at stake
authorErwan Tulou <erwan10@videolan.org>
Tue, 10 Aug 2010 08:47:37 +0000 (10:47 +0200)
committerErwan Tulou <erwan10@videolan.org>
Tue, 10 Aug 2010 09:30:51 +0000 (11:30 +0200)
This patch does the following
   - do not reset m_firstPosition when not needed
   - fix corner case when playlist is flat (prone to crash)
     The node with a single leaf being deleted should become the
     next leaf. But, actually just forcing the rtree.begin()
     in any case is simpler and no problem here.

modules/gui/skins2/controls/ctrl_tree.cpp

index dad3e43aaff5091a2c54be442adc6774b1db4ed6..a0a438ea5843b3472beaba26d20a34bec0446159 100644 (file)
@@ -138,8 +138,6 @@ int CtrlTree::maxItems()
 void CtrlTree::onUpdate( Subject<VarTree, tree_update> &rTree,
                          tree_update *arg )
 {
-    m_firstPos = m_flat ? m_rTree.firstLeaf() : m_rTree.begin();
-
     if( arg->i_type == 0 ) // Item update
     {
         if( arg->b_active_item )
@@ -152,6 +150,8 @@ void CtrlTree::onUpdate( Subject<VarTree, tree_update> &rTree,
     /// \todo handle delete in a more clever way
     else if ( arg->i_type == 1 ) // Global change or deletion
     {
+        m_firstPos = m_flat ? m_rTree.firstLeaf() : m_rTree.begin();
+
         makeImage();
     }
     else if ( arg->i_type == 2 ) // Item-append
@@ -168,14 +168,15 @@ void CtrlTree::onUpdate( Subject<VarTree, tree_update> &rTree,
     else if( arg->i_type == 3 ) // item-del
     {
         /* Make sure firstPos and lastSelected are still valid */
-        while( m_firstPos->m_deleted && m_firstPos != m_rTree.root()->begin() )
+        while( m_firstPos->m_deleted &&
+               m_firstPos != (m_flat ? m_rTree.firstLeaf()
+                                     : m_rTree.begin()) )
         {
             m_firstPos = m_flat ? m_rTree.getPrevLeaf( m_firstPos )
                                 : m_rTree.getPrevVisibleItem( m_firstPos );
         }
         if( m_firstPos->m_deleted )
-            m_firstPos = m_flat ? m_rTree.firstLeaf()
-                                : m_rTree.root()->begin();
+            m_firstPos = m_rTree.begin();
 
         if( arg->b_visible == true )
         {