From 138154aca0fcb27e3e09e2de3f895c5e1de99e3f Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 31 Aug 2018 22:16:13 +0200 Subject: Added "Refresh" button to downloads tab. --- src/mainwindow.h | 1 + 1 file changed, 1 insertion(+) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.h b/src/mainwindow.h index ad0972da..b3d179e8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -575,6 +575,7 @@ private slots: // ui slots void on_bsaList_customContextMenuRequested(const QPoint &pos); void on_clearFiltersButton_clicked(); void on_btnRefreshData_clicked(); + void on_btnRefreshDownloads_clicked(); void on_categoriesList_customContextMenuRequested(const QPoint &pos); void on_conflictsCheckBox_toggled(bool checked); void on_dataTree_customContextMenuRequested(const QPoint &pos); -- cgit v1.3.1 From 67fb7e56d3a080844927d4d41764da1e9bb39795 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Fri, 7 Sep 2018 22:04:03 +0200 Subject: Add option to create a Mod backup from the modlist context menu. --- src/installationmanager.h | 4 +++- src/mainwindow.cpp | 12 ++++++++++++ src/mainwindow.h | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.h') diff --git a/src/installationmanager.h b/src/installationmanager.h index e17aee17..e66184d3 100644 --- a/src/installationmanager.h +++ b/src/installationmanager.h @@ -147,6 +147,8 @@ public: */ virtual bool testOverwrite(MOBase::GuessedValue &modName, bool *merge = nullptr) const; + QString generateBackupName(const QString &directoryName) const; + private: void queryPassword(QString *password); @@ -171,7 +173,7 @@ private: bool doInstall(MOBase::GuessedValue &modName, QString gameName, int modID, const QString &version, const QString &newestVersion, int categoryID, const QString &repository); - QString generateBackupName(const QString &directoryName) const; + //QString generateBackupName(const QString &directoryName) const; bool ensureValidModName(MOBase::GuessedValue &name) const; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 28d561b9..57988663 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2409,6 +2409,16 @@ void MainWindow::reinstallMod_clicked() } } +void MainWindow::backupMod_clicked() +{ + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + QString backupDirectory = m_OrganizerCore.installationManager()->generateBackupName(modInfo->absolutePath()); + if (!copyDir(modInfo->absolutePath(), backupDirectory, false)) { + QMessageBox::information(this, tr("Failed"), + tr("Failed to create backup.")); + } + m_OrganizerCore.refreshModList(); +} void MainWindow::resumeDownload(int downloadIndex) { @@ -3626,6 +3636,8 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Reinstall Mod"), this, SLOT(reinstallMod_clicked())); menu->addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); + menu->addAction(tr("Create Backup"), this, SLOT(backupMod_clicked())); + menu->addSeparator(); diff --git a/src/mainwindow.h b/src/mainwindow.h index b3d179e8..0bf3d3c8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -407,6 +407,7 @@ private slots: void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); + void backupMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); void dontendorse_clicked(); -- cgit v1.3.1 From 42d2344f0b81cb1cf8dbe83e8f480b84ed0c3114 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 02:16:20 +0200 Subject: Added modlist Separators feature: *New modType separator. *Bold, italic and centralized name without _separator at the end. *Added "create separator" option to context menu. *Added "rename separator" option. *Fixed rename separator issue with priority resetting. --- src/mainwindow.cpp | 42 +++++++++++++++++++++++--- src/mainwindow.h | 1 + src/modinfo.cpp | 8 +++-- src/modinfo.h | 3 +- src/modinfodialog.cpp | 17 ++++++++++- src/modinfoseparator.cpp | 36 ++++++++++++++++++++++ src/modinfoseparator.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ src/modlist.cpp | 29 ++++++++++++++++-- 8 files changed, 202 insertions(+), 11 deletions(-) create mode 100644 src/modinfoseparator.cpp create mode 100644 src/modinfoseparator.h (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 04bd96c7..bc25ab70 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2629,8 +2629,9 @@ void MainWindow::modOpenNext(int tab) ModInfo::Ptr mod = ModInfo::getByIndex(m_ContextRow); std::vector flags = mod->getFlags(); if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || - (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end())) { - // skip overwrite and backups + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end())) { + // skip overwrite and backups and separators modOpenNext(tab); } else { displayModInformation(m_ContextRow,tab); @@ -2649,8 +2650,9 @@ void MainWindow::modOpenPrev(int tab) ModInfo::Ptr mod = ModInfo::getByIndex(m_ContextRow); std::vector flags = mod->getFlags(); if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || - (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end())) { - // skip overwrite and backups + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end())) { + // skip overwrite and backups and separators modOpenPrev(tab); } else { displayModInformation(m_ContextRow,tab); @@ -2839,6 +2841,33 @@ void MainWindow::createEmptyMod_clicked() m_OrganizerCore.refreshModList(); } +void MainWindow::createSeparator_clicked() +{ + GuessedValue name; + name.setFilter(&fixDirectoryName); + while (name->isEmpty()) + { + bool ok; + name.update(QInputDialog::getText(this, tr("Create Separator..."), + tr("This will create a new separator.\n" + "Please enter a name:"), QLineEdit::Normal, "", &ok), + GUESS_USER); + if (!ok) { return; } + } + if (m_OrganizerCore.getMod(name) != nullptr) + { + reportError(tr("A separator with this name already exists")); + return; + } + name->append("_separator"); + if (m_OrganizerCore.getMod(name) != nullptr) + { + return; + } + if (m_OrganizerCore.createMod(name) == nullptr) { return; } + m_OrganizerCore.refreshModList(); +} + void MainWindow::createModFromOverwrite() { GuessedValue name; @@ -3579,6 +3608,8 @@ QMenu *MainWindow::modListContextMenu() menu->addAction(tr("Create empty mod"), this, SLOT(createEmptyMod_clicked())); + menu->addAction(tr("Create separator"), this, SLOT(createSeparator_clicked())); + menu->addSeparator(); menu->addAction(tr("Enable all visible"), this, SLOT(enableVisibleMods())); @@ -3623,6 +3654,9 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) { menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); + } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ + menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); + menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { // nop, nothing to do with this mod } else { diff --git a/src/mainwindow.h b/src/mainwindow.h index 0bf3d3c8..78d374e6 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -404,6 +404,7 @@ private slots: // modlist context menu void installMod_clicked(); void createEmptyMod_clicked(); + void createSeparator_clicked(); void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 8ce40da3..4c41a114 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see . #include "modinforegular.h" #include "modinfoforeign.h" #include "modinfooverwrite.h" +#include "modinfoseparator.h" #include "installationtester.h" #include "categories.h" @@ -64,11 +65,14 @@ bool ModInfo::ByName(const ModInfo::Ptr &LHS, const ModInfo::Ptr &RHS) ModInfo::Ptr ModInfo::createFrom(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &dir, DirectoryEntry **directoryStructure) { QMutexLocker locker(&s_Mutex); -// int id = s_NextID++; + // int id = s_NextID++; static QRegExp backupExp(".*backup[0-9]*"); + static QRegExp separatorExp(".*_separator"); ModInfo::Ptr result; if (backupExp.exactMatch(dir.dirName())) { result = ModInfo::Ptr(new ModInfoBackup(pluginContainer, game, dir, directoryStructure)); + } else if(separatorExp.exactMatch(dir.dirName())){ + result = Ptr(new ModInfoSeparator(pluginContainer, game, dir, directoryStructure)); } else { result = ModInfo::Ptr(new ModInfoRegular(pluginContainer, game, dir, directoryStructure)); } @@ -418,4 +422,4 @@ void ModInfo::testValid() while (dirIter.hasNext()) { dirIter.next(); } -} \ No newline at end of file +} diff --git a/src/modinfo.h b/src/modinfo.h index 895105df..9f6c2fbc 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -62,6 +62,7 @@ public: enum EFlag { FLAG_INVALID, FLAG_BACKUP, + FLAG_SEPARATOR, FLAG_OVERWRITE, FLAG_FOREIGN, FLAG_NOTENDORSED, @@ -560,7 +561,7 @@ public: /** * @return true if this mod is considered "valid", that is: it contains data used by the game **/ - bool isValid() const { return m_Valid; } + virtual bool isValid() const { return m_Valid; } /** * @return true if the file has been endorsed on nexus diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index fedddd6c..54910e41 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -134,7 +134,22 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo refreshLists(); - if (unmanaged) { + if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)) + { + ui->tabWidget->setTabEnabled(TAB_TEXTFILES, false); + ui->tabWidget->setTabEnabled(TAB_INIFILES, false); + ui->tabWidget->setTabEnabled(TAB_IMAGES, false); + ui->tabWidget->setTabEnabled(TAB_ESPS, false); + ui->tabWidget->setTabEnabled(TAB_CONFLICTS, false); + //ui->tabWidget->setTabEnabled(TAB_CATEGORIES, false); + addCategories(CategoryFactory::instance(), modInfo->getCategories(), ui->categoriesTree->invisibleRootItem(), 0); + refreshPrimaryCategoriesBox(); + ui->tabWidget->setTabEnabled(TAB_NEXUS, false); + //ui->tabWidget->setTabEnabled(TAB_NOTES, false); + ui->tabWidget->setTabEnabled(TAB_FILETREE, false); + } + else if (unmanaged) + { ui->tabWidget->setTabEnabled(TAB_INIFILES, false); ui->tabWidget->setTabEnabled(TAB_CATEGORIES, false); ui->tabWidget->setTabEnabled(TAB_NEXUS, false); diff --git a/src/modinfoseparator.cpp b/src/modinfoseparator.cpp new file mode 100644 index 00000000..60014f66 --- /dev/null +++ b/src/modinfoseparator.cpp @@ -0,0 +1,36 @@ +#include "modinfoseparator.h" + +bool ModInfoSeparator::setName(const QString& name) +{ + return ModInfoRegular::setName(name); +} + +std::vector ModInfoSeparator::getFlags() const +{ + { + auto result = ModInfoRegular::getFlags(); + result.insert(result.begin(), FLAG_SEPARATOR); + return result; + } +} + +int ModInfoSeparator::getHighlight() const +{ + return HIGHLIGHT_CENTER; +} + +QString ModInfoSeparator::getDescription() const +{ + return tr("This is a Separator"); +} + +QString ModInfoSeparator::name() const +{ + return ModInfoRegular::name(); +} + + +ModInfoSeparator::ModInfoSeparator(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, const QDir &path, MOShared::DirectoryEntry **directoryStructure) + : ModInfoRegular(pluginContainer, game, path, directoryStructure) +{ +} diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h new file mode 100644 index 00000000..f215fb17 --- /dev/null +++ b/src/modinfoseparator.h @@ -0,0 +1,77 @@ +#ifndef MODINFOSEPARATOR_H +#define MODINFOSEPARATOR_H + +#include "modinforegular.h" + +class ModInfoSeparator: + public ModInfoRegular +{ + friend class ModInfo; + +public: + + virtual bool updateAvailable() const { return false; } + virtual bool updateIgnored() const { return false; } + virtual bool downgradeAvailable() const { return false; } + virtual bool updateNXMInfo() { return false; } + virtual bool isValid() const { return true; } + //TODO: Fix renaming method to avoid priority reset + virtual bool setName(const QString& name); + + virtual int getNexusID() const { return -1; } + + virtual void setGameName(QString /*gameName*/) + { + } + + virtual void setNexusID(int /*modID*/) + { + } + + virtual void endorse(bool /*doEndorse*/) + { + } + + virtual void ignoreUpdate(bool /*ignore*/) + { + } + + virtual bool canBeUpdated() const { return false; } + virtual bool canBeEnabled() const { return false; } + virtual std::vector getIniTweaks() const { return std::vector(); } + + virtual std::vector getFlags() const; + virtual int getHighlight() const; + + virtual QString getDescription() const; + virtual QString name() const; + virtual QString getGameName() const { return ""; } + virtual QString getInstallationFile() const { return ""; } + virtual QString getURL() const { return ""; } + virtual QString repository() const { return ""; } + + virtual QDateTime getLastNexusQuery() const { return QDateTime(); } + virtual QDateTime creationTime() const { return QDateTime(); } + + virtual void getNexusFiles + ( + QList::const_iterator& /*unused*/, + QList::const_iterator& /*unused*/) + { + } + + virtual QString getNexusDescription() const { return QString(); } + + virtual void addInstalledFile(int /*modId*/, int /*fileId*/) + { + } + +private: + + ModInfoSeparator + ( + PluginContainer* pluginContainer, const MOBase::IPluginGame* game, const QDir& path, + MOShared::DirectoryEntry** directoryStructure); +}; + +#endif diff --git a/src/modlist.cpp b/src/modlist.cpp index c7f6a53b..31ef9ddc 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -45,6 +45,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include @@ -145,6 +146,7 @@ QString ModList::getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const { switch (flag) { case ModInfo::FLAG_BACKUP: return tr("Backup"); + case ModInfo::FLAG_SEPARATOR: return tr("Separator"); case ModInfo::FLAG_INVALID: return tr("No valid game data"); case ModInfo::FLAG_NOTENDORSED: return tr("Not endorsed yet"); case ModInfo::FLAG_NOTES: return QString("%1").arg(modInfo->notes().replace("\n", "
")); @@ -203,7 +205,13 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const || (column == COL_CONTENT)) { return QVariant(); } else if (column == COL_NAME) { - return modInfo->name(); + auto flags = modInfo->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + return modInfo->name().replace("_separator", ""); + } + else + return modInfo->name(); } else if (column == COL_VERSION) { VersionInfo verInfo = modInfo->getVersion(); QString version = verInfo.displayString(); @@ -277,6 +285,7 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } } else if (role == Qt::TextAlignmentRole) { + auto flags = modInfo->getFlags(); if (column == COL_NAME) { if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_CENTER) { return QVariant(Qt::AlignCenter | Qt::AlignVCenter); @@ -327,8 +336,15 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return modInfo->getGameName(); } else if (role == Qt::FontRole) { QFont result; + auto flags = modInfo->getFlags(); if (column == COL_NAME) { - if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_INVALID) { + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + //result.setCapitalization(QFont::AllUppercase); + result.setItalic(true); + //result.setUnderline(true); + result.setBold(true); + } else if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_INVALID) { result.setItalic(true); } } else if ((column == COL_CATEGORY) && (modInfo->hasFlag(ModInfo::FLAG_FOREIGN))) { @@ -476,6 +492,7 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) ModInfo::Ptr info = ModInfo::getByIndex(modID); IModList::ModStates oldState = state(modID); + bool result = false; emit aboutToChangeData(); @@ -493,7 +510,13 @@ bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) } else if (role == Qt::EditRole) { switch (index.column()) { case COL_NAME: { - result = renameMod(modID, value.toString()); + auto flags = info->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + result = renameMod(modID, value.toString() + "_separator"); + } + else + result = renameMod(modID, value.toString()); } break; case COL_PRIORITY: { bool ok = false; -- cgit v1.3.1 From dce6507dad1ff7d76a5c0497d516c79bacd08477 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 15:04:50 +0100 Subject: Added Color costumization for Separators. --- src/mainwindow.cpp | 28 +++++++++++++++++++++++++++- src/mainwindow.h | 1 + src/modinfo.h | 11 +++++++++++ src/modinforegular.cpp | 13 +++++++++++++ src/modinforegular.h | 7 +++++++ src/modlist.cpp | 6 +++++- 6 files changed, 64 insertions(+), 2 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bc25ab70..438ba037 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -154,6 +154,8 @@ along with Mod Organizer. If not, see . #include #include #include +#include +#include #include #include @@ -2868,6 +2870,26 @@ void MainWindow::createSeparator_clicked() m_OrganizerCore.refreshModList(); } +void MainWindow::setColor_clicked() +{ + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + QColor color = QColorDialog::getColor(modInfo->getColor(),this); + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + for (QModelIndex idx : selection->selectedRows()) { + ModInfo::Ptr info = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt()); + auto flags = info->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + info->setColor(color); + } + } + } + else { + modInfo->setColor(color); + } +} + void MainWindow::createModFromOverwrite() { GuessedValue name; @@ -3608,7 +3630,7 @@ QMenu *MainWindow::modListContextMenu() menu->addAction(tr("Create empty mod"), this, SLOT(createEmptyMod_clicked())); - menu->addAction(tr("Create separator"), this, SLOT(createSeparator_clicked())); + menu->addAction(tr("Create Separator"), this, SLOT(createSeparator_clicked())); menu->addSeparator(); @@ -3655,8 +3677,12 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ + menu->addSeparator(); menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); + menu->addSeparator(); + menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); + menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { // nop, nothing to do with this mod } else { diff --git a/src/mainwindow.h b/src/mainwindow.h index 78d374e6..02e368d7 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -408,6 +408,7 @@ private slots: void restoreBackup_clicked(); void renameMod_clicked(); void removeMod_clicked(); + void setColor_clicked(); void backupMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); diff --git a/src/modinfo.h b/src/modinfo.h index 9f6c2fbc..235fb50c 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -31,6 +31,7 @@ class QDir; #include #include #include +#include #include @@ -524,6 +525,16 @@ public: */ virtual QStringList archives() const = 0; + /* + *@return the color choosen by the user for the mod/separator + */ + virtual QColor getColor() { return QColor(); } + + /* + *@return true if the color has been set successfully. + */ + virtual void setColor(QColor color) { } + /** * @brief adds the information that a file has been installed into this mod * @param modId id of the mod installed diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 1d84e2c8..d0f56a52 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -90,6 +90,7 @@ void ModInfoRegular::readMeta() m_Validated = metaFile.value("validated", false).toBool(); m_URL = metaFile.value("url", "").toString(); m_LastNexusQuery = QDateTime::fromString(metaFile.value("lastNexusQuery", "").toString(), Qt::ISODate); + m_Color = metaFile.value("color",QColor()).value(); if (metaFile.contains("endorsed")) { if (metaFile.value("endorsed").canConvert()) { switch (metaFile.value("endorsed").toInt()) { @@ -153,6 +154,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); metaFile.setValue("converted", m_Converted); metaFile.setValue("validated", m_Validated); + metaFile.setValue("color", m_Color); if (m_EndorsedState != ENDORSED_UNKNOWN) { metaFile.setValue("endorsed", m_EndorsedState); } @@ -397,6 +399,17 @@ void ModInfoRegular::setNeverEndorse() } +void ModInfoRegular::setColor(QColor color) +{ + m_Color = color; + m_MetaInfoChanged = true; +} + +QColor ModInfoRegular::getColor() +{ + return m_Color; +} + bool ModInfoRegular::remove() { m_MetaInfoChanged = false; diff --git a/src/modinforegular.h b/src/modinforegular.h index 2f3eb941..78a6e58a 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -311,6 +311,10 @@ public: virtual QStringList archives() const; + virtual void setColor(QColor color); + + virtual QColor getColor(); + virtual void addInstalledFile(int modId, int fileId); /** @@ -355,9 +359,12 @@ private: QString m_URL; QString m_GameName; + QDateTime m_CreationTime; QDateTime m_LastNexusQuery; + QColor m_Color; + int m_NexusID; std::set> m_InstalledFileIDs; diff --git a/src/modlist.cpp b/src/modlist.cpp index 31ef9ddc..6caafeb2 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -383,12 +383,16 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const return QVariant(); } else if ((role == Qt::BackgroundRole) || (role == ViewMarkingScrollBar::DEFAULT_ROLE)) { + auto flags = modInfo->getFlags(); if (modInfo->getHighlight() & ModInfo::HIGHLIGHT_PLUGIN) { return QColor(0, 0, 255, 64); } else if (m_Overwrite.find(modIndex) != m_Overwrite.end()) { return QColor(0, 255, 0, 64); - } else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) { + } + else if (m_Overwritten.find(modIndex) != m_Overwritten.end()) { return QColor(255, 0, 0, 64); + } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end() && modInfo->getColor().isValid()) { + return modInfo->getColor(); } else { return QVariant(); } -- cgit v1.3.1 From ab95f78689e159722b79f991c7ef07c31cb3f958 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Sun, 28 Oct 2018 17:27:34 +0100 Subject: Added Reset color option for separators and changed the bahavior of "cancel" of the color selector dialog to keep previous color. --- src/mainwindow.cpp | 26 +++++++++++++++++++++++++- src/mainwindow.h | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3b2dfbb2..74eecf06 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2873,7 +2873,29 @@ void MainWindow::createSeparator_clicked() void MainWindow::setColor_clicked() { ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); - QColor color = QColorDialog::getColor(modInfo->getColor(),this); + QColor color = QColorDialog::getColor(modInfo->getColor(), this); + if (!color.isValid()) + return; + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + for (QModelIndex idx : selection->selectedRows()) { + ModInfo::Ptr info = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt()); + auto flags = info->getFlags(); + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()) + { + info->setColor(color); + } + } + } + else { + modInfo->setColor(color); + } +} + +void MainWindow::resetColor_clicked() +{ + ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); + QColor color = QColor(); QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { for (QModelIndex idx : selection->selectedRows()) { @@ -3682,6 +3704,8 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); + if(info->getColor().isValid()) + menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { // nop, nothing to do with this mod diff --git a/src/mainwindow.h b/src/mainwindow.h index 02e368d7..53db447a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -409,6 +409,7 @@ private slots: void renameMod_clicked(); void removeMod_clicked(); void setColor_clicked(); + void resetColor_clicked(); void backupMod_clicked(); void reinstallMod_clicked(); void endorse_clicked(); -- cgit v1.3.1 From eb26120332433c73716531e6eaae798aeae33c1b Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 31 Oct 2018 14:53:24 -0500 Subject: Add send to top/bottom options for the mod list --- src/mainwindow.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++---------- src/mainwindow.h | 2 ++ src/modlist.h | 3 +-- 3 files changed, 51 insertions(+), 12 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 74eecf06..24def4ef 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2652,7 +2652,7 @@ void MainWindow::modOpenPrev(int tab) ModInfo::Ptr mod = ModInfo::getByIndex(m_ContextRow); std::vector flags = mod->getFlags(); if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || - (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || + (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end()) || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end())) { // skip overwrite and backups and separators modOpenPrev(tab); @@ -3686,6 +3686,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu = new QMenu(this); allMods->setTitle(tr("All Mods")); menu->addMenu(allMods); + menu->addSeparator(); ModInfo::Ptr info = ModInfo::getByIndex(m_ContextRow); std::vector flags = info->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) { @@ -3699,38 +3700,43 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked())); menu->addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked())); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_SEPARATOR) != flags.end()){ - menu->addSeparator(); menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); + menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); + menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addSeparator(); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); if(info->getColor().isValid()) menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { - // nop, nothing to do with this mod + menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); + menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); } else { QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); populateMenuCategories(addRemoveCategoriesMenu, 0); connect(addRemoveCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(addRemoveCategories_MenuHandler())); addMenuAsPushButton(menu, addRemoveCategoriesMenu); - //Removed as it was redundant, just making the categories look more complicated. - /* + //Removed as it was redundant, just making the categories look more complicated. + /* QMenu *replaceCategoriesMenu = new QMenu(tr("Replace Categories")); populateMenuCategories(replaceCategoriesMenu, 0); connect(replaceCategoriesMenu, SIGNAL(aboutToHide()), this, SLOT(replaceCategories_MenuHandler())); addMenuAsPushButton(menu, replaceCategoriesMenu); - */ + */ QMenu *primaryCategoryMenu = new QMenu(tr("Primary Category")); connect(primaryCategoryMenu, SIGNAL(aboutToShow()), this, SLOT(addPrimaryCategoryCandidates())); addMenuAsPushButton(menu, primaryCategoryMenu); menu->addSeparator(); + if (info->downgradeAvailable()) { menu->addAction(tr("Change versioning scheme"), this, SLOT(changeVersioningScheme())); } + if (info->updateAvailable() || info->downgradeAvailable()) { if (info->updateIgnored()) { menu->addAction(tr("Un-ignore update"), this, SLOT(unignoreUpdate())); @@ -3746,13 +3752,17 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator(); + menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); + menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + + menu->addSeparator(); + menu->addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Reinstall Mod"), this, SLOT(reinstallMod_clicked())); - menu->addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); + menu->addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked())); menu->addAction(tr("Create Backup"), this, SLOT(backupMod_clicked())); - - menu->addSeparator(); + menu->addSeparator(); if (info->getNexusID() > 0) { switch (info->endorsedState()) { @@ -3774,7 +3784,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) } } - menu->addSeparator(); + menu->addSeparator(); std::vector flags = info->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_INVALID) != flags.end()) { @@ -5566,3 +5576,31 @@ void MainWindow::on_clearFiltersButton_clicked() { deselectFilters(); } + +void MainWindow::sendModToTop_clicked() +{ + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + std::vector modsToMove; + for (QModelIndex idx : selection->selectedRows()) { + modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); + } + m_OrganizerCore.modList()->changeModPriority(modsToMove, 0); + } else { + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, 0); + } +} + +void MainWindow::sendModToBottom_clicked() +{ + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + std::vector modsToMove; + for (QModelIndex idx : selection->selectedRows()) { + modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); + } + m_OrganizerCore.modList()->changeModPriority(modsToMove, INT_MAX); + } else { + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, INT_MAX); + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 53db447a..923a8330 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -423,6 +423,8 @@ private slots: void information_clicked(); void enableSelectedMods_clicked(); void disableSelectedMods_clicked(); + void sendModToTop_clicked(); + void sendModToBottom_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); diff --git a/src/modlist.h b/src/modlist.h index 15376ed5..caad8c61 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -106,6 +106,7 @@ public: static QString getColumnName(int column); void changeModPriority(int sourceIndex, int newPriority); + void changeModPriority(std::vector sourceIndices, int newPriority); void setOverwriteMarkers(const std::set &overwrite, const std::set &overwritten); void setPluginContainer(PluginContainer *pluginContainer); @@ -266,8 +267,6 @@ private: bool testValid(const QString &modDir); - void changeModPriority(std::vector sourceIndices, int newPriority); - QVariant getOverwriteData(int column, int role) const; QString getFlagText(ModInfo::EFlag flag, ModInfo::Ptr modInfo) const; -- cgit v1.3.1 From 5de173ba1ae9531aaca0c0f022a2b0dae1c09250 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Wed, 31 Oct 2018 17:05:05 -0500 Subject: Add send to top/bottom options for the plugin list --- src/mainwindow.cpp | 15 ++++++++++ src/mainwindow.h | 2 ++ src/pluginlist.cpp | 88 +++++++++++++++++++++++++++++++++++++----------------- src/pluginlist.h | 12 ++++++++ 4 files changed, 90 insertions(+), 27 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 24def4ef..d279da91 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4341,6 +4341,16 @@ void MainWindow::disableSelectedPlugins_clicked() m_OrganizerCore.pluginList()->disableSelected(ui->espList->selectionModel()); } +void MainWindow::sendSelectedPluginsToTop_clicked() +{ + m_OrganizerCore.pluginList()->sendToTop(ui->espList->selectionModel()); +} + +void MainWindow::sendSelectedPluginsToBottom_clicked() +{ + m_OrganizerCore.pluginList()->sendToBottom(ui->espList->selectionModel()); +} + void MainWindow::enableSelectedMods_clicked() { @@ -4966,6 +4976,11 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addAction(tr("Enable all"), m_OrganizerCore.pluginList(), SLOT(enableAll())); menu.addAction(tr("Disable all"), m_OrganizerCore.pluginList(), SLOT(disableAll())); + menu.addSeparator(); + + menu.addAction(tr("Send to top"), this, SLOT(sendSelectedPluginsToTop_clicked())); + menu.addAction(tr("Send to bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + QItemSelection currentSelection = ui->espList->selectionModel()->selection(); bool hasLocked = false; bool hasUnlocked = false; diff --git a/src/mainwindow.h b/src/mainwindow.h index 923a8330..9dee2953 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -439,6 +439,8 @@ private slots: // pluginlist context menu void enableSelectedPlugins_clicked(); void disableSelectedPlugins_clicked(); + void sendSelectedPluginsToTop_clicked(); + void sendSelectedPluginsToBottom_clicked(); void linkToolbar(); void linkDesktop(); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 18e40a6e..4097ba98 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -289,21 +289,26 @@ void PluginList::enableESP(const QString &name, bool enable) } } +int PluginList::findPluginByPriority(int priority) +{ + for (int i = 0; i < m_ESPs.size(); i++ ) { + if (m_ESPs[i].m_Priority == priority) { + return i; + } + } + qCritical(QString("No plugin with priority %1").arg(priority).toLocal8Bit()); + return -1; +} + void PluginList::enableSelected(const QItemSelectionModel *selectionModel) { - if (selectionModel->hasSelection()){ + if (selectionModel->hasSelection()) { bool dirty = false; for (auto row : selectionModel->selectedRows(COL_PRIORITY)) { - int rowPriority = row.data().toInt(); - for (int i = 0; i < m_ESPs.size(); i++) { - if (m_ESPs[i].m_Priority == rowPriority) { - if (!m_ESPs[i].m_Enabled) { - m_ESPs[i].m_Enabled = true; - dirty = true; - } - - break; - } + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_Enabled) { + m_ESPs[rowIndex].m_Enabled = true; + dirty = true; } } if (dirty) emit writePluginsList(); @@ -312,18 +317,13 @@ void PluginList::enableSelected(const QItemSelectionModel *selectionModel) void PluginList::disableSelected(const QItemSelectionModel *selectionModel) { - if (selectionModel->hasSelection()){ + if (selectionModel->hasSelection()) { bool dirty = false; for (auto row : selectionModel->selectedRows(COL_PRIORITY)) { - int rowPriority = row.data().toInt(); - for (int i = 0; i < m_ESPs.size(); i++) { - if (m_ESPs[i].m_Priority == rowPriority) { - if (!m_ESPs[i].m_ForceEnabled && m_ESPs[i].m_Enabled) { - m_ESPs[i].m_Enabled = false; - dirty = true; - } - break; - } + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_ForceEnabled && m_ESPs[rowIndex].m_Enabled) { + m_ESPs[rowIndex].m_Enabled = false; + dirty = true; } } if (dirty) emit writePluginsList(); @@ -356,6 +356,40 @@ void PluginList::disableAll() } } +void PluginList::sendToTop(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()) { + std::vector pluginsToMove; + for (auto row: selectionModel->selectedRows(COL_PRIORITY)) { + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_ForceEnabled) { + pluginsToMove.push_back(rowIndex); + } + } + if (pluginsToMove.size()) { + changePluginPriority(pluginsToMove, 0); + emit SIGNAL(displayPlugin(0)); + } + } +} + +void PluginList::sendToBottom(const QItemSelectionModel *selectionModel) +{ + if (selectionModel->hasSelection()) { + std::vector pluginsToMove; + for (auto row: selectionModel->selectedRows(COL_PRIORITY)) { + int rowIndex = findPluginByPriority(row.data().toInt()); + if (!m_ESPs[rowIndex].m_ForceEnabled) { + pluginsToMove.push_back(rowIndex); + } + } + if (pluginsToMove.size()) { + changePluginPriority(pluginsToMove, INT_MAX); + emit SIGNAL(displayPlugin(INT_MAX)); + } + } +} + bool PluginList::isEnabled(const QString &name) { @@ -1092,6 +1126,12 @@ void PluginList::setPluginPriority(int row, int &newPriority) { int newPriorityTemp = newPriority; + // enforce valid range + if (newPriorityTemp < 0) + newPriorityTemp = 0; + else if (newPriorityTemp >= static_cast(m_ESPsByPriority.size())) + newPriorityTemp = static_cast(m_ESPsByPriority.size()) - 1; + if (!m_ESPs[row].m_IsMaster && !m_ESPs[row].m_IsLight) { // don't allow esps to be moved above esms while ((newPriorityTemp < static_cast(m_ESPsByPriority.size() - 1)) && @@ -1113,12 +1153,6 @@ void PluginList::setPluginPriority(int row, int &newPriority) } } - // enforce valid range - if (newPriorityTemp < 0) - newPriorityTemp = 0; - else if (newPriorityTemp >= static_cast(m_ESPsByPriority.size())) - newPriorityTemp = static_cast(m_ESPsByPriority.size()) - 1; - try { int oldPriority = m_ESPs.at(row).m_Priority; if (newPriorityTemp > oldPriority) { diff --git a/src/pluginlist.h b/src/pluginlist.h index 03d6426a..009c9153 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -264,6 +264,16 @@ public slots: **/ void disableAll(); + /** + * @brief moves selected plugins to the top (lowest priority) + **/ + void sendToTop(const QItemSelectionModel *selectionModel); + + /** + * @brief moves selected plugins to the bottom (highest priority) + **/ + void sendToBottom(const QItemSelectionModel *selectionModel); + /** * @brief The currently managed game has changed * @param gamePlugin @@ -340,6 +350,8 @@ private: void fixPriorities(); + int findPluginByPriority(int priority); + private: std::vector m_ESPs; -- cgit v1.3.1 From 3dbfba91e1618e6cdf3ed5ce7ff7955376df03eb Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Thu, 1 Nov 2018 14:51:14 -0500 Subject: Add separators according to context location of context menu --- src/mainwindow.cpp | 14 ++++++++++++++ src/mainwindow.h | 1 + src/organizercore.cpp | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 5e4bb86f..5b257977 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -204,6 +204,7 @@ MainWindow::MainWindow(QSettings &initSettings , m_CategoryFactory(CategoryFactory::instance()) , m_ContextItem(nullptr) , m_ContextAction(nullptr) + , m_ContextRow(-1) , m_CurrentSaveView(nullptr) , m_OrganizerCore(organizerCore) , m_PluginContainer(pluginContainer) @@ -328,6 +329,7 @@ MainWindow::MainWindow(QSettings &initSettings ui->linkButton->setMenu(linkMenu); ui->listOptionsBtn->setMenu(modListContextMenu()); + connect(ui->listOptionsBtn, SIGNAL(pressed()), this, SLOT(on_listOptionsBtn_pressed())); ui->openFolderMenu->setMenu(openFolderMenu()); @@ -2866,8 +2868,15 @@ void MainWindow::createSeparator_clicked() { return; } + int newPriority; + if (m_ContextRow >= 0) { + newPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); + } if (m_OrganizerCore.createMod(name) == nullptr) { return; } m_OrganizerCore.refreshModList(); + if (m_ContextRow >= 0) { + m_OrganizerCore.modList()->changeModPriority(ModInfo::getIndex(name), newPriority); + } } void MainWindow::setColor_clicked() @@ -3023,6 +3032,11 @@ void MainWindow::on_modList_doubleClicked(const QModelIndex &index) } } +void MainWindow::on_listOptionsBtn_pressed() +{ + m_ContextRow = -1; +} + void MainWindow::on_espList_doubleClicked(const QModelIndex &index) { if (!index.isValid()) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 9dee2953..c595575e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -590,6 +590,7 @@ private slots: // ui slots void on_executablesListBox_currentIndexChanged(int index); void on_modList_customContextMenuRequested(const QPoint &pos); void on_modList_doubleClicked(const QModelIndex &index); + void on_listOptionsBtn_pressed(); void on_espList_doubleClicked(const QModelIndex &index); void on_profileBox_currentIndexChanged(int index); void on_savegameList_customContextMenuRequested(const QPoint &pos); diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 1fafd4c1..fe720a0c 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -1184,7 +1184,7 @@ QStringList OrganizerCore::modsSortedByProfilePriority() const { QStringList res; for (int i = currentProfile()->getPriorityMinimum(); - i < currentProfile()->getPriorityMinimum() + currentProfile()->numRegularMods(); + i < currentProfile()->getPriorityMinimum() + (int)currentProfile()->numRegularMods(); ++i) { int modIndex = currentProfile()->modIndexByPriority(i); res.push_back(ModInfo::getByIndex(modIndex)->name()); -- cgit v1.3.1 From a48a20f13fd20e599c2055752bae5065bce43700 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 13:10:41 -0600 Subject: Add context menu option to send to a specific priority --- src/mainwindow.cpp | 84 ++++++++++++++++++++++++++++++++++++++---------------- src/mainwindow.h | 11 +++++-- src/pluginlist.cpp | 23 ++------------- src/pluginlist.h | 9 ++---- 4 files changed, 72 insertions(+), 55 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7c7d9c95..3d7cc13b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3683,6 +3683,26 @@ QMenu *MainWindow::modListContextMenu() return menu; } +QMenu *MainWindow::modSendToContextMenu() +{ + QMenu *menu = new QMenu(this); + menu->setTitle(tr("Send to")); + menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); + menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); + menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); + return menu; +} + +QMenu *MainWindow::pluginSendToContextMenu() +{ + QMenu *menu = new QMenu(this); + menu->setTitle(tr("Send to")); + menu->addAction(tr("Top"), this, SLOT(sendSelectedPluginsToTop_clicked())); + menu->addAction(tr("Bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + menu->addAction(tr("Priority..."), this, SLOT(sendSelectedPluginsToPriority_clicked())); + return menu; +} + void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) { try { @@ -3726,16 +3746,14 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); - menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); - menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addMenu(modSendToContextMenu()); menu->addSeparator(); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); if(info->getColor().isValid()) menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { - menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); - menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addMenu(modSendToContextMenu()); } else { QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); populateMenuCategories(addRemoveCategoriesMenu, 0); @@ -3767,8 +3785,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator(); - menu->addAction(tr("Send to Top"), this, SLOT(sendModToTop_clicked())); - menu->addAction(tr("Send to Bottom"), this, SLOT(sendModToBottom_clicked())); + menu->addMenu(modSendToContextMenu()); menu->addSeparator(); @@ -4358,12 +4375,23 @@ void MainWindow::disableSelectedPlugins_clicked() void MainWindow::sendSelectedPluginsToTop_clicked() { - m_OrganizerCore.pluginList()->sendToTop(ui->espList->selectionModel()); + m_OrganizerCore.pluginList()->sendToPriority(ui->espList->selectionModel(), 0); } void MainWindow::sendSelectedPluginsToBottom_clicked() { - m_OrganizerCore.pluginList()->sendToBottom(ui->espList->selectionModel()); + m_OrganizerCore.pluginList()->sendToPriority(ui->espList->selectionModel(), INT_MAX); +} + +void MainWindow::sendSelectedPluginsToPriority_clicked() +{ + bool ok; + int newPriority = QInputDialog::getInt(this, + tr("Set Priority"), tr("Set the priority of the selected mods"), + 0, 0, INT_MAX, 1, &ok); + if (!ok) return; + + m_OrganizerCore.pluginList()->sendToPriority(ui->espList->selectionModel(), newPriority); } @@ -4993,8 +5021,7 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addSeparator(); - menu.addAction(tr("Send to top"), this, SLOT(sendSelectedPluginsToTop_clicked())); - menu.addAction(tr("Send to bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + menu.addMenu(pluginSendToContextMenu()); QItemSelection currentSelection = ui->espList->selectionModel()->selection(); bool hasLocked = false; @@ -5607,30 +5634,37 @@ void MainWindow::on_clearFiltersButton_clicked() deselectFilters(); } -void MainWindow::sendModToTop_clicked() +void MainWindow::sendSelectedModsToPriority(int newPriority) { QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { std::vector modsToMove; for (QModelIndex idx : selection->selectedRows()) { - modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); + modsToMove.push_back(idx.data().toInt()); } - m_OrganizerCore.modList()->changeModPriority(modsToMove, 0); + m_OrganizerCore.modList()->changeModPriority(modsToMove, newPriority); } else { - m_OrganizerCore.modList()->changeModPriority(m_ContextRow, 0); + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, newPriority); } } -void MainWindow::sendModToBottom_clicked() +void MainWindow::sendSelectedModsToTop_clicked() { - QItemSelectionModel *selection = ui->modList->selectionModel(); - if (selection->hasSelection() && selection->selectedRows().count() > 1) { - std::vector modsToMove; - for (QModelIndex idx : selection->selectedRows()) { - modsToMove.push_back(idx.data(Qt::UserRole + 1).toInt()); - } - m_OrganizerCore.modList()->changeModPriority(modsToMove, INT_MAX); - } else { - m_OrganizerCore.modList()->changeModPriority(m_ContextRow, INT_MAX); - } + sendSelectedModsToPriority(0); +} + +void MainWindow::sendSelectedModsToBottom_clicked() +{ + sendSelectedModsToPriority(INT_MAX); +} + +void MainWindow::sendSelectedModsToPriority_clicked() +{ + bool ok; + int newPriority = QInputDialog::getInt(this, + tr("Set Priority"), tr("Set the priority of the selected mods"), + 0, 0, INT_MAX, 1, &ok); + if (!ok) return; + + sendSelectedModsToPriority(newPriority); } diff --git a/src/mainwindow.h b/src/mainwindow.h index c595575e..85b3fc2d 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -278,6 +278,8 @@ private: QString queryRestore(const QString &filePath); QMenu *modListContextMenu(); + QMenu *modSendToContextMenu(); + QMenu *pluginSendToContextMenu(); QMenu *openFolderMenu(); @@ -294,6 +296,9 @@ private: bool registerWidgetState(const QString &name, QHeaderView *view, const char *oldSettingName = nullptr); + void sendSelectedModsToPriority(int newPriority); + void sendSelectedPluginsToPriority(int newPriority); + private: static const char *PATTERN_BACKUP_GLOB; @@ -423,8 +428,9 @@ private slots: void information_clicked(); void enableSelectedMods_clicked(); void disableSelectedMods_clicked(); - void sendModToTop_clicked(); - void sendModToBottom_clicked(); + void sendSelectedModsToTop_clicked(); + void sendSelectedModsToBottom_clicked(); + void sendSelectedModsToPriority_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); @@ -441,6 +447,7 @@ private slots: void disableSelectedPlugins_clicked(); void sendSelectedPluginsToTop_clicked(); void sendSelectedPluginsToBottom_clicked(); + void sendSelectedPluginsToPriority_clicked(); void linkToolbar(); void linkDesktop(); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 21e716d3..480cb014 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -359,7 +359,7 @@ void PluginList::disableAll() } } -void PluginList::sendToTop(const QItemSelectionModel *selectionModel) +void PluginList::sendToPriority(const QItemSelectionModel *selectionModel, int newPriority) { if (selectionModel->hasSelection()) { std::vector pluginsToMove; @@ -370,30 +370,11 @@ void PluginList::sendToTop(const QItemSelectionModel *selectionModel) } } if (pluginsToMove.size()) { - changePluginPriority(pluginsToMove, 0); - emit SIGNAL(displayPlugin(0)); + changePluginPriority(pluginsToMove, newPriority); } } } -void PluginList::sendToBottom(const QItemSelectionModel *selectionModel) -{ - if (selectionModel->hasSelection()) { - std::vector pluginsToMove; - for (auto row: selectionModel->selectedRows(COL_PRIORITY)) { - int rowIndex = findPluginByPriority(row.data().toInt()); - if (!m_ESPs[rowIndex].m_ForceEnabled) { - pluginsToMove.push_back(rowIndex); - } - } - if (pluginsToMove.size()) { - changePluginPriority(pluginsToMove, INT_MAX); - emit SIGNAL(displayPlugin(INT_MAX)); - } - } -} - - bool PluginList::isEnabled(const QString &name) { std::map::iterator iter = m_ESPsByName.find(name.toLower()); diff --git a/src/pluginlist.h b/src/pluginlist.h index f7817c37..228ccdec 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -265,14 +265,9 @@ public slots: void disableAll(); /** - * @brief moves selected plugins to the top (lowest priority) + * @brief moves selected plugins to specified priority **/ - void sendToTop(const QItemSelectionModel *selectionModel); - - /** - * @brief moves selected plugins to the bottom (highest priority) - **/ - void sendToBottom(const QItemSelectionModel *selectionModel); + void sendToPriority(const QItemSelectionModel *selectionModel, int priority); /** * @brief The currently managed game has changed -- cgit v1.3.1 From 21d61e617bb03bcb1f73b16d42e52742a3b0ae67 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 4 Nov 2018 13:39:22 -0600 Subject: Hide "send to" context menu options when not sorting by priority --- src/mainwindow.cpp | 51 ++++++++++++++++++++++++++++----------------------- src/mainwindow.h | 4 ++-- 2 files changed, 30 insertions(+), 25 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3d7cc13b..92127e0a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3683,24 +3683,34 @@ QMenu *MainWindow::modListContextMenu() return menu; } -QMenu *MainWindow::modSendToContextMenu() +void MainWindow::addModSendToContextMenu(QMenu *menu) { - QMenu *menu = new QMenu(this); - menu->setTitle(tr("Send to")); - menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); - menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); - menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); - return menu; + if (m_ModListSortProxy->sortColumn() != ModList::COL_PRIORITY) + return; + + QMenu *sub_menu = new QMenu(this); + sub_menu->setTitle(tr("Send to")); + sub_menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); + sub_menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); + sub_menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); + + menu->addMenu(sub_menu); + menu->addSeparator(); } -QMenu *MainWindow::pluginSendToContextMenu() +void MainWindow::addPluginSendToContextMenu(QMenu *menu) { - QMenu *menu = new QMenu(this); - menu->setTitle(tr("Send to")); - menu->addAction(tr("Top"), this, SLOT(sendSelectedPluginsToTop_clicked())); - menu->addAction(tr("Bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); - menu->addAction(tr("Priority..."), this, SLOT(sendSelectedPluginsToPriority_clicked())); - return menu; + if (m_PluginListSortProxy->sortColumn() != PluginList::COL_PRIORITY) + return; + + QMenu *sub_menu = new QMenu(this); + sub_menu->setTitle(tr("Send to")); + sub_menu->addAction(tr("Top"), this, SLOT(sendSelectedPluginsToTop_clicked())); + sub_menu->addAction(tr("Bottom"), this, SLOT(sendSelectedPluginsToBottom_clicked())); + sub_menu->addAction(tr("Priority..."), this, SLOT(sendSelectedPluginsToPriority_clicked())); + + menu->addMenu(sub_menu); + menu->addSeparator(); } void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) @@ -3746,14 +3756,13 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addAction(tr("Rename Separator..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Remove Separator..."), this, SLOT(removeMod_clicked())); menu->addSeparator(); - menu->addMenu(modSendToContextMenu()); - menu->addSeparator(); + addModSendToContextMenu(menu); menu->addAction(tr("Select Color..."), this, SLOT(setColor_clicked())); if(info->getColor().isValid()) menu->addAction(tr("Reset Color"), this, SLOT(resetColor_clicked())); menu->addSeparator(); } else if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) != flags.end()) { - menu->addMenu(modSendToContextMenu()); + addModSendToContextMenu(menu); } else { QMenu *addRemoveCategoriesMenu = new QMenu(tr("Change Categories")); populateMenuCategories(addRemoveCategoriesMenu, 0); @@ -3785,9 +3794,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) menu->addSeparator(); - menu->addMenu(modSendToContextMenu()); - - menu->addSeparator(); + addModSendToContextMenu(menu); menu->addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked())); menu->addAction(tr("Reinstall Mod"), this, SLOT(reinstallMod_clicked())); @@ -5021,7 +5028,7 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addSeparator(); - menu.addMenu(pluginSendToContextMenu()); + addPluginSendToContextMenu(&menu); QItemSelection currentSelection = ui->espList->selectionModel()->selection(); bool hasLocked = false; @@ -5037,8 +5044,6 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) } } - menu.addSeparator(); - if (hasLocked) { menu.addAction(tr("Unlock load order"), this, SLOT(unlockESPIndex())); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 85b3fc2d..06219a5a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -278,8 +278,8 @@ private: QString queryRestore(const QString &filePath); QMenu *modListContextMenu(); - QMenu *modSendToContextMenu(); - QMenu *pluginSendToContextMenu(); + void addModSendToContextMenu(QMenu *menu); + void addPluginSendToContextMenu(QMenu *menu); QMenu *openFolderMenu(); -- cgit v1.3.1 From c0b55690bc47102459ef7b1720d69945d6523d08 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sun, 2 Dec 2018 20:26:26 -0600 Subject: Add "send to separator..." option for mods --- src/CMakeLists.txt | 3 ++ src/listdialog.cpp | 46 ++++++++++++++++++++++++++ src/listdialog.h | 25 ++++++++++++++ src/listdialog.ui | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mainwindow.cpp | 57 +++++++++++++++++++++++++++++--- src/mainwindow.h | 1 + src/organizer.pro | 9 +++-- 7 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 src/listdialog.cpp create mode 100644 src/listdialog.h create mode 100644 src/listdialog.ui (limited to 'src/mainwindow.h') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 372b9519..3f004ddc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -91,6 +91,7 @@ SET(organizer_SRCS usvfsconnector.cpp eventfilter.cpp moshortcut.cpp + listdialog.cpp shared/windows_error.cpp shared/error_report.cpp @@ -185,6 +186,7 @@ SET(organizer_HDRS eventfilter.h descriptionpage.h moshortcut.h + listdialog.h shared/windows_error.h shared/error_report.h @@ -225,6 +227,7 @@ SET(organizer_UIS previewdialog.ui browserdialog.ui aboutdialog.ui + listdialog.ui ) SET(organizer_QRCS diff --git a/src/listdialog.cpp b/src/listdialog.cpp new file mode 100644 index 00000000..4acfa5de --- /dev/null +++ b/src/listdialog.cpp @@ -0,0 +1,46 @@ +/* +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see . +*/ + +#include "listdialog.h" +#include "ui_listdialog.h" + +ListDialog::ListDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::ListDialog) +{ + ui->setupUi(this); +} + +ListDialog::~ListDialog() +{ + delete ui; +} + +void ListDialog::setChoices(QStringList choices) +{ + ui->listWidget->clear(); + ui->listWidget->addItems(choices); +} + +QString ListDialog::getChoice() const +{ + if (ui->listWidget->selectedItems().length()) { + return ui->listWidget->currentItem()->text(); + } else { + return ""; + } +} diff --git a/src/listdialog.h b/src/listdialog.h new file mode 100644 index 00000000..5e826a30 --- /dev/null +++ b/src/listdialog.h @@ -0,0 +1,25 @@ +#ifndef LISTDIALOG_H +#define LISTDIALOG_H + +#include + +namespace Ui { +class ListDialog; +} + +class ListDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ListDialog(QWidget *parent = nullptr); + ~ListDialog(); + + void setChoices(QStringList choices); + QString getChoice() const; + +private: + Ui::ListDialog *ui; +}; + +#endif // LISTDIALOG_H diff --git a/src/listdialog.ui b/src/listdialog.ui new file mode 100644 index 00000000..38819c87 --- /dev/null +++ b/src/listdialog.ui @@ -0,0 +1,96 @@ + + + ListDialog + + + + 0 + 0 + 260 + 340 + + + + Dialog + + + + + 90 + 299 + 161 + 32 + + + + Qt::LeftToRight + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 10 + 240 + 280 + + + + + 0 + 0 + + + + + 240 + 280 + + + + QAbstractItemView::ScrollPerPixel + + + + + + + buttonBox + accepted() + ListDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ListDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 704ce838..44fc0bf3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -85,6 +85,7 @@ along with Mod Organizer. If not, see . #include #include #include "localsavegames.h" +#include "listdialog.h" #include #include @@ -1149,7 +1150,7 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) { bool isDirectory = false; - { + { for (const FileEntry::Ptr current : directoryEntry.getFiles()) { if (conflictsOnly && (current->getAlternatives().size() == 0)) { continue; @@ -3721,6 +3722,7 @@ void MainWindow::addModSendToContextMenu(QMenu *menu) sub_menu->addAction(tr("Top"), this, SLOT(sendSelectedModsToTop_clicked())); sub_menu->addAction(tr("Bottom"), this, SLOT(sendSelectedModsToBottom_clicked())); sub_menu->addAction(tr("Priority..."), this, SLOT(sendSelectedModsToPriority_clicked())); + sub_menu->addAction(tr("Separator..."), this, SLOT(sendSelectedModsToSeparator_clicked())); menu->addMenu(sub_menu); menu->addSeparator(); @@ -4574,7 +4576,7 @@ void MainWindow::on_dataTree_customContextMenuRequested(const QPoint &pos) m_ContextItem = dataTree->itemAt(pos.x(), pos.y()); QMenu menu; - if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0) + if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0) && (m_ContextItem->data(0, Qt::UserRole + 3).toBool() != true)) { menu.addAction(tr("Open/Execute"), this, SLOT(openDataFile())); menu.addAction(tr("Add as Executable"), this, SLOT(addAsExecutable())); @@ -5673,8 +5675,8 @@ void MainWindow::sendSelectedModsToPriority(int newPriority) QItemSelectionModel *selection = ui->modList->selectionModel(); if (selection->hasSelection() && selection->selectedRows().count() > 1) { std::vector modsToMove; - for (QModelIndex idx : selection->selectedRows()) { - modsToMove.push_back(idx.data().toInt()); + for (auto idx : selection->selectedRows(ModList::COL_PRIORITY)) { + modsToMove.push_back(m_OrganizerCore.currentProfile()->modIndexByPriority(idx.data().toInt())); } m_OrganizerCore.modList()->changeModPriority(modsToMove, newPriority); } else { @@ -5702,3 +5704,50 @@ void MainWindow::sendSelectedModsToPriority_clicked() sendSelectedModsToPriority(newPriority); } + +void MainWindow::sendSelectedModsToSeparator_clicked() +{ + QStringList separators; + for (auto mod : m_OrganizerCore.modList()->allMods()) { + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(mod)); + if (modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)) { + separators << mod.chopped(10); + } + } + + ListDialog dialog(this); + dialog.setChoices(separators); + if (dialog.exec() == QDialog::Accepted) { + QString result = dialog.getChoice(); + if (!result.isEmpty()) { + result += "_separator"; + + int newPriority = INT_MAX; + bool foundSection = false; + for (auto mod : m_OrganizerCore.modsSortedByProfilePriority()) { + unsigned int modIndex = ModInfo::getIndex(mod); + ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex); + if (!foundSection && result.compare(mod) == 0) { + foundSection = true; + } else if (foundSection && modInfo->hasFlag(ModInfo::FLAG_SEPARATOR)) { + newPriority = m_OrganizerCore.currentProfile()->getModPriority(modIndex); + break; + } + } + + QItemSelectionModel *selection = ui->modList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 1) { + std::vector modsToMove; + for (QModelIndex idx : selection->selectedRows(ModList::COL_PRIORITY)) { + modsToMove.push_back(m_OrganizerCore.currentProfile()->modIndexByPriority(idx.data().toInt())); + } + m_OrganizerCore.modList()->changeModPriority(modsToMove, newPriority); + } else { + int oldPriority = m_OrganizerCore.currentProfile()->getModPriority(m_ContextRow); + if (oldPriority < newPriority) + --newPriority; + m_OrganizerCore.modList()->changeModPriority(m_ContextRow, newPriority); + } + } + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 06219a5a..62ffe3de 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -431,6 +431,7 @@ private slots: void sendSelectedModsToTop_clicked(); void sendSelectedModsToBottom_clicked(); void sendSelectedModsToPriority_clicked(); + void sendSelectedModsToSeparator_clicked(); // savegame context menu void deleteSavegame_clicked(); void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets); diff --git a/src/organizer.pro b/src/organizer.pro index 0ef2638b..582fde9f 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -91,7 +91,8 @@ SOURCES += \ modinforegular.cpp \ modinfobackup.cpp \ modinfooverwrite.cpp \ - modinfoforeign.cpp + modinfoforeign.cpp \ + listdialog.cpp HEADERS += \ @@ -167,7 +168,8 @@ HEADERS += \ modinforegular.h \ modinfobackup.h \ modinfooverwrite.h \ - modinfoforeign.h + modinfoforeign.h \ + listdialog.h FORMS += \ transfersavesdialog.ui \ @@ -196,7 +198,8 @@ FORMS += \ problemsdialog.ui \ previewdialog.ui \ browserdialog.ui \ - aboutdialog.ui + aboutdialog.ui \ + listdialog.ui RESOURCES += \ resources.qrc \ -- cgit v1.3.1 From 9d9dbd9f7e06f4abc3ad57f1574f98210ac65bc9 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Sat, 8 Dec 2018 14:46:42 -0600 Subject: Add shortcut to select name filters on mod list and plugin list --- src/mainwindow.cpp | 28 ++++++++++++++++++++++++++++ src/mainwindow.h | 3 +++ 2 files changed, 31 insertions(+) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9a40ce2e..c1e00feb 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -412,6 +412,8 @@ MainWindow::MainWindow(QSettings &initSettings new QShortcut(QKeySequence::Refresh, this, SLOT(refreshProfile_activated())); + new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F), this, SLOT(search_activated())); + new QShortcut(QKeySequence(Qt::Key_Escape), this, SLOT(searchClear_activated())); m_UpdateProblemsTimer.setSingleShot(true); connect(&m_UpdateProblemsTimer, SIGNAL(timeout()), this, SLOT(updateProblemsButton())); @@ -2862,6 +2864,32 @@ void MainWindow::refreshProfile_activated() m_OrganizerCore.profileRefresh(); } +void MainWindow::search_activated() +{ + if (ui->modList->hasFocus() || ui->modFilterEdit->hasFocus()) { + ui->modFilterEdit->setFocus(); + ui->modFilterEdit->setSelection(0, INT_MAX); + } + + if (ui->espList->hasFocus() || ui->espFilterEdit->hasFocus()) { + ui->espFilterEdit->setFocus(); + ui->espFilterEdit->setSelection(0, INT_MAX); + } +} + +void MainWindow::searchClear_activated() +{ + if (ui->modFilterEdit->hasFocus()) { + ui->modFilterEdit->clear(); + ui->modList->setFocus(); + } + + if (ui->espFilterEdit->hasFocus()) { + ui->espFilterEdit->clear(); + ui->espList->setFocus(); + } +} + void MainWindow::information_clicked() { try { diff --git a/src/mainwindow.h b/src/mainwindow.h index 62ffe3de..366765a2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -577,6 +577,9 @@ private slots: void modlistSelectionsChanged(const QItemSelection ¤t); void esplistSelectionsChanged(const QItemSelection ¤t); + void search_activated(); + void searchClear_activated(); + private slots: // ui slots // actions void on_actionAdd_Profile_triggered(); -- cgit v1.3.1 From 0af33ccddf1962ff7ba72edda3d0aef660914a3c Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 11 Dec 2018 16:26:41 +0100 Subject: Added "Open Origin in Explorer" and "Open Origin Info..." options to ESPList context menu. --- src/mainwindow.cpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mainwindow.h | 2 ++ 2 files changed, 70 insertions(+) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 935c3612..55ffedc0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2837,6 +2837,29 @@ void MainWindow::openExplorer_clicked() } } +void MainWindow::openOriginExplorer_clicked() +{ + QItemSelectionModel *selection = ui->espList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 0) { + for (QModelIndex idx : selection->selectedRows()) { + QString fileName = idx.data().toString(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } + } + else { + QModelIndex idx = selection->currentIndex(); + QString fileName = idx.data().toString(); + + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } +} + void MainWindow::openExplorer_activated() { if (ui->modList->hasFocus()) { @@ -3150,6 +3173,38 @@ void MainWindow::on_listOptionsBtn_pressed() m_ContextRow = -1; } +void MainWindow::openOriginInformation_clicked() +{ + try { + QItemSelectionModel *selection = ui->espList->selectionModel(); + if (selection->hasSelection() && selection->selectedRows().count() > 0) { + for (QModelIndex idx : selection->selectedRows()) { + QString fileName = idx.data().toString(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { + displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + } + } + } + else { + QModelIndex idx = selection->currentIndex(); + QString fileName = idx.data().toString(); + + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + std::vector flags = modInfo->getFlags(); + + if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) { + displayModInformation(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); + } + } + } + catch (const std::exception &e) { + reportError(e.what()); + } +} + void MainWindow::on_espList_doubleClicked(const QModelIndex &index) { if (!index.isValid()) { @@ -5175,6 +5230,19 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) menu.addAction(tr("Lock load order"), this, SLOT(lockESPIndex())); } + menu.addSeparator(); + menu.addAction(tr("Open Origin in Explorer"), this, SLOT(openOriginExplorer_clicked())); + + QModelIndex idx = ui->espList->selectionModel()->currentIndex(); + ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(idx.data().toString()))); + std::vector flags = modInfo->getFlags(); + + if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end()) { + menu.addSeparator(); + QAction *infoAction = menu.addAction(tr("Open Origin Info..."), this, SLOT(openOriginInformation_clicked())); + menu.setDefaultAction(infoAction); + } + try { menu.exec(ui->espList->mapToGlobal(pos)); } catch (const std::exception &e) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 366765a2..d5484400 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -425,6 +425,8 @@ private slots: void visitOnNexus_clicked(); void visitWebPage_clicked(); void openExplorer_clicked(); + void openOriginExplorer_clicked(); + void openOriginInformation_clicked(); void information_clicked(); void enableSelectedMods_clicked(); void disableSelectedMods_clicked(); -- cgit v1.3.1 From dac716bb86a9e4ff514fe7d939f33b397dc120e5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 14:15:37 -0600 Subject: Allow tool plugins to define a submenu with the display name Setting the display name to "/" will group plugins under the submenu. --- src/iuserinterface.h | 5 +++- src/mainwindow.cpp | 66 ++++++++++++++++++++++++++++++++++++++-------------- src/mainwindow.h | 3 ++- 3 files changed, 55 insertions(+), 19 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/iuserinterface.h b/src/iuserinterface.h index 7ce71c24..034fa029 100644 --- a/src/iuserinterface.h +++ b/src/iuserinterface.h @@ -8,6 +8,8 @@ #include #include +#include + class QSettings; class IUserInterface @@ -16,7 +18,8 @@ public: virtual void storeSettings(QSettings &settings) = 0; - virtual void registerPluginTool(MOBase::IPluginTool *tool) = 0; + virtual void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr) = 0; + virtual void registerPluginTools(std::vector toolPlugins) = 0; virtual void registerModPage(MOBase::IPluginModPage *modPage) = 0; virtual void installTranslator(const QString &name) = 0; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b06eb44d..61a745b2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -267,7 +267,7 @@ MainWindow::MainWindow(QSettings &initSettings // insert spacers ui->toolBar->insertWidget(action, spacer); m_Sep = action; - // m_Sep would only use the last seperator anyway, and we only have the one anyway? + // m_Sep would only use the last separator anyway, and we only have the one anyway? break; } } @@ -437,15 +437,7 @@ MainWindow::MainWindow(QSettings &initSettings installTranslator(QFileInfo(fileName).baseName()); } - std::vector toolPlugins = m_PluginContainer.plugins(); - std::sort(toolPlugins.begin(), toolPlugins.end(), - [](IPluginTool *left, IPluginTool *right){ - return left->displayName().toLower() < right->displayName().toLower(); - } - ); - for (IPluginTool *toolPlugin : toolPlugins) { - registerPluginTool(toolPlugin); - } + registerPluginTools(m_PluginContainer.plugins()); for (IPluginModPage *modPagePlugin : m_PluginContainer.plugins()) { registerModPage(modPagePlugin); @@ -1046,15 +1038,57 @@ void MainWindow::modPagePluginInvoke() } } -void MainWindow::registerPluginTool(IPluginTool *tool) +void MainWindow::registerPluginTool(IPluginTool *tool, QString name, QMenu *menu) { - QAction *action = new QAction(tool->icon(), tool->displayName(), ui->toolBar); + if (name.isEmpty()) + name = tool->displayName(); + + QAction *action = new QAction(tool->icon(), name, ui->toolBar); action->setToolTip(tool->tooltip()); tool->setParentWidget(this); action->setData(qVariantFromValue((QObject*)tool)); connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection); - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); - toolBtn->menu()->addAction(action); + + if (menu == nullptr) { + QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); + toolBtn->menu()->addAction(action); + } else { + menu->addAction(action); + } +} + +void MainWindow::registerPluginTools(std::vector toolPlugins) +{ + // Sort the plugins by display name + std::sort(toolPlugins.begin(), toolPlugins.end(), + [](IPluginTool *left, IPluginTool *right) { + return left->displayName().toLower() < right->displayName().toLower(); + } + ); + + // Group the plugins into submenus + QMap>> submenuMap; + for (auto toolPlugin : toolPlugins) { + QStringList toolName = toolPlugin->displayName().split("/"); + QString submenu = toolName[0]; + toolName.pop_front(); + submenuMap[submenu].append(QPair(toolName.join("/"), toolPlugin)); + } + + // Start registering plugins + for (auto submenuKey : submenuMap.keys()) { + if (submenuMap[submenuKey].length() > 1) { + QMenu *submenu = new QMenu(submenuKey, this); + for (auto info : submenuMap[submenuKey]) { + registerPluginTool(info.second, info.first, submenu); + } + QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); + toolBtn->menu()->addMenu(submenu); + } + else { + registerPluginTool(submenuMap[submenuKey].front().second); + } + } } void MainWindow::registerModPage(IPluginModPage *modPage) @@ -1171,7 +1205,6 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director std::wostringstream temp; temp << directorySoFar << "\\" << directoryEntry.getName(); { - std::vector::const_iterator current, end; directoryEntry.getSubDirectories(current, end); for (; current != end; ++current) { @@ -1275,7 +1308,6 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } } - //subTree->sortChildren(0, Qt::AscendingOrder); } @@ -2845,7 +2877,7 @@ void MainWindow::openOriginExplorer_clicked() QString fileName = idx.data().toString(); ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); std::vector flags = modInfo->getFlags(); - + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index d5484400..69d08337 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -132,7 +132,8 @@ public: void saveArchiveList(); - void registerPluginTool(MOBase::IPluginTool *tool); + void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr); + void registerPluginTools(std::vector toolPlugins); void registerModPage(MOBase::IPluginModPage *modPage); void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info); -- cgit v1.3.1 From ff51aa10c27ce09ddacccc84e09105f333a36abc Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 18 Dec 2018 00:10:37 +0100 Subject: Fixed performance issue of Data tab. --- src/mainwindow.cpp | 26 +++++++++++++++++--------- src/mainwindow.h | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9f9dc0fb..3e35ebec 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1198,9 +1198,11 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) } } -void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly) +void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon) { bool isDirectory = true; + //QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + //QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); std::wostringstream temp; temp << directorySoFar << "\\" << directoryEntry.getName(); @@ -1213,11 +1215,11 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director columns.append(""); if (!(*current)->isEmpty()) { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::DecorationRole, *folderIcon); directoryChild->setData(0, Qt::UserRole + 3, isDirectory); if (conflictsOnly) { - updateTo(directoryChild, temp.str(), **current, conflictsOnly); + updateTo(directoryChild, temp.str(), **current, conflictsOnly, fileIcon, folderIcon); if (directoryChild->childCount() != 0) { subTree->addChild(directoryChild); } @@ -1236,7 +1238,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } else { QTreeWidgetItem *directoryChild = new QTreeWidgetItem(columns); - directoryChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); + directoryChild->setData(0, Qt::DecorationRole, *folderIcon); directoryChild->setData(0, Qt::UserRole + 3, isDirectory); subTree->addChild(directoryChild); } @@ -1281,7 +1283,7 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director fileChild->setFont(1, font); } fileChild->setData(0, Qt::UserRole, ToQString(current->getFullPath())); - fileChild->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::File)); + fileChild->setData(0, Qt::DecorationRole, *fileIcon); fileChild->setData(0, Qt::UserRole + 3, isDirectory); fileChild->setData(0, Qt::UserRole + 1, isArchive); fileChild->setData(1, Qt::UserRole, source); @@ -1322,6 +1324,7 @@ void MainWindow::delayedRemove() void MainWindow::expandDataTreeItem(QTreeWidgetItem *item) { + if ((item->childCount() == 1) && (item->child(0)->data(0, Qt::UserRole).toString() == "__loaded_on_demand__")) { // read the data we need from the sub-item, then dispose of it QTreeWidgetItem *onDemandDataItem = item->child(0); @@ -1331,7 +1334,9 @@ void MainWindow::expandDataTreeItem(QTreeWidgetItem *item) std::wstring virtualPath = (path + L"\\").substr(6) + ToWString(item->text(0)); DirectoryEntry *dir = m_OrganizerCore.directoryStructure()->findSubDirectoryRecursive(virtualPath); if (dir != nullptr) { - updateTo(item, path, *dir, conflictsOnly); + QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); + updateTo(item, path, *dir, conflictsOnly, &fileIcon, &folderIcon); } else { qWarning("failed to update view of %ls", path.c_str()); } @@ -1406,12 +1411,14 @@ void MainWindow::refreshDataTree() { QCheckBox *conflictsBox = findChild("conflictsCheckBox"); QTreeWidget *tree = findChild("dataTree"); + QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); tree->clear(); QStringList columns("data"); columns.append(""); QTreeWidgetItem *subTree = new QTreeWidgetItem(columns); subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); - updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked()); + updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked(), &fileIcon, &folderIcon); tree->insertTopLevelItem(0, subTree); subTree->setExpanded(true); } @@ -1420,7 +1427,8 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() { QCheckBox *conflictsBox = findChild("conflictsCheckBox"); QTreeWidget *tree = findChild("dataTree"); - + QIcon folderIcon = (new QFileIconProvider())->icon(QFileIconProvider::Folder); + QIcon fileIcon = (new QFileIconProvider())->icon(QFileIconProvider::File); QStringList expandedNodes; QTreeWidgetItemIterator it1(tree, QTreeWidgetItemIterator::NotHidden | QTreeWidgetItemIterator::HasChildren); while (*it1) { @@ -1436,7 +1444,7 @@ void MainWindow::refreshDataTreeKeepExpandedNodes() columns.append(""); QTreeWidgetItem *subTree = new QTreeWidgetItem(columns); subTree->setData(0, Qt::DecorationRole, (new QFileIconProvider())->icon(QFileIconProvider::Folder)); - updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked()); + updateTo(subTree, L"", *m_OrganizerCore.directoryStructure(), conflictsBox->isChecked(), &fileIcon, &folderIcon); tree->insertTopLevelItem(0, subTree); subTree->setExpanded(true); QTreeWidgetItemIterator it2(tree, QTreeWidgetItemIterator::HasChildren); diff --git a/src/mainwindow.h b/src/mainwindow.h index 69d08337..cd7e6f43 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -211,7 +211,7 @@ private: void startSteam(); - void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly); + void updateTo(QTreeWidgetItem *subTree, const std::wstring &directorySoFar, const MOShared::DirectoryEntry &directoryEntry, bool conflictsOnly, QIcon *fileIcon, QIcon *folderIcon); bool refreshProfiles(bool selectProfile = true); void refreshExecutablesList(); void installMod(QString fileName = ""); -- cgit v1.3.1 From 9a33dc148054443cb0efd5916ff758fca5bc09e3 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Thu, 20 Dec 2018 19:12:11 +0100 Subject: *Added "Open INIs Folder" option. *Changed "Open Instance Folder" to open the Appdata or MO2 install instead of the baseDirectory. --- src/mainwindow.cpp | 19 ++++++++++++++++++- src/mainwindow.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3e35ebec..954c88c6 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3639,7 +3639,11 @@ void MainWindow::disableVisibleMods() void MainWindow::openInstanceFolder() { - ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getBaseDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + QString dataPath = qApp->property("dataPath").toString(); + ::ShellExecuteW(nullptr, L"explore", ToWString(dataPath).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + + //opens BaseDirectory instead + //::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getBaseDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } void MainWindow::openLogsFolder() @@ -3665,6 +3669,17 @@ void MainWindow::openProfileFolder() ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } +void MainWindow::openIniFolder() +{ + if (m_OrganizerCore.currentProfile()->localSettingsEnabled()) + { + ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.currentProfile()->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } + else { + ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.managedGame()->documentsDirectory().absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + } +} + void MainWindow::openDownloadsFolder() { ::ShellExecuteW(nullptr, L"explore", ToWString(m_OrganizerCore.settings().getDownloadDirectory()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); @@ -3864,6 +3879,8 @@ QMenu *MainWindow::openFolderMenu() FolderMenu->addAction(tr("Open MyGames folder"), this, SLOT(openMyGamesFolder())); + FolderMenu->addAction(tr("Open INIs folder"), this, SLOT(openIniFolder())); + FolderMenu->addSeparator(); FolderMenu->addAction(tr("Open Instance folder"), this, SLOT(openInstanceFolder())); diff --git a/src/mainwindow.h b/src/mainwindow.h index cd7e6f43..e799a64a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -529,6 +529,7 @@ private slots: void openDownloadsFolder(); void openModsFolder(); void openProfileFolder(); + void openIniFolder(); void openGameFolder(); void openMyGamesFolder(); void startExeAction(); -- cgit v1.3.1