summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-12-30 19:11:48 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 15:38:17 +0100
commit89ff59da4613f06a05a633b4aa4387470831ce94 (patch)
tree2217435c5c5b575ab81013d9113d673e2409bb4a /src
parent313589cf10640ae06cd7873989b5840f7c476e50 (diff)
Add message for invalid drag. Split & clean code.
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/downloadlist.cpp3
-rw-r--r--src/modlist.cpp140
-rw-r--r--src/modlist.h93
-rw-r--r--src/modlistbypriorityproxy.cpp5
-rw-r--r--src/modlistdropinfo.cpp124
-rw-r--r--src/modlistdropinfo.h92
-rw-r--r--src/modlistsortproxy.cpp5
-rw-r--r--src/modlistview.cpp179
9 files changed, 335 insertions, 307 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0a913649..93b9e768 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -134,6 +134,7 @@ add_filter(NAME src/modinfo/dialog GROUPS
)
add_filter(NAME src/modlist GROUPS
modlist
+ modlistdropinfo
modlistsortproxy
modlistbypriorityproxy
modlistview
diff --git a/src/downloadlist.cpp b/src/downloadlist.cpp
index 78e5fd24..93f8538c 100644
--- a/src/downloadlist.cpp
+++ b/src/downloadlist.cpp
@@ -19,6 +19,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "downloadlist.h"
#include "downloadmanager.h"
+#include "modlistdropinfo.h"
#include <utility.h>
#include <log.h>
#include <QEvent>
@@ -98,7 +99,7 @@ Qt::ItemFlags DownloadList::flags(const QModelIndex& idx) const
QMimeData* DownloadList::mimeData(const QModelIndexList& indexes) const
{
QMimeData* result = QAbstractItemModel::mimeData(indexes);
- result->setData("text/plain", "archive");
+ result->setData("text/plain", ModListDropInfo::DOWNLOAD_TEXT);
return result;
}
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 28e20917..7da6fe3b 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -28,6 +28,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "settings.h"
#include "organizercore.h"
#include "modinforegular.h"
+#include "modlistdropinfo.h"
#include "shared/directoryentry.h"
#include "shared/fileentry.h"
#include "shared/filesorigin.h"
@@ -60,128 +61,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
using namespace MOBase;
-
-ModList::DropInfo::DropInfo(const QMimeData* mimeData, OrganizerCore& core) :
- m_rows{}, m_download{ -1 }, m_localUrls{}, m_url{}
-{
- // this only check if the drop is valid, not if the content of the drop
- // matches the target, a drop is valid if either
- // 1. it contains items from another model (drag&drop in modlist or from download list)
- // 2. it contains URLs from MO2 (overwrite or from another mod)
- // 3. it contains a single URL to an external folder
- // 4. it contains a single URL to a valid archive for MO2
- try {
- if (mimeData->hasUrls()) {
- for (auto& url : mimeData->urls()) {
- auto p = relativeUrl(url);
- if (p) {
- m_localUrls.push_back(*p);
- }
- }
-
- // external drop
- if (m_localUrls.empty() && mimeData->urls().size() == 1) {
- auto url = mimeData->urls()[0];
- if (url.isLocalFile() && !relativeUrl(url)) {
- QFileInfo info(url.toLocalFile());
- if (info.isDir()) {
- m_url = url;
- }
- else if (core.installationManager()->getSupportedExtensions().contains(info.suffix(), Qt::CaseInsensitive)) {
- m_url = url;
- }
- }
- }
-
- }
- else if (mimeData->hasText()) {
- QByteArray encoded = mimeData->data("application/x-qabstractitemmodeldatalist");
- QDataStream stream(&encoded, QIODevice::ReadOnly);
-
- while (!stream.atEnd()) {
- int sourceRow, col;
- QMap<int, QVariant> roleDataMap;
- stream >> sourceRow >> col >> roleDataMap;
- if (col == 0) {
- m_rows.push_back(sourceRow);
- }
- }
-
- if (mimeData->text() != "mod") {
- if (mimeData->text() == "archive" && m_rows.size() == 1) {
- m_download = m_rows[0];
- }
- m_rows = {};
- }
- }
- }
- catch (std::exception const&) {
- m_rows = {};
- m_download = -1;
- m_localUrls.clear();
- m_url = {};
- }
-}
-
-std::optional<ModList::DropInfo::RelativeUrl> ModList::DropInfo::relativeUrl(const QUrl& url) const
-{
- if (!url.isLocalFile()) {
- return {};
- }
-
- QDir allModsDir(Settings::instance().paths().mods());
- QDir overwriteDir(Settings::instance().paths().overwrite());
-
- QFileInfo sourceInfo(url.toLocalFile());
- QString sourceFile = sourceInfo.canonicalFilePath();
-
- QString relativePath;
- QString originName;
-
- if (sourceFile.startsWith(allModsDir.canonicalPath())) {
- QDir relativeDir(allModsDir.relativeFilePath(sourceFile));
- QStringList splitPath = relativeDir.path().split("/");
- originName = splitPath[0];
- splitPath.pop_front();
- return { { url, splitPath.join("/"), originName } };
- }
- else if (sourceFile.startsWith(overwriteDir.canonicalPath())) {
- return { { url, overwriteDir.relativeFilePath(sourceFile), ModInfo::getOverwrite()->name() } };
- }
-
- return {};
-}
-
-bool ModList::DropInfo::isValid() const
-{
- return isLocalFileDrop() || isModDrop() || isDownloadDrop() || m_url.isLocalFile();
-}
-
-bool ModList::DropInfo::isLocalFileDrop() const
-{
- return !m_localUrls.empty();
-}
-
-bool ModList::DropInfo::isModDrop() const
-{
- return !m_rows.empty();
-}
-
-bool ModList::DropInfo::isDownloadDrop() const
-{
- return m_download != -1;
-}
-
-bool ModList::DropInfo::isExternalArchiveDrop() const
-{
- return m_url.isLocalFile() && QFileInfo(m_url.toLocalFile()).isFile();
-}
-
-bool ModList::DropInfo::isExternalFolderDrop() const
-{
- return m_url.isLocalFile() && QFileInfo(m_url.toLocalFile()).isDir();
-}
-
ModList::ModList(PluginContainer *pluginContainer, OrganizerCore *organizer)
: QAbstractItemModel(organizer)
, m_Organizer(organizer)
@@ -829,7 +708,7 @@ QStringList ModList::mimeTypes() const
QMimeData *ModList::mimeData(const QModelIndexList &indexes) const
{
QMimeData *result = QAbstractItemModel::mimeData(indexes);
- result->setData("text/plain", "mod");
+ result->setData("text/plain", ModListDropInfo::MOD_TEXT);
return result;
}
@@ -1231,12 +1110,7 @@ int ModList::dropPriority(int row, const QModelIndex& parent) const
return newPriority;
}
-ModList::DropInfo ModList::dropInfo(const QMimeData* mimeData) const
-{
- return DropInfo(mimeData, *m_Organizer);
-}
-
-bool ModList::dropURLs(const DropInfo& dropInfo, int row, const QModelIndex &parent)
+bool ModList::dropLocalFiles(const ModListDropInfo& dropInfo, int row, const QModelIndex &parent)
{
if (row == -1) {
row = parent.row();
@@ -1279,7 +1153,7 @@ bool ModList::dropURLs(const DropInfo& dropInfo, int row, const QModelIndex &par
void ModList::onDragEnter(const QMimeData* mimeData)
{
- m_DropOnMod = dropInfo(mimeData).isLocalFileDrop();
+ m_DropOnMod = ModListDropInfo(mimeData, *m_Organizer).isLocalFileDrop();
}
bool ModList::canDropMimeData(const QMimeData* mimeData, Qt::DropAction action, int row, int column, const QModelIndex& parent) const
@@ -1288,7 +1162,7 @@ bool ModList::canDropMimeData(const QMimeData* mimeData, Qt::DropAction action,
return false;
}
- DropInfo dropInfo(mimeData, *m_Organizer);
+ ModListDropInfo dropInfo(mimeData, *m_Organizer);
if (dropInfo.isLocalFileDrop()) {
if (row == -1 && parent.isValid()) {
@@ -1319,7 +1193,7 @@ bool ModList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int
return true;
}
- DropInfo dropInfo(mimeData, *m_Organizer);
+ ModListDropInfo dropInfo(mimeData, *m_Organizer);
if (!m_Profile || !dropInfo.isValid()) {
return false;
@@ -1331,7 +1205,7 @@ bool ModList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int
}
if (dropInfo.isLocalFileDrop()) {
- return dropURLs(dropInfo, row, parent);
+ return dropLocalFiles(dropInfo, row, parent);
}
else {
if (dropInfo.isModDrop()) {
diff --git a/src/modlist.h b/src/modlist.h
index 815024b9..870978f9 100644
--- a/src/modlist.h
+++ b/src/modlist.h
@@ -43,6 +43,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
class QSortFilterProxyModel;
class PluginContainer;
class OrganizerCore;
+class ModListDropInfo;
/**
* Model presenting an overview of the installed mod
@@ -353,6 +354,14 @@ private:
MOBase::IModList::ModStates state(unsigned int modIndex) const;
+ // handle dropping of local URLs files
+ //
+ bool dropLocalFiles(const ModListDropInfo& dropInfo, int row, const QModelIndex& parent);
+
+ // return the priority of the mod for a drop event
+ //
+ int dropPriority(int row, const QModelIndex& parent) const;
+
private slots:
private:
@@ -374,90 +383,6 @@ private:
private:
- // small class that extract information from mimeData
- //
- class DropInfo {
- public:
-
- struct RelativeUrl {
- const QUrl url;
- const QString relativePath;
- const QString originName;
- };
-
- // returns true if this drop is valid
- //
- bool isValid() const;
-
- // returns true if these data corresponds to drag&drop
- // of local files (e.g. from overwrite)
- //
- bool isLocalFileDrop() const;
-
- // returns true if these data corresponds to drag&drop
- // of mod in the list
- //
- bool isModDrop() const;
-
- // returns true if these data corresponds to drag&drop
- // from the download list
- //
- bool isDownloadDrop() const;
-
- // returns true if these data corresponds to dropping
- // an archive for installation
- //
- bool isExternalArchiveDrop() const;
-
- // returns true if these data corresponds to dropping
- // a folder for copy
- //
- bool isExternalFolderDrop() const;
-
- const auto& rows() const { return m_rows; }
- const auto& download() const { return m_download; }
- const auto& localUrls() const { return m_localUrls; }
- const auto& externalUrl() const { return m_url; }
-
- private:
-
- friend class ModList;
-
- // retrieve the relative path of file and its origin given a URL from Mime data
- // returns an empty optional if the URL is not a valid file for dropping
- //
- std::optional<RelativeUrl> relativeUrl(const QUrl&) const;
-
- private:
- DropInfo(const QMimeData* mimeData, OrganizerCore& core);
-
- // rows for drag&drop between views
- std::vector<int> m_rows;
- int m_download; // -1 if invalid
-
- // local URLs from the data (relative path + origin name)
- std::vector<RelativeUrl> m_localUrls;
-
- // external URL
- QUrl m_url;
- };
-
- // create a DropInfo object from the given data
- //
- DropInfo dropInfo(const QMimeData* mimeData) const;
-
- bool dropURLs(const DropInfo& dropInfo, int row, const QModelIndex& parent);
-
- // return the priority of the mod for a drop event
- //
- int dropPriority(int row, const QModelIndex& parent) const;
-
-private:
-
- friend class ModListProxy;
- friend class ModListSortProxy;
- friend class ModListByPriorityProxy;
-
OrganizerCore *m_Organizer;
Profile *m_Profile;
diff --git a/src/modlistbypriorityproxy.cpp b/src/modlistbypriorityproxy.cpp
index b1426422..749991d0 100644
--- a/src/modlistbypriorityproxy.cpp
+++ b/src/modlistbypriorityproxy.cpp
@@ -4,6 +4,7 @@
#include "profile.h"
#include "organizercore.h"
#include "modlist.h"
+#include "modlistdropinfo.h"
#include "log.h"
ModListByPriorityProxy::ModListByPriorityProxy(Profile* profile, OrganizerCore& core, QObject* parent) :
@@ -195,7 +196,7 @@ bool ModListByPriorityProxy::setData(const QModelIndex& index, const QVariant& v
bool ModListByPriorityProxy::canDropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) const
{
- auto dropInfo = m_core.modList()->dropInfo(data);
+ ModListDropInfo dropInfo(data, m_core);
if (!dropInfo.isValid() || dropInfo.isLocalFileDrop()) {
return QAbstractProxyModel::canDropMimeData(data, action, row, column, parent);
@@ -265,7 +266,7 @@ bool ModListByPriorityProxy::canDropMimeData(const QMimeData* data, Qt::DropActi
bool ModListByPriorityProxy::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent)
{
// we need to fix the source model row
- auto dropInfo = m_core.modList()->dropInfo(data);
+ ModListDropInfo dropInfo(data, m_core);
int sourceRow = -1;
if (dropInfo.isLocalFileDrop()) {
diff --git a/src/modlistdropinfo.cpp b/src/modlistdropinfo.cpp
new file mode 100644
index 00000000..62a103a4
--- /dev/null
+++ b/src/modlistdropinfo.cpp
@@ -0,0 +1,124 @@
+#include "modlistdropinfo.h"
+
+#include "organizercore.h"
+
+ModListDropInfo::ModListDropInfo(const QMimeData* mimeData, OrganizerCore& core) :
+ m_rows{}, m_download{ -1 }, m_localUrls{}, m_url{}
+{
+ // this only check if the drop is valid, not if the content of the drop
+ // matches the target, a drop is valid if either
+ // 1. it contains items from another model (drag&drop in modlist or from download list)
+ // 2. it contains URLs from MO2 (overwrite or from another mod)
+ // 3. it contains a single URL to an external folder
+ // 4. it contains a single URL to a valid archive for MO2
+ try {
+ if (mimeData->hasUrls()) {
+ for (auto& url : mimeData->urls()) {
+ auto p = relativeUrl(url);
+ if (p) {
+ m_localUrls.push_back(*p);
+ }
+ }
+
+ // external drop
+ if (m_localUrls.empty() && mimeData->urls().size() == 1) {
+ auto url = mimeData->urls()[0];
+ if (url.isLocalFile() && !relativeUrl(url)) {
+ QFileInfo info(url.toLocalFile());
+ if (info.isDir()) {
+ m_url = url;
+ }
+ else if (core.installationManager()->getSupportedExtensions().contains(info.suffix(), Qt::CaseInsensitive)) {
+ m_url = url;
+ }
+ }
+ }
+
+ }
+ else if (mimeData->hasText()) {
+ QByteArray encoded = mimeData->data("application/x-qabstractitemmodeldatalist");
+ QDataStream stream(&encoded, QIODevice::ReadOnly);
+
+ while (!stream.atEnd()) {
+ int sourceRow, col;
+ QMap<int, QVariant> roleDataMap;
+ stream >> sourceRow >> col >> roleDataMap;
+ if (col == 0) {
+ m_rows.push_back(sourceRow);
+ }
+ }
+
+ if (mimeData->text() != ModListDropInfo::MOD_TEXT) {
+ if (mimeData->text() == ModListDropInfo::DOWNLOAD_TEXT && m_rows.size() == 1) {
+ m_download = m_rows[0];
+ }
+ m_rows = {};
+ }
+ }
+ }
+ catch (std::exception const&) {
+ m_rows = {};
+ m_download = -1;
+ m_localUrls.clear();
+ m_url = {};
+ }
+}
+
+std::optional<ModListDropInfo::RelativeUrl> ModListDropInfo::relativeUrl(const QUrl& url) const
+{
+ if (!url.isLocalFile()) {
+ return {};
+ }
+
+ QDir allModsDir(Settings::instance().paths().mods());
+ QDir overwriteDir(Settings::instance().paths().overwrite());
+
+ QFileInfo sourceInfo(url.toLocalFile());
+ QString sourceFile = sourceInfo.canonicalFilePath();
+
+ QString relativePath;
+ QString originName;
+
+ if (sourceFile.startsWith(allModsDir.canonicalPath())) {
+ QDir relativeDir(allModsDir.relativeFilePath(sourceFile));
+ QStringList splitPath = relativeDir.path().split("/");
+ originName = splitPath[0];
+ splitPath.pop_front();
+ return { { url, splitPath.join("/"), originName } };
+ }
+ else if (sourceFile.startsWith(overwriteDir.canonicalPath())) {
+ return { { url, overwriteDir.relativeFilePath(sourceFile), ModInfo::getOverwrite()->name() } };
+ }
+
+ return {};
+}
+
+bool ModListDropInfo::isValid() const
+{
+ return isLocalFileDrop() || isModDrop() || isDownloadDrop() || m_url.isLocalFile();
+}
+
+bool ModListDropInfo::isLocalFileDrop() const
+{
+ return !m_localUrls.empty();
+}
+
+bool ModListDropInfo::isModDrop() const
+{
+ return !m_rows.empty();
+}
+
+bool ModListDropInfo::isDownloadDrop() const
+{
+ return m_download != -1;
+}
+
+bool ModListDropInfo::isExternalArchiveDrop() const
+{
+ return m_url.isLocalFile() && QFileInfo(m_url.toLocalFile()).isFile();
+}
+
+bool ModListDropInfo::isExternalFolderDrop() const
+{
+ return m_url.isLocalFile() && QFileInfo(m_url.toLocalFile()).isDir();
+}
diff --git a/src/modlistdropinfo.h b/src/modlistdropinfo.h
new file mode 100644
index 00000000..14a21691
--- /dev/null
+++ b/src/modlistdropinfo.h
@@ -0,0 +1,92 @@
+#ifndef MODLISTDROPINFO_H
+#define MODLISTDROPINFO_H
+
+#include <optional>
+#include <vector>
+
+#include <QMimeData>
+#include <QString>
+#include <QUrl>
+
+class OrganizerCore;
+
+// small class that extract information from mimeData
+//
+class ModListDropInfo {
+public:
+
+ // text value for the mime-data for the various possible
+ // origin (not for external drops)
+ //
+ static constexpr const char* MOD_TEXT = "mod";
+ static constexpr const char* DOWNLOAD_TEXT = "download";
+
+public:
+
+ struct RelativeUrl {
+ const QUrl url;
+ const QString relativePath;
+ const QString originName;
+ };
+
+public:
+
+ ModListDropInfo(const QMimeData* mimeData, OrganizerCore& core);
+
+ // returns true if this drop is valid
+ //
+ bool isValid() const;
+
+ // returns true if these data corresponds to drag&drop
+ // of local files (e.g. from overwrite)
+ //
+ bool isLocalFileDrop() const;
+
+ // returns true if these data corresponds to drag&drop
+ // of mod in the list
+ //
+ bool isModDrop() const;
+
+ // returns true if these data corresponds to drag&drop
+ // from the download list
+ //
+ bool isDownloadDrop() const;
+
+ // returns true if these data corresponds to dropping
+ // an archive for installation
+ //
+ bool isExternalArchiveDrop() const;
+
+ // returns true if these data corresponds to dropping
+ // a folder for copy
+ //
+ bool isExternalFolderDrop() const;
+
+ const auto& rows() const { return m_rows; }
+ const auto& download() const { return m_download; }
+ const auto& localUrls() const { return m_localUrls; }
+ const auto& externalUrl() const { return m_url; }
+
+private:
+
+ friend class ModList;
+
+ // retrieve the relative path of file and its origin given a URL from Mime data
+ // returns an empty optional if the URL is not a valid file for dropping
+ //
+ std::optional<RelativeUrl> relativeUrl(const QUrl&) const;
+
+private:
+
+ // rows for drag&drop between views
+ std::vector<int> m_rows;
+ int m_download; // -1 if invalid
+
+ // local URLs from the data (relative path + origin name)
+ std::vector<RelativeUrl> m_localUrls;
+
+ // external URL
+ QUrl m_url;
+};
+
+#endif
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp
index f9a32b26..0dc2be83 100644
--- a/src/modlistsortproxy.cpp
+++ b/src/modlistsortproxy.cpp
@@ -18,6 +18,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
*/
#include "modlistsortproxy.h"
+#include "modlistdropinfo.h"
#include "modinfo.h"
#include "profile.h"
#include "messagedialog.h"
@@ -607,7 +608,7 @@ bool ModListSortProxy::filterAcceptsRow(int source_row, const QModelIndex &paren
bool ModListSortProxy::canDropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) const
{
- auto dropInfo = m_Organizer->modList()->dropInfo(data);
+ ModListDropInfo dropInfo(data, *m_Organizer);
if (!dropInfo.isLocalFileDrop() && sortColumn() != ModList::COL_PRIORITY) {
return false;
@@ -630,7 +631,7 @@ bool ModListSortProxy::canDropMimeData(const QMimeData* data, Qt::DropAction act
bool ModListSortProxy::dropMimeData(const QMimeData *data, Qt::DropAction action,
int row, int column, const QModelIndex &parent)
{
- auto dropInfo = m_Organizer->modList()->dropInfo(data);
+ ModListDropInfo dropInfo(data, *m_Organizer);
if (!dropInfo.isLocalFileDrop() && sortColumn() != ModList::COL_PRIORITY) {
QWidget *wid = qApp->activeWindow()->findChild<QTreeView*>("modList");
diff --git a/src/modlistview.cpp b/src/modlistview.cpp
index 02b7384a..be173478 100644
--- a/src/modlistview.cpp
+++ b/src/modlistview.cpp
@@ -17,6 +17,7 @@
#include "log.h"
#include "modflagicondelegate.h"
#include "modconflicticondelegate.h"
+#include "modlistdropinfo.h"
#include "genericicondelegate.h"
#include "shared/directoryentry.h"
#include "shared/filesorigin.h"
@@ -516,6 +517,91 @@ void ModListView::updateModCount()
);
}
+void ModListView::onExternalFolderDropped(const QUrl& url, int priority)
+{
+ QFileInfo fileInfo(url.toLocalFile());
+
+ GuessedValue<QString> name;
+ name.setFilter(&fixDirectoryName);
+ name.update(fileInfo.fileName(), GUESS_PRESET);
+
+ do {
+ bool ok;
+ name.update(QInputDialog::getText(this, tr("Copy Folder..."),
+ tr("This will copy the content of %1 to a new mod.\n"
+ "Please enter the name:").arg(fileInfo.fileName()), QLineEdit::Normal, name, &ok),
+ GUESS_USER);
+ if (!ok) {
+ return;
+ }
+ } while (name->isEmpty());
+
+ if (m_core->modList()->getMod(name) != nullptr) {
+ reportError(tr("A mod with this name already exists."));
+ return;
+ }
+
+ IModInterface* newMod = m_core->createMod(name);
+ if (!newMod) {
+ return;
+ }
+
+ if (!copyDir(fileInfo.absoluteFilePath(), newMod->absolutePath(), true)) {
+ return;
+ }
+
+ m_core->refresh();
+
+ if (priority != -1) {
+ m_core->modList()->changeModPriority(ModInfo::getIndex(name), priority);
+ }
+}
+
+bool ModListView::moveSelection(int key)
+{
+ QModelIndex cindex = indexViewToModel(currentIndex());
+ QModelIndexList sourceRows = indexViewToModel(selectionModel()->selectedRows());
+
+ int offset = key == Qt::Key_Up ? -1 : 1;
+ if (m_sortProxy->sortOrder() == Qt::DescendingOrder) {
+ offset = -offset;
+ }
+
+ m_core->modList()->shiftMods(sourceRows, offset);
+
+ // reset the selection and the index
+ setCurrentIndex(indexModelToView(cindex));
+ for (auto idx : sourceRows) {
+ selectionModel()->select(indexModelToView(idx), QItemSelectionModel::Select | QItemSelectionModel::Rows);
+ }
+
+ return true;
+}
+
+bool ModListView::removeSelection()
+{
+ if (selectionModel()->hasSelection()) {
+ QModelIndexList rows = selectionModel()->selectedRows();
+ if (rows.count() > 1) {
+ emit removeSelectedMods();
+ }
+ else if (rows.count() == 1) {
+ // this does not work, I don't know why
+ // model()->removeRow(rows[0].row(), rows[0].parent());
+ m_core->modList()->removeRow(indexViewToModel(rows[0]).row());
+ }
+ }
+ return true;
+}
+
+bool ModListView::toggleSelectionState()
+{
+ if (!selectionModel()->hasSelection()) {
+ return true;
+ }
+ return m_core->modList()->toggleState(indexViewToModel(selectionModel()->selectedRows()));
+}
+
void ModListView::updateGroupByProxy(int groupIndex)
{
// if the index is -1, we do not refresh unless we are grouping
@@ -683,6 +769,14 @@ void ModListView::dragEnterEvent(QDragEnterEvent* event)
{
emit dragEntered(event->mimeData());
QTreeView::dragEnterEvent(event);
+
+
+ ModListDropInfo dropInfo(event->mimeData(), *m_core);
+
+ if (dropInfo.isValid() && !dropInfo.isLocalFileDrop()
+ && sortColumn() != ModList::COL_PRIORITY) {
+ log::warn("Drag&Drop is only supported when sorting by priority.");
+ }
}
void ModListView::dragMoveEvent(QDragMoveEvent* event)
@@ -722,91 +816,6 @@ void ModListView::timerEvent(QTimerEvent* event)
}
}
-void ModListView::onExternalFolderDropped(const QUrl& url, int priority)
-{
- QFileInfo fileInfo(url.toLocalFile());
-
- GuessedValue<QString> name;
- name.setFilter(&fixDirectoryName);
- name.update(fileInfo.fileName(), GUESS_PRESET);
-
- do {
- bool ok;
- name.update(QInputDialog::getText(this, tr("Copy Folder..."),
- tr("This will copy the content of %1 to a new mod.\n"
- "Please enter the name:").arg(fileInfo.fileName()), QLineEdit::Normal, name, &ok),
- GUESS_USER);
- if (!ok) {
- return;
- }
- } while (name->isEmpty());
-
- if (m_core->modList()->getMod(name) != nullptr) {
- reportError(tr("A mod with this name already exists."));
- return;
- }
-
- IModInterface* newMod = m_core->createMod(name);
- if (!newMod) {
- return;
- }
-
- if (!copyDir(fileInfo.absoluteFilePath(), newMod->absolutePath(), true)) {
- return;
- }
-
- m_core->refresh();
-
- if (priority != -1) {
- m_core->modList()->changeModPriority(ModInfo::getIndex(name), priority);
- }
-}
-
-bool ModListView::moveSelection(int key)
-{
- QModelIndex cindex = indexViewToModel(currentIndex());
- QModelIndexList sourceRows = indexViewToModel(selectionModel()->selectedRows());
-
- int offset = key == Qt::Key_Up ? -1 : 1;
- if (m_sortProxy->sortOrder() == Qt::DescendingOrder) {
- offset = -offset;
- }
-
- m_core->modList()->shiftMods(sourceRows, offset);
-
- // reset the selection and the index
- setCurrentIndex(indexModelToView(cindex));
- for (auto idx : sourceRows) {
- selectionModel()->select(indexModelToView(idx), QItemSelectionModel::Select | QItemSelectionModel::Rows);
- }
-
- return true;
-}
-
-bool ModListView::removeSelection()
-{
- if (selectionModel()->hasSelection()) {
- QModelIndexList rows = selectionModel()->selectedRows();
- if (rows.count() > 1) {
- emit removeSelectedMods();
- }
- else if (rows.count() == 1) {
- // this does not work, I don't know why
- // model()->removeRow(rows[0].row(), rows[0].parent());
- m_core->modList()->removeRow(indexViewToModel(rows[0]).row());
- }
- }
- return true;
-}
-
-bool ModListView::toggleSelectionState()
-{
- if (!selectionModel()->hasSelection()) {
- return true;
- }
- return m_core->modList()->toggleState(indexViewToModel(selectionModel()->selectedRows()));
-}
-
bool ModListView::event(QEvent* event)
{
Profile* profile = m_core->currentProfile();