diff options
author | Petr Mrázek <peterix@gmail.com> | 2016-05-15 23:21:33 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2016-05-15 23:27:06 +0200 |
commit | 4440f68e59fa5535e6fb3b6d49fa578beecc091f (patch) | |
tree | cb7494e338702b260d5e5d152f5ab7b886afff12 /api/logic/minecraft/ModList.cpp | |
parent | 67b22c8105f872582279274593bed431b3dd6510 (diff) | |
download | MultiMC-4440f68e59fa5535e6fb3b6d49fa578beecc091f.tar MultiMC-4440f68e59fa5535e6fb3b6d49fa578beecc091f.tar.gz MultiMC-4440f68e59fa5535e6fb3b6d49fa578beecc091f.tar.lz MultiMC-4440f68e59fa5535e6fb3b6d49fa578beecc091f.tar.xz MultiMC-4440f68e59fa5535e6fb3b6d49fa578beecc091f.zip |
GH-575 Add back file drop support to ModList
Diffstat (limited to 'api/logic/minecraft/ModList.cpp')
-rw-r--r-- | api/logic/minecraft/ModList.cpp | 70 |
1 files changed, 68 insertions, 2 deletions
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; } |