#include "DraggableListModel.h" #include "../dictionary/CardPack.h" #include "../dictionary/Field.h" #include Qt::ItemFlags DraggableListModel::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); if (index.isValid()) return Qt::ItemIsDragEnabled | defaultFlags; else return Qt::ItemIsDropEnabled | defaultFlags; } Qt::DropActions DraggableListModel::supportedDropActions() const { return Qt::MoveAction; } QStringList DraggableListModel::mimeTypes() const { QStringList types; types << "application/octet-stream"; return types; } QMimeData *DraggableListModel::mimeData(const QModelIndexList &indexes) const { QStringList list; QModelIndexList validIndexes; foreach (QModelIndex index, indexes) if (index.isValid() && index.column() == 0) validIndexes << index; qSort(validIndexes); int num = validIndexes.size(); QByteArray encodedData; QDataStream stream( &encodedData, QIODevice::WriteOnly ); const void** ptrs = new const void*[num]; int i=0; foreach (QModelIndex index, validIndexes) ptrs[i++] = dataPtr( index ); stream.writeBytes( (char*)ptrs, num*sizeof(void*) ); delete ptrs; QMimeData *mimeData = new QMimeData(); mimeData->setData( "application/octet-stream", encodedData ); return mimeData; } bool DraggableListModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int /*column*/, const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; if (!data->hasFormat("application/octet-stream")) return false; int beginRow; if (row != -1) beginRow = row; else if (parent.isValid()) beginRow = parent.row(); else beginRow = rowCount(QModelIndex()); QByteArray encodedData = data->data("application/octet-stream"); QDataStream stream( &encodedData, QIODevice::ReadOnly ); void** ptrs = new void*[ rowCount() ]; uint num; stream.readBytes( (char*&)ptrs, num ); //TODO: Avoid converting pointer to other types num /= sizeof(void*); QList movedIndexes; for(uint i=0; i