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 )
/// \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
}
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 )
{
/* 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;
/* 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();
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;
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;
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 );
}