X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fplaylist%2Fplaylist_model.cpp;h=6d4fc637865ac09857597fca169b762e029ddade;hb=f025433b9a8d04ddbed9ac7d1bf1e3b9a63958c8;hp=0ee740b566ffe695b7d2b05a35e734643b0849d5;hpb=449fd28aaf007c6411251dae9d0dbfdc65b135d1;p=vlc diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp index 0ee740b566..6d4fc63786 100644 --- a/modules/gui/qt4/components/playlist/playlist_model.cpp +++ b/modules/gui/qt4/components/playlist/playlist_model.cpp @@ -26,11 +26,12 @@ #endif #include "qt4.hpp" +#include "dialogs_provider.hpp" #include "components/playlist/playlist_model.hpp" #include "dialogs/mediainfo.hpp" #include -#include "pixmaps/type_unknown.xpm" +#include "pixmaps/types/type_unknown.xpm" #include #include @@ -39,6 +40,8 @@ #include #include +#include "sorting.h" + QIcon PLModel::icons[ITEM_TYPE_NUMBER]; static int PlaylistChanged( vlc_object_t *, const char *, @@ -72,8 +75,6 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ assert( i_depth == DEPTH_SEL || i_depth == DEPTH_PL ); p_intf = _p_intf; p_playlist = _p_playlist; - i_items_to_append = 0; - b_need_update = false; i_cached_id = -1; i_cached_input_id = -1; i_popup_item = i_popup_parent = -1; @@ -83,14 +84,14 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ /* Icons initialization */ #define ADD_ICON(type, x) icons[ITEM_TYPE_##type] = QIcon( QPixmap( x ) ) ADD_ICON( UNKNOWN , type_unknown_xpm ); - ADD_ICON( FILE, ":/pixmaps/type_file.png" ); - ADD_ICON( DIRECTORY, ":/pixmaps/type_directory.png" ); - ADD_ICON( DISC, ":/pixmaps/disc_16px.png" ); - ADD_ICON( CDDA, ":/pixmaps/cdda_16px.png" ); - ADD_ICON( CARD, ":/pixmaps/capture-card_16px.png" ); - ADD_ICON( NET, ":/pixmaps/type_net.png" ); - ADD_ICON( PLAYLIST, ":/pixmaps/type_playlist.png" ); - ADD_ICON( NODE, ":/pixmaps/type_node.png" ); + ADD_ICON( FILE, ":/type_file" ); + ADD_ICON( DIRECTORY, ":/type_directory" ); + ADD_ICON( DISC, ":/disc" ); + ADD_ICON( CDDA, ":/cdda" ); + ADD_ICON( CARD, ":/capture-card" ); + ADD_ICON( NET, ":/type_net" ); + ADD_ICON( PLAYLIST, ":/type_playlist" ); + ADD_ICON( NODE, ":/type_node" ); #undef ADD_ICON rebuild( p_root ); @@ -98,8 +99,7 @@ PLModel::PLModel( playlist_t *_p_playlist, /* THEPL */ PLModel::~PLModel() { - QSettings settings( "vlc", "vlc-qt-interface" ); - settings.setValue( "qt-pl-showflags", rootItem->i_showflags ); + getSettings()->setValue( "qt-pl-showflags", rootItem->i_showflags ); delCallbacks(); delete rootItem; } @@ -168,9 +168,9 @@ bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action, PL_LOCK; playlist_item_t *p_target = playlist_ItemGetById( p_playlist, targetItem->i_id, - true ); + pl_Locked ); playlist_item_t *p_src = playlist_ItemGetById( p_playlist, srcId, - true ); + pl_Locked ); if( !p_target || !p_src ) { @@ -183,7 +183,7 @@ bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action, assert( parentItem ); playlist_item_t *p_parent = playlist_ItemGetById( p_playlist, parentItem->i_id, - true ); + pl_Locked ); if( !p_parent ) { PL_UNLOCK; @@ -260,7 +260,7 @@ void PLModel::activateItem( const QModelIndex &index ) assert( item ); PL_LOCK; playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id, - true); + pl_Locked ); activateItem( p_item ); PL_UNLOCK; } @@ -276,7 +276,7 @@ void PLModel::activateItem( playlist_item_t *p_item ) p_parent = p_parent->p_parent; } if( p_parent ) - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, true, + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, p_parent, p_item ); } @@ -397,6 +397,35 @@ int PLModel::rowCount( const QModelIndex &parent ) const return parentItem->childCount(); } +QStringList PLModel::selectedURIs() +{ + QStringList lst; + for( int i = 0; i < current_selection.size(); i++ ) + { + PL_LOCK; + PLItem *item = static_cast + (current_selection[i].internalPointer()); + if( !item ) + continue; + + input_item_t *p_item = input_item_GetById( p_playlist, + item->i_input_id ); + if( !p_item ) + continue; + + char *psz = input_item_GetURI( p_item ); + if( !psz ) + continue; + else + { + lst.append( QString( psz ) ); + free( psz ); + } + PL_UNLOCK; + } + return lst; +} + /************************* General playlist status ***********************/ bool PLModel::hasRandom() @@ -523,7 +552,11 @@ void PLModel::ProcessInputItemUpdate( int i_input_id ) if( i_input_id <= 0 ) return; PLItem *item = FindByInput( rootItem, i_input_id ); if( item ) + { + QPL_LOCK; UpdateTreeItem( item, true ); + QPL_UNLOCK; + } } void PLModel::ProcessItemRemoval( int i_id ) @@ -539,14 +572,12 @@ void PLModel::ProcessItemAppend( playlist_add_t *p_add ) { playlist_item_t *p_item = NULL; PLItem *newItem = NULL; - i_items_to_append--; - if( b_need_update ) return; PLItem *nodeItem = FindById( rootItem, p_add->i_node ); PL_LOCK; if( !nodeItem ) goto end; - p_item = playlist_ItemGetById( p_playlist, p_add->i_item, true ); + p_item = playlist_ItemGetById( p_playlist, p_add->i_item, pl_Locked ); if( !p_item || p_item->i_flags & PLAYLIST_DBL_FLAG ) goto end; if( i_depth == DEPTH_SEL && p_item->p_parent && p_item->p_parent->i_id != rootItem->i_id ) @@ -588,8 +619,8 @@ void PLModel::rebuild( playlist_item_t *p_root ) } if( p_root ) { - //if( rootItem ) delete rootItem; - rootItem = new PLItem( p_root, NULL, this ); + delete rootItem; + rootItem = new PLItem( p_root, getSettings(), this ); } assert( rootItem ); /* Recreate from root */ @@ -615,7 +646,7 @@ void PLModel::rebuild( playlist_item_t *p_root ) void PLModel::UpdateNodeChildren( PLItem *root ) { playlist_item_t *p_node = playlist_ItemGetById( p_playlist, root->i_id, - true ); + pl_Locked ); UpdateNodeChildren( p_node, root ); } @@ -637,7 +668,7 @@ void PLModel::UpdateNodeChildren( playlist_item_t *p_node, PLItem *root ) void PLModel::UpdateTreeItem( PLItem *item, bool signal, bool force ) { playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id, - true ); + pl_Locked ); UpdateTreeItem( p_item, item, signal, force ); } @@ -697,13 +728,13 @@ void PLModel::doDeleteItem( PLItem *item, QModelIndexList *fullList ) PL_LOCK; playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id, - true ); + pl_Locked ); if( !p_item ) { PL_UNLOCK; return; } if( p_item->i_children == -1 ) - playlist_DeleteFromInput( p_playlist, item->i_input_id, true ); + playlist_DeleteFromInput( p_playlist, item->i_input_id, pl_Locked ); else playlist_NodeDelete( p_playlist, p_item, true, false ); /* And finally, remove it from the tree */ @@ -717,25 +748,35 @@ void PLModel::sort( int column, Qt::SortOrder order ) int i_index = -1; int i_flag = 0; + // FIXME: Disable sorting on startup by ignoring + // first call of sorting caused by showing dialog + // see: standardpanel.cpp:65 + static bool b_first_time = true; + if( b_first_time ) + { + b_first_time = false; + return; + } + #define CHECK_COLUMN( meta ) \ { \ - if( ( shownFlags() & VLC_META_ENGINE_##meta ) ) \ + if( ( shownFlags() & meta ) ) \ i_index++; \ if( column == i_index ) \ { \ - i_flag = VLC_META_ENGINE_##meta; \ + i_flag = meta; \ goto next; \ } \ } - CHECK_COLUMN( TRACKID ); - CHECK_COLUMN( TITLE ); - CHECK_COLUMN( DURATION ); - CHECK_COLUMN( ARTIST ); - CHECK_COLUMN( GENRE ); - CHECK_COLUMN( COLLECTION ); - CHECK_COLUMN( SEQ_NUM ); - CHECK_COLUMN( DESCRIPTION ); + CHECK_COLUMN( COLUMN_NUMBER ); + CHECK_COLUMN( COLUMN_TITLE ); + CHECK_COLUMN( COLUMN_DURATION ); + CHECK_COLUMN( COLUMN_ARTIST ); + CHECK_COLUMN( COLUMN_GENRE ); + CHECK_COLUMN( COLUMN_ALBUM ); + CHECK_COLUMN( COLUMN_TRACK_NUMBER ); + CHECK_COLUMN( COLUMN_DESCRIPTION ); #undef CHECK_COLUMN @@ -744,23 +785,11 @@ next: { playlist_item_t *p_root = playlist_ItemGetById( p_playlist, rootItem->i_id, - true ); - int i_mode; - switch( i_flag ) - { - case VLC_META_ENGINE_TRACKID: i_mode = SORT_ID; break; - case VLC_META_ENGINE_TITLE: i_mode = SORT_TITLE_NODES_FIRST;break; - case VLC_META_ENGINE_DURATION: i_mode = SORT_DURATION; break; - case VLC_META_ENGINE_ARTIST: i_mode = SORT_ARTIST; break; - case VLC_META_ENGINE_GENRE: i_mode = SORT_GENRE; break; - case VLC_META_ENGINE_COLLECTION: i_mode = SORT_ALBUM; break; - case VLC_META_ENGINE_SEQ_NUM: i_mode = SORT_TRACK_NUMBER; break; - case VLC_META_ENGINE_DESCRIPTION:i_mode = SORT_DESCRIPTION; break; - default: i_mode = SORT_TITLE_NODES_FIRST;break; - } + pl_Locked ); if( p_root ) { - playlist_RecursiveNodeSort( p_playlist, p_root, i_mode, + playlist_RecursiveNodeSort( p_playlist, p_root, + i_column_sorting( i_flag ), order == Qt::AscendingOrder ? ORDER_NORMAL : ORDER_REVERSE ); p_playlist->b_reset_currently_playing = true; @@ -777,7 +806,7 @@ void PLModel::search( QString search_text ) { playlist_item_t *p_root = playlist_ItemGetById( p_playlist, rootItem->i_id, - true ); + pl_Locked ); assert( p_root ); char *psz_name = search_text.toUtf8().data(); playlist_LiveSearchUpdate( p_playlist , p_root, psz_name ); @@ -792,7 +821,7 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list ) assert( index.isValid() ); PL_LOCK; playlist_item_t *p_item = playlist_ItemGetById( p_playlist, - itemId( index ), true ); + itemId( index ), pl_Locked ); if( p_item ) { i_popup_item = p_item->i_id; @@ -813,10 +842,8 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list ) menu->addAction( qfu(I_POP_SORT), this, SLOT( popupSort() ) ); menu->addAction( qfu(I_POP_ADD), this, SLOT( popupAdd() ) ); } -#ifdef WIN32 menu->addSeparator(); menu->addAction( qfu( I_POP_EXPLORE ), this, SLOT( popupExplore() ) ); -#endif menu->popup( point ); } else @@ -826,32 +853,17 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list ) void PLModel::viewchanged( int meta ) { + assert( meta ); + int _meta = meta; if( rootItem ) { - int index=0; - switch( meta ) + int index=-1; + while( _meta ) { - case VLC_META_ENGINE_TRACKID: - index=0; break; - case VLC_META_ENGINE_TITLE: - index=1; break; - case VLC_META_ENGINE_DURATION: - index=2; break; - case VLC_META_ENGINE_ARTIST: - index=3; break; - case VLC_META_ENGINE_GENRE: - index=4; break; - case VLC_META_ENGINE_COPYRIGHT: - index=5; break; - case VLC_META_ENGINE_COLLECTION: - index=6; break; - case VLC_META_ENGINE_SEQ_NUM: - index=7; break; - case VLC_META_ENGINE_DESCRIPTION: - index=8; break; - default: - break; + index++; + _meta >>= 1; } + /* UNUSED emit layoutAboutToBeChanged(); */ index = __MIN( index, rootItem->item_col_strings.count() ); QModelIndex parent = createIndex( 0, 0, rootItem ); @@ -880,12 +892,14 @@ void PLModel::popupDel() { doDelete( current_selection ); } + void PLModel::popupPlay() { PL_LOCK; { playlist_item_t *p_item = playlist_ItemGetById( p_playlist, - i_popup_item,true ); + i_popup_item, + pl_Locked ); activateItem( p_item ); } PL_UNLOCK; @@ -895,7 +909,7 @@ void PLModel::popupInfo() { playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i_popup_item, - true ); + pl_Unlocked ); if( p_item ) { MediaInfoDialog *mid = new MediaInfoDialog( p_intf, p_item->p_input ); @@ -905,21 +919,40 @@ void PLModel::popupInfo() void PLModel::popupStream() { - msg_Err( p_playlist, "Stream not implemented" ); + QStringList mrls = selectedURIs(); + if( !mrls.isEmpty() ) + THEDP->streamingDialog( NULL, mrls[0], false ); + } void PLModel::popupSave() { - msg_Err( p_playlist, "Save not implemented" ); + QStringList mrls = selectedURIs(); + if( !mrls.isEmpty() ) + THEDP->streamingDialog( NULL, mrls[0], true ); } -#ifdef WIN32 -#include +#include +#include +#include void PLModel::popupExplore() { - ShellExecute( NULL, "explore", "C:\\", NULL, NULL, SW_SHOWNORMAL ); + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, + i_popup_item, + pl_Unlocked ); + if( p_item ) + { + input_item_t *p_input = p_item->p_input; + char *psz_meta = input_item_GetURI( p_input ); + if( psz_meta ) + { + /* FIXME add a MRLSplit like function */ + QFileInfo info( qfu( psz_meta ) ); + QDesktopServices::openUrl( QUrl::fromLocalFile( info.absolutePath() ) ); + free( psz_meta ); + } + } } -#endif /********************************************************************** * Playlist callbacks @@ -969,11 +1002,6 @@ static int ItemAppended( vlc_object_t *p_this, const char *psz_variable, playlist_add_t *p_add = (playlist_add_t *)malloc( sizeof( playlist_add_t)); memcpy( p_add, nval.p_address, sizeof( playlist_add_t ) ); - if( ++p_model->i_items_to_append >= 50 ) - { -// p_model->b_need_update = true; -// return VLC_SUCCESS; - } PLEvent *event = new PLEvent( p_add ); QApplication::postEvent( p_model, static_cast(event) ); return VLC_SUCCESS;