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;
}
/*!
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
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
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,
int row, int column, const QModelIndex &parent)

View File

@ -193,6 +193,8 @@ public:
virtual QStringList mimeTypes() 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,
int row, int column, const QModelIndex &parent);
virtual Qt::DropActions supportedDropActions() const;

View File

@ -72,6 +72,7 @@ private slots:
void match();
void dropMimeData_data();
void dropMimeData();
void canDropMimeData();
void changePersistentIndex();
void movePersistentIndex();
@ -150,6 +151,9 @@ public:
const QModelIndex &destinationParent, int destinationChild);
void reset();
bool canDropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent) const;
int cCount, rCount;
mutable bool wrongIndex;
QVector<QVector<QString> > table;
@ -315,6 +319,25 @@ void QtTestModel::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.
* 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()
{
QtTestModel model(3, 3);