X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fplaylist%2Fplaylist_model.cpp;h=d60c0786eefab4e80e911e951c35d71151045d0f;hb=96b97b1612e584d4e0c24a884c1333f2e52abe8a;hp=dde688ebaa60cfff129af1b09142df692d84b86e;hpb=b4adbba8586661abb982e0491d52b2c30138c9c0;p=vlc diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp index dde688ebaa..d60c0786ee 100644 --- a/modules/gui/qt4/components/playlist/playlist_model.cpp +++ b/modules/gui/qt4/components/playlist/playlist_model.cpp @@ -49,8 +49,6 @@ static int PlaylistChanged( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); static int PlaylistNext( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); -static int ItemChanged( vlc_object_t *, const char *, - vlc_value_t, vlc_value_t, void * ); static int ItemAppended( vlc_object_t *p_this, const char *psz_variable, vlc_value_t oval, vlc_value_t nval, void *param ); static int ItemDeleted( vlc_object_t *p_this, const char *psz_variable, @@ -85,22 +83,27 @@ 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, ":/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" ); + ADD_ICON( FILE, ":/type/file" ); + ADD_ICON( DIRECTORY, ":/type/directory" ); + ADD_ICON( DISC, ":/type/disc" ); + ADD_ICON( CDDA, ":/type/cdda" ); + ADD_ICON( CARD, ":/type/capture-card" ); + ADD_ICON( NET, ":/type/net" ); + ADD_ICON( PLAYLIST, ":/type/playlist" ); + ADD_ICON( NODE, ":/type/node" ); #undef ADD_ICON rebuild( p_root ); + CONNECT( THEMIM->getIM(), metaChanged( input_item_t *), + this, ProcessInputItemUpdate( input_item_t *) ); + CONNECT( THEMIM, inputChanged( input_thread_t * ), + this, ProcessInputItemUpdate( input_thread_t* ) ); } PLModel::~PLModel() { - getSettings()->setValue( "qt-pl-showflags", rootItem->i_showflags ); + if(i_depth == -1) + getSettings()->setValue( "qt-pl-showflags", rootItem->i_showflags ); delCallbacks(); delete rootItem; } @@ -112,11 +115,32 @@ Qt::DropActions PLModel::supportedDropActions() const Qt::ItemFlags PLModel::flags( const QModelIndex &index ) const { - Qt::ItemFlags defaultFlags = QAbstractItemModel::flags( index ); - if( index.isValid() ) - return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; + Qt::ItemFlags flags = QAbstractItemModel::flags( index ); + + PLItem *item = index.isValid() ? + static_cast( index.internalPointer() ) : + rootItem; + + int pl_input_id = p_playlist->p_local_category->p_input->i_id; + int ml_input_id = p_playlist->p_ml_category->p_input->i_id; + + if( rootItem->i_id == p_playlist->p_root_onelevel->i_id + || rootItem->i_id == p_playlist->p_root_category->i_id ) + { + if( item->i_input_id == pl_input_id + || item->i_input_id == ml_input_id ) + flags |= Qt::ItemIsDropEnabled; + } else - return Qt::ItemIsDropEnabled | defaultFlags; + { + if ( item->b_is_node && + ( rootItem->i_input_id == pl_input_id || + rootItem->i_input_id == ml_input_id ) ) + flags |= Qt::ItemIsDropEnabled; + flags |= Qt::ItemIsDragEnabled; + } + + return flags; } /* A list of model indexes are a playlist */ @@ -132,10 +156,17 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const QMimeData *mimeData = new QMimeData(); QByteArray encodedData; QDataStream stream( &encodedData, QIODevice::WriteOnly ); + QModelIndexList list; - foreach( QModelIndex index, indexes ) { + foreach( const QModelIndex &index, indexes ) { if( index.isValid() && index.column() == 0 ) - stream << itemId( index ); + list.append(index); + } + + qSort(list); + + foreach( const QModelIndex &index, list ) { + stream << itemId( index ); } mimeData->setData( "vlc/playlist-item-id", encodedData ); return mimeData; @@ -143,68 +174,80 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const /* Drop operation */ bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action, - int row, int column, const QModelIndex &target ) + int row, int column, const QModelIndex &parent ) { if( data->hasFormat( "vlc/playlist-item-id" ) ) { if( action == Qt::IgnoreAction ) return true; - if( !target.isValid() ) - /* We don't want to move on an invalid position */ - return true; + PL_LOCK; - PLItem *targetItem = static_cast( target.internalPointer() ); + playlist_item_t *p_parent; + + if( !parent.isValid()) + { + if( row > -1) + { + // dropped into top node + p_parent = playlist_ItemGetById( p_playlist, rootItem->i_id ); + } + else + { + // dropped outside any item + PL_UNLOCK; + return true; + } + } + else + { + // dropped into/onto an item (depends on (row = -1) or (row > -1)) + p_parent = playlist_ItemGetById( p_playlist, itemId ( parent ) ); + } + if( !p_parent || p_parent->i_children == -1 ) + { + PL_UNLOCK; + return false; + } QByteArray encodedData = data->data( "vlc/playlist-item-id" ); QDataStream stream( &encodedData, QIODevice::ReadOnly ); - PLItem *newParentItem; + /* easiest way to never miss the right index to move to is to + track the previously moved item */ + playlist_item_t *p_target = NULL; + while( !stream.atEnd() ) { - int i; - int srcId; - stream >> srcId; - - PL_LOCK; - playlist_item_t *p_target = - playlist_ItemGetById( p_playlist, targetItem->i_id, - pl_Locked ); - playlist_item_t *p_src = playlist_ItemGetById( p_playlist, srcId, - pl_Locked ); - - if( !p_target || !p_src ) + int src_id; + stream >> src_id; + playlist_item_t *p_src = playlist_ItemGetById( p_playlist, src_id ); + + if( !p_src ) { PL_UNLOCK; return false; } - if( p_target->i_children == -1 ) /* A leaf */ + if( !p_target ) { - PLItem *parentItem = targetItem->parent(); - assert( parentItem ); - playlist_item_t *p_parent = - playlist_ItemGetById( p_playlist, parentItem->i_id, - pl_Locked ); - if( !p_parent ) + if(row == -1) { - PL_UNLOCK; - return false; + playlist_TreeMove( p_playlist, p_src, p_parent, 0 ); + } + else { + playlist_TreeMove( p_playlist, p_src, p_parent, row ); } - for( i = 0 ; i< p_parent->i_children ; i++ ) - if( p_parent->pp_children[i] == p_target ) break; - // Move the item to the element after i - playlist_TreeMove( p_playlist, p_src, p_parent, i + 1 ); - newParentItem = parentItem; } else { - /* \todo: if we drop on a top-level node, use copy instead ? */ - playlist_TreeMove( p_playlist, p_src, p_target, 0 ); - i = 0; - newParentItem = targetItem; + int i; + for( i = 0 ; i< p_parent->i_children ; i++ ) + if( p_parent->pp_children[i] == p_target ) break; + playlist_TreeMove( p_playlist, p_src, p_parent, i + 1 ); } - PL_UNLOCK; + p_target = p_src; } + PL_UNLOCK; /*TODO: That's not a good idea to rebuild the playlist */ rebuild(); } @@ -223,21 +266,22 @@ void PLModel::addCallbacks() { /* Some global changes happened -> Rebuild all */ var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this ); - /* We went to the next item */ - var_AddCallback( p_playlist, "playlist-current", PlaylistNext, this ); + /* We went to the next item + var_AddCallback( p_playlist, "item-current", PlaylistNext, this ); + */ /* One item has been updated */ - var_AddCallback( p_playlist, "item-change", ItemChanged, this ); - var_AddCallback( p_playlist, "item-append", ItemAppended, this ); - var_AddCallback( p_playlist, "item-deleted", ItemDeleted, this ); + var_AddCallback( p_playlist, "playlist-item-append", ItemAppended, this ); + var_AddCallback( p_playlist, "playlist-item-deleted", ItemDeleted, this ); } void PLModel::delCallbacks() { - var_DelCallback( p_playlist, "item-change", ItemChanged, this ); - var_DelCallback( p_playlist, "playlist-current", PlaylistNext, this ); + /* + var_DelCallback( p_playlist, "item-current", PlaylistNext, this ); + */ var_DelCallback( p_playlist, "intf-change", PlaylistChanged, this ); - var_DelCallback( p_playlist, "item-append", ItemAppended, this ); - var_DelCallback( p_playlist, "item-deleted", ItemDeleted, this ); + var_DelCallback( p_playlist, "playlist-item-append", ItemAppended, this ); + var_DelCallback( p_playlist, "playlist-item-deleted", ItemDeleted, this ); } void PLModel::activateItem( const QModelIndex &index ) @@ -246,8 +290,7 @@ void PLModel::activateItem( const QModelIndex &index ) PLItem *item = static_cast(index.internalPointer()); assert( item ); PL_LOCK; - playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id, - pl_Locked ); + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id ); activateItem( p_item ); PL_UNLOCK; } @@ -274,7 +317,39 @@ QVariant PLModel::data( const QModelIndex &index, int role ) const PLItem *item = static_cast(index.internalPointer()); if( role == Qt::DisplayRole ) { - return QVariant( item->columnString( index.column() ) ); + int running_index = -1; + int columncount = 0; + int metadata = 1; + + if( item->model->i_depth == DEPTH_SEL ) + { + vlc_mutex_lock( &item->p_input->lock ); + QString returninfo = QString( qfu( item->p_input->psz_name ) ); + vlc_mutex_unlock( &item->p_input->lock ); + return QVariant(returninfo); + } + + while( metadata < COLUMN_END ) + { + if( item->i_showflags & metadata ) + running_index++; + if( running_index == index.column() ) + break; + metadata <<= 1; + } + + if( running_index != index.column() ) return QVariant(); + + QString returninfo; + if( metadata == COLUMN_NUMBER ) + returninfo = QString::number( index.row() + 1 ); + else + { + char *psz = psz_column_meta( item->p_input, metadata ); + returninfo = QString( qfu( psz ) ); + free( psz ); + } + return QVariant( returninfo ); } else if( role == Qt::DecorationRole && index.column() == 0 ) { @@ -307,9 +382,25 @@ int PLModel::itemId( const QModelIndex &index ) const QVariant PLModel::headerData( int section, Qt::Orientation orientation, int role ) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) - return QVariant( rootItem->columnString( section ) ); - return QVariant(); + int metadata=1; + int running_index=-1; + if (orientation != Qt::Horizontal || role != Qt::DisplayRole) + return QVariant(); + + if( i_depth == DEPTH_SEL ) return QVariant( QString("") ); + + while( metadata < COLUMN_END ) + { + if( metadata & rootItem->i_showflags ) + running_index++; + if( running_index == section ) + break; + metadata <<= 1; + } + + if( running_index != section ) return QVariant(); + + return QVariant( qfu( psz_column_title( metadata ) ) ); } QModelIndex PLModel::index( int row, int column, const QModelIndex &parent ) @@ -364,7 +455,17 @@ QModelIndex PLModel::parent( const QModelIndex &index ) const int PLModel::columnCount( const QModelIndex &i) const { - return rootItem->item_col_strings.count(); + int columnCount=0; + int metadata=1; + if( i_depth == DEPTH_SEL ) return 1; + + while( metadata < COLUMN_END ) + { + if( metadata & rootItem->i_showflags ) + columnCount++; + metadata <<= 1; + } + return columnCount; } int PLModel::childrenCount( const QModelIndex &parent ) const @@ -392,20 +493,18 @@ QStringList PLModel::selectedURIs() PL_LOCK; PLItem *item = static_cast (current_selection[i].internalPointer()); - if( !item ) - continue; - - input_item_t *p_item = NULL; - if( !p_item ) - continue; - - char *psz = input_item_GetURI( p_item ); - if( !psz ) - continue; - else + if( item ) { - lst.append( QString( psz ) ); - free( psz ); + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id ); + if( p_item ) + { + char *psz = input_item_GetURI( p_item->p_input ); + if( psz ) + { + lst.append( psz ); + free( psz ); + } + } } PL_UNLOCK; } @@ -416,18 +515,15 @@ QStringList PLModel::selectedURIs() bool PLModel::hasRandom() { - if( var_GetBool( p_playlist, "random" ) ) return true; - return false; + return var_GetBool( p_playlist, "random" ); } bool PLModel::hasRepeat() { - if( var_GetBool( p_playlist, "repeat" ) ) return true; - return false; + return var_GetBool( p_playlist, "repeat" ); } bool PLModel::hasLoop() { - if( var_GetBool( p_playlist, "loop" ) ) return true; - return false; + return var_GetBool( p_playlist, "loop" ); } void PLModel::setLoop( bool on ) { @@ -516,16 +612,14 @@ PLItem * PLModel::FindInner( PLItem *root, int i_id, bool b_input ) void PLModel::customEvent( QEvent *event ) { int type = event->type(); - if( type != ItemUpdate_Type && type != ItemAppend_Type && + if( type != ItemAppend_Type && type != ItemDelete_Type && type != PLUpdate_Type ) return; PLEvent *ple = static_cast(event); - if( type == ItemUpdate_Type ) - ProcessInputItemUpdate( ple->i_id ); - else if( type == ItemAppend_Type ) - ProcessItemAppend( ple->p_add ); + if( type == ItemAppend_Type ) + ProcessItemAppend( &ple->add ); else if( type == ItemDelete_Type ) ProcessItemRemoval( ple->i_id ); else @@ -533,10 +627,20 @@ void PLModel::customEvent( QEvent *event ) } /**** Events processing ****/ -void PLModel::ProcessInputItemUpdate( int i_input_id ) +void PLModel::ProcessInputItemUpdate( input_thread_t *p_input ) { - if( i_input_id <= 0 ) return; - PLItem *item = FindByInput( rootItem, i_input_id ); + if( !p_input ) return; + ProcessInputItemUpdate( input_GetItem( p_input ) ); + if( p_input && !( p_input->b_dead || !vlc_object_alive( p_input ) ) ) + { + PLItem *item = FindByInput( rootItem, input_GetItem( p_input )->i_id ); + emit currentChanged( index( item, 0 ) ); + } +} +void PLModel::ProcessInputItemUpdate( input_item_t *p_item ) +{ + if( !p_item || p_item->i_id <= 0 ) return; + PLItem *item = FindByInput( rootItem, p_item->i_id ); if( item ) { QPL_LOCK; @@ -554,7 +658,7 @@ void PLModel::ProcessItemRemoval( int i_id ) removeItem( i_id ); } -void PLModel::ProcessItemAppend( playlist_add_t *p_add ) +void PLModel::ProcessItemAppend( const playlist_add_t *p_add ) { playlist_item_t *p_item = NULL; PLItem *newItem = NULL; @@ -563,7 +667,7 @@ void PLModel::ProcessItemAppend( playlist_add_t *p_add ) PL_LOCK; if( !nodeItem ) goto end; - p_item = playlist_ItemGetById( p_playlist, p_add->i_item, pl_Locked ); + p_item = playlist_ItemGetById( p_playlist, p_add->i_item ); 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 ) @@ -612,7 +716,7 @@ void PLModel::rebuild( playlist_item_t *p_root ) assert( rootItem ); /* Recreate from root */ UpdateNodeChildren( rootItem ); - if( p_item=playlist_CurrentPlayingItem(p_playlist) ) + if( (p_item = playlist_CurrentPlayingItem(p_playlist)) ) { PLItem *currentItem = FindByInput( rootItem, p_item->p_input->i_id ); @@ -632,8 +736,7 @@ void PLModel::rebuild( playlist_item_t *p_root ) /* This function must be entered WITH the playlist lock */ void PLModel::UpdateNodeChildren( PLItem *root ) { - playlist_item_t *p_node = playlist_ItemGetById( p_playlist, root->i_id, - pl_Locked ); + playlist_item_t *p_node = playlist_ItemGetById( p_playlist, root->i_id ); UpdateNodeChildren( p_node, root ); } @@ -654,8 +757,7 @@ void PLModel::UpdateNodeChildren( playlist_item_t *p_node, PLItem *root ) /* This function must be entered WITH the playlist lock */ void PLModel::UpdateTreeItem( PLItem *item, bool signal, bool force ) { - playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id, - pl_Locked ); + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id ); UpdateTreeItem( p_item, item, signal, force ); } @@ -694,6 +796,7 @@ void PLModel::doDelete( QModelIndexList selected ) recurseDelete( item->children, &selected ); doDeleteItem( item, &selected ); } + if( i > selected.size() ) i = selected.size(); } } @@ -714,14 +817,14 @@ void PLModel::doDeleteItem( PLItem *item, QModelIndexList *fullList ) fullList->removeAll( deleteIndex ); PL_LOCK; - playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id, - pl_Locked ); + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id ); if( !p_item ) { - PL_UNLOCK; return; + PL_UNLOCK; + return; } if( p_item->i_children == -1 ) - playlist_DeleteFromInput( p_playlist, item->i_input_id, pl_Locked ); + playlist_DeleteFromInput( p_playlist, p_item->p_input, pl_Locked ); else playlist_NodeDelete( p_playlist, p_item, true, false ); /* And finally, remove it from the tree */ @@ -735,16 +838,6 @@ 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; - } - int i_column = 1; for( i_column = 1; i_column != COLUMN_END; i_column<<=1 ) { @@ -762,9 +855,8 @@ next: PL_LOCK; { playlist_item_t *p_root = playlist_ItemGetById( p_playlist, - rootItem->i_id, - pl_Locked ); - if( p_root ) + rootItem->i_id ); + if( p_root && i_flag ) { playlist_RecursiveNodeSort( p_playlist, p_root, i_column_sorting( i_flag ), @@ -776,16 +868,15 @@ next: rebuild(); } -void PLModel::search( QString search_text ) +void PLModel::search( const QString& search_text ) { /** \todo Fire the search with a small delay ? */ PL_LOCK; { playlist_item_t *p_root = playlist_ItemGetById( p_playlist, - rootItem->i_id, - pl_Locked ); + rootItem->i_id ); assert( p_root ); - char *psz_name = search_text.toUtf8().data(); + const char *psz_name = search_text.toUtf8().data(); playlist_LiveSearchUpdate( p_playlist , p_root, psz_name ); } PL_UNLOCK; @@ -797,8 +888,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 ), pl_Locked ); + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, itemId( index ) ); if( p_item ) { i_popup_item = p_item->i_id; @@ -806,21 +896,21 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list ) PL_UNLOCK; current_selection = list; QMenu *menu = new QMenu; - menu->addAction( qfu(I_POP_PLAY), this, SLOT( popupPlay() ) ); - menu->addAction( qfu(I_POP_DEL), this, SLOT( popupDel() ) ); + menu->addAction( qtr(I_POP_PLAY), this, SLOT( popupPlay() ) ); + menu->addAction( qtr(I_POP_DEL), this, SLOT( popupDel() ) ); menu->addSeparator(); - menu->addAction( qfu(I_POP_STREAM), this, SLOT( popupStream() ) ); - menu->addAction( qfu(I_POP_SAVE), this, SLOT( popupSave() ) ); + menu->addAction( qtr(I_POP_STREAM), this, SLOT( popupStream() ) ); + menu->addAction( qtr(I_POP_SAVE), this, SLOT( popupSave() ) ); menu->addSeparator(); - menu->addAction( qfu(I_POP_INFO), this, SLOT( popupInfo() ) ); + menu->addAction( qtr(I_POP_INFO), this, SLOT( popupInfo() ) ); if( p_item->i_children > -1 ) { menu->addSeparator(); - menu->addAction( qfu(I_POP_SORT), this, SLOT( popupSort() ) ); - menu->addAction( qfu(I_POP_ADD), this, SLOT( popupAdd() ) ); + menu->addAction( qtr(I_POP_SORT), this, SLOT( popupSort() ) ); + menu->addAction( qtr(I_POP_ADD), this, SLOT( popupAdd() ) ); } menu->addSeparator(); - menu->addAction( qfu( I_POP_EXPLORE ), this, SLOT( popupExplore() ) ); + menu->addAction( qtr( I_POP_EXPLORE ), this, SLOT( popupExplore() ) ); menu->popup( point ); } else @@ -842,7 +932,7 @@ void PLModel::viewchanged( int meta ) } /* UNUSED emit layoutAboutToBeChanged(); */ - index = __MIN( index, rootItem->item_col_strings.count() ); + index = __MIN( index, columnCount() ); QModelIndex parent = createIndex( 0, 0, rootItem ); if( rootItem->i_showflags & meta ) @@ -851,7 +941,6 @@ void PLModel::viewchanged( int meta ) beginRemoveColumns( parent, index, index+1 ); rootItem->i_showflags &= ~( meta ); getSettings()->setValue( "qt-pl-showflags", rootItem->i_showflags ); - rootItem->updateColumnHeaders(); endRemoveColumns(); } else @@ -860,9 +949,9 @@ void PLModel::viewchanged( int meta ) beginInsertColumns( parent, index, index+1 ); rootItem->i_showflags |= meta; getSettings()->setValue( "qt-pl-showflags", rootItem->i_showflags ); - rootItem->updateColumnHeaders(); endInsertColumns(); } + emit columnsChanged( meta ); rebuild(); } } @@ -877,8 +966,7 @@ void PLModel::popupPlay() PL_LOCK; { playlist_item_t *p_item = playlist_ItemGetById( p_playlist, - i_popup_item, - pl_Locked ); + i_popup_item ); activateItem( p_item ); } PL_UNLOCK; @@ -886,12 +974,16 @@ void PLModel::popupPlay() void PLModel::popupInfo() { + PL_LOCK; playlist_item_t *p_item = playlist_ItemGetById( p_playlist, - i_popup_item, - pl_Unlocked ); + i_popup_item ); if( p_item ) { - MediaInfoDialog *mid = new MediaInfoDialog( p_intf, p_item->p_input ); + input_item_t* p_input = p_item->p_input; + vlc_gc_incref( p_input ); + PL_UNLOCK; + MediaInfoDialog *mid = new MediaInfoDialog( p_intf, p_input ); + vlc_gc_decref( p_input ); mid->setParent( PlaylistDialog::getInstance( p_intf ), Qt::Dialog ); mid->show(); @@ -910,7 +1002,7 @@ void PLModel::popupSave() { QStringList mrls = selectedURIs(); if( !mrls.isEmpty() ) - THEDP->streamingDialog( NULL, mrls[0], true ); + THEDP->streamingDialog( NULL, mrls[0] ); } #include @@ -918,13 +1010,14 @@ void PLModel::popupSave() #include void PLModel::popupExplore() { + PL_LOCK; playlist_item_t *p_item = playlist_ItemGetById( p_playlist, - i_popup_item, - pl_Unlocked ); + 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; @@ -943,6 +1036,8 @@ void PLModel::popupExplore() free( psz_meta ); } } + else + PL_UNLOCK; } /********************************************************************** @@ -953,7 +1048,7 @@ static int PlaylistChanged( vlc_object_t *p_this, const char *psz_variable, { PLModel *p_model = (PLModel *) param; PLEvent *event = new PLEvent( PLUpdate_Type, 0 ); - QApplication::postEvent( p_model, static_cast(event) ); + QApplication::postEvent( p_model, event ); return VLC_SUCCESS; } @@ -962,18 +1057,9 @@ static int PlaylistNext( vlc_object_t *p_this, const char *psz_variable, { PLModel *p_model = (PLModel *) param; PLEvent *event = new PLEvent( ItemUpdate_Type, oval.i_int ); - QApplication::postEvent( p_model, static_cast(event) ); + QApplication::postEvent( p_model, event ); event = new PLEvent( ItemUpdate_Type, nval.i_int ); - QApplication::postEvent( p_model, static_cast(event) ); - return VLC_SUCCESS; -} - -static int ItemChanged( vlc_object_t *p_this, const char *psz_variable, - vlc_value_t oval, vlc_value_t nval, void *param ) -{ - PLModel *p_model = (PLModel *) param; - PLEvent *event = new PLEvent( ItemUpdate_Type, nval.i_int ); - QApplication::postEvent( p_model, static_cast(event) ); + QApplication::postEvent( p_model, event ); return VLC_SUCCESS; } @@ -982,7 +1068,7 @@ static int ItemDeleted( vlc_object_t *p_this, const char *psz_variable, { PLModel *p_model = (PLModel *) param; PLEvent *event = new PLEvent( ItemDelete_Type, nval.i_int ); - QApplication::postEvent( p_model, static_cast(event) ); + QApplication::postEvent( p_model, event ); return VLC_SUCCESS; } @@ -990,11 +1076,9 @@ static int ItemAppended( vlc_object_t *p_this, const char *psz_variable, vlc_value_t oval, vlc_value_t nval, void *param ) { PLModel *p_model = (PLModel *) param; - playlist_add_t *p_add = (playlist_add_t *)malloc( sizeof( playlist_add_t)); - memcpy( p_add, nval.p_address, sizeof( playlist_add_t ) ); - + const playlist_add_t *p_add = (playlist_add_t *)nval.p_address; PLEvent *event = new PLEvent( p_add ); - QApplication::postEvent( p_model, static_cast(event) ); + QApplication::postEvent( p_model, event ); return VLC_SUCCESS; }