X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fplaylist%2Fplaylist_model.cpp;h=8f5da1847e55040f8cb488d10fa31d28dc263f61;hb=69863bd612acc31188fa55c713e0c9dc329eb909;hp=c0eca67cfbf8e934240b608394aeffdad23be089;hpb=a3b7bce48608077a11dcb032c2162970cb1c8b6f;p=vlc diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp index c0eca67cfb..8f5da1847e 100644 --- a/modules/gui/qt4/components/playlist/playlist_model.cpp +++ b/modules/gui/qt4/components/playlist/playlist_model.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * playlist_model.cpp : Manage playlist model **************************************************************************** - * Copyright (C) 2006-2007 the VideoLAN team + * Copyright (C) 2006-2011 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -88,6 +88,8 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ 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 *) ); @@ -101,6 +103,7 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ PLModel::~PLModel() { + getSettings()->setValue( "Playlist/zoom", i_zoom ); delete rootItem; delete sortingMenu; } @@ -186,7 +189,7 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const /* 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 ) @@ -229,7 +232,7 @@ void PLModel::dropMove( const PlMimeData * plMimeData, PLItem *target, int row ) { QList inputItems = plMimeData->inputItems(); QList model_items; - playlist_item_t *pp_items[inputItems.size()]; + playlist_item_t *pp_items[inputItems.count()]; PL_LOCK; @@ -308,7 +311,8 @@ void PLModel::activateItem( const QModelIndex &index ) 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; @@ -367,7 +371,7 @@ QVariant PLModel::data( const QModelIndex &index, const int role ) const 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 ); @@ -376,7 +380,10 @@ QVariant PLModel::data( const QModelIndex &index, const int role ) const { 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; @@ -493,7 +500,7 @@ QModelIndex PLModel::parent( const QModelIndex &index ) const return createIndex(parentItem->row(), 0, parentItem); } -int PLModel::columnCount( const QModelIndex &i) const +int PLModel::columnCount( const QModelIndex &) const { return columnFromMeta( COLUMN_END ); } @@ -507,7 +514,7 @@ int PLModel::rowCount( const QModelIndex &parent ) const 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 ) @@ -650,8 +657,6 @@ void PLModel::processItemAppend( int i_item, int i_parent ) void PLModel::rebuild( playlist_item_t *p_root ) { - playlist_item_t* p_item; - /* Invalidate cache */ i_cached_id = i_cached_input_id = -1; @@ -689,7 +694,7 @@ void PLModel::takeItem( PLItem *item ) void PLModel::insertChildren( PLItem *node, QList& 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 ); @@ -782,7 +787,7 @@ void PLModel::doDelete( QModelIndexList selected ) void PLModel::recurseDelete( QList 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() ) @@ -856,9 +861,8 @@ void PLModel::search( const QString& search_text, const QModelIndex & idx, bool 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 ); @@ -892,23 +896,22 @@ bool PLModel::popup( const QModelIndex & index, const QPoint &point, const QMode 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() ) ); @@ -925,6 +928,7 @@ bool PLModel::popup( const QModelIndex & index, const QPoint &point, const QMode } vlc_gc_decref( p_input ); + /* In PL or ML, allow to add a file/folder */ if( canEdit() ) { QIcon addIcon( ":/buttons/playlist/playlist_add" ); @@ -944,31 +948,48 @@ bool PLModel::popup( const QModelIndex & index, const QPoint &point, const QMode 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 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; @@ -992,6 +1013,22 @@ void PLModel::popupPlay() 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; @@ -1016,7 +1053,6 @@ void PLModel::popupStream() QStringList mrls = selectedURIs(); if( !mrls.isEmpty() ) THEDP->streamingDialog( NULL, mrls[0], false ); - } void PLModel::popupSave() @@ -1028,40 +1064,29 @@ 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() @@ -1087,6 +1112,19 @@ void PLModel::popupSort( int column ) 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() {