summaryrefslogtreecommitdiff
path: root/src/modlist.cpp
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2013-05-10 11:00:09 +0200
committerTannin <devnull@localhost>2013-05-10 11:00:09 +0200
commitfc3753dcc5b7d55bf99674e7d17962f477053921 (patch)
tree54fef6cd5b57533fd84f04cc58259c242600efed /src/modlist.cpp
parent4fbfc9aa54ed4499f54eb7b3cd942337f6b49e58 (diff)
parent9bc123e8e2dbd17508a68e4afc2eb881873601bd (diff)
Merge
Diffstat (limited to 'src/modlist.cpp')
-rw-r--r--src/modlist.cpp159
1 files changed, 128 insertions, 31 deletions
diff --git a/src/modlist.cpp b/src/modlist.cpp
index 84e76b75..3fc8ae23 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -20,11 +20,11 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "modlist.h"
#include "report.h"
-#include "utility.h"
#include "messagedialog.h"
#include "installationtester.h"
+#include "qtgroupingproxy.h"
#include <gameinfo.h>
-
+#include <utility.h>
#include <QFileInfo>
#include <QDir>
#include <QDirIterator>
@@ -49,7 +49,7 @@ using namespace MOBase;
ModList::ModList(QObject *parent)
: QAbstractItemModel(parent), m_Profile(NULL), m_Modified(false),
- m_FontMetrics(QFont())
+ m_FontMetrics(QFont()), m_DropOnItems(false)
{
}
@@ -136,6 +136,8 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
QString version = modInfo->getVersion().canonicalString();
if (version.isEmpty() && modInfo->canBeUpdated()) {
version = "?";
+ } else if (version[0] == 'd') {
+ version.remove(0, 1);
}
return version;
} else if (column == COL_PRIORITY) {
@@ -143,15 +145,7 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
if (priority != INT_MIN) {
return QVariant(); // hide priority for mods where it's fixed
} else {
- if ((m_Profile->getModPriority(modIndex) == 0) && (role == Qt::DisplayRole)) {
- return tr("min");
- } else if ((m_Profile->getModPriority(modIndex) == static_cast<int>(m_Profile->numRegularMods()) - 1) &&
- (role == Qt::DisplayRole)) {
- return tr("max");
- } else {
- //return QString::number(m_Profile->getModPriority(modIndex));
- return m_Profile->getModPriority(modIndex);
- }
+ return m_Profile->getModPriority(modIndex);
}
} else if (column == COL_MODID) {
int modID = modInfo->getNexusID();
@@ -196,9 +190,33 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
return QVariant(Qt::AlignCenter | Qt::AlignVCenter);
}
} else if (role == Qt::UserRole) {
- return modInfo->getNexusID();
+ if (column == COL_CATEGORY) {
+ QVariantList categoryNames;
+ std::set<int> categories = modInfo->getCategories();
+ CategoryFactory &categoryFactory = CategoryFactory::instance();
+ for (auto iter = categories.begin(); iter != categories.end(); ++iter) {
+ categoryNames.append(categoryFactory.getCategoryName(categoryFactory.getCategoryIndex(*iter)));
+ }
+ if (categoryNames.count() != 0) {
+ return categoryNames;
+ } else {
+ return QVariant();
+ }
+ } else if (column == COL_PRIORITY) {
+ return m_Profile->getModPriority(modIndex);
+ } else {
+ return modInfo->getNexusID();
+ }
} else if (role == Qt::UserRole + 1) {
return modIndex;
+ } else if (role == Qt::UserRole + 2) {
+ switch (column) {
+ case COL_MODID: return QtGroupingProxy::AGGR_FIRST;
+ case COL_VERSION: return QtGroupingProxy::AGGR_MAX;
+ case COL_CATEGORY: return QtGroupingProxy::AGGR_FIRST;
+ case COL_PRIORITY: return QtGroupingProxy::AGGR_MIN;
+ default: return QtGroupingProxy::AGGR_NONE;
+ }
} else if (role == Qt::FontRole) {
QFont result;
if (column == COL_NAME) {
@@ -212,10 +230,13 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
}
return result;
} else if (role == Qt::DecorationRole) {
- if ((column == COL_VERSION) &&
- modInfo->updateAvailable() &&
- modInfo->getNewestVersion().isValid()) {
- return QIcon(":/MO/gui/update_available");
+ if (column == COL_VERSION) {
+ if (modInfo->updateAvailable() &&
+ modInfo->getNewestVersion().isValid()) {
+ return QIcon(":/MO/gui/update_available");
+ } else if (modInfo->getVersion().isVersionDate()) {
+ return QIcon(":/MO/gui/version_date");
+ }
}
return QVariant();
} else if (role == Qt::ForegroundRole) {
@@ -284,19 +305,25 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const
bool ModList::renameMod(int index, const QString &newName)
{
+ QString nameFixed = newName;
+ if (!fixDirectoryName(nameFixed) || nameFixed.isEmpty()) {
+ MessageDialog::showMessage(tr("Invalid name"), NULL);
+ return false;
+ }
+
// before we rename, write back the current profile so we don't lose changes and to ensure
// there is no scheduled asynchronous rewrite anytime soon
m_Profile->writeModlistNow();
ModInfo::Ptr modInfo = ModInfo::getByIndex(index);
QString oldName = modInfo->name();
- modInfo->setName(newName);
+ modInfo->setName(nameFixed);
// this just broke all profiles! The recipient of modRenamed has to do some magic
// to can't write the currently active profile back
- emit modRenamed(oldName, newName);
+ emit modRenamed(oldName, nameFixed);
// invalidate the currently displayed state of this list
-// notifyChange(-1);
+ notifyChange(-1);
return true;
}
@@ -309,10 +336,12 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
return false;
}
+ int modID = index.row();
+
if (role == Qt::CheckStateRole) {
bool enabled = value.toInt() == Qt::Checked;
- if (m_Profile->modEnabled(index.row()) != enabled) {
- m_Profile->setModEnabled(index.row(), enabled);
+ if (m_Profile->modEnabled(modID) != enabled) {
+ m_Profile->setModEnabled(modID, enabled);
m_Modified = true;
emit modlist_changed(index, role);
@@ -321,13 +350,13 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
} else if (role == Qt::EditRole) {
switch (index.column()) {
case COL_NAME: {
- return renameMod(index.row(), value.toString());
+ return renameMod(modID, value.toString());
} break;
case COL_PRIORITY: {
bool ok = false;
int newPriority = value.toInt(&ok);
if (ok) {
- m_Profile->setModPriority(index.row(), newPriority);
+ m_Profile->setModPriority(modID, newPriority);
emit modlist_changed(index, role);
return true;
@@ -336,7 +365,7 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
}
} break;
case COL_MODID: {
- ModInfo::Ptr info = ModInfo::getByIndex(index.row());
+ ModInfo::Ptr info = ModInfo::getByIndex(modID);
bool ok = false;
int newID = value.toInt(&ok);
if (ok) {
@@ -348,7 +377,7 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role)
}
} break;
case COL_VERSION: {
- ModInfo::Ptr info = ModInfo::getByIndex(index.row());
+ ModInfo::Ptr info = ModInfo::getByIndex(modID);
VersionInfo version(value.toString());
if (version.isValid()) {
info->setVersion(version);
@@ -421,12 +450,23 @@ Qt::ItemFlags ModList::flags(const QModelIndex &modelIndex) const
result |= Qt::ItemIsEditable;
}
}
+ std::vector<ModInfo::EFlag> flags = modInfo->getFlags();
+ if ((m_DropOnItems) && (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) == flags.end())) {
+ result |= Qt::ItemIsDropEnabled;
+ }
} else {
- result |= Qt::ItemIsDropEnabled;
+ if (!m_DropOnItems) result |= Qt::ItemIsDropEnabled;
}
return result;
}
+QStringList ModList::mimeTypes() const
+{
+ QStringList result = QAbstractItemModel::mimeTypes();
+ result.append("text/uri-list");
+ return result;
+}
+
void ModList::changeModPriority(std::vector<int> sourceIndices, int newPriority)
{
@@ -474,13 +514,39 @@ void ModList::changeModPriority(int sourceIndex, int newPriority)
}
-bool ModList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int row, int, const QModelIndex &parent)
+bool ModList::dropURLs(const QMimeData *mimeData, int row, const QModelIndex &parent)
{
- if (action == Qt::IgnoreAction) {
- return true;
+ QStringList source;
+ QStringList target;
+
+ if (row == -1) {
+ row = parent.row();
}
- if (m_Profile == NULL) return false;
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(row);
+ QDir modDirectory(modInfo->absolutePath());
+ QDir gameDirectory(QDir::fromNativeSeparators(ToQString(MOShared::GameInfo::instance().getOverwriteDir())));
+
+ foreach (const QUrl &url, mimeData->urls()) {
+ QString relativePath = gameDirectory.relativeFilePath(url.toLocalFile());
+ if (relativePath.startsWith("..")) {
+ qDebug("%s drop ignored", qPrintable(url.toLocalFile()));
+ continue;
+ }
+ source.append(url.toLocalFile());
+ target.append(modDirectory.absoluteFilePath(relativePath));
+ }
+
+ if (source.count() != 0) {
+ shellMove(source, target, NULL);
+ }
+
+ return true;
+}
+
+
+bool ModList::dropMod(const QMimeData *mimeData, int row, const QModelIndex &parent)
+{
try {
QByteArray encoded = mimeData->data("application/x-qabstractitemmodeldatalist");
@@ -524,6 +590,22 @@ bool ModList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int
}
+bool ModList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int row, int, const QModelIndex &parent)
+{
+ if (action == Qt::IgnoreAction) {
+ return true;
+ }
+
+ if (m_Profile == NULL) return false;
+ if (mimeData->hasUrls()) {
+ return dropURLs(mimeData, row, parent);
+ } else {
+ return dropMod(mimeData, row, parent);
+ }
+
+}
+
+
void ModList::removeRowForce(int row)
{
if (static_cast<unsigned int>(row) >= ModInfo::getNumMods()) {
@@ -588,6 +670,21 @@ QModelIndex ModList::parent(const QModelIndex&) const
return QModelIndex();
}
+QMap<int, QVariant> ModList::itemData(const QModelIndex &index) const
+{
+ QMap<int, QVariant> result = QAbstractItemModel::itemData(index);
+ result[Qt::UserRole] = data(index, Qt::UserRole);
+ return result;
+}
+
+
+void ModList::dropModeUpdate(bool dropOnItems)
+{
+ if (m_DropOnItems != dropOnItems) {
+ m_DropOnItems = dropOnItems;
+ }
+}
+
QString ModList::getColumnName(int column)
{