diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2014-09-17 18:08:51 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2014-10-31 14:06:25 +0100 |
commit | ee17adebd23528e541e76d1f422b6ce498ab83bb (patch) | |
tree | feed18525f98fd05fd186a5a91b1b09df3ed58b8 /src/widgets/itemviews | |
parent | 0678d7c43c1658d2d2ec984be5844054031649a2 (diff) |
Implement QTableWidget/QListWidget::mimeData()
For some reasons lost in history, those methods simply ignore
the list of items passed to them, and always return NULL.
Of course, that's totally broken. Fix that by doing the same thing
that the respective (hidden) models did when calling mimeData().
Surprisingly enough, QTreeWidget has a proper implementation.
Task-number: QTBUG-25900
Change-Id: I99ca7b4d4f87f096fd9ff0b0cb4e58282aa9c26e
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/qlistwidget.cpp | 19 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget_p.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 19 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget_p.h | 2 |
4 files changed, 38 insertions, 4 deletions
diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 51561ac23b..aae75e5651 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -1783,9 +1783,24 @@ QStringList QListWidget::mimeTypes() const If the list of items is empty, 0 is returned instead of a serialized empty list. */ -QMimeData *QListWidget::mimeData(const QList<QListWidgetItem*>) const +QMimeData *QListWidget::mimeData(const QList<QListWidgetItem*> items) const { - return d_func()->listModel()->internalMimeData(); + Q_D(const QListWidget); + + QModelIndexList &cachedIndexes = d->listModel()->cachedIndexes; + + // if non empty, it's called from the model's own mimeData + if (cachedIndexes.isEmpty()) { + foreach (QListWidgetItem *item, items) + cachedIndexes << indexFromItem(item); + + QMimeData *result = d->listModel()->internalMimeData(); + + cachedIndexes.clear(); + return result; + } + + return d->listModel()->internalMimeData(); } #ifndef QT_NO_DRAGANDDROP diff --git a/src/widgets/itemviews/qlistwidget_p.h b/src/widgets/itemviews/qlistwidget_p.h index b019cd5eaf..1f2e9e8819 100644 --- a/src/widgets/itemviews/qlistwidget_p.h +++ b/src/widgets/itemviews/qlistwidget_p.h @@ -72,6 +72,8 @@ public: class Q_AUTOTEST_EXPORT QListModel : public QAbstractListModel { Q_OBJECT + friend class QListWidget; + public: QListModel(QListWidget *parent); ~QListModel(); diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 7c24819c0e..eb239f8025 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -2553,9 +2553,24 @@ QStringList QTableWidget::mimeTypes() const If the list of items is empty, 0 is returned rather than a serialized empty list. */ -QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*>) const +QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*> items) const { - return d_func()->tableModel()->internalMimeData(); + Q_D(const QTableWidget); + + QModelIndexList &cachedIndexes = d->tableModel()->cachedIndexes; + + // if non empty, it's called from the model's own mimeData + if (cachedIndexes.isEmpty()) { + foreach (QTableWidgetItem *item, items) + cachedIndexes << indexFromItem(item); + + QMimeData *result = d->tableModel()->internalMimeData(); + + cachedIndexes.clear(); + return result; + } + + return d->tableModel()->internalMimeData(); } /*! diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 50b5a66eb5..92a8f5f305 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -82,6 +82,8 @@ public: class QTableModel : public QAbstractTableModel { Q_OBJECT + friend class QTableWidget; + public: enum ItemFlagsExtension { ItemIsHeaderItem = 128 |