diff --git a/api/logic/minecraft/ModList.cpp b/api/logic/minecraft/ModList.cpp index ca606de3..36371ee3 100644 --- a/api/logic/minecraft/ModList.cpp +++ b/api/logic/minecraft/ModList.cpp @@ -303,7 +303,73 @@ Qt::ItemFlags ModList::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); if (index.isValid()) - return Qt::ItemIsUserCheckable | defaultFlags; + return Qt::ItemIsUserCheckable | Qt::ItemIsDropEnabled | + defaultFlags; else - return defaultFlags; + return Qt::ItemIsDropEnabled | defaultFlags; +} + +Qt::DropActions ModList::supportedDropActions() const +{ + // copy from outside, move from within and other mod lists + return Qt::CopyAction | Qt::MoveAction; +} + +QStringList ModList::mimeTypes() const +{ + QStringList types; + types << "text/uri-list"; + return types; +} + +bool ModList::dropMimeData(const QMimeData* data, Qt::DropAction action, int, int, const QModelIndex&) +{ + if (action == Qt::IgnoreAction) + { + return true; + } + + // check if the action is supported + if (!data || !(action & supportedDropActions())) + { + return false; + } + + // files dropped from outside? + if (data->hasUrls()) + { + bool was_watching = is_watching; + bool added = false; + if (was_watching) + { + stopWatching(); + } + auto urls = data->urls(); + for (auto url : urls) + { + // only local files may be dropped... + if (!url.isLocalFile()) + { + continue; + } + // TODO: implement not only copy, but also move + if (installMod(url.toLocalFile())) + { + added = true; + } + } + if(added) + { + // re-sort the list + beginResetModel(); + internalSort(mods); + endResetModel(); + } + if (was_watching) + { + startWatching(); + } + return true; + } + return false; } diff --git a/api/logic/minecraft/ModList.h b/api/logic/minecraft/ModList.h index 5e7740bd..1a42c8f8 100644 --- a/api/logic/minecraft/ModList.h +++ b/api/logic/minecraft/ModList.h @@ -44,21 +44,22 @@ public: }; ModList(const QString &dir); - virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - virtual bool setData(const QModelIndex &index, const QVariant &value, - int role = Qt::EditRole); + 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; /// flags, mostly to support drag&drop - virtual Qt::ItemFlags flags(const QModelIndex &index) const; + 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; - virtual int rowCount(const QModelIndex &) const + virtual int rowCount(const QModelIndex &) const override { return size(); } ; - virtual QVariant headerData(int section, Qt::Orientation orientation, - int role = Qt::DisplayRole) const; - virtual int columnCount(const QModelIndex &parent) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + virtual int columnCount(const QModelIndex &parent) const override; size_t size() const {