]> git.sesse.net Git - vlc/commitdiff
Qt: use Qt::DropAction properly throughout playlist drag-and-drop
authorJakob Leben <jleben@videolan.org>
Wed, 10 Mar 2010 17:31:24 +0000 (18:31 +0100)
committerJakob Leben <jleben@videolan.org>
Wed, 10 Mar 2010 17:34:28 +0000 (18:34 +0100)
modules/gui/qt4/components/playlist/icon_view.cpp
modules/gui/qt4/components/playlist/icon_view.hpp
modules/gui/qt4/components/playlist/playlist_model.cpp
modules/gui/qt4/components/playlist/selector.cpp
modules/gui/qt4/components/playlist/selector.hpp

index 290300a41421755d17a87780e301a4f021a55fdf..c76c2d140de1be881cd48b4afff63d2d02668999 100644 (file)
@@ -33,6 +33,7 @@
 #include <QFontMetrics>
 #include <QPixmapCache>
 #include <QDrag>
+#include <QDragMoveEvent>
 
 #include "assert.h"
 
@@ -319,6 +320,14 @@ static void plViewStartDrag( QAbstractItemView *view, const Qt::DropActions & su
     drag->exec( supportedActions );
 }
 
+static void plViewDragMoveEvent( QAbstractItemView *view, QDragMoveEvent * event )
+{
+    if( event->keyboardModifiers() & Qt::ControlModifier &&
+        event->possibleActions() & Qt::CopyAction )
+        event->setDropAction( Qt::CopyAction );
+    else event->acceptProposedAction();
+}
+
 PlIconView::PlIconView( PLModel *model, QWidget *parent ) : QListView( parent )
 {
     PlIconViewItemDelegate *delegate = new PlIconViewItemDelegate( this );
@@ -344,6 +353,12 @@ void PlIconView::startDrag ( Qt::DropActions supportedActions )
     plViewStartDrag( this, supportedActions );
 }
 
+void PlIconView::dragMoveEvent ( QDragMoveEvent * event )
+{
+    plViewDragMoveEvent( this, event );
+    QAbstractItemView::dragMoveEvent( event );
+}
+
 PlListView::PlListView( PLModel *model, QWidget *parent ) : QListView( parent )
 {
     setModel( model );
@@ -364,8 +379,19 @@ void PlListView::startDrag ( Qt::DropActions supportedActions )
     plViewStartDrag( this, supportedActions );
 }
 
+void PlListView::dragMoveEvent ( QDragMoveEvent * event )
+{
+    plViewDragMoveEvent( this, event );
+    QAbstractItemView::dragMoveEvent( event );
+}
+
 void PlTreeView::startDrag ( Qt::DropActions supportedActions )
 {
     plViewStartDrag( this, supportedActions );
 }
 
+void PlTreeView::dragMoveEvent ( QDragMoveEvent * event )
+{
+    plViewDragMoveEvent( this, event );
+    QAbstractItemView::dragMoveEvent( event );
+}
index b5cc433afafba4f93e7c887d9e0464066aac0fe9..9f539990d05ceb2a63e894e1636cd56cc8154c2a 100644 (file)
@@ -70,6 +70,7 @@ public:
     PlIconView( PLModel *model, QWidget *parent = 0 );
 private:
     void startDrag ( Qt::DropActions supportedActions );
+    void dragMoveEvent ( QDragMoveEvent * event );
 };
 
 class PlListView : public QListView
@@ -80,6 +81,7 @@ public:
     PlListView( PLModel *model, QWidget *parent = 0 );
 private:
     void startDrag ( Qt::DropActions supportedActions );
+    void dragMoveEvent ( QDragMoveEvent * event );
 };
 
 class PlTreeView : public QTreeView
@@ -88,6 +90,7 @@ class PlTreeView : public QTreeView
 
 private:
     void startDrag ( Qt::DropActions supportedActions );
+    void dragMoveEvent ( QDragMoveEvent * event );
 };
 
 #endif
index 82b3178be6c8c118d073b9a3c3476055cf7395bf..c3c960e16f6e6315f9965d9bfe2a05fd5d671321 100644 (file)
@@ -108,7 +108,7 @@ PLModel::~PLModel()
 
 Qt::DropActions PLModel::supportedDropActions() const
 {
-    return Qt::CopyAction; /* Why not Qt::MoveAction */
+    return Qt::CopyAction | Qt::MoveAction;
 }
 
 Qt::ItemFlags PLModel::flags( const QModelIndex &index ) const
@@ -189,33 +189,13 @@ QMimeData *PLModel::mimeData( const QModelIndexList &indexes ) const
 bool PLModel::dropMimeData( const QMimeData *data, Qt::DropAction action,
                            int row, int column, const QModelIndex &parent )
 {
+    bool copy = action == Qt::CopyAction;
+    if( !copy && action != Qt::MoveAction )
+        return true;
+
     const PlMimeData *plMimeData = qobject_cast<const PlMimeData*>( data );
     if( plMimeData )
     {
-        if( action == Qt::IgnoreAction )
-            return true;
-
-        PL_LOCK;
-        playlist_item_t *p_parent =
-            playlist_ItemGetById( p_playlist, itemId( parent ) );
-        if( !p_parent || p_parent->i_children == -1 )
-        {
-            PL_UNLOCK;
-            return false;
-        }
-
-        bool copy = false;
-        playlist_item_t *p_pl = p_playlist->p_playing;
-        playlist_item_t *p_ml = p_playlist->p_media_library;
-        if
-        (
-            row == -1 && (
-            ( p_pl && p_parent == p_pl ) ||
-            ( p_ml && p_parent == p_ml ) )
-        )
-            copy = true;
-        PL_UNLOCK;
-
         if( copy )
             dropAppendCopy( plMimeData, getItem( parent ) );
         else
index 24bfa54cc4a14236b2595730ab0fe9c265e54edc..42e886e2421db24a17b08299fba437e789837e9c 100644 (file)
@@ -372,6 +372,12 @@ bool PLSelector::dropMimeData ( QTreeWidgetItem * parent, int index,
     return true;
 }
 
+void PLSelector::dragMoveEvent ( QDragMoveEvent * event )
+{
+    event->setDropAction( Qt::CopyAction );
+    QAbstractItemView::dragMoveEvent( event );
+}
+
 void PLSelector::plItemAdded( int item, int parent )
 {
     if( parent != podcastsParentId ) return;
index e9ea01741d61197c142e9acb76acab321c1bad0c..41d37b1305251cfe7efdd7c785c8200744ea57fe 100644 (file)
@@ -119,6 +119,7 @@ protected:
 private:
     QStringList mimeTypes () const;
     bool dropMimeData ( QTreeWidgetItem *, int, const QMimeData *, Qt::DropAction );
+    void dragMoveEvent ( QDragMoveEvent * event );
     void createItems();
     void drawBranches ( QPainter *, const QRect &, const QModelIndex & ) const;
     PLSelItem * addItem (