GH-575 Add back file drop support to ModList

This commit is contained in:
Petr Mrázek 2016-05-15 23:21:33 +02:00
parent 67b22c8105
commit 4440f68e59
2 changed files with 77 additions and 10 deletions

View File

@ -303,7 +303,73 @@ Qt::ItemFlags ModList::flags(const QModelIndex &index) const
{ {
Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index); Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index);
if (index.isValid()) if (index.isValid())
return Qt::ItemIsUserCheckable | defaultFlags; return Qt::ItemIsUserCheckable | Qt::ItemIsDropEnabled |
defaultFlags;
else 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;
} }

View File

@ -44,21 +44,22 @@ public:
}; };
ModList(const QString &dir); ModList(const QString &dir);
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
virtual bool setData(const QModelIndex &index, const QVariant &value, virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
int role = Qt::EditRole); Qt::DropActions supportedDropActions() const override;
/// flags, mostly to support drag&drop /// 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(); return size();
} }
; ;
virtual QVariant headerData(int section, Qt::Orientation orientation, virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
int role = Qt::DisplayRole) const; virtual int columnCount(const QModelIndex &parent) const override;
virtual int columnCount(const QModelIndex &parent) const;
size_t size() const size_t size() const
{ {