From 53aa6dff9b7820323298c268090e80bca41592d1 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 12 Apr 2015 01:28:11 +0200 Subject: [PATCH] Work around odd drag & drop behaviour. --- src/tomahawk/sourcetree/SourceTreeView.cpp | 24 ++++++++++++++-------- src/tomahawk/sourcetree/SourcesModel.cpp | 12 +++++------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/tomahawk/sourcetree/SourceTreeView.cpp b/src/tomahawk/sourcetree/SourceTreeView.cpp index d114e7a62..ee0fe7000 100644 --- a/src/tomahawk/sourcetree/SourceTreeView.cpp +++ b/src/tomahawk/sourcetree/SourceTreeView.cpp @@ -874,6 +874,18 @@ SourceTreeView::dropEvent( QDropEvent* event ) const QPoint pos = event->pos(); const QModelIndex index = indexAt( pos ); + // Need to fake the dropevent because the treeview would reject it if it is outside the item (on the tree) + if ( pos.x() < 96 ) + { + event->ignore(); + + QDropEvent* newEvent = new QDropEvent( pos + QPoint( 96, 0 ), event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers(), event->type() ); + QTreeView::dropEvent( newEvent ); + delete newEvent; + + return; + } + // if it's a playlist drop, accept it anywhere in the sourcetree by manually parsing it. if ( DropJob::isDropType( DropJob::Playlist, event->mimeData() ) ) { @@ -883,19 +895,13 @@ SourceTreeView::dropEvent( QDropEvent* event ) dropThis->parseMimeData( event->mimeData() ); // Don't add it to the playlist under drop, it's a new playlist now + event->acceptProposedAction(); return; } - // Need to fake the dropevent because the treeview would reject it if it is outside the item (on the tree) - if ( pos.x() < 100 ) + if ( model()->dropMimeData( event->mimeData(), event->proposedAction(), index.row(), 0, index.parent() ) ) { - QDropEvent* newEvent = new QDropEvent( pos + QPoint( 100, 0 ), event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers(), event->type() ); - QTreeView::dropEvent( newEvent ); - delete newEvent; - } - else - { - QTreeView::dropEvent( event ); + event->acceptProposedAction(); } m_dragging = false; diff --git a/src/tomahawk/sourcetree/SourcesModel.cpp b/src/tomahawk/sourcetree/SourcesModel.cpp index 05a8616b6..05ee67163 100644 --- a/src/tomahawk/sourcetree/SourcesModel.cpp +++ b/src/tomahawk/sourcetree/SourcesModel.cpp @@ -254,17 +254,17 @@ bool SourcesModel::dropMimeData( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ) { SourceTreeItem* item = 0; -// qDebug() << "Got mime data dropped:" << row << column << parent << itemFromIndex( parent )->text(); + if ( row == -1 && column == -1 ) item = itemFromIndex( parent ); - else if ( column == 0 ) - item = itemFromIndex( index( row, column, parent ) ); - else if ( column == -1 ) // column is -1, that means the drop is happening "below" the indices. that means we actually want the one before it - item = itemFromIndex( index( row - 1, 0, parent ) ); + else + item = itemFromIndex( index( row, column > 0 ? column : 0, parent ) ); Q_ASSERT( item ); + if ( !item ) + return false; -// qDebug() << "Dropping on:" << item->text(); +// tDebug() << "Dropping on:" << item->text() << row << column; return item->dropMimeData( data, action ); }