ADD_ICON( NODE, ":/type/node" );
#undef ADD_ICON
+ i_zoom = getSettings()->value( "Playlist/zoom", 0 ).toInt();
+
rebuild( p_root );
DCONNECT( THEMIM->getIM(), metaChanged( input_item_t *),
this, processInputItemUpdate( input_item_t *) );
PLModel::~PLModel()
{
+ getSettings()->setValue( "Playlist/zoom", i_zoom );
delete rootItem;
delete sortingMenu;
}
/* Drop operation */
bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action,
- int row, int column, const QModelIndex &parent )
+ int row, int, const QModelIndex &parent )
{
bool copy = action == Qt::CopyAction;
if( !copy && action != Qt::MoveAction )
{
QList<input_item_t*> inputItems = plMimeData->inputItems();
QList<PLItem*> model_items;
- playlist_item_t *pp_items[inputItems.size()];
+ playlist_item_t *pp_items[inputItems.count()];
PL_LOCK;
PL_UNLOCK;
}
-/* Must be entered with lock */
+/* Convenient overloaded private version of activateItem
+ * Must be entered with PL lock */
void PLModel::activateItem( playlist_item_t *p_item )
{
if( !p_item ) return;
else if( role == Qt::FontRole )
{
QFont f;
- f.setPointSize( f.pointSize() - 1 );
+ f.setPointSize( __MAX( f.pointSize() - 1 + i_zoom, 4 ) );
if( isCurrent( index ) )
f.setBold( true );
return QVariant( f );
{
return QVariant( QBrush( Qt::gray ) );
}
- else if( role == IsCurrentRole ) return QVariant( isCurrent( index ) );
+ else if( role == IsCurrentRole )
+ {
+ return QVariant( isCurrent( index ) );
+ }
else if( role == IsLeafNodeRole )
{
QVariant isLeaf;
return createIndex(parentItem->row(), 0, parentItem);
}
-int PLModel::columnCount( const QModelIndex &i) const
+int PLModel::columnCount( const QModelIndex &) const
{
return columnFromMeta( COLUMN_END );
}
QStringList PLModel::selectedURIs()
{
QStringList lst;
- for( int i = 0; i < current_selection.size(); i++ )
+ for( int i = 0; i < current_selection.count(); i++ )
{
const PLItem *item = getItem( current_selection[i] );
if( item )
void PLModel::insertChildren( PLItem *node, QList<PLItem*>& items, int i_pos )
{
assert( node );
- int count = items.size();
+ int count = items.count();
if( !count ) return;
printf( "Here I am\n");
beginInsertRows( index( node, 0 ), i_pos, i_pos + count - 1 );
void PLModel::recurseDelete( QList<PLItem*> children, QModelIndexList *fullList )
{
- for( int i = children.size() - 1; i >= 0 ; i-- )
+ for( int i = children.count() - 1; i >= 0 ; i-- )
{
PLItem *item = children[i];
if( item->childCount() )
playlist_item_t *p_root = playlist_ItemGetById( p_playlist,
itemId( idx ) );
assert( p_root );
- const char *psz_name = qtu( search_text );
- playlist_LiveSearchUpdate( p_playlist , p_root, psz_name, b_recursive );
-
+ playlist_LiveSearchUpdate( p_playlist , p_root, qtu( search_text ),
+ b_recursive );
if( idx.isValid() )
{
PLItem *searchRoot = getItem( idx );
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_item = index.isValid() ? p_item->i_id : -1;
i_popup_parent = index.isValid() ?
( p_item->p_parent ? p_item->p_parent->i_id : -1 ) :
( rootItem->id() );
- i_popup_column = index.column();
bool tree = ( rootItem && rootItem->id() != p_playlist->p_playing->i_id ) ||
var_InheritBool( p_intf, "playlist-tree" );
+ input_item_t *p_input = p_item->p_input;
+ vlc_gc_incref( p_input );
PL_UNLOCK;
- current_selection = list;
-
+ /* */
QMenu menu;
+
+ /* Play/Stream/Info static actions */
if( i_popup_item > -1 )
{
menu.addAction( QIcon( ":/menu/play" ), qtr(I_POP_PLAY), this, SLOT( popupPlay() ) );
}
vlc_gc_decref( p_input );
+ /* In PL or ML, allow to add a file/folder */
if( canEdit() )
{
QIcon addIcon( ":/buttons/playlist/playlist_add" );
menu.addAction( addIcon, qtr(I_OP_ADVOP), THEDP, SLOT( MLAppendDialog() ) );
}
}
+
+ /* Item removal */
if( i_popup_item > -1 )
{
+ if( rootItem->id() != THEPL->p_playing->i_id )
+ menu.addAction( qtr( "Add to playlist"), this, SLOT( popupAddToPlaylist() ) );
menu.addAction( QIcon( ":/buttons/playlist/playlist_remove" ),
qtr(I_POP_DEL), this, SLOT( popupDel() ) );
menu.addSeparator();
- if( !sortingMenu )
+ }
+
+ /* Playlist sorting */
+ if( !sortingMenu )
+ {
+ sortingMenu = new QMenu( qtr( "Sort by" ) );
+ sortingMapper = new QSignalMapper( this );
+ /* Choose what columns to show in sorting menu, not sure if this should be configurable*/
+ QList<int> sortingColumns;
+ sortingColumns << COLUMN_TITLE << COLUMN_ARTIST << COLUMN_ALBUM << COLUMN_TRACK_NUMBER << COLUMN_URI;
+ foreach( int Column, sortingColumns )
{
- sortingMenu = new QMenu( qtr( "Sort by" ) );
- sortingMapper = new QSignalMapper( this );
- for( int i = 1, j = 1; i < COLUMN_END; i <<= 1, j++ )
- {
- if( i == COLUMN_NUMBER ) continue;
- QMenu *m = sortingMenu->addMenu( qfu( psz_column_title( i ) ) );
- QAction *asc = m->addAction( qtr("Ascending") );
- QAction *desc = m->addAction( qtr("Descending") );
- sortingMapper->setMapping( asc, j );
- sortingMapper->setMapping( desc, -j );
- CONNECT( asc, triggered(), sortingMapper, map() );
- CONNECT( desc, triggered(), sortingMapper, map() );
- }
- CONNECT( sortingMapper, mapped( int ), this, popupSort( int ) );
+ QAction *asc = sortingMenu->addAction( qfu( psz_column_title( Column ) ) + " " + qtr("Ascending") );
+ QAction *desc = sortingMenu->addAction( qfu( psz_column_title( Column ) ) + " " + qtr("Descending") );
+ sortingMapper->setMapping( asc, columnFromMeta(Column) + 1 );
+ sortingMapper->setMapping( desc, -1 * (columnFromMeta(Column)+1) );
+ CONNECT( asc, triggered(), sortingMapper, map() );
+ CONNECT( desc, triggered(), sortingMapper, map() );
}
- menu.addMenu( sortingMenu );
+ CONNECT( sortingMapper, mapped( int ), this, popupSort( int ) );
}
+ menu.addMenu( sortingMenu );
+
+ /* Zoom */
+ QMenu *zoomMenu = new QMenu( qtr( "Display size" ) );
+ zoomMenu->addAction( qtr( "Increase" ), this, SLOT( increaseZoom() ) );
+ zoomMenu->addAction( qtr( "Decrease" ), this, SLOT( decreaseZoom() ) );
+ menu.addMenu( zoomMenu );
+ /* Store the current selected item for popup*() methods */
+ current_selection = list;
+
+ /* Display and forward the result */
if( !menu.isEmpty() )
{
menu.exec( point ); return true;
PL_UNLOCK;
}
+void PLModel::popupAddToPlaylist()
+{
+ playlist_Lock( THEPL );
+
+ foreach( QModelIndex currentIndex, current_selection )
+ {
+ playlist_item_t *p_item = playlist_ItemGetById( THEPL, itemId( currentIndex ) );
+ if( !p_item ) continue;
+
+ playlist_NodeAddCopy( THEPL, p_item,
+ THEPL->p_playing,
+ PLAYLIST_END );
+ }
+ playlist_Unlock( THEPL );
+}
+
void PLModel::popupInfo()
{
PL_LOCK;
QStringList mrls = selectedURIs();
if( !mrls.isEmpty() )
THEDP->streamingDialog( NULL, mrls[0], false );
-
}
void PLModel::popupSave()
void PLModel::popupExplore()
{
+ char *uri = NULL, *path = NULL;
+
PL_LOCK;
- playlist_item_t *p_item = playlist_ItemGetById( p_playlist,
- i_popup_item );
+ playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i_popup_item );
if( p_item )
{
input_item_t *p_input = p_item->p_input;
- char *psz_meta = input_item_GetURI( p_input );
- PL_UNLOCK;
- if( psz_meta )
- {
- const char *psz_access;
- const char *psz_demux;
- char *psz_path;
- input_SplitMRL( &psz_access, &psz_demux, &psz_path, psz_meta );
-
- if( !EMPTY_STR( psz_access ) && (
- !strncasecmp( psz_access, "file", 4 ) ||
- !strncasecmp( psz_access, "dire", 4 ) ))
- {
-#if defined( WIN32 ) || defined( __OS2__ )
- /* Qt openURL doesn't know to open files that starts with a / or \ */
- if( psz_path[0] == '/' || psz_path[0] == '\\' )
- psz_path++;
-#endif
+ uri = input_item_GetURI( p_input );
+ }
+ PL_UNLOCK;
- QFileInfo info( qfu( decode_URI( psz_path ) ) );
- QDesktopServices::openUrl(
- QUrl::fromLocalFile( info.absolutePath() ) );
- }
- free( psz_meta );
- }
+ if( uri != NULL )
+ {
+ path = make_path( uri );
+ free( uri );
}
- else
- PL_UNLOCK;
+ if( path == NULL )
+ return;
+
+ QFileInfo info( qfu( path ) );
+ free( path );
+
+ QDesktopServices::openUrl( QUrl::fromLocalFile( info.absolutePath() ) );
}
void PLModel::popupAddNode()
column > 0 ? Qt::AscendingOrder : Qt::DescendingOrder );
}
+/* */
+void PLModel::increaseZoom()
+{
+ i_zoom++;
+ emit layoutChanged();
+}
+
+void PLModel::decreaseZoom()
+{
+ i_zoom--;
+ emit layoutChanged();
+}
+
/******************* Drag and Drop helper class ******************/
PlMimeData::~PlMimeData()
{