From: Peter Penz Date: Wed, 24 Aug 2011 16:11:55 +0000 (+0200) Subject: Interface cleanups for drag and drop support X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/84010807786c352aaeb2320caf27e5f9048d8dec Interface cleanups for drag and drop support --- diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index a7217d30c..d9742945a 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -46,6 +47,8 @@ KFileItemListView::KFileItemListView(QGraphicsWidget* parent) : m_updateIconSizeTimer(0), m_minimumRolesWidths() { + setAcceptDrops(true); + setScrollOrientation(Qt::Vertical); setWidgetCreator(new KItemListWidgetCreator()); setGroupHeaderCreator(new KItemListGroupHeaderCreator()); @@ -204,6 +207,26 @@ QHash KFileItemListView::visibleRoleSizes() const return sizes; } +QPixmap KFileItemListView::createDragPixmap(const QSet& indexes) const +{ + QPixmap pixmap; + + if (model()) { + QSetIterator it(indexes); + while (it.hasNext()) { + const int index = it.next(); + // TODO: Only one item is considered currently + pixmap = model()->data(index).value("iconPixmap").value(); + 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(item); diff --git a/src/kitemviews/kfileitemlistview.h b/src/kitemviews/kfileitemlistview.h index acd03ed22..4f7e84e29 100644 --- a/src/kitemviews/kfileitemlistview.h +++ b/src/kitemviews/kfileitemlistview.h @@ -48,9 +48,15 @@ public: void setItemLayout(Layout layout); Layout itemLayout() const; + /** @reimp */ virtual QSizeF itemSizeHint(int index) const; + + /** @reimp */ virtual QHash visibleRoleSizes() const; + /** @reimp */ + virtual QPixmap createDragPixmap(const QSet& indexes) const; + protected: virtual void initializeItemListWidget(KItemListWidget* item); virtual void onModelChanged(KItemModelBase* current, KItemModelBase* previous); diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index c54a982f6..5e3269799 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #define KFILEITEMMODEL_DEBUG @@ -132,6 +133,27 @@ bool KFileItemModel::supportsSorting() const return true; } +QMimeData* KFileItemModel::createMimeData(const QSet& indexes) const +{ + QMimeData* data = new QMimeData(); + + KUrl::List urls; + urls.reserve(indexes.count()); + + QSetIterator 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()) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index e6c89d744..654c7dbeb 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -66,6 +66,9 @@ public: */ virtual bool supportsSorting() const; + /** @reimp */ + virtual QMimeData* createMimeData(const QSet& 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 diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 15aab28d5..c3f3b36f4 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -26,11 +26,6 @@ #include "kitemlistrubberband_p.h" #include "kitemlistselectionmanager.h" -// TODO: Remove after moving mimeData() and createDropPixmap() into -// KFileItemModel/KFileItemListView -#include "kfileitemmodel.h" -#include - #include #include #include @@ -661,70 +656,26 @@ void KItemListController::slotRubberBandChanged() m_selectionManager->setSelectedItems(selectedItems + m_oldSelection); } -QPixmap KItemListController::createDragPixmap(const QSet& 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 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(); - 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& 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 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(m_model); - Q_ASSERT(model); - const KUrl url = model->fileItem(index).url(); - urls.append(url); + const QSet 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 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); } diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index b56087ce1..01d1b9408 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -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& 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& indexes) const; - /** * Creates a QDrag object to start a drag-operation. */ diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 4bf7159d6..3435e3f65 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -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& indexes) const +{ + Q_UNUSED(indexes); + return QPixmap(); +} + void KItemListView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { QGraphicsWidget::paint(painter, option, widget); diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 2a07dbb23..344221e40 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -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& 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); diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp index 2b9623d89..fc604e729 100644 --- a/src/kitemviews/kitemmodelbase.cpp +++ b/src/kitemviews/kitemmodelbase.cpp @@ -103,6 +103,12 @@ QString KItemModelBase::roleDescription(const QByteArray& role) const return role; } +QMimeData* KItemModelBase::createMimeData(const QSet& indexes) const +{ + Q_UNUSED(indexes); + return 0; +} + void KItemModelBase::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous) { Q_UNUSED(current); diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h index 08f723ced..467046959 100644 --- a/src/kitemviews/kitemmodelbase.h +++ b/src/kitemviews/kitemmodelbase.h @@ -30,6 +30,8 @@ #include #include +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& indexes) const; + signals: /** * Is emitted if one or more items have been inserted. Each item-range consists