]> git.sesse.net Git - vlc/blobdiff - modules/gui/skins2/controls/ctrl_tree.cpp
skins2: playlist, fix selection issue
[vlc] / modules / gui / skins2 / controls / ctrl_tree.cpp
index 34c29302b6867e5ae32cbb0210235acdf1d68acd..914dd529ec4079cc374757108a7574077470e126 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
@@ -167,15 +167,16 @@ 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() )
+        /* Make sure firstPos is valid */
+        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 )
         {
@@ -268,10 +269,10 @@ void CtrlTree::handleEvent( EvtGeneric &rEvent )
             /* Find first non selected item before m_pLastSelected */
             VarTree::Iterator it_sel = m_flat ? m_rTree.firstLeaf()
                                               : m_rTree.begin();
-            for( it = m_flat ? m_rTree.firstLeaf() : m_rTree.begin();
+            for( it = (m_flat ? m_rTree.firstLeaf() : m_rTree.begin());
                  it != m_rTree.end();
-                 it = m_flat ? m_rTree.getNextLeaf( it )
-                             : m_rTree.getNextVisibleItem( it ) )
+                 it = (m_flat ? m_rTree.getNextLeaf( it )
+                              : m_rTree.getNextVisibleItem( it )) )
             {
                 if( &*it == m_pLastSelected ) break;
                 if( !it->m_selected ) it_sel = it;
@@ -280,9 +281,23 @@ void CtrlTree::handleEvent( EvtGeneric &rEvent )
             /* Delete selected stuff */
             m_rTree.delSelected();
 
-            /* Select it_sel */
-            it_sel->m_selected = true;
-            m_pLastSelected = &*it_sel;
+            /* Verify if there is still sthg selected (e.g read-only items) */
+            m_pLastSelected = NULL;
+            for( it = (m_flat ? m_rTree.firstLeaf() : m_rTree.begin());
+                 it != m_rTree.end();
+                 it = (m_flat ? m_rTree.getNextLeaf( it )
+                              : m_rTree.getNextVisibleItem( it )) )
+            {
+                if( it->m_selected )
+                    m_pLastSelected = &*it;
+            }
+
+            /* if everything was deleted, use it_sel as last selection */
+            if( !m_pLastSelected )
+            {
+                it_sel->m_selected = true;
+                m_pLastSelected = &*it_sel;
+            }
 
             // Redraw the control
             makeImage();
@@ -608,29 +623,25 @@ void CtrlTree::handleEvent( EvtGeneric &rEvent )
         m_rTree.getPositionVar().set( percentage );
     }
 
-    /* We changed the nodes, let's fix teh position var */
+    /* We changed the nodes, let's fix the position var */
     if( bChangedPosition )
     {
         VarTree::Iterator it;
-        int i = 0;
         int iFirst = 0;
         for( it = m_flat ? m_rTree.firstLeaf() : m_rTree.begin();
              it != m_rTree.end();
              it = m_flat ? m_rTree.getNextLeaf( it )
                          : m_rTree.getNextVisibleItem( it ) )
         {
-            i++;
             if( it == m_firstPos )
-            {
-                iFirst = i;
                 break;
-            }
+            iFirst++;
         }
-        iFirst += maxItems();
-        if( iFirst >= m_flat ? m_rTree.countLeafs() : m_rTree.visibleItems() )
-            iFirst = m_flat ? m_rTree.countLeafs() : m_rTree.visibleItems();
-        float f_new = (float)iFirst / (float)( m_flat ? m_rTree.countLeafs()
-                                                      :m_rTree.visibleItems() );
+
+        int indexMax = ( m_flat ? m_rTree.countLeafs()
+                                : m_rTree.visibleItems() ) - 1;
+        float f_new = (float)iFirst / (float)indexMax;
+
         m_dontMove = true;
         m_rTree.getPositionVar().set( 1.0 - f_new );
         m_dontMove = false;
@@ -697,13 +708,13 @@ bool CtrlTree::ensureVisible( int focusItemIndex )
 
     if( it != m_rTree.end()
         && ( focusItemIndex < firstPosIndex
-           || focusItemIndex > firstPosIndex + maxItems() ) )
+           || focusItemIndex > firstPosIndex + maxItems() - 1 ) )
     {
         // Scroll to have the wanted stream visible
         VarPercent &rVarPos = m_rTree.getPositionVar();
-        rVarPos.set( 1.0 - (double)focusItemIndex /
-                           (double)( m_flat ? m_rTree.countLeafs()
-                                            : m_rTree.visibleItems() ) );
+        int indexMax = ( m_flat ? m_rTree.countLeafs()
+                                : m_rTree.visibleItems() ) - 1;
+        rVarPos.set( 1.0 - (double)focusItemIndex / (double)indexMax );
         return true;
     }
     return false;
@@ -726,20 +737,19 @@ void CtrlTree::autoScroll()
            break;
         }
     }
+
     for( it = m_flat ? m_rTree.firstLeaf() : m_rTree.begin();
          it != m_rTree.end();
          it = m_flat ? m_rTree.getNextLeaf( it )
                      : m_rTree.getNextVisibleItem( it ) )
     {
         if( it->m_playing )
+        {
+           ensureVisible( playIndex );
            break;
+        }
         playIndex++;
     }
-
-    if( it == m_rTree.end() ) return;
-
-
-    ensureVisible( playIndex );
 }