i_cached_input_id = -1;
i_popup_item = i_popup_parent = -1;
sortingMenu = NULL;
- current_index = QModelIndex();
rootItem = NULL; /* PLItem rootItem, will be set in rebuild( ) */
this, processItemAppend( int, int ) );
CONNECT( THEMIM, playlistItemRemoved( int ),
this, processItemRemoval( int ) );
- CONNECT( this, currentChanged( const QModelIndex &) ,
- this, cacheCurrent( const QModelIndex &) );
}
PLModel::~PLModel()
{
Qt::ItemFlags flags = QAbstractItemModel::flags( index );
- PLItem *item = index.isValid() ? getItem( index ) : rootItem;
+ const PLItem *item = index.isValid() ? getItem( index ) : rootItem;
if( canEdit() )
{
void PLModel::activateItem( const QModelIndex &index )
{
assert( index.isValid() );
- PLItem *item = getItem( index );
+ const PLItem *item = getItem( index );
assert( item );
PL_LOCK;
playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id );
}
/****************** Base model mandatory implementations *****************/
-QVariant PLModel::data( const QModelIndex &index, int role ) const
+QVariant PLModel::data( const QModelIndex &index, const int role ) const
{
if( !index.isValid() ) return QVariant();
- PLItem *item = getItem( index );
+ const PLItem *item = getItem( index );
if( role == Qt::DisplayRole )
{
int metadata = columnToMeta( index.column() );
}
else if( role == Qt::FontRole )
{
+ QFont f;
+ f.setPointSize( f.pointSize() - 1 );
if( isCurrent( index ) )
- {
- QFont f; f.setBold( true ); return QVariant( f );
- }
+ f.setBold( true );
+ return QVariant( f );
}
else if( role == Qt::BackgroundRole && isCurrent( index ) )
{
}
else if( role == IsCurrentsParentNodeRole )
{
- return QVariant( isParent( index, current_index ) );
+ return QVariant( isParent( index, currentIndex() ) );
}
return QVariant();
}
bool PLModel::isCurrent( const QModelIndex &index ) const
{
- return index == current_index;
+ return getItem( index )->p_input == THEMIM->currentInputItem();
}
int PLModel::itemId( const QModelIndex &index ) const
return QVariant( qfu( psz_column_title( meta_col ) ) );
}
-QModelIndex PLModel::index( int row, int column, const QModelIndex &parent )
+QModelIndex PLModel::index( const int row, const int column, const QModelIndex &parent )
const
{
PLItem *parentItem = parent.isValid() ? getItem( parent ) : rootItem;
return QModelIndex();
}
-QModelIndex PLModel::index( int i_id, int c )
+QModelIndex PLModel::index( const int i_id, const int c )
{
return index( findById( rootItem, i_id ), c );
}
return QModelIndex();
}
-void PLModel::cacheCurrent( const QModelIndex ¤t )
-{
- current_index = current;
-}
-
-QModelIndex PLModel::currentIndex()
+QModelIndex PLModel::currentIndex() const
{
- return current_index;
+ input_thread_t *p_input_thread = THEMIM->getInput();
+ if( !p_input_thread ) return QModelIndex();
+ PLItem *item = findByInput( rootItem, input_GetItem( p_input_thread )->i_id );
+ return index( item, 0 );
}
QModelIndex PLModel::parent( const QModelIndex &index ) const
int PLModel::rowCount( const QModelIndex &parent ) const
{
- PLItem *parentItem = parent.isValid() ? getItem( parent ) : rootItem;
+ const PLItem *parentItem = parent.isValid() ? getItem( parent ) : rootItem;
return parentItem->childCount();
}
QStringList lst;
for( int i = 0; i < current_selection.size(); i++ )
{
- PLItem *item = getItem( current_selection[i] );
+ const PLItem *item = getItem( current_selection[i] );
if( item )
{
PL_LOCK;
/************************* Lookups *****************************/
-PLItem *PLModel::findById( PLItem *root, int i_id )
+PLItem *PLModel::findById( PLItem *root, int i_id ) const
{
return findInner( root, i_id, false );
}
-PLItem *PLModel::findByInput( PLItem *root, int i_id )
+PLItem *PLModel::findByInput( PLItem *root, int i_id ) const
{
PLItem *result = findInner( root, i_id, true );
return result;
}
-#define CACHE( i, p ) { i_cached_id = i; p_cached_item = p; }
-#define ICACHE( i, p ) { i_cached_input_id = i; p_cached_item_bi = p; }
-
-PLItem * PLModel::findInner( PLItem *root, int i_id, bool b_input )
+PLItem * PLModel::findInner( PLItem *root, int i_id, bool b_input ) const
{
if( !root ) return NULL;
- if( ( !b_input && i_cached_id == i_id) ||
- ( b_input && i_cached_input_id ==i_id ) )
- {
- return b_input ? p_cached_item_bi : p_cached_item;
- }
if( !b_input && root->i_id == i_id )
- {
- CACHE( i_id, root );
return root;
- }
+
else if( b_input && root->p_input->i_id == i_id )
- {
- ICACHE( i_id, root );
return root;
- }
QList<PLItem *>::iterator it = root->children.begin();
while ( it != root->children.end() )
{
if( !b_input && (*it)->i_id == i_id )
- {
- CACHE( i_id, (*it) );
- return p_cached_item;
- }
+ return (*it);
+
else if( b_input && (*it)->p_input->i_id == i_id )
- {
- ICACHE( i_id, (*it) );
- return p_cached_item_bi;
- }
+ return (*it);
+
if( (*it)->children.size() )
{
PLItem *childFound = findInner( (*it), i_id, b_input );
if( childFound )
- {
- if( b_input )
- ICACHE( i_id, childFound )
- else
- CACHE( i_id, childFound )
- return childFound;
- }
+ return childFound;
}
it++;
}
return NULL;
}
-#undef CACHE
-#undef ICACHE
int PLModel::columnToMeta( int _column )
{
PLItem *nodeItem = findById( rootItem, i_parent );
if( !nodeItem ) return;
- foreach( PLItem *existing, nodeItem->children )
+ foreach( const PLItem *existing, nodeItem->children )
if( existing->i_id == i_item ) return;
PL_LOCK;
/* Invalidate cache */
i_cached_id = i_cached_input_id = -1;
- current_index = QModelIndex();
if( rootItem ) rootItem->removeChildren();
i_cached_id = -1;
i_cached_input_id = -1;
- current_index = QModelIndex();
if( item->parentItem ) {
int i = item->parentItem->children.indexOf( item );
}
/******* Volume III: Sorting and searching ********/
-void PLModel::sort( int column, Qt::SortOrder order )
+void PLModel::sort( const int column, Qt::SortOrder order )
{
sort( rootItem->i_id, column, order );
}
-void PLModel::sort( int i_root_id, int column, Qt::SortOrder order )
+void PLModel::sort( const int i_root_id, const int column, Qt::SortOrder order )
{
msg_Dbg( p_intf, "Sorting by column %i, order %i", column, order );
}
i_cached_id = i_cached_input_id = -1;
- current_index = QModelIndex();
if( count )
{
return false;
}
+ input_item_t *p_input = p_item->p_input;
+ vlc_gc_incref( p_input );
+
i_popup_item = index.isValid() ? p_item->i_id : -1;
i_popup_parent = index.isValid() ?
( p_item->p_parent ? p_item->p_parent->i_id : -1 ) :
qtr(I_POP_STREAM), this, SLOT( popupStream() ) );
menu.addAction( qtr(I_POP_SAVE), this, SLOT( popupSave() ) );
menu.addAction( QIcon( ":/menu/info" ), qtr(I_POP_INFO), this, SLOT( popupInfo() ) );
- menu.addAction( QIcon( ":/type/folder-grey" ),
- qtr( I_POP_EXPLORE ), this, SLOT( popupExplore() ) );
+ if( !strncasecmp( p_input->psz_uri, "file://", 7 ) )
+ menu.addAction( QIcon( ":/type/folder-grey" ),
+ qtr( I_POP_EXPLORE ), this, SLOT( popupExplore() ) );
menu.addSeparator();
}
if( canEdit() )
}
menu.addMenu( sortingMenu );
}
+ vlc_gc_decref( p_input );
+
if( !menu.isEmpty() )
{
menu.exec( point ); return true;