]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Interface cleanups for drag and drop support
authorPeter Penz <peter.penz19@gmail.com>
Wed, 24 Aug 2011 16:11:55 +0000 (18:11 +0200)
committerPeter Penz <peter.penz19@gmail.com>
Wed, 24 Aug 2011 16:12:52 +0000 (18:12 +0200)
src/kitemviews/kfileitemlistview.cpp
src/kitemviews/kfileitemlistview.h
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/kitemlistcontroller.cpp
src/kitemviews/kitemlistcontroller.h
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h
src/kitemviews/kitemmodelbase.cpp
src/kitemviews/kitemmodelbase.h

index a7217d30c344cf1ab968bccd076109d13ca788a7..d9742945a18c03bfb47304388297f35f15616f99 100644 (file)
@@ -27,6 +27,7 @@
 #include <KStringHandler>
 
 #include <KDebug>
+#include <KIcon>
 
 #include <QTextLine>
 #include <QTimer>
@@ -46,6 +47,8 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) :
     m_updateIconSizeTimer(0),
     m_minimumRolesWidths()
 {
+    setAcceptDrops(true);
+
     setScrollOrientation(Qt::Vertical);
     setWidgetCreator(new KItemListWidgetCreator<KFileItemListWidget>());
     setGroupHeaderCreator(new KItemListGroupHeaderCreator<KItemListGroupHeader>());
@@ -204,6 +207,26 @@ QHash<QByteArray, QSizeF> KFileItemListView::visibleRoleSizes() const
     return sizes;
 }
 
+QPixmap KFileItemListView::createDragPixmap(const QSet<int>& indexes) const
+{
+    QPixmap pixmap;
+
+    if (model()) {
+        QSetIterator<int> it(indexes);
+        while (it.hasNext()) {
+            const int index = it.next();
+            // TODO: Only one item is considered currently
+            pixmap = model()->data(index).value("iconPixmap").value<QPixmap>();
+            if (pixmap.isNull()) {
+                KIcon icon(model()->data(index).value("iconName").toString());
+                pixmap = icon.pixmap(itemSize().toSize());
+            }
+        }
+    }
+
+    return pixmap;
+}
+
 void KFileItemListView::initializeItemListWidget(KItemListWidget* item)
 {
     KFileItemListWidget* fileItemListWidget = static_cast<KFileItemListWidget*>(item);
index acd03ed22240f42ae60cebb555ee6607ed2ffdca..4f7e84e2908aa2fdf5c93144eec8779923ea76a2 100644 (file)
@@ -48,9 +48,15 @@ public:
     void setItemLayout(Layout layout);
     Layout itemLayout() const;
 
+    /** @reimp */
     virtual QSizeF itemSizeHint(int index) const;
+
+    /** @reimp */
     virtual QHash<QByteArray, QSizeF> visibleRoleSizes() const;
 
+    /** @reimp */
+    virtual QPixmap createDragPixmap(const QSet<int>& indexes) const;
+
 protected:
     virtual void initializeItemListWidget(KItemListWidget* item);
     virtual void onModelChanged(KItemModelBase* current, KItemModelBase* previous);
index c54a982f6fc6eb3b00e8be5a643364d5c2d35746..5e3269799a8e46197cad8e6cdc92f8476c170dad 100644 (file)
@@ -24,6 +24,7 @@
 #include <KStringHandler>
 #include <KDebug>
 
+#include <QMimeData>
 #include <QTimer>
 
 #define KFILEITEMMODEL_DEBUG
@@ -132,6 +133,27 @@ bool KFileItemModel::supportsSorting() const
     return true;
 }
 
+QMimeData* KFileItemModel::createMimeData(const QSet<int>& indexes) const
+{
+    QMimeData* data = new QMimeData();
+
+    KUrl::List urls;
+    urls.reserve(indexes.count());
+
+    QSetIterator<int> it(indexes);
+    while (it.hasNext()) {
+        const int index = it.next();
+        const KUrl url = fileItem(index).url();
+        if (url.isValid() && !url.isEmpty()) {
+            urls.append(url);
+        }
+    }
+
+    urls.populateMimeData(data);
+
+    return data;
+}
+
 KFileItem KFileItemModel::fileItem(int index) const
 {
     if (index >= 0 && index < count()) {
index e6c89d74452be8e1b823633791d416f496583555..654c7dbeb70d1f877c4fefc894c75c958c963fc5 100644 (file)
@@ -66,6 +66,9 @@ public:
      */
     virtual bool supportsSorting() const;
 
+    /** @reimp */
+    virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
+
     /**
      * @return The file-item for the index \a index. If the index is in a valid
      *         range it is assured that the file-item is not null. The runtime
index 15aab28d50ec3cdcf8ef307a60699d0d954b8c14..c3f3b36f42d30cafb7ba2f913ad327000f868e6e 100644 (file)
 #include "kitemlistrubberband_p.h"
 #include "kitemlistselectionmanager.h"
 
-// TODO: Remove after moving mimeData() and createDropPixmap() into
-// KFileItemModel/KFileItemListView
-#include "kfileitemmodel.h"
-#include <KIcon>
-
 #include <QApplication>
 #include <QDrag>
 #include <QEvent>
@@ -661,70 +656,26 @@ void KItemListController::slotRubberBandChanged()
     m_selectionManager->setSelectedItems(selectedItems + m_oldSelection);
 }
 
-QPixmap KItemListController::createDragPixmap(const QSet<int>& indexes) const
-{
-    if (!m_model || !m_view) {
-        return QPixmap();
-    }
-
-    // TODO: The current hack assumes a property "iconPixmap" in the model. The method
-    // will get an interface of KFileItemList later.
-    QSetIterator<int> it(indexes);
-    while (it.hasNext()) {
-        const int index = it.next();
-        // TODO: Only one item is considered currently
-        QPixmap pixmap = m_model->data(index).value("iconPixmap").value<QPixmap>();
-        if (pixmap.isNull()) {
-            KIcon icon(m_model->data(index).value("iconName").toString());
-            const QSizeF size = m_view->itemSize();
-            pixmap = icon.pixmap(size.toSize());
-        }
-        return pixmap;
-    }
-
-    return QPixmap();
-}
-
-QMimeData* KItemListController::createMimeData(const QSet<int>& indexes) const
+void KItemListController::startDragging()
 {
-    if (!m_model) {
-        return 0;
+    if (!m_view || !m_model) {
+        return;
     }
 
-    QMimeData* data = new QMimeData();
-
-    // TODO: Check KDirModel::mimeData() for a good reference implementation
-    KUrl::List urls;
-    QSetIterator<int> it(indexes);
-    while (it.hasNext()) {
-        const int index = it.next();
-        // TODO: Big hack to use KFileItemModel here. Remove after moving mimeData()
-        // into KFileItemModel.
-        KFileItemModel* model = qobject_cast<KFileItemModel*>(m_model);
-        Q_ASSERT(model);
-        const KUrl url = model->fileItem(index).url();
-        urls.append(url);
+    const QSet<int> selectedItems = m_selectionManager->selectedItems();
+    QMimeData* data = m_model->createMimeData(selectedItems);
+    if (!data) {
+        return;
     }
 
-    urls.populateMimeData(data);
-
-    return data;
-}
-
-void KItemListController::startDragging()
-{
     // The created drag object will be owned and deleted
     // by QApplication::activeWindow().
     QDrag* drag = new QDrag(QApplication::activeWindow());
+    drag->setMimeData(data);
 
-    const QSet<int> selectedItems = m_selectionManager->selectedItems();
-
-    const QPixmap pixmap = createDragPixmap(selectedItems);
+    const QPixmap pixmap = m_view->createDragPixmap(selectedItems);
     drag->setPixmap(pixmap);
 
-    QMimeData* data = createMimeData(selectedItems);
-    drag->setMimeData(data);
-
     drag->exec(Qt::MoveAction | Qt::CopyAction | Qt::LinkAction, Qt::IgnoreAction);
 }
 
index b56087ce12d00d1129455c909315cbb4ca9891f7..01d1b94081638d969ada51100fb8ac00e49da85e 100644 (file)
@@ -133,19 +133,6 @@ private slots:
     void slotRubberBandChanged();
 
 private:
-    /**
-     * @return Pixmap that is used for a drag operation based on the
-     *         items given by \a indexes.
-     * TODO: Will be moved to KItemListView later
-     */
-    QPixmap createDragPixmap(const QSet<int>& indexes) const;
-
-    /**
-     * @return MIME-data for the items given by \a indexes.
-     * TODO: Will be moved to KItemListView or KItemModelBase/KFileItemModel later.
-     */
-    QMimeData* createMimeData(const QSet<int>& indexes) const;
-
     /**
      * Creates a QDrag object to start a drag-operation.
      */
index 4bf7159d66f5fe120fb692f28340a0052b458960..3435e3f6531bda7d8b5fadf36c49c54e52494c7f 100644 (file)
@@ -66,7 +66,6 @@ KItemListView::KItemListView(QGraphicsWidget* parent) :
     m_mousePos()
 {
     setAcceptHoverEvents(true);
-    setAcceptDrops(true);
 
     m_sizeHintResolver = new KItemListSizeHintResolver(this);
 
@@ -359,6 +358,12 @@ bool KItemListView::isTransactionActive() const
     return m_activeTransactions > 0;
 }
 
+QPixmap KItemListView::createDragPixmap(const QSet<int>& indexes) const
+{
+    Q_UNUSED(indexes);
+    return QPixmap();
+}
+
 void KItemListView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
 {
     QGraphicsWidget::paint(painter, option, widget);
index 2a07dbb230fc641e4d84172fc3c4e7c76db91e11..344221e40135850a5d09c542cfa573b1c69ccd45 100644 (file)
@@ -155,10 +155,17 @@ public:
     void endTransaction();
     bool isTransactionActive() const;
 
+    /**
+     * @return Pixmap that is used for a drag operation based on the
+     *         items given by \a indexes. The default implementation returns
+     *         a null-pixmap.
+     */
+    virtual QPixmap createDragPixmap(const QSet<int>& indexes) const;
+
     /**
      * @reimp
      */
-   virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
+    virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 
 signals:
     void offsetChanged(qreal current, qreal previous);
index 2b9623d89bcf64cb9e8d22ce997be570c684fe18..fc604e729f9bb54f72ec89f73971f7d0879fe6fd 100644 (file)
@@ -103,6 +103,12 @@ QString KItemModelBase::roleDescription(const QByteArray& role) const
     return role;
 }
 
+QMimeData* KItemModelBase::createMimeData(const QSet<int>& indexes) const
+{
+    Q_UNUSED(indexes);
+    return 0;
+}
+
 void KItemModelBase::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous)
 {
     Q_UNUSED(current);
index 08f723ced7cdac22f36c49ffbcc715a00ee042aa..4670469590c05000558b798bac29af0eb08cdbb2 100644 (file)
@@ -30,6 +30,8 @@
 #include <QSet>
 #include <QVariant>
 
+class QMimeData;
+
 struct KItemRange
 {
     KItemRange(int index, int count);
@@ -107,6 +109,13 @@ public:
 
     virtual QString roleDescription(const QByteArray& role) const;
 
+    /**
+     * @return MIME-data for the items given by \a indexes. The default implementation
+     *         returns 0. The ownership of the returned instance is in the hand of the
+     *         caller of this method.
+     */
+    virtual QMimeData* createMimeData(const QSet<int>& indexes) const;
+
 signals:
     /**
      * Is emitted if one or more items have been inserted. Each item-range consists