/*****************************************************************************
* var_tree.cpp
*****************************************************************************
- * Copyright (C) 2005 VideoLAN
+ * Copyright (C) 2005 the VideoLAN team
* $Id$
*
* Authors: Antoine Cellerier <dionoea@videolan.org>
+ * Clément Stenac <zorglub@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
VarTree::VarTree( intf_thread_t *pIntf )
: Variable( pIntf ), m_id( 0 ), m_selected( false ), m_playing( false ),
- m_expanded( false ), m_deleted( false ), m_readonly( false),
- m_pData( NULL ), m_pParent( NULL )
+ m_expanded( false ), m_deleted( false ),
+ m_pData( NULL ), m_pParent( NULL ), m_readonly( false )
{
// Create the position variable
m_cPosition = VariablePtr( new VarPercent( pIntf ) );
void *pData )
: Variable( pIntf ), m_id( id ), m_cString( rcString ),
m_selected( selected ), m_playing( playing ), m_expanded( expanded ),
- m_deleted( false ), m_readonly( readonly ),
- m_pData( pData ), m_pParent( pParent )
+ m_deleted( false ), m_pData( pData ), m_pParent( pParent ),
+ m_readonly( readonly )
{
// Create the position variable
m_cPosition = VariablePtr( new VarPercent( pIntf ) );
while( it != end() )
{
n--;
- if( n <= 0 ) return it;
+ if( n <= 0 )
+ return it;
if( it->m_expanded )
{
- int i = n - it->visibleItems();
+ int i;
+ i = n - it->visibleItems();
if( i <= 0 ) return it->getVisibleItem( n );
n = i;
}
return end();
}
+VarTree::Iterator VarTree::getLeaf( int n )
+{
+ Iterator it = begin();
+ while( it != end() )
+ {
+ if( it->size() )
+ {
+ int i;
+ i = n - it->countLeafs();
+ if( i <= 0 ) return it->getLeaf( n );
+ n = i;
+ }
+ else
+ {
+ n--;
+ if( n <= 0 )
+ return it;
+ }
+ it++;
+ }
+ return end();
+}
+
VarTree::Iterator VarTree::getNextVisibleItem( Iterator it )
{
if( it->m_expanded && it->size() )
{
VarTree::Iterator it_old = it;
if( it == root()->begin() || it == ++(root()->begin()) ) return it;
- if( it->parent() )
- {
- }
+
/* Was it the first child of its parent ? */
if( it->parent() && it == it->parent()->begin() )
{
/* Yes, get previous uncle */
it = it_old->prev_uncle();
- }
+ }
else
it--;
return it;
}
+VarTree::Iterator VarTree::getPrevItem( Iterator it )
+{
+ VarTree::Iterator it_old = it;
+ if( it == root()->begin() || it == ++(root()->begin()) ) return it;
+
+ /* Was it the first child of its parent ? */
+ if( it->parent() && it == it->parent()->begin() )
+ {
+ /* Yes, get previous uncle */
+ it = it_old->prev_uncle();
+ }
+ else
+ it--;
+
+ /* We have found an expanded uncle, take its last child */
+ while( it != root()->begin() && it->size() )
+ {
+ it = it->end();
+ it--;
+ }
+ return it;
+}
+
+VarTree::Iterator VarTree::getNextLeaf( Iterator it )
+{
+ do
+ {
+ it = getNextItem( it );
+ }
+ while( it != root()->end() && it->size() );
+ return it;
+}
+
+VarTree::Iterator VarTree::getPrevLeaf( Iterator it )
+{
+ do
+ {
+ it = getPrevItem( it );
+ }
+ while( it != root()->begin() && it->size() ); /* FIXME ? */
+ if( it == root()->begin() ) it = firstLeaf();
+ return it;
+}
VarTree::Iterator VarTree::findById( int id )
{
current = current->parent();
}
}
+
+int VarTree::countLeafs()
+{
+ if( size() == 0 ) return 1;
+
+ int i_count = 0;
+ Iterator it = begin();
+ while( it != end() )
+ {
+ i_count += it->countLeafs();
+ it++;
+ }
+ return i_count;
+}
+
+VarTree::Iterator VarTree::firstLeaf()
+{
+ Iterator b = root()->begin();
+ if( b->size() ) return getNextLeaf( b );
+ return b;
+}
+