summaryrefslogtreecommitdiffstats
path: root/api/logic/minecraft/ModList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'api/logic/minecraft/ModList.cpp')
-rw-r--r--api/logic/minecraft/ModList.cpp70
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;
}