summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-12-31 00:32:15 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 15:38:17 +0100
commit7f0c9b8d8278f14754b375967267ff67d6fdb6ee (patch)
tree3f34b8f66e6ccf5c630e0a0dcf104f714a250219
parentfb52a129b3a878511cf754daed433d9a789689c8 (diff)
Move the overwrite context menu.
-rw-r--r--src/mainwindow.cpp154
-rw-r--r--src/mainwindow.h12
-rw-r--r--src/modlistcontextmenu.cpp44
-rw-r--r--src/modlistcontextmenu.h15
-rw-r--r--src/modlistviewactions.cpp128
-rw-r--r--src/modlistviewactions.h20
-rw-r--r--src/organizercore.cpp2
7 files changed, 188 insertions, 187 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 91897d2f..056eeef7 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -535,14 +535,17 @@ MainWindow::MainWindow(Settings &settings
void MainWindow::setupModList()
{
- ui->modList->setup(m_OrganizerCore, new ModListViewActions(m_OrganizerCore, *m_Filters, m_CategoryFactory, this, ui->modList), ui);
+ auto* actions = new ModListViewActions(m_OrganizerCore, *m_Filters, m_CategoryFactory, this, ui->modList);
+ ui->modList->setup(m_OrganizerCore, actions, ui);
+ connect(actions, &ModListViewActions::overwriteCleared, [=]() { scheduleCheckForProblems(); });
connect(ui->modList, &ModListView::removeSelectedMods, [=]() { removeMod_clicked(-1); });
+ connect(m_OrganizerCore.modList(), &ModList::clearOverwrite, actions, &ModListViewActions::clearOverwrite);
+ connect(m_OrganizerCore.modList(), &ModList::modPrioritiesChanged, [&]() { m_ArchiveListWriter.write(); });
// keep here for now
connect(ui->modList->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &MainWindow::modlistSelectionsChanged);
- connect(m_OrganizerCore.modList(), &ModList::modPrioritiesChanged, [&]() { m_ArchiveListWriter.write(); });
}
void MainWindow::resetActionIcons()
@@ -2925,21 +2928,6 @@ void MainWindow::visitNexusOrWebPage_clicked(int index) {
}
}
-void MainWindow::openExplorer_clicked(int index)
-{
- QItemSelectionModel *selection = ui->modList->selectionModel();
- if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- for (QModelIndex idx : selection->selectedRows()) {
- ModInfo::Ptr info = ModInfo::getByIndex(idx.data(ModList::IndexRole).toInt());
- shell::Explore(info->absolutePath());
- }
- }
- else {
- ModInfo::Ptr modInfo = ModInfo::getByIndex(index);
- shell::Explore(modInfo->absolutePath());
- }
-}
-
void MainWindow::openPluginOriginExplorer_clicked()
{
QItemSelectionModel *selection = ui->espList->selectionModel();
@@ -3121,127 +3109,6 @@ void MainWindow::resetColor_clicked(int modIndex)
m_OrganizerCore.settings().colors().removePreviousSeparatorColor();
}
-void MainWindow::createModFromOverwrite()
-{
- GuessedValue<QString> name;
- name.setFilter(&fixDirectoryName);
-
- while (name->isEmpty()) {
- bool ok;
- name.update(QInputDialog::getText(this, tr("Create Mod..."),
- tr("This will move all files from overwrite into a new, regular mod.\n"
- "Please enter a name:"), QLineEdit::Normal, "", &ok),
- GUESS_USER);
- if (!ok) {
- return;
- }
- }
-
- if (m_OrganizerCore.modList()->getMod(name) != nullptr) {
- reportError(tr("A mod with this name already exists"));
- return;
- }
-
- const IModInterface *newMod = m_OrganizerCore.createMod(name);
- if (newMod == nullptr) {
- return;
- }
-
- doMoveOverwriteContentToMod(newMod->absolutePath());
-}
-
-void MainWindow::moveOverwriteContentToExistingMod()
-{
- QStringList mods;
- auto indexesByPriority = m_OrganizerCore.currentProfile()->getAllIndexesByPriority();
- for (auto & iter : indexesByPriority) {
- if ((iter.second != UINT_MAX)) {
- ModInfo::Ptr modInfo = ModInfo::getByIndex(iter.second);
- if (!modInfo->hasFlag(ModInfo::FLAG_SEPARATOR) && !modInfo->hasFlag(ModInfo::FLAG_FOREIGN) && !modInfo->hasFlag(ModInfo::FLAG_OVERWRITE)) {
- mods << modInfo->name();
- }
- }
- }
-
- ListDialog dialog(this);
- dialog.setWindowTitle("Select a mod...");
- dialog.setChoices(mods);
-
- if (dialog.exec() == QDialog::Accepted) {
- QString result = dialog.getChoice();
- if (!result.isEmpty()) {
-
- QString modAbsolutePath;
-
- for (const auto& mod : m_OrganizerCore.modsSortedByProfilePriority(m_OrganizerCore.currentProfile())) {
- if (result.compare(mod) == 0) {
- ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(mod));
- modAbsolutePath = modInfo->absolutePath();
- break;
- }
- }
-
- if (modAbsolutePath.isNull()) {
- log::warn("Mod {} has not been found, for some reason", result);
- return;
- }
-
- doMoveOverwriteContentToMod(modAbsolutePath);
- }
- }
-}
-
-void MainWindow::doMoveOverwriteContentToMod(const QString &modAbsolutePath)
-{
- unsigned int overwriteIndex = ModInfo::findMod([](ModInfo::Ptr mod) -> bool {
- std::vector<ModInfo::EFlag> flags = mod->getFlags();
- return std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end(); });
-
- ModInfo::Ptr overwriteInfo = ModInfo::getByIndex(overwriteIndex);
- bool successful = shellMove((QDir::toNativeSeparators(overwriteInfo->absolutePath()) + "\\*"),
- (QDir::toNativeSeparators(modAbsolutePath)), false, this);
-
- if (successful) {
- MessageDialog::showMessage(tr("Move successful."), this);
- }
- else {
- const auto e = GetLastError();
- log::error("Move operation failed: {}", formatSystemMessage(e));
- }
-
- m_OrganizerCore.refresh();
-}
-
-void MainWindow::clearOverwrite()
-{
- unsigned int overwriteIndex = ModInfo::findMod([](ModInfo::Ptr mod) -> bool {
- std::vector<ModInfo::EFlag> flags = mod->getFlags();
- return std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE)
- != flags.end();
- });
-
- ModInfo::Ptr modInfo = ModInfo::getByIndex(overwriteIndex);
- if (modInfo)
- {
- QDir overwriteDir(modInfo->absolutePath());
- if (QMessageBox::question(this, tr("Are you sure?"),
- tr("About to recursively delete:\n") + overwriteDir.absolutePath(),
- QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok)
- {
- QStringList delList;
- for (auto f : overwriteDir.entryList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot))
- delList.push_back(overwriteDir.absoluteFilePath(f));
- if (shellDelete(delList, true)) {
- scheduleCheckForProblems();
- m_OrganizerCore.refresh();
- } else {
- const auto e = GetLastError();
- log::error("Delete operation failed: {}", formatSystemMessage(e));
- }
- }
- }
-}
-
void MainWindow::cancelModListEditor()
{
ui->modList->setEnabled(false);
@@ -3869,13 +3736,6 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos)
// context menu for overwrites
if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) {
- if (QDir(info->absolutePath()).count() > 2) {
- menu.addAction(tr("Sync to Mods..."), [=]() { m_OrganizerCore.syncOverwrite(); });
- menu.addAction(tr("Create Mod..."), [=]() { createModFromOverwrite(); });
- menu.addAction(tr("Move content to Mod..."), [=]() { moveOverwriteContentToExistingMod(); });
- menu.addAction(tr("Clear Overwrite..."), [=]() { clearOverwrite(); });
- }
- menu.addAction(tr("Open in Explorer"), [=]() { openExplorer_clicked(modIndex); });
}
// context menu for mod backups
@@ -3899,7 +3759,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos)
menu.addAction(tr("Visit on %1").arg(url.host()), [=]() { visitWebPage_clicked(modIndex); });
}
- menu.addAction(tr("Open in Explorer"), [=]() { openExplorer_clicked(modIndex); });
+ menu.addAction(tr("Open in Explorer"), [=]() { ui->modList->actions().openExplorer({ contextIdx }); });
}
// separator
@@ -4049,7 +3909,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos)
menu.addAction(tr("Visit on %1").arg(url.host()), [=]() { visitWebPage_clicked(modIndex); });
}
- menu.addAction(tr("Open in Explorer"), [&, modIndex]() { openExplorer_clicked(modIndex); });
+ menu.addAction(tr("Open in Explorer"), [=]() { ui->modList->actions().openExplorer({ contextIdx }); });
}
if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_FOREIGN) == flags.end()) {
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 790960e1..21c8f2aa 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -365,7 +365,6 @@ private slots:
void visitOnNexus_clicked(int modIndex);
void visitWebPage_clicked(int modIndex);
void visitNexusOrWebPage_clicked(int modIndex);
- void openExplorer_clicked(int modIndex);
void openPluginOriginExplorer_clicked();
void openOriginInformation_clicked();
void information_clicked(int modIndex);
@@ -390,17 +389,6 @@ private slots:
BSA::EErrorCode extractBSA(BSA::Archive &archive, BSA::Folder::Ptr folder, const QString &destination, QProgressDialog &extractProgress);
- void createModFromOverwrite();
- /**
- * @brief sends the content of the overwrite folder to an already existing mod
- */
- void moveOverwriteContentToExistingMod();
- /**
- * @brief actually sends the content of the overwrite folder to specified mod
- */
- void doMoveOverwriteContentToMod(const QString &modAbsolutePath);
- void clearOverwrite();
-
// nexus related
void checkModsForUpdates();
diff --git a/src/modlistcontextmenu.cpp b/src/modlistcontextmenu.cpp
index c4a82e46..dda88735 100644
--- a/src/modlistcontextmenu.cpp
+++ b/src/modlistcontextmenu.cpp
@@ -44,14 +44,14 @@ ModListGlobalContextMenu::ModListGlobalContextMenu(OrganizerCore& core, ModListV
ModListContextMenu::ModListContextMenu(OrganizerCore& core, const QModelIndex& index, ModListView* view) :
QMenu(view)
, m_core(core)
- , m_index()
+ , m_index(index)
, m_view(view)
{
if (view->selectionModel()->hasSelection()) {
- m_index = view->indexViewToModel(view->selectionModel()->selectedRows());
+ m_selected = view->indexViewToModel(view->selectionModel()->selectedRows());
}
else {
- m_index = { index };
+ m_selected = { index };
}
@@ -73,24 +73,24 @@ ModListContextMenu::ModListContextMenu(OrganizerCore& core, const QModelIndex& i
// - Don't forget to check for the sort priority for "Send To... "
if (info->isOverwrite()) {
- addOverwriteActions();
+ addOverwriteActions(info);
}
else if (info->isBackup()) {
- addBackupActions();
+ addBackupActions(info);
}
else if (info->isSeparator()) {
- addSeparatorActions();
+ addSeparatorActions(info);
}
else if (info->isForeign()) {
- addForeignActions();
+ addForeignActions(info);
}
else {
- addRegularActions();
+ addRegularActions(info);
}
// add information for all except foreign
if (!info->isForeign()) {
- QAction* infoAction = addAction(tr("Information..."), [=]() { view->actions().displayModInformation(m_index[0].row()); });
+ QAction* infoAction = addAction(tr("Information..."), [=]() { view->actions().displayModInformation(m_index.data(ModList::IndexRole).toInt()); });
setDefaultAction(infoAction);
}
}
@@ -99,36 +99,42 @@ QMenu* ModListContextMenu::createSendToContextMenu()
{
QMenu* menu = new QMenu(m_view);
menu->setTitle(tr("Send to... "));
- menu->addAction(tr("Top"), [=]() { m_view->actions().sendModsToTop(m_index); });
- menu->addAction(tr("Bottom"), [=]() { m_view->actions().sendModsToBottom(m_index); });
- menu->addAction(tr("Priority..."), [=]() { m_view->actions().sendModsToPriority(m_index); });
- menu->addAction(tr("Separator..."), [=]() { m_view->actions().sendModsToSeparator(m_index); });
+ menu->addAction(tr("Top"), [=]() { m_view->actions().sendModsToTop(m_selected); });
+ menu->addAction(tr("Bottom"), [=]() { m_view->actions().sendModsToBottom(m_selected); });
+ menu->addAction(tr("Priority..."), [=]() { m_view->actions().sendModsToPriority(m_selected); });
+ menu->addAction(tr("Separator..."), [=]() { m_view->actions().sendModsToSeparator(m_selected); });
return menu;
}
-void ModListContextMenu::addOverwriteActions()
+void ModListContextMenu::addOverwriteActions(ModInfo::Ptr mod)
{
-
+ if (QDir(mod->absolutePath()).count() > 2) {
+ addAction(tr("Sync to Mods..."), [=]() { m_core.syncOverwrite(); });
+ addAction(tr("Create Mod..."), [=]() { m_view->actions().createModFromOverwrite(); });
+ addAction(tr("Move content to Mod..."), [=]() { m_view->actions().moveOverwriteContentToExistingMod(); });
+ addAction(tr("Clear Overwrite..."), [=]() { m_view->actions().clearOverwrite(); });
+ }
+ addAction(tr("Open in Explorer"), [=]() { m_view->actions().openExplorer(m_selected); });
}
-void ModListContextMenu::addSeparatorActions()
+void ModListContextMenu::addSeparatorActions(ModInfo::Ptr mod)
{
}
-void ModListContextMenu::addForeignActions()
+void ModListContextMenu::addForeignActions(ModInfo::Ptr mod)
{
if (m_view->sortColumn() == ModList::COL_PRIORITY) {
addMenu(createSendToContextMenu());
}
}
-void ModListContextMenu::addBackupActions()
+void ModListContextMenu::addBackupActions(ModInfo::Ptr mod)
{
}
-void ModListContextMenu::addRegularActions()
+void ModListContextMenu::addRegularActions(ModInfo::Ptr mod)
{
}
diff --git a/src/modlistcontextmenu.h b/src/modlistcontextmenu.h
index 3bc15c57..22318575 100644
--- a/src/modlistcontextmenu.h
+++ b/src/modlistcontextmenu.h
@@ -7,6 +7,8 @@
#include <QModelIndex>
#include <QTreeView>
+#include "modinfo.h"
+
class ModListView;
class OrganizerCore;
@@ -37,14 +39,15 @@ public: // TODO: Move this to private when all is done
// add actions/menus to this menu for each type of mod
//
- void addOverwriteActions();
- void addSeparatorActions();
- void addForeignActions();
- void addBackupActions();
- void addRegularActions();
+ void addOverwriteActions(ModInfo::Ptr mod);
+ void addSeparatorActions(ModInfo::Ptr mod);
+ void addForeignActions(ModInfo::Ptr mod);
+ void addBackupActions(ModInfo::Ptr mod);
+ void addRegularActions(ModInfo::Ptr mod);
OrganizerCore& m_core;
- QModelIndexList m_index;
+ QModelIndex m_index;
+ QModelIndexList m_selected;
ModListView* m_view;
};
diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp
index 0d556e64..a07fb27c 100644
--- a/src/modlistviewactions.cpp
+++ b/src/modlistviewactions.cpp
@@ -7,6 +7,7 @@
#include <log.h>
#include <report.h>
+#include <utility.h>
#include "categories.h"
#include "filedialogmemory.h"
@@ -16,6 +17,7 @@
#include "modlist.h"
#include "modlistview.h"
#include "mainwindow.h"
+#include "messagedialog.h"
#include "nexusinterface.h"
#include "nxmaccessmanager.h"
#include "savetextasdialog.h"
@@ -387,7 +389,11 @@ void ModListViewActions::displayModInformation(ModInfo::Ptr modInfo, unsigned in
dialog->show();
dialog->raise();
dialog->activateWindow();
- connect(dialog, SIGNAL(finished(int)), this, SLOT(overwriteClosed(int)));
+ connect(dialog, &QDialog::finished, [=]() {
+ m_core.modList()->modInfoChanged(modInfo);
+ dialog->deleteLater();
+ m_core.refreshDirectoryStructure();
+ });
}
catch (const std::exception& e) {
reportError(tr("Failed to display overwrite dialog: %1").arg(e.what()));
@@ -498,3 +504,123 @@ void ModListViewActions::sendModsToSeparator(const QModelIndexList& index) const
}
}
}
+
+void ModListViewActions::openExplorer(const QModelIndexList& index) const
+{
+ for (auto& idx : index) {
+ ModInfo::Ptr info = ModInfo::getByIndex(idx.data(ModList::IndexRole).toInt());
+ shell::Explore(info->absolutePath());
+ }
+}
+
+void ModListViewActions::moveOverwriteContentsTo(const QString& absolutePath) const
+{
+ ModInfo::Ptr overwriteInfo = ModInfo::getOverwrite();
+ bool successful = shellMove((QDir::toNativeSeparators(overwriteInfo->absolutePath()) + "\\*"),
+ (QDir::toNativeSeparators(absolutePath)), false, m_view);
+
+ if (successful) {
+ MessageDialog::showMessage(tr("Move successful."), m_view);
+ }
+ else {
+ const auto e = GetLastError();
+ log::error("Move operation failed: {}", formatSystemMessage(e));
+ }
+
+ m_core.refresh();
+}
+
+void ModListViewActions::createModFromOverwrite() const
+{
+ GuessedValue<QString> name;
+ name.setFilter(&fixDirectoryName);
+
+ while (name->isEmpty()) {
+ bool ok;
+ name.update(QInputDialog::getText(m_view, tr("Create Mod..."),
+ tr("This will move all files from overwrite into a new, regular mod.\n"
+ "Please enter a name:"), QLineEdit::Normal, "", &ok),
+ GUESS_USER);
+ if (!ok) {
+ return;
+ }
+ }
+
+ if (m_core.modList()->getMod(name) != nullptr) {
+ reportError(tr("A mod with this name already exists"));
+ return;
+ }
+
+ const IModInterface* newMod = m_core.createMod(name);
+ if (newMod == nullptr) {
+ return;
+ }
+
+ moveOverwriteContentsTo(newMod->absolutePath());
+}
+
+void ModListViewActions::moveOverwriteContentToExistingMod() const
+{
+ QStringList mods;
+ auto indexesByPriority = m_core.currentProfile()->getAllIndexesByPriority();
+ for (auto& iter : indexesByPriority) {
+ if ((iter.second != UINT_MAX)) {
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(iter.second);
+ if (!modInfo->hasFlag(ModInfo::FLAG_SEPARATOR) && !modInfo->hasFlag(ModInfo::FLAG_FOREIGN) && !modInfo->hasFlag(ModInfo::FLAG_OVERWRITE)) {
+ mods << modInfo->name();
+ }
+ }
+ }
+
+ ListDialog dialog(m_view);
+ dialog.setWindowTitle("Select a mod...");
+ dialog.setChoices(mods);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ QString result = dialog.getChoice();
+ if (!result.isEmpty()) {
+
+ QString modAbsolutePath;
+
+ for (const auto& mod : m_core.modsSortedByProfilePriority(m_core.currentProfile())) {
+ if (result.compare(mod) == 0) {
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(mod));
+ modAbsolutePath = modInfo->absolutePath();
+ break;
+ }
+ }
+
+ if (modAbsolutePath.isNull()) {
+ log::warn("Mod {} has not been found, for some reason", result);
+ return;
+ }
+
+ moveOverwriteContentsTo(modAbsolutePath);
+ }
+ }
+}
+
+void ModListViewActions::clearOverwrite() const
+{
+ ModInfo::Ptr modInfo = ModInfo::getOverwrite();
+ if (modInfo)
+ {
+ QDir overwriteDir(modInfo->absolutePath());
+ if (QMessageBox::question(m_view, tr("Are you sure?"),
+ tr("About to recursively delete:\n") + overwriteDir.absolutePath(),
+ QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok)
+ {
+ QStringList delList;
+ for (auto f : overwriteDir.entryList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot))
+ delList.push_back(overwriteDir.absoluteFilePath(f));
+ if (shellDelete(delList, true)) {
+ emit overwriteCleared();
+ m_core.refresh();
+ }
+ else {
+ const auto e = GetLastError();
+ log::error("Delete operation failed: {}", formatSystemMessage(e));
+ }
+ }
+ }
+}
diff --git a/src/modlistviewactions.h b/src/modlistviewactions.h
index d8e1a3d0..10aa6c39 100644
--- a/src/modlistviewactions.h
+++ b/src/modlistviewactions.h
@@ -60,6 +60,26 @@ public:
void sendModsToPriority(const QModelIndexList& index) const;
void sendModsToSeparator(const QModelIndexList& index) const;
+ // open the Windows explorer for the specified mods
+ //
+ void openExplorer(const QModelIndexList& index) const;
+
+ // overwrite-specific actions
+ //
+ void createModFromOverwrite() const;
+ void moveOverwriteContentToExistingMod() const;
+ void clearOverwrite() const;
+
+signals:
+
+ // emitted when the overwrite mod has been clear
+ //
+ void overwriteCleared() const;
+
+private:
+
+ void moveOverwriteContentsTo(const QString& absolutePath) const;
+
private:
OrganizerCore& m_core;
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 986b6fbb..507932e2 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -249,8 +249,6 @@ void OrganizerCore::setUserInterface(IUserInterface* ui)
SLOT(modRemoved(QString)));
connect(&m_InstallationManager, SIGNAL(modReplaced(QString)), w,
SLOT(modRemoved(QString)));
- connect(&m_ModList, SIGNAL(clearOverwrite()), w,
- SLOT(clearOverwrite()));
connect(&m_ModList, SIGNAL(fileMoved(QString, QString, QString)), w,
SLOT(fileMoved(QString, QString, QString)));
connect(&m_PluginList, SIGNAL(writePluginsList()), w,