Add the QAbstractItemModel::canDropMimeData method.

Can be used by views to indicate whether a drop is allowed (eg
adequete permissions in a filesystem model).

Change-Id: Iefedb5399e44c8edc5f5df1403c8d5c0da618612
Reviewed-by: Peter Penz <peter.penz19@gmail.com>
Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
This commit is contained in:
Stephen Kelly 2012-01-24 17:29:20 +01:00 committed by Qt by Nokia
parent 3fe3d1dfdd
commit be1867b6c4
3 changed files with 52 additions and 1 deletions

View File

@ -1752,6 +1752,23 @@ QMimeData *QAbstractItemModel::mimeData(const QModelIndexList &indexes) const
return data; return data;
} }
/*!
Returns whether a model can accept a drop of data.
This can be used to indicate whether a drop of certain data is allowed, for example
by using a 'forbidden' emblem on a mouse cursor during a drag operation.
This method returns true by default.
\sa dropMimeData(), {Using drag and drop with item views}
*/
bool QAbstractItemModel::canDropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column,
const QModelIndex &parent) const
{
return true;
}
/*! /*!
Handles the \a data supplied by a drag and drop operation that ended with Handles the \a data supplied by a drag and drop operation that ended with
the given \a action. the given \a action.
@ -1773,7 +1790,7 @@ QMimeData *QAbstractItemModel::mimeData(const QModelIndexList &indexes) const
greater than or equal zero, it means that the drop occurred just before the greater than or equal zero, it means that the drop occurred just before the
specified \a row and \a column in the specified \a parent. specified \a row and \a column in the specified \a parent.
\sa supportedDropActions(), {Using drag and drop with item views} \sa supportedDropActions(), canDropMimeData(), {Using drag and drop with item views}
*/ */
bool QAbstractItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, bool QAbstractItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) int row, int column, const QModelIndex &parent)

View File

@ -193,6 +193,8 @@ public:
virtual QStringList mimeTypes() const; virtual QStringList mimeTypes() const;
virtual QMimeData *mimeData(const QModelIndexList &indexes) const; virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) const;
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent); int row, int column, const QModelIndex &parent);
virtual Qt::DropActions supportedDropActions() const; virtual Qt::DropActions supportedDropActions() const;

View File

@ -72,6 +72,7 @@ private slots:
void match(); void match();
void dropMimeData_data(); void dropMimeData_data();
void dropMimeData(); void dropMimeData();
void canDropMimeData();
void changePersistentIndex(); void changePersistentIndex();
void movePersistentIndex(); void movePersistentIndex();
@ -150,6 +151,9 @@ public:
const QModelIndex &destinationParent, int destinationChild); const QModelIndex &destinationParent, int destinationChild);
void reset(); void reset();
bool canDropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) const;
int cCount, rCount; int cCount, rCount;
mutable bool wrongIndex; mutable bool wrongIndex;
QVector<QVector<QString> > table; QVector<QVector<QString> > table;
@ -315,6 +319,25 @@ void QtTestModel::reset()
QAbstractItemModel::reset(); QAbstractItemModel::reset();
} }
bool QtTestModel::canDropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) const
{
Q_UNUSED(data);
Q_UNUSED(action);
// For testing purposes, we impose some arbitrary rules on what may be dropped.
if (!parent.isValid() && row < 0 && column < 0) {
// a drop in emtpy space in the view is allowed.
// For example, in a filesystem view, a file may be dropped into empty space
// if it represents a writable directory.
return true;
}
// We then arbitrarily decide to only allow drops on odd rows.
// A filesystem view/model might be able to drop onto (writable) directories.
return row % 2 == 0;
}
/** /**
* The source Model *must* be initialized before the _data function, since the _data function uses QModelIndexes to reference the items in the tables. * The source Model *must* be initialized before the _data function, since the _data function uses QModelIndexes to reference the items in the tables.
* Therefore, we must initialize it globally. * Therefore, we must initialize it globally.
@ -755,6 +778,15 @@ void tst_QAbstractItemModel::dropMimeData()
} }
} }
void tst_QAbstractItemModel::canDropMimeData()
{
QtTestModel model(3, 3);
QVERIFY(model.canDropMimeData(0, Qt::CopyAction, -1, -1, QModelIndex()));
QVERIFY(model.canDropMimeData(0, Qt::CopyAction, 0, 0, QModelIndex()));
QVERIFY(!model.canDropMimeData(0, Qt::CopyAction, 1, 0, QModelIndex()));
}
void tst_QAbstractItemModel::changePersistentIndex() void tst_QAbstractItemModel::changePersistentIndex()
{ {
QtTestModel model(3, 3); QtTestModel model(3, 3);