diff options
| author | Tannin <devnull@localhost> | 2013-05-10 11:00:09 +0200 |
|---|---|---|
| committer | Tannin <devnull@localhost> | 2013-05-10 11:00:09 +0200 |
| commit | fc3753dcc5b7d55bf99674e7d17962f477053921 (patch) | |
| tree | 54fef6cd5b57533fd84f04cc58259c242600efed /src/modlist.cpp | |
| parent | 4fbfc9aa54ed4499f54eb7b3cd942337f6b49e58 (diff) | |
| parent | 9bc123e8e2dbd17508a68e4afc2eb881873601bd (diff) | |
Merge
Diffstat (limited to 'src/modlist.cpp')
| -rw-r--r-- | src/modlist.cpp | 159 |
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) { |
