diff --git a/api/logic/minecraft/SimpleModList.cpp b/api/logic/minecraft/SimpleModList.cpp index 298328e4..d4242989 100644 --- a/api/logic/minecraft/SimpleModList.cpp +++ b/api/logic/minecraft/SimpleModList.cpp @@ -21,6 +21,7 @@ #include #include #include +#include SimpleModList::SimpleModList(const QString &dir) : QAbstractListModel(), m_dir(dir) { @@ -313,8 +314,7 @@ Qt::ItemFlags SimpleModList::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); if (index.isValid()) - return Qt::ItemIsUserCheckable | Qt::ItemIsDropEnabled | - defaultFlags; + return Qt::ItemIsUserCheckable | Qt::ItemIsDropEnabled | Qt::ItemIsDragEnabled | defaultFlags; else return Qt::ItemIsDropEnabled | defaultFlags; } @@ -325,6 +325,11 @@ Qt::DropActions SimpleModList::supportedDropActions() const return Qt::CopyAction | Qt::MoveAction; } +Qt::DropActions SimpleModList::supportedDragActions() const +{ + return Qt::CopyAction | Qt::MoveAction; +} + QStringList SimpleModList::mimeTypes() const { QStringList types; @@ -332,6 +337,7 @@ QStringList SimpleModList::mimeTypes() const return types; } + bool SimpleModList::dropMimeData(const QMimeData* data, Qt::DropAction action, int, int, const QModelIndex&) { if (action == Qt::IgnoreAction) @@ -363,3 +369,22 @@ bool SimpleModList::dropMimeData(const QMimeData* data, Qt::DropAction action, i } return false; } + +QMimeData *SimpleModList::mimeData(const QModelIndexList &indexes) const +{ + auto *mimeData = new QMimeData(); + QByteArray encodedData; + + QDataStream stream(&encodedData, QIODevice::WriteOnly); + for(const auto &index : indexes) + { + if(index.isValid()) + { + auto mod = mods[index.row()]; + stream << "file://" << mod.filename().absoluteFilePath() << "\n"; + } + } + + mimeData->setData("text/uri-list", encodedData); + return mimeData; +} \ No newline at end of file diff --git a/api/logic/minecraft/SimpleModList.h b/api/logic/minecraft/SimpleModList.h index 72973b6d..342dff38 100644 --- a/api/logic/minecraft/SimpleModList.h +++ b/api/logic/minecraft/SimpleModList.h @@ -49,11 +49,13 @@ public: virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; Qt::DropActions supportedDropActions() const override; + Qt::DropActions supportedDragActions() const override; /// flags, mostly to support drag&drop virtual Qt::ItemFlags flags(const QModelIndex &index) const override; QStringList mimeTypes() const override; bool dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent) override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; virtual int rowCount(const QModelIndex &) const override { diff --git a/application/widgets/ModListView.cpp b/application/widgets/ModListView.cpp index 99972a40..9054f974 100644 --- a/application/widgets/ModListView.cpp +++ b/application/widgets/ModListView.cpp @@ -35,8 +35,10 @@ ModListView::ModListView ( QWidget* parent ) setHorizontalScrollBarPolicy ( Qt::ScrollBarAsNeeded ); setDropIndicatorShown(true); setDragEnabled(true); - setDragDropMode(QAbstractItemView::DropOnly); + setDragDropMode(QAbstractItemView::DragDrop); viewport()->setAcceptDrops(true); + setAcceptDrops(true); + setDefaultDropAction(Qt::CopyAction); } void ModListView::setModel ( QAbstractItemModel* model ) @@ -64,3 +66,18 @@ void ModListView::setModel ( QAbstractItemModel* model ) head->setSectionResizeMode(i, QHeaderView::ResizeToContents); } } + +void ModListView::dragEnterEvent(QDragEnterEvent *event) +{ + event->accept(); +} + +void ModListView::dragMoveEvent(QDragMoveEvent *event) +{ + event->accept(); +} + +void ModListView::dropEvent(QDropEvent *event) +{ + QAbstractItemView::dropEvent(event); +} diff --git a/application/widgets/ModListView.h b/application/widgets/ModListView.h index 189131c5..a6a3ed1f 100644 --- a/application/widgets/ModListView.h +++ b/application/widgets/ModListView.h @@ -22,6 +22,10 @@ class ModListView: public QTreeView { Q_OBJECT public: - explicit ModListView ( QWidget* parent = 0 ); - virtual void setModel ( QAbstractItemModel* model ); + explicit ModListView ( QWidget* parent = nullptr ); + void setModel ( QAbstractItemModel* model ) override; + + void dragEnterEvent(QDragEnterEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; + void dropEvent(QDropEvent *event) override; };