/* 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;
m_pLastSelected = &*it;
}
}
- //ensureVisible( it );
+ ensureVisible( it );
}
else if( key == KEY_DOWN )
{
{
previousWasSelected = ( &*it == m_pLastSelected );
}
- //ensureVisible( it );
+ ensureVisible( it );
}
else if( key == KEY_RIGHT )
{
// 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 )
&& ( 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() );
// 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 );
}
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;
}
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 )
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();
+ }
+}
int i_type;
int i_parent;
int i_id;
+ bool b_visible;
} tree_update;
/// Tree variable
/// 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;
// 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 );
}
}
}
+ // TODO: Do this better
buildTree();
tree_update descr;
descr.i_type = 1;
void Playtree::onAppend( playlist_add_t *p_add )
{
+ i_items_to_append --;
+
Iterator node = findById( p_add->i_node );
if( node != end() )
{
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 );
}
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 */
/// 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;