Commit 0d26b166 authored by Clément Stenac's avatar Clément Stenac

Improve ensureVisible

parent a65b3524
......@@ -147,7 +147,10 @@ void CtrlTree::onUpdate( Subject<VarTree, tree_update*> &rTree,
/* TODO: Check if the item should be visible. If it is, makeImage
* Else, do nothing
*/
makeImage();
if( arg->b_visible == true )
{
makeImage();
}
}
notifyLayout();
m_pLastSelected = NULL;
......@@ -232,7 +235,7 @@ void CtrlTree::handleEvent( EvtGeneric &rEvent )
m_pLastSelected = &*it;
}
}
//ensureVisible( it );
ensureVisible( it );
}
else if( key == KEY_DOWN )
{
......@@ -252,7 +255,7 @@ void CtrlTree::handleEvent( EvtGeneric &rEvent )
{
previousWasSelected = ( &*it == m_pLastSelected );
}
//ensureVisible( it );
ensureVisible( it );
}
else if( key == KEY_RIGHT )
{
......@@ -466,13 +469,16 @@ bool CtrlTree::ensureVisible( VarTree::Iterator item )
// Find the item to focus
int focusItemIndex = 0;
VarTree::Iterator it;
m_rTree.ensureExpanded( item );
for( it = m_rTree.begin(); it != m_rTree.end();
it = m_rTree.getNextVisibleItem( it ) )
{
if( it->m_playing ) break;
if( it == item ) break;
focusItemIndex++;
}
return ensureVisible( focusItemIndex );
return ensureVisible( focusItemIndex );
}
bool CtrlTree::ensureVisible( int focusItemIndex )
......@@ -494,7 +500,7 @@ bool CtrlTree::ensureVisible( int focusItemIndex )
&& ( focusItemIndex < firstPosIndex
|| focusItemIndex > firstPosIndex + maxItems() ) )
{
// Scroll to have the playing stream visible
// Scroll to have the wanted stream visible
VarPercent &rVarPos = m_rTree.getPositionVar();
rVarPos.set( 1.0 - (double)focusItemIndex /
(double)m_rTree.visibleItems() );
......@@ -508,15 +514,27 @@ void CtrlTree::autoScroll()
// Find the current playing stream
int playIndex = 0;
VarTree::Iterator it;
for( it = m_rTree.begin(); it != m_rTree.end();
it = m_rTree.getNextItem( it ) )
{
if( it->m_playing )
{
m_rTree.ensureExpanded( it );
break;
}
}
for( it = m_rTree.begin(); it != m_rTree.end();
it = m_rTree.getNextVisibleItem( it ) )
{
if( it->m_playing ) break;
if( it->m_playing )
break;
playIndex++;
}
if( it == m_rTree.end() ) return;
ensureVisible( playIndex );
}
......
......@@ -421,17 +421,18 @@ int VlcProc::onItemAppend( vlc_object_t *pObj, const char *pVariable,
memcpy( p_add, newVal.p_address, sizeof( playlist_add_t ) ) ;
CmdGenericPtr ptrTree;
CmdPlaytreeAppend *pCmdTree = new CmdPlaytreeAppend( pThis->getIntf(),
p_add );
ptrTree = CmdGenericPtr( pCmdTree );
// Create a playlist notify command (for old style playlist)
CmdNotifyPlaylist *pCmd = new CmdNotifyPlaylist( pThis->getIntf() );
// Create a playtree notify command (for new style playtree)
CmdPlaytreeAppend *pCmdTree = new CmdPlaytreeAppend( pThis->getIntf(),
p_add );
// Push the command in the asynchronous command queue
AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
pQueue->push( CmdGenericPtr( pCmd ) );
pQueue->push( CmdGenericPtr( pCmdTree ), false );
pQueue->push( ptrTree , false );
return VLC_SUCCESS;
}
......
......@@ -202,6 +202,26 @@ VarTree::Iterator VarTree::getNextVisibleItem( Iterator it )
return it;
}
VarTree::Iterator VarTree::getNextItem( Iterator it )
{
if( it->size() )
{
it = it->begin();
}
else
{
VarTree::Iterator it_old = it;
it++;
// Was 'it' the last brother? If so, look for uncles
if( it_old->parent() && it_old->parent()->end() == it )
{
it = it_old->uncle();
}
}
return it;
}
VarTree::Iterator VarTree::findById( int id )
{
for (Iterator it = begin(); it != end(); ++it )
......@@ -216,3 +236,15 @@ VarTree::Iterator VarTree::findById( int id )
return end();
}
void VarTree::ensureExpanded( VarTree::Iterator it )
{
/// Don't expand ourselves, only our parents
VarTree *current = &(*it);
current = current->parent();
while( current->parent() != NULL )
{
current->m_expanded = true;
current = current->parent();
}
}
......@@ -37,6 +37,7 @@ typedef struct tree_update
int i_type;
int i_parent;
int i_id;
bool b_visible;
} tree_update;
/// Tree variable
......@@ -138,9 +139,15 @@ class VarTree: public Variable, public Subject<VarTree, tree_update*>
/// Given an iterator to a visible item, return the next visible item
Iterator getNextVisibleItem( Iterator it );
/// Given an iterator to an item, return the next item
Iterator getNextItem( Iterator it );
/// Find a children node with the given id
Iterator findById( int id );
/// Ensure an item is expanded
void ensureExpanded( VarTree::Iterator );
private:
/// List of children
list<VarTree> m_children;
......
......@@ -34,6 +34,8 @@ Playtree::Playtree( intf_thread_t *pIntf ): VarTree( pIntf )
// Get the VLC playlist object
m_pPlaylist = pIntf->p_sys->p_playlist;
i_items_to_append = 0;
// Try to guess the current charset
char *pCharset;
vlc_current_charset( &pCharset );
......@@ -77,6 +79,7 @@ void Playtree::delSelected()
}
}
}
// TODO: Do this better
buildTree();
tree_update descr;
descr.i_type = 1;
......@@ -135,6 +138,8 @@ void Playtree::onUpdateItem( int id )
void Playtree::onAppend( playlist_add_t *p_add )
{
i_items_to_append --;
Iterator node = findById( p_add->i_node );
if( node != end() )
{
......@@ -152,6 +157,7 @@ void Playtree::onAppend( playlist_add_t *p_add )
tree_update descr;
descr.i_id = p_add->i_item;
descr.i_parent = p_add->i_node;
descr.b_visible = node->m_expanded;
descr.i_type = 2;
notify( &descr );
}
......@@ -178,6 +184,8 @@ void Playtree::buildTree()
clear();
vlc_mutex_lock( &m_pPlaylist->object_lock );
i_items_to_append = 0;
playlist_view_t *p_view;
p_view = playlist_ViewFind( m_pPlaylist, VIEW_CATEGORY );
/* TODO : let the user chose the view type */
......
......@@ -48,6 +48,9 @@ class Playtree: public VarTree
/// Function called to notify playlist item append
void onAppend( playlist_add_t * );
/// Items waiting to be appended
int i_items_to_append;
private:
/// VLC playlist object
playlist_t *m_pPlaylist;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment