plMimeData->appendItem( item->p_input );
}
- return plMimeData->mimeData();
+ return plMimeData;
}
/* Drop operation */
bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent )
{
- if( data->hasFormat( "vlc/qt-input-items" ) )
+ const PlMimeData *plMimeData = qobject_cast<const PlMimeData*>( data );
+ if( plMimeData )
{
if( action == Qt::IgnoreAction )
return true;
PL_UNLOCK;
if( copy )
- dropAppendCopy( data, getItem( parent ) );
+ dropAppendCopy( plMimeData, getItem( parent ) );
else
- dropMove( data, getItem( parent ), row );
+ dropMove( plMimeData, getItem( parent ), row );
}
return true;
}
-void PLModel::dropAppendCopy( const QMimeData *data, PLItem *target )
+void PLModel::dropAppendCopy( const PlMimeData *plMimeData, PLItem *target )
{
PL_LOCK;
bool b_flat = p_parent == p_playlist->p_playing &&
!var_InheritBool( p_intf, "playlist-tree" );
- QList<input_item_t*> inputItems = PlMimeData::inputItems( data );
+ QList<input_item_t*> inputItems = plMimeData->inputItems();
foreach( input_item_t* p_input, inputItems )
{
playlist_item_t *p_item = playlist_ItemGetByInput( p_playlist, p_input );
recursiveAppendCopy( p_playlist, source->pp_children[i], target, b_flat );
}
-void PLModel::dropMove( const QMimeData * mimeData, PLItem *target, int row )
+void PLModel::dropMove( const PlMimeData * plMimeData, PLItem *target, int row )
{
- QList<input_item_t*> inputItems = PlMimeData::inputItems( mimeData );
+ QList<input_item_t*> inputItems = plMimeData->inputItems();
QList<PLItem*> model_items;
- int new_pos = row == -1 ? target->children.size() : row;
+ playlist_item_t *pp_items[inputItems.size()];
+
+ PL_LOCK;
+
+ playlist_item_t *p_parent =
+ playlist_ItemGetByInput( p_playlist, target->p_input );
+
+ if( !p_parent || row > p_parent->i_children )
+ {
+ PL_UNLOCK; return;
+ }
+
+ int new_pos = row == -1 ? p_parent->i_children : row;
int model_pos = new_pos;
+ int i = 0;
foreach( input_item_t *p_input, inputItems )
{
+ playlist_item_t *p_item = playlist_ItemGetByInput( p_playlist, p_input );
+ if( !p_item ) continue;
+
PLItem *item = findByInput( rootItem, p_input->i_id );
if( !item ) continue;
PLItem *climber = target;
while( climber )
{
- if( climber == item ) return;
+ if( climber == item )
+ {
+ PL_UNLOCK; return;
+ }
climber = climber->parentItem;
}
model_pos--;
model_items.append( item );
+ pp_items[i] = p_item;
+ i++;
}
- if( model_items.isEmpty() ) return;
+ if( model_items.isEmpty() )
+ {
+ PL_UNLOCK; return;
+ }
- foreach( PLItem *item, model_items )
- takeItem( item );
+ playlist_TreeMoveMany( p_playlist, i, pp_items, p_parent, new_pos );
- playlist_item_t *pp_items[model_items.size()];
+ PL_UNLOCK;
- PL_LOCK;
- int i = 0;
foreach( PLItem *item, model_items )
- {
- playlist_item_t *p_item = playlist_ItemGetById( p_playlist, item->i_id );
- if( !p_item )
- {
- PL_UNLOCK;
- return;
- }
- pp_items[i] = p_item;
- i++;
- }
- playlist_item_t *p_parent =
- playlist_ItemGetById( p_playlist, target->i_id );
- playlist_TreeMoveMany( p_playlist, i, pp_items, p_parent,
- new_pos );
- PL_UNLOCK;
+ takeItem( item );
insertChildren( target, model_items, model_pos );
}
/******************* Drag and Drop helper class ******************/
PlMimeData::PlMimeData( )
-{
- _mimeData = new QMimeData;
- setParent( _mimeData );
-}
+{ }
PlMimeData::~PlMimeData()
{
_inputItems.append( p_item );
}
-QMimeData * PlMimeData::mimeData()
+QList<input_item_t*> PlMimeData::inputItems() const
{
- QByteArray encodedData;
- input_item_t *pp_items[_inputItems.size()];
-
- for( int i = 0; i < _inputItems.size() ; i++ )
- pp_items[i] = _inputItems[i];
-
- _mimeData->setData( "vlc/qt-input-items",
- QByteArray( (char*) pp_items, _inputItems.size() * sizeof( input_item_t*) ) );
- return _mimeData;
+ return _inputItems;
}
-QList<input_item_t*> PlMimeData::inputItems( const QMimeData * mimeData )
+QStringList PlMimeData::formats () const
{
- QList<input_item_t*> list;
-
- if( !mimeData->hasFormat( "vlc/qt-input-items" ) ) return list;
-
- QByteArray encodedData = mimeData->data( "vlc/qt-input-items" );
-
- input_item_t **pp_items = (input_item_t **) encodedData.data();
- int i_items = encodedData.size() / sizeof( input_item_t* );
- for( int i = 0; i < i_items; i++ )
- list.append( pp_items[i] );
-
- return list;
+ QStringList fmts;
+ fmts << "vlc/qt-input-items";
+ return fmts;
}
class PLItem;
class PLSelector;
+class PlMimeData;
class PLModel : public QAbstractItemModel
{
/* Deep actions (affect core playlist) */
static void recursiveAppendCopy( playlist_t *, playlist_item_t *, playlist_item_t *, bool );
- void dropAppendCopy( const QMimeData * data, PLItem *target );
- void dropMove( const QMimeData * data, PLItem *target, int new_pos );
+ void dropAppendCopy( const PlMimeData * data, PLItem *target );
+ void dropMove( const PlMimeData * data, PLItem *target, int new_pos );
/* Popup */
int i_popup_item, i_popup_parent, i_popup_column;
void processItemAppend( int item, int parent );
};
-class PlMimeData : public QObject
+class PlMimeData : public QMimeData
{
+ Q_OBJECT;
+
public:
PlMimeData();
~PlMimeData();
void appendItem( input_item_t *p_item );
- QMimeData *mimeData();
- static QList<input_item_t*> inputItems( const QMimeData * mimeData );
+ QList<input_item_t*> inputItems() const;
+ QStringList formats () const;
private:
QList<input_item_t*> _inputItems;