Commit 56a7b4ba authored by Jakob Leben's avatar Jakob Leben Committed by Rémi Denis-Courmont

Qt4 playlist: keep item order when moving

Signed-off-by: default avatarRémi Denis-Courmont <remi@remlab.net>
parent 45440560
...@@ -135,9 +135,16 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const ...@@ -135,9 +135,16 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const
QMimeData *mimeData = new QMimeData(); QMimeData *mimeData = new QMimeData();
QByteArray encodedData; QByteArray encodedData;
QDataStream stream( &encodedData, QIODevice::WriteOnly ); QDataStream stream( &encodedData, QIODevice::WriteOnly );
QModelIndexList list;
foreach( const QModelIndex &index, indexes ) { foreach( const QModelIndex &index, indexes ) {
if( index.isValid() && index.column() == 0 ) if( index.isValid() && index.column() == 0 )
list.append(index);
}
qSort(list);
foreach( const QModelIndex &index, list ) {
stream << itemId( index ); stream << itemId( index );
} }
mimeData->setData( "vlc/playlist-item-id", encodedData ); mimeData->setData( "vlc/playlist-item-id", encodedData );
...@@ -146,65 +153,80 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const ...@@ -146,65 +153,80 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const
/* Drop operation */ /* Drop operation */
bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action, 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( data->hasFormat( "vlc/playlist-item-id" ) )
{ {
if( action == Qt::IgnoreAction ) if( action == Qt::IgnoreAction )
return true; return true;
if( !target.isValid() ) PL_LOCK;
/* We don't want to move on an invalid position */
return true;
PLItem *targetItem = static_cast<PLItem*>( 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" ); QByteArray encodedData = data->data( "vlc/playlist-item-id" );
QDataStream stream( &encodedData, QIODevice::ReadOnly ); 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() ) while( !stream.atEnd() )
{ {
int i; int src_id;
int srcId; stream >> src_id;
stream >> srcId; playlist_item_t *p_src = playlist_ItemGetById( p_playlist, src_id );
PL_LOCK;
playlist_item_t *p_target =
playlist_ItemGetById( p_playlist, targetItem->i_id );
playlist_item_t *p_src = playlist_ItemGetById( p_playlist, srcId );
if( !p_target || !p_src ) if( !p_src )
{ {
PL_UNLOCK; PL_UNLOCK;
return false; return false;
} }
if( p_target->i_children == -1 ) /* A leaf */ if( !p_target )
{ {
PLItem *parentItem = targetItem->parent(); if(row == -1)
assert( parentItem );
playlist_item_t *p_parent =
playlist_ItemGetById( p_playlist, parentItem->i_id );
if( !p_parent )
{ {
PL_UNLOCK; playlist_TreeMove( p_playlist, p_src, p_parent, 0 );
return false; }
else {
playlist_TreeMove( p_playlist, p_src, p_parent, row );
}
} }
else
{
int i;
for( i = 0 ; i< p_parent->i_children ; i++ ) for( i = 0 ; i< p_parent->i_children ; i++ )
if( p_parent->pp_children[i] == p_target ) break; 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 ); playlist_TreeMove( p_playlist, p_src, p_parent, i + 1 );
newParentItem = parentItem;
} }
else p_target = p_src;
{
/* \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;
} }
PL_UNLOCK; PL_UNLOCK;
}
/*TODO: That's not a good idea to rebuild the playlist */ /*TODO: That's not a good idea to rebuild the playlist */
rebuild(); rebuild();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment