From 2cb5c21b8e15b02a09144ff6c1ab11e87879a420 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 24 Jul 2020 09:25:02 -0400 Subject: fixed settings doing weird stuff with multiple instances sort games by name added intro and confirmation pages --- src/mainwindow.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 65c1d65c..c2d83e36 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5952,20 +5952,24 @@ void MainWindow::on_actionNotifications_triggered() scheduleCheckForProblems(); } +void openInstanceManager(PluginContainer& pc, QWidget* parent); + void MainWindow::on_actionChange_Game_triggered() { - if (m_OrganizerCore.settings().interface().showChangeGameConfirmation()) { - const auto r = QMessageBox::question( - this, tr("Are you sure?"), tr("This will restart MO, continue?"), - QMessageBox::Yes | QMessageBox::Cancel); + openInstanceManager(m_PluginContainer, this); - if (r != QMessageBox::Yes) { - return; - } - } - - InstanceManager::instance().clearCurrentInstance(); - ExitModOrganizer(Exit::Restart); + //if (m_OrganizerCore.settings().interface().showChangeGameConfirmation()) { + // const auto r = QMessageBox::question( + // this, tr("Are you sure?"), tr("This will restart MO, continue?"), + // QMessageBox::Yes | QMessageBox::Cancel); + // + // if (r != QMessageBox::Yes) { + // return; + // } + //} + // + //InstanceManager::instance().clearCurrentInstance(); + //ExitModOrganizer(Exit::Restart); } void MainWindow::setCategoryListVisible(bool visible) -- cgit v1.3.1 From b1e681e129d87cb2f8aab89a734ab7b185975bcd Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 25 Jul 2020 23:18:47 -0400 Subject: hide tutorial question option --- src/mainwindow.cpp | 30 +++++++++++++++++++++++++----- src/mainwindow.h | 1 + src/settings.cpp | 11 +++++++++++ src/settings.h | 3 +++ 4 files changed, 40 insertions(+), 5 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index c2d83e36..60ad77a0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1334,6 +1334,30 @@ void MainWindow::hookUpWindowTutorials() } } +bool MainWindow::shouldStartTutorial() const +{ + if (GlobalSettings::hideTutorialQuestion()) { + return false; + } + + QMessageBox dlg( + QMessageBox::Question, tr("Show tutorial?"), + tr("You are starting Mod Organizer for the first time. " + "Do you want to show a tutorial of its basic features? If you choose " + "no you can always start the tutorial from the \"Help\"-menu."), + QMessageBox::Yes | QMessageBox::No); + + dlg.setCheckBox(new QCheckBox(tr("Never ask to show tutorials"))); + + const auto r = dlg.exec(); + + if (dlg.checkBox()->isChecked()) { + GlobalSettings::setHideTutorialQuestion(true); + } + + return (r == QMessageBox::Yes); +} + void MainWindow::showEvent(QShowEvent *event) { QMainWindow::showEvent(event); @@ -1360,11 +1384,7 @@ void MainWindow::showEvent(QShowEvent *event) if (m_OrganizerCore.settings().firstStart()) { QString firstStepsTutorial = ToQString(AppConfig::firstStepsTutorial()); if (TutorialManager::instance().hasTutorial(firstStepsTutorial)) { - if (QMessageBox::question(this, tr("Show tutorial?"), - tr("You are starting Mod Organizer for the first time. " - "Do you want to show a tutorial of its basic features? If you choose " - "no you can always start the tutorial from the \"Help\"-menu."), - QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + if (shouldStartTutorial()) { TutorialManager::instance().activateTutorial("MainWindow", firstStepsTutorial); } } else { diff --git a/src/mainwindow.h b/src/mainwindow.h index 814e0363..8b2188c8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -506,6 +506,7 @@ private slots: void hideSaveGameInfo(); void hookUpWindowTutorials(); + bool shouldStartTutorial() const; void resumeDownload(int downloadIndex); void endorseMod(ModInfo::Ptr mod); diff --git a/src/settings.cpp b/src/settings.cpp index 4ee4cd81..a0758bd4 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2212,7 +2212,18 @@ void GlobalSettings::setHideCreateInstanceIntro(bool b) settings().setValue("HideCreateInstanceIntro", b); } +bool GlobalSettings::hideTutorialQuestion() +{ + return settings().value("HideTutorialQuestion", false).toBool(); +} + +void GlobalSettings::setHideTutorialQuestion(bool b) +{ + settings().setValue("HideTutorialQuestion", b); +} + void GlobalSettings::resetDialogs() { setHideCreateInstanceIntro(false); + setHideTutorialQuestion(false); } diff --git a/src/settings.h b/src/settings.h index dd8abf3f..a9501b9d 100644 --- a/src/settings.h +++ b/src/settings.h @@ -841,6 +841,9 @@ public: static bool hideCreateInstanceIntro(); static void setHideCreateInstanceIntro(bool b); + static bool hideTutorialQuestion(); + static void setHideTutorialQuestion(bool b); + // resets anything that the user can disable static void resetDialogs(); -- cgit v1.3.1 From c4df6b8ec98feb34cc9b9785e6d4d0eac6b3f571 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Thu, 30 Jul 2020 00:48:46 -0400 Subject: split nexus connection stuff into NexusConnectionUI so it can be reused in the instance creation dialog removed the PluginContainer* parameter from NexusInterface::instance() - it's a singleton, so it only needs to be given once, not every time - it doesn't even matter because the first time instance() is called, it creates the singleton, but the plugin container is always null - and setPluginContainer() is called much later from OrganizerCore with the correct value added non functional nexus page to instance creation dialog --- src/createinstancedialog.cpp | 1 + src/createinstancedialog.ui | 161 ++++++++++++++-- src/createinstancedialogpages.cpp | 20 ++ src/createinstancedialogpages.h | 14 ++ src/main.cpp | 10 +- src/mainwindow.cpp | 62 +++---- src/modinfo.cpp | 18 +- src/modinfo.h | 5 +- src/modinfodialognexus.cpp | 8 +- src/nexusinterface.cpp | 15 +- src/nexusinterface.h | 5 +- src/organizercore.cpp | 22 +-- src/settingsdialognexus.cpp | 382 +++++++++++++++++++++----------------- src/settingsdialognexus.h | 55 ++++-- 14 files changed, 510 insertions(+), 268 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/createinstancedialog.cpp b/src/createinstancedialog.cpp index 75ccc774..935b9ee9 100644 --- a/src/createinstancedialog.cpp +++ b/src/createinstancedialog.cpp @@ -25,6 +25,7 @@ CreateInstanceDialog::CreateInstanceDialog( m_pages.push_back(std::make_unique(*this)); m_pages.push_back(std::make_unique(*this)); m_pages.push_back(std::make_unique(*this)); + m_pages.push_back(std::make_unique(*this)); m_pages.push_back(std::make_unique(*this)); ui->pages->setCurrentIndex(0); diff --git a/src/createinstancedialog.ui b/src/createinstancedialog.ui index a8f21c51..ebaef84d 100644 --- a/src/createinstancedialog.ui +++ b/src/createinstancedialog.ui @@ -266,8 +266,8 @@ 0 0 - 98 - 28 + 63 + 16 @@ -283,13 +283,6 @@ 0 - - - - PushButton - - - @@ -409,8 +402,8 @@ 0 0 - 98 - 28 + 63 + 16 @@ -886,6 +879,148 @@ + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + <h3>Link Mod Organizer with your Nexus account</h3> + + + + + + + Linking with Nexus allows you to download mods directly from Mod Organizer and automatically check for updates. This is optional. + + + true + + + + + + + + + + + 0 + 100 + + + + + 0 + + + 9 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Connect to Nexus + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Enter API Key Manually + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + @@ -1057,6 +1192,8 @@ - + + + diff --git a/src/createinstancedialogpages.cpp b/src/createinstancedialogpages.cpp index f37853f0..37d50ee1 100644 --- a/src/createinstancedialogpages.cpp +++ b/src/createinstancedialogpages.cpp @@ -997,6 +997,26 @@ bool PathsPage::checkPath( } +NexusPage::NexusPage(CreateInstanceDialog& dlg) + : Page(dlg) +{ +} + +bool NexusPage::ready() const +{ + return true; +} + +bool NexusPage::skip() const +{ + return Settings::instance().nexus().hasApiKey(); +} + +void NexusPage::activated() +{ +} + + ConfirmationPage::ConfirmationPage(CreateInstanceDialog& dlg) : Page(dlg) { diff --git a/src/createinstancedialogpages.h b/src/createinstancedialogpages.h index f2f4216d..88e49628 100644 --- a/src/createinstancedialogpages.h +++ b/src/createinstancedialogpages.h @@ -203,6 +203,20 @@ private: }; +class NexusPage : public Page +{ +public: + NexusPage(CreateInstanceDialog& dlg); + + bool ready() const override; + bool skip() const override; + void activated() override; + +private: + +}; + + class ConfirmationPage : public Page { public: diff --git a/src/main.cpp b/src/main.cpp index 58e22466..93580931 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -395,7 +395,7 @@ int runApplication( QString apiKey; if (settings.nexus().apiKey(apiKey)) { - NexusInterface::instance(pluginContainer.get())->getAccessManager()->apiCheck(apiKey); + NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } log::debug("initializing tutorials"); @@ -415,8 +415,8 @@ int runApplication( // set up main window and its data structures MainWindow mainWindow(settings, organizer, *pluginContainer); - NexusInterface::instance(pluginContainer.get()) - ->getAccessManager()->setTopLevelWidget(&mainWindow); + NexusInterface::instance() + .getAccessManager()->setTopLevelWidget(&mainWindow); QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application, SLOT(setStyleFile(QString))); @@ -443,8 +443,8 @@ int runApplication( res = application.exec(); mainWindow.close(); - NexusInterface::instance(pluginContainer.get()) - ->getAccessManager()->setTopLevelWidget(nullptr); + NexusInterface::instance() + .getAccessManager()->setTopLevelWidget(nullptr); } settings.geometry().resetIfNeeded(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 60ad77a0..9144210c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -291,7 +291,7 @@ MainWindow::MainWindow(Settings &settings ui->statusBar->setup(ui, settings); { - auto* ni = NexusInterface::instance(&m_PluginContainer); + auto* ni = &NexusInterface::instance(); // there are two ways to get here: // 1) the user just started MO, and @@ -439,24 +439,24 @@ MainWindow::MainWindow(Settings &settings connect(m_OrganizerCore.updater(), SIGNAL(updateAvailable()), this, SLOT(updateAvailable())); connect(m_OrganizerCore.updater(), SIGNAL(motdAvailable(QString)), this, SLOT(motdReceived(QString))); - connect(NexusInterface::instance(&pluginContainer), SIGNAL(requestNXMDownload(QString)), &m_OrganizerCore, SLOT(downloadRequestedNXM(QString))); - connect(NexusInterface::instance(&pluginContainer), SIGNAL(nxmDownloadURLsAvailable(QString,int,int,QVariant,QVariant,int)), this, SLOT(nxmDownloadURLs(QString,int,int,QVariant,QVariant,int))); - connect(NexusInterface::instance(&pluginContainer), SIGNAL(needLogin()), &m_OrganizerCore, SLOT(nexusApi())); + connect(&NexusInterface::instance(), SIGNAL(requestNXMDownload(QString)), &m_OrganizerCore, SLOT(downloadRequestedNXM(QString))); + connect(&NexusInterface::instance(), SIGNAL(nxmDownloadURLsAvailable(QString,int,int,QVariant,QVariant,int)), this, SLOT(nxmDownloadURLs(QString,int,int,QVariant,QVariant,int))); + connect(&NexusInterface::instance(), SIGNAL(needLogin()), &m_OrganizerCore, SLOT(nexusApi())); connect( - NexusInterface::instance(&pluginContainer)->getAccessManager(), + NexusInterface::instance().getAccessManager(), SIGNAL(credentialsReceived(const APIUserAccount&)), this, SLOT(updateWindowTitle(const APIUserAccount&))); connect( - NexusInterface::instance(&pluginContainer)->getAccessManager(), + NexusInterface::instance().getAccessManager(), SIGNAL(credentialsReceived(const APIUserAccount&)), - NexusInterface::instance(&m_PluginContainer), + &NexusInterface::instance(), SLOT(setUserAccount(const APIUserAccount&))); connect( - NexusInterface::instance(&pluginContainer), + &NexusInterface::instance(), SIGNAL(requestsChanged(const APIStats&, const APIUserAccount&)), this, SLOT(onRequestsChanged(const APIStats&, const APIUserAccount&))); @@ -1911,9 +1911,9 @@ QDir MainWindow::currentSavesDir() const wchar_t path[MAX_PATH]; if (::GetPrivateProfileStringW( - L"General", L"SLocalSavePath", L"", - path, MAX_PATH, - iniPath.toStdWString().c_str() + L"General", L"SLocalSavePath", L"", + path, MAX_PATH, + iniPath.toStdWString().c_str() )) { savesDir.setPath(m_OrganizerCore.managedGame()->documentsDirectory().absoluteFilePath(QString::fromWCharArray(path))); } @@ -3288,7 +3288,7 @@ void MainWindow::visitOnNexus_clicked() int modID = info->nexusId(); gameName = info->gameName(); if (modID > 0) { - linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); + linkClicked(NexusInterface::instance().getModURL(modID, gameName)); } else { log::error("mod '{}' has no nexus id", info->name()); } @@ -3298,7 +3298,7 @@ void MainWindow::visitOnNexus_clicked() int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole).toInt(); QString gameName = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole + 4).toString(); if (modID > 0) { - linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); + linkClicked(NexusInterface::instance().getModURL(modID, gameName)); } else { MessageDialog::showMessage(tr("Nexus ID for this mod is unknown"), this); } @@ -3355,7 +3355,7 @@ void MainWindow::visitNexusOrWebPage(const QModelIndex& idx) const auto url = info->parseCustomURL(); if (modID > 0) { - linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); + linkClicked(NexusInterface::instance().getModURL(modID, gameName)); } else if (url.isValid()) { linkClicked(url.toString()); } else { @@ -4220,15 +4220,15 @@ void MainWindow::saveArchiveList() void MainWindow::checkModsForUpdates() { bool checkingModsForUpdate = false; - if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) { - checkingModsForUpdate = ModInfo::checkAllForUpdate(&m_PluginContainer, this); - NexusInterface::instance(&m_PluginContainer)->requestEndorsementInfo(this, QVariant(), QString()); - NexusInterface::instance(&m_PluginContainer)->requestTrackingInfo(this, QVariant(), QString()); + if (NexusInterface::instance().getAccessManager()->validated()) { + checkingModsForUpdate = ModInfo::checkAllForUpdate(this); + NexusInterface::instance().requestEndorsementInfo(this, QVariant(), QString()); + NexusInterface::instance().requestTrackingInfo(this, QVariant(), QString()); } else { QString apiKey; if (m_OrganizerCore.settings().nexus().apiKey(apiKey)) { m_OrganizerCore.doAfterLogin([this] () { this->checkModsForUpdates(); }); - NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey); + NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } else { log::warn("{}", tr("You are not currently authenticated with Nexus. Please do so under Settings -> Nexus.")); } @@ -4603,7 +4603,7 @@ void MainWindow::exportModListCSV() if (nexus_ID->isChecked()) builder.setRowField("#Nexus_ID", info->nexusId()); if (mod_Nexus_URL->isChecked()) - builder.setRowField("#Mod_Nexus_URL",(info->nexusId()>0)? NexusInterface::instance(&m_PluginContainer)->getModURL(info->nexusId(), info->gameName()) : ""); + builder.setRowField("#Mod_Nexus_URL",(info->nexusId()>0)? NexusInterface::instance().getModURL(info->nexusId(), info->gameName()) : ""); if (mod_Version->isChecked()) builder.setRowField("#Mod_Version", info->version().canonicalString()); if (install_Date->isChecked()) @@ -5157,7 +5157,7 @@ void MainWindow::on_actionSettings_triggered() } if (settings.paths().cache() != oldCacheDirectory) { - NexusInterface::instance(&m_PluginContainer)->setCacheDirectory( + NexusInterface::instance().setCacheDirectory( settings.paths().cache()); } @@ -5191,7 +5191,7 @@ void MainWindow::on_actionNexus_triggered() QString gameName = game->gameShortName(); if (game->gameNexusName().isEmpty() && game->primarySources().count()) gameName = game->primarySources()[0]; - QDesktopServices::openUrl(QUrl(NexusInterface::instance(&m_PluginContainer)->getGameURL(gameName))); + QDesktopServices::openUrl(QUrl(NexusInterface::instance().getGameURL(gameName))); } @@ -5350,9 +5350,9 @@ void MainWindow::actionEndorseMO() if (QMessageBox::question(this, tr("Endorse Mod Organizer"), tr("Do you want to endorse Mod Organizer on %1 now?").arg( - NexusInterface::instance(&m_PluginContainer)->getGameURL(game->gameShortName())), + NexusInterface::instance().getGameURL(game->gameShortName())), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - NexusInterface::instance(&m_PluginContainer)->requestToggleEndorsement( + NexusInterface::instance().requestToggleEndorsement( game->gameShortName(), game->nexusModOrganizerID(), m_OrganizerCore.getVersion().canonicalString(), true, this, QVariant(), QString()); } } @@ -5366,9 +5366,9 @@ void MainWindow::actionWontEndorseMO() if (QMessageBox::question(this, tr("Abstain from Endorsing Mod Organizer"), tr("Are you sure you want to abstain from endorsing Mod Organizer 2?\n" "You will have to visit the mod page on the %1 Nexus site to change your mind.").arg( - NexusInterface::instance(&m_PluginContainer)->getGameURL(game->gameShortName())), + NexusInterface::instance().getGameURL(game->gameShortName())), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - NexusInterface::instance(&m_PluginContainer)->requestToggleEndorsement( + NexusInterface::instance().requestToggleEndorsement( game->gameShortName(), game->nexusModOrganizerID(), m_OrganizerCore.getVersion().canonicalString(), false, this, QVariant(), QString()); } } @@ -5430,13 +5430,13 @@ void MainWindow::updateDownloadView() void MainWindow::modUpdateCheck(std::multimap IDs) { - if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) { - ModInfo::manualUpdateCheck(&m_PluginContainer, this, IDs); + if (NexusInterface::instance().getAccessManager()->validated()) { + ModInfo::manualUpdateCheck(this, IDs); } else { QString apiKey; if (m_OrganizerCore.settings().nexus().apiKey(apiKey)) { m_OrganizerCore.doAfterLogin([=]() { this->modUpdateCheck(IDs); }); - NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey); + NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } else log::warn("{}", tr("You are not currently authenticated with Nexus. Please do so under Settings -> Nexus.")); } @@ -5588,7 +5588,7 @@ void MainWindow::finishUpdateInfo() log::warn("{}", tr("All of your mods have been checked recently. We restrict update checks to help preserve your available API requests.")); for (auto game : organizedGames) - NexusInterface::instance(&m_PluginContainer)->requestUpdates(game.second, this, QVariant(), game.first, QString()); + NexusInterface::instance().requestUpdates(game.second, this, QVariant(), game.first, QString()); disconnect(sender()); delete sender(); @@ -5675,7 +5675,7 @@ void MainWindow::nxmUpdatesAvailable(QString gameName, int modID, QVariant userD } if (requiresInfo) - NexusInterface::instance(&m_PluginContainer)->requestModInfo(gameNameReal, modID, this, QVariant(), QString()); + NexusInterface::instance().requestModInfo(gameNameReal, modID, this, QVariant(), QString()); } void MainWindow::nxmModInfoAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID) diff --git a/src/modinfo.cpp b/src/modinfo.cpp index bbeefb12..04cb18ce 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -266,7 +266,7 @@ void ModInfo::updateFromDisc(const QString &modDirectory, createFromOverwrite(pluginContainer, game, directoryStructure); std::sort(s_Collection.begin(), s_Collection.end(), ModInfo::ByName); - + parallelMap(std::begin(s_Collection), std::end(s_Collection), &ModInfo::prefetch, refreshThreadCount); updateIndices(); @@ -295,7 +295,7 @@ ModInfo::ModInfo(PluginContainer *pluginContainer) } -bool ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver) +bool ModInfo::checkAllForUpdate(QObject *receiver) { bool updatesAvailable = true; @@ -348,19 +348,19 @@ bool ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *recei } for (auto game : organizedGames) - NexusInterface::instance(pluginContainer)->requestUpdates(game.second, receiver, QVariant(), game.first, QString()); + NexusInterface::instance().requestUpdates(game.second, receiver, QVariant(), game.first, QString()); } else if (earliest < QDateTime::currentDateTimeUtc().addMonths(-1)) { for (auto gameName : games) - NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::MONTH, receiver, QVariant(true), QString()); + NexusInterface::instance().requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::MONTH, receiver, QVariant(true), QString()); } else if (earliest < QDateTime::currentDateTimeUtc().addDays(-7)) { for (auto gameName : games) - NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::MONTH, receiver, QVariant(false), QString()); + NexusInterface::instance().requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::MONTH, receiver, QVariant(false), QString()); } else if (earliest < QDateTime::currentDateTimeUtc().addDays(-1)) { for (auto gameName : games) - NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::WEEK, receiver, QVariant(false), QString()); + NexusInterface::instance().requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::WEEK, receiver, QVariant(false), QString()); } else { for (auto gameName : games) - NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::DAY, receiver, QVariant(false), QString()); + NexusInterface::instance().requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::DAY, receiver, QVariant(false), QString()); } return updatesAvailable; @@ -400,7 +400,7 @@ std::set> ModInfo::filteredMods(QString gameName, QVaria return finalMods; } -void ModInfo::manualUpdateCheck(PluginContainer *pluginContainer, QObject *receiver, std::multimap IDs) +void ModInfo::manualUpdateCheck(QObject *receiver, std::multimap IDs) { std::vector> mods; std::set> organizedGames; @@ -438,7 +438,7 @@ void ModInfo::manualUpdateCheck(PluginContainer *pluginContainer, QObject *recei } for (auto game : organizedGames) { - NexusInterface::instance(pluginContainer)->requestUpdates(game.second, receiver, QVariant(), game.first, QString()); + NexusInterface::instance().requestUpdates(game.second, receiver, QVariant(), game.first, QString()); } } else { log::info("None of the selected mods can be updated."); diff --git a/src/modinfo.h b/src/modinfo.h index 7223cece..480fe013 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -190,15 +190,14 @@ public: // Static functions: * @brief Run a limited batch of mod update checks for "newest version" information. * */ - static void manualUpdateCheck( - PluginContainer *pluginContainer, QObject *receiver, std::multimap IDs); + static void manualUpdateCheck(QObject *receiver, std::multimap IDs); /** * @brief Query nexus information for every mod and update the "newest version" information. * * @return true if any mods are checked for update. */ - static bool checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver); + static bool checkAllForUpdate(QObject *receiver); /** * diff --git a/src/modinfodialognexus.cpp b/src/modinfodialognexus.cpp index dd95cdaa..b4099a8d 100644 --- a/src/modinfodialognexus.cpp +++ b/src/modinfodialognexus.cpp @@ -141,8 +141,8 @@ void NexusTab::updateWebpage() const int modID = mod().nexusId(); if (isValidModID(modID)) { - const QString nexusLink = NexusInterface::instance(&plugin()) - ->getModURL(modID, mod().gameName()); + const QString nexusLink = NexusInterface::instance() + .getModURL(modID, mod().gameName()); ui->visitNexus->setToolTip(nexusLink); refreshData(modID); @@ -360,8 +360,8 @@ void NexusTab::onVisitNexus() const int modID = mod().nexusId(); if (isValidModID(modID)) { - const QString nexusLink = NexusInterface::instance(&plugin()) - ->getModURL(modID, mod().gameName()); + const QString nexusLink = NexusInterface::instance() + .getModURL(modID, mod().gameName()); shell::Open(QUrl(nexusLink)); } diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 9eb1540a..396cec11 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -26,6 +26,7 @@ along with Mod Organizer. If not, see . #include #include "shared/util.h" #include +#include #include #include @@ -50,7 +51,7 @@ void throttledWarning(const APIUserAccount& user) NexusBridge::NexusBridge(PluginContainer *pluginContainer, const QString &subModule) - : m_Interface(NexusInterface::instance(pluginContainer)) + : m_Interface(&NexusInterface::instance()) , m_SubModule(subModule) { } @@ -234,8 +235,8 @@ APILimits NexusInterface::parseLimits( } -NexusInterface::NexusInterface(PluginContainer *pluginContainer) - : m_PluginContainer(pluginContainer) +NexusInterface::NexusInterface() + : m_PluginContainer(nullptr) { m_User.limits(defaultAPILimits()); m_MOVersion = createVersionInfo(); @@ -255,10 +256,10 @@ NexusInterface::~NexusInterface() cleanup(); } -NexusInterface *NexusInterface::instance(PluginContainer *pluginContainer) +NexusInterface& NexusInterface::instance() { - static NexusInterface s_Instance(pluginContainer); - return &s_Instance; + static NexusInterface ni; + return ni; } void NexusInterface::setCacheDirectory(const QString &directory) @@ -284,7 +285,7 @@ void NexusInterface::interpretNexusFileName(const QString &fileName, QString &mo static const QRegularExpression complex(R"(^([a-zA-Z0-9_'"\-.() ]*?)([-_ ][VvRr]+[0-9]+(?:(?:[\.][0-9]+){0,2}|(?:[_][0-9]+){0,2}|(?:[-.][0-9]+){0,2})?[ab]?)??-([1-9][0-9]+)?-.*?\.(zip|rar|7z))"); //complex regex explanation: //group 1: modname. - //group 2: optional version, + //group 2: optional version, // assumed to start with v (empty most of the time). //group 3: NexusId, // assumed wrapped in "-", will miss single digit IDs for better accuracy. diff --git a/src/nexusinterface.h b/src/nexusinterface.h index 35362bdf..72f30a38 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -154,8 +154,7 @@ public: static APILimits parseLimits(const QList& headers); ~NexusInterface(); - - static NexusInterface *instance(PluginContainer *pluginContainer); + static NexusInterface& instance(); /** * @return the access manager object used to connect to nexus @@ -535,7 +534,7 @@ private: private: - NexusInterface(PluginContainer *pluginContainer); + NexusInterface(); void nextRequest(); void requestFinished(std::list::iterator iter); MOBase::IPluginGame *getGame(QString gameName) const; diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 0849d756..7fd8c33b 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -95,12 +95,12 @@ OrganizerCore::OrganizerCore(Settings &settings) , m_PluginContainer(nullptr) , m_CurrentProfile(nullptr) , m_Settings(settings) - , m_Updater(NexusInterface::instance(m_PluginContainer)) + , m_Updater(&NexusInterface::instance()) , m_ModList(m_PluginContainer, this) , m_PluginList(this) , m_DirectoryRefresher(new DirectoryRefresher(settings.refreshThreadCount())) , m_DirectoryStructure(new DirectoryEntry(L"data", nullptr, 0)) - , m_DownloadManager(NexusInterface::instance(m_PluginContainer), this) + , m_DownloadManager(&NexusInterface::instance(), this) , m_DirectoryUpdate(false) , m_ArchivesInit(false) , m_PluginListsWriter(std::bind(&OrganizerCore::savePluginList, this)) @@ -108,8 +108,7 @@ OrganizerCore::OrganizerCore(Settings &settings) env::setHandleCloserThreadCount(settings.refreshThreadCount()); m_DownloadManager.setOutputDirectory(m_Settings.paths().downloads(), false); - NexusInterface::instance(m_PluginContainer)->setCacheDirectory( - m_Settings.paths().cache()); + NexusInterface::instance().setCacheDirectory(m_Settings.paths().cache()); m_InstallationManager.setModsDirectory(m_Settings.paths().mods()); m_InstallationManager.setDownloadDirectory(m_Settings.paths().downloads()); @@ -122,9 +121,9 @@ OrganizerCore::OrganizerCore(Settings &settings) connect(&m_ModList, SIGNAL(removeOrigin(QString)), this, SLOT(removeOrigin(QString))); - connect(NexusInterface::instance(m_PluginContainer)->getAccessManager(), + connect(NexusInterface::instance().getAccessManager(), SIGNAL(validateSuccessful(bool)), this, SLOT(loginSuccessful(bool))); - connect(NexusInterface::instance(m_PluginContainer)->getAccessManager(), + connect(NexusInterface::instance().getAccessManager(), SIGNAL(validateFailed(QString)), this, SLOT(loginFailed(QString))); // This seems awfully imperative @@ -332,8 +331,7 @@ Settings &OrganizerCore::settings() bool OrganizerCore::nexusApi(bool retry) { - NXMAccessManager *accessManager - = NexusInterface::instance(m_PluginContainer)->getAccessManager(); + auto* accessManager = NexusInterface::instance().getAccessManager(); if ((accessManager->validateAttempted() || accessManager->validated()) && !retry) { @@ -1424,13 +1422,13 @@ void OrganizerCore::updateModsInDirectoryStructure(QMap f) { - if (NexusInterface::instance(m_PluginContainer)->getAccessManager()->validated()) { + if (NexusInterface::instance().getAccessManager()->validated()) { f(); } else { QString apiKey; if (settings().nexus().apiKey(apiKey)) { doAfterLogin([f]{ f(); }); - NexusInterface::instance(m_PluginContainer)->getAccessManager()->apiCheck(apiKey); + NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } else { MessageDialog::showMessage(tr("You need to be logged in with Nexus"), parent); } @@ -1704,7 +1702,7 @@ void OrganizerCore::loginSuccessful(bool necessary) } m_PostLoginTasks.clear(); - NexusInterface::instance(m_PluginContainer)->loginCompleted(); + NexusInterface::instance().loginCompleted(); } void OrganizerCore::loginSuccessfulUpdate(bool necessary) @@ -1742,7 +1740,7 @@ void OrganizerCore::loginFailed(const QString &message) qApp->activeWindow()); m_PostLoginTasks.clear(); } - NexusInterface::instance(m_PluginContainer)->loginCompleted(); + NexusInterface::instance().loginCompleted(); } void OrganizerCore::loginFailedUpdate(const QString &message) diff --git a/src/settingsdialognexus.cpp b/src/settingsdialognexus.cpp index d49e0a33..a76b9ad7 100644 --- a/src/settingsdialognexus.cpp +++ b/src/settingsdialognexus.cpp @@ -71,112 +71,45 @@ private: }; -NexusSettingsTab::NexusSettingsTab(Settings& s, SettingsDialog& d) - : SettingsTab(s, d) +NexusConnectionUI::NexusConnectionUI(Settings& s, QWidget* parent) : + m_parent(parent), m_settings(s), + m_connect(nullptr), m_disconnect(nullptr), m_manual(nullptr), m_log(nullptr) { - ui->offlineBox->setChecked(settings().network().offlineMode()); - ui->proxyBox->setChecked(settings().network().useProxy()); - ui->endorsementBox->setChecked(settings().nexus().endorsementIntegration()); - ui->hideAPICounterBox->setChecked(settings().interface().hideAPICounter()); - - // display server preferences - for (const auto& server : s.network().servers()) { - QString descriptor = server.name(); - - if (!descriptor.compare("CDN", Qt::CaseInsensitive)) { - descriptor += QStringLiteral(" (automatic)"); - } - - const auto averageSpeed = server.averageSpeed(); - if (averageSpeed > 0) { - descriptor += QString(" (%1)").arg(MOBase::localizedByteSpeed(averageSpeed)); - } - - QListWidgetItem *newItem = new ServerItem(descriptor, Qt::UserRole + 1); - - newItem->setData(Qt::UserRole, server.name()); - newItem->setData(Qt::UserRole + 1, server.preferred()); - - if (server.preferred() > 0) { - ui->preferredServersList->addItem(newItem); - } else { - ui->knownServersList->addItem(newItem); - } - - ui->preferredServersList->sortItems(Qt::DescendingOrder); - } - - QObject::connect(ui->nexusConnect, &QPushButton::clicked, [&]{ on_nexusConnect_clicked(); }); - QObject::connect(ui->nexusManualKey, &QPushButton::clicked, [&]{ on_nexusManualKey_clicked(); }); - QObject::connect(ui->nexusDisconnect, &QPushButton::clicked, [&]{ on_nexusDisconnect_clicked(); }); - QObject::connect(ui->clearCacheButton, &QPushButton::clicked, [&]{ on_clearCacheButton_clicked(); }); - QObject::connect(ui->associateButton, &QPushButton::clicked, [&]{ on_associateButton_clicked(); }); - - if (settings().nexus().hasApiKey()) { - addNexusLog(QObject::tr("Connected.")); - } else { - addNexusLog(QObject::tr("Not connected.")); - } - - updateNexusState(); } -void NexusSettingsTab::update() +void NexusConnectionUI::set( + QAbstractButton* connectButton, + QAbstractButton* disconnectButton, + QAbstractButton* manualButton, + QListWidget* logList) { - settings().network().setOfflineMode(ui->offlineBox->isChecked()); - settings().network().setUseProxy(ui->proxyBox->isChecked()); - settings().nexus().setEndorsementIntegration(ui->endorsementBox->isChecked()); - settings().interface().setHideAPICounter(ui->hideAPICounterBox->isChecked()); - - auto servers = settings().network().servers(); - - // store server preference - for (int i = 0; i < ui->knownServersList->count(); ++i) { - const QString key = ui->knownServersList->item(i)->data(Qt::UserRole).toString(); - - bool found = false; - - for (auto& server : servers) { - if (server.name() == key) { - server.setPreferred(0); - found = true; - break; - } - } - - if (!found) { - log::error("while setting preferred to 0, server '{}' not found", key); - } + m_connect = connectButton; + if (m_connect) { + QObject::connect(m_connect, &QPushButton::clicked, [&]{ connect(); }); } - const int count = ui->preferredServersList->count(); - - for (int i = 0; i < count; ++i) { - const QString key = ui->preferredServersList->item(i)->data(Qt::UserRole).toString(); - const int newPreferred = count - i; + m_disconnect = disconnectButton; + if (m_disconnect) { + QObject::connect(m_disconnect, &QPushButton::clicked, [&]{ disconnect(); }); + } - bool found = false; + m_manual = manualButton; + if (m_manual) { + QObject::connect(manualButton, &QPushButton::clicked, [&]{ manual(); }); + } - for (auto& server : servers) { + m_log = logList; - if (server.name() == key) { - server.setPreferred(newPreferred); - found = true; - break; - } - } - - if (!found) { - log::error( - "while setting preference to {}, server '{}' not found", - newPreferred, key); - } + if (m_settings.nexus().hasApiKey()) { + addLog(tr("Connected.")); + } else { + addLog(tr("Not connected.")); } - settings().network().updateServers(servers); + updateState(); } -void NexusSettingsTab::on_nexusConnect_clicked() +void NexusConnectionUI::connect() { if (m_nexusLogin && m_nexusLogin->isActive()) { m_nexusLogin->cancel(); @@ -195,19 +128,19 @@ void NexusSettingsTab::on_nexusConnect_clicked() }; } - ui->nexusLog->clear(); + m_log->clear(); m_nexusLogin->start(); - updateNexusState(); + updateState(); } -void NexusSettingsTab::on_nexusManualKey_clicked() +void NexusConnectionUI::manual() { if (m_nexusValidator && m_nexusValidator->isActive()) { m_nexusValidator->cancel(); return; } - NexusManualKeyDialog d(&dialog()); + NexusManualKeyDialog d(m_parent); if (d.exec() != QDialog::Accepted) { return; } @@ -218,162 +151,273 @@ void NexusSettingsTab::on_nexusManualKey_clicked() return; } - ui->nexusLog->clear(); + m_log->clear(); validateKey(key); } -void NexusSettingsTab::on_nexusDisconnect_clicked() +void NexusConnectionUI::disconnect() { clearKey(); - ui->nexusLog->clear(); - addNexusLog(QObject::tr("Disconnected.")); -} - -void NexusSettingsTab::on_clearCacheButton_clicked() -{ - QDir(Settings::instance().paths().cache()).removeRecursively(); - NexusInterface::instance(dialog().pluginContainer())->clearCache(); -} - -void NexusSettingsTab::on_associateButton_clicked() -{ - Settings::instance().nexus().registerAsNXMHandler(true); + m_log->clear(); + addLog(tr("Disconnected.")); } -void NexusSettingsTab::validateKey(const QString& key) +void NexusConnectionUI::validateKey(const QString& key) { if (!m_nexusValidator) { m_nexusValidator.reset(new NexusKeyValidator( - *NexusInterface::instance(dialog().pluginContainer())->getAccessManager())); + *NexusInterface::instance().getAccessManager())); m_nexusValidator->finished = [&](auto&& r, auto&& m, auto&& u) { onValidatorFinished(r, m, u); }; } - addNexusLog(QObject::tr("Checking API key...")); + addLog(tr("Checking API key...")); m_nexusValidator->start(key, NexusKeyValidator::OneShot); } -void NexusSettingsTab::onSSOKeyChanged(const QString& key) +void NexusConnectionUI::onSSOKeyChanged(const QString& key) { if (key.isEmpty()) { clearKey(); } else { - addNexusLog(QObject::tr("Received API key.")); + addLog(tr("Received API key.")); validateKey(key); } } -void NexusSettingsTab::onSSOStateChanged(NexusSSOLogin::States s, const QString& e) +void NexusConnectionUI::onSSOStateChanged( + NexusSSOLogin::States s, const QString& e) { if (s != NexusSSOLogin::Finished) { // finished state is handled in onSSOKeyChanged() const auto log = NexusSSOLogin::stateToString(s, e); for (auto&& line : log.split("\n")) { - addNexusLog(line); + addLog(line); } } - updateNexusState(); + updateState(); } -void NexusSettingsTab::onValidatorFinished( +void NexusConnectionUI::onValidatorFinished( ValidationAttempt::Result r, const QString& message, std::optional user) { if (user) { - NexusInterface::instance(dialog().pluginContainer())->setUserAccount(*user); - addNexusLog(QObject::tr("Received user acount information")); + NexusInterface::instance().setUserAccount(*user); + addLog(tr("Received user account information")); if (setKey(user->apiKey())) { - addNexusLog(QObject::tr("Linked with Nexus successfully.")); + addLog(tr("Linked with Nexus successfully.")); } else { - addNexusLog(QObject::tr("Failed to set API key")); + addLog(tr("Failed to set API key")); } } else { if (message.isEmpty()) { // shouldn't happen - addNexusLog("Unknown error"); + addLog("Unknown error"); } else { - addNexusLog(message); + addLog(message); } } - updateNexusState(); + updateState(); } -void NexusSettingsTab::addNexusLog(const QString& s) +void NexusConnectionUI::addLog(const QString& s) { - ui->nexusLog->addItem(s); - ui->nexusLog->scrollToBottom(); + m_log->addItem(s); + m_log->scrollToBottom(); } -bool NexusSettingsTab::setKey(const QString& key) +bool NexusConnectionUI::setKey(const QString& key) { - dialog().setExitNeeded(Exit::Restart); - const bool ret = settings().nexus().setApiKey(key); - updateNexusState(); + const bool ret = m_settings.nexus().setApiKey(key); + updateState(); + + emit keyChanged(); + return ret; } -bool NexusSettingsTab::clearKey() +bool NexusConnectionUI::clearKey() { - dialog().setExitNeeded(Exit::Restart); - const auto ret = settings().nexus().clearApiKey(); + const auto ret = m_settings.nexus().clearApiKey(); + + NexusInterface::instance().getAccessManager()->clearApiKey(); + updateState(); - NexusInterface::instance(dialog().pluginContainer())->getAccessManager()->clearApiKey(); - updateNexusState(); + emit keyChanged(); return ret; } -void NexusSettingsTab::updateNexusState() +void NexusConnectionUI::updateState() { - updateNexusButtons(); - updateNexusData(); -} + auto setButton = [&](QAbstractButton* b, bool enabled, QString caption={}) { + if (b) { + b->setEnabled(enabled); + if (!caption.isEmpty()) { + b->setText(caption); + } + } + }; -void NexusSettingsTab::updateNexusButtons() -{ if (m_nexusLogin && m_nexusLogin->isActive()) { // api key is in the process of being retrieved - ui->nexusConnect->setText(QObject::tr("Cancel")); - ui->nexusConnect->setEnabled(true); - ui->nexusDisconnect->setEnabled(false); - ui->nexusManualKey->setText(QObject::tr("Enter API Key Manually")); - ui->nexusManualKey->setEnabled(false); + setButton(m_connect, true, QObject::tr("Cancel")); + setButton(m_disconnect, false); + setButton(m_manual, false,QObject::tr("Enter API Key Manually")); } else if (m_nexusValidator && m_nexusValidator->isActive()) { // api key is in the process of being tested - ui->nexusConnect->setText(QObject::tr("Connect to Nexus")); - ui->nexusConnect->setEnabled(false); - ui->nexusDisconnect->setEnabled(false); - ui->nexusManualKey->setText(QObject::tr("Cancel")); - ui->nexusManualKey->setEnabled(true); + setButton(m_connect, false, QObject::tr("Connect to Nexus")); + setButton(m_disconnect, false); + setButton(m_manual, true, QObject::tr("Cancel")); } - else if (settings().nexus().hasApiKey()) { + else if (m_settings.nexus().hasApiKey()) { // api key is present - ui->nexusConnect->setText(QObject::tr("Connect to Nexus")); - ui->nexusConnect->setEnabled(false); - ui->nexusDisconnect->setEnabled(true); - ui->nexusManualKey->setText(QObject::tr("Enter API Key Manually")); - ui->nexusManualKey->setEnabled(false); + setButton(m_connect, false, QObject::tr("Connect to Nexus")); + setButton(m_disconnect, true); + setButton(m_manual, false, QObject::tr("Enter API Key Manually")); } else { // api key not present - ui->nexusConnect->setText(QObject::tr("Connect to Nexus")); - ui->nexusConnect->setEnabled(true); - ui->nexusDisconnect->setEnabled(false); - ui->nexusManualKey->setText(QObject::tr("Enter API Key Manually")); - ui->nexusManualKey->setEnabled(true); + setButton(m_connect, true, QObject::tr("Connect to Nexus")); + setButton(m_disconnect, false); + setButton(m_manual, true, QObject::tr("Enter API Key Manually")); + } + + emit stateChanged(); +} + + + +NexusSettingsTab::NexusSettingsTab(Settings& s, SettingsDialog& d) + : SettingsTab(s, d), m_connectionUI(s, &d) +{ + ui->offlineBox->setChecked(settings().network().offlineMode()); + ui->proxyBox->setChecked(settings().network().useProxy()); + ui->endorsementBox->setChecked(settings().nexus().endorsementIntegration()); + ui->hideAPICounterBox->setChecked(settings().interface().hideAPICounter()); + + // display server preferences + for (const auto& server : s.network().servers()) { + QString descriptor = server.name(); + + if (!descriptor.compare("CDN", Qt::CaseInsensitive)) { + descriptor += QStringLiteral(" (automatic)"); + } + + const auto averageSpeed = server.averageSpeed(); + if (averageSpeed > 0) { + descriptor += QString(" (%1)").arg(MOBase::localizedByteSpeed(averageSpeed)); + } + + QListWidgetItem *newItem = new ServerItem(descriptor, Qt::UserRole + 1); + + newItem->setData(Qt::UserRole, server.name()); + newItem->setData(Qt::UserRole + 1, server.preferred()); + + if (server.preferred() > 0) { + ui->preferredServersList->addItem(newItem); + } else { + ui->knownServersList->addItem(newItem); + } + + ui->preferredServersList->sortItems(Qt::DescendingOrder); } + + m_connectionUI.set( + ui->nexusConnect, + ui->nexusDisconnect, + ui->nexusManualKey, + ui->nexusLog); + + QObject::connect( + &m_connectionUI, &NexusConnectionUI::stateChanged, &d, + [&]{ updateNexusData(); }, Qt::QueuedConnection); + + QObject::connect( + &m_connectionUI, &NexusConnectionUI::keyChanged, &d, + [&]{ dialog().setExitNeeded(Exit::Restart); }); + + + QObject::connect(ui->clearCacheButton, &QPushButton::clicked, [&]{ on_clearCacheButton_clicked(); }); + QObject::connect(ui->associateButton, &QPushButton::clicked, [&]{ on_associateButton_clicked(); }); +} + +void NexusSettingsTab::update() +{ + settings().network().setOfflineMode(ui->offlineBox->isChecked()); + settings().network().setUseProxy(ui->proxyBox->isChecked()); + settings().nexus().setEndorsementIntegration(ui->endorsementBox->isChecked()); + settings().interface().setHideAPICounter(ui->hideAPICounterBox->isChecked()); + + auto servers = settings().network().servers(); + + // store server preference + for (int i = 0; i < ui->knownServersList->count(); ++i) { + const QString key = ui->knownServersList->item(i)->data(Qt::UserRole).toString(); + + bool found = false; + + for (auto& server : servers) { + if (server.name() == key) { + server.setPreferred(0); + found = true; + break; + } + } + + if (!found) { + log::error("while setting preferred to 0, server '{}' not found", key); + } + } + + const int count = ui->preferredServersList->count(); + + for (int i = 0; i < count; ++i) { + const QString key = ui->preferredServersList->item(i)->data(Qt::UserRole).toString(); + const int newPreferred = count - i; + + bool found = false; + + for (auto& server : servers) { + + if (server.name() == key) { + server.setPreferred(newPreferred); + found = true; + break; + } + } + + if (!found) { + log::error( + "while setting preference to {}, server '{}' not found", + newPreferred, key); + } + } + + settings().network().updateServers(servers); +} + +void NexusSettingsTab::on_clearCacheButton_clicked() +{ + QDir(Settings::instance().paths().cache()).removeRecursively(); + NexusInterface::instance().clearCache(); +} + +void NexusSettingsTab::on_associateButton_clicked() +{ + Settings::instance().nexus().registerAsNXMHandler(true); } void NexusSettingsTab::updateNexusData() { - const auto user = NexusInterface::instance(dialog().pluginContainer()) - ->getAPIUserAccount(); + const auto user = NexusInterface::instance().getAPIUserAccount(); if (user.isValid()) { ui->nexusUserID->setText(user.id()); diff --git a/src/settingsdialognexus.h b/src/settingsdialognexus.h index 2cb1cc1e..0adf67c7 100644 --- a/src/settingsdialognexus.h +++ b/src/settingsdialognexus.h @@ -5,38 +5,67 @@ #include "settingsdialog.h" #include "nxmaccessmanager.h" -class NexusSettingsTab : public SettingsTab +class NexusConnectionUI : public QObject { + Q_OBJECT; + public: - NexusSettingsTab(Settings& settings, SettingsDialog& dialog); - void update(); + NexusConnectionUI(Settings& s, QWidget* parent=nullptr); + + void set( + QAbstractButton* connectButton, + QAbstractButton* disconnectButton, + QAbstractButton* manualButton, + QListWidget* logList); + + void connect(); + void manual(); + void disconnect(); + +signals: + void stateChanged(); + void keyChanged(); private: + QWidget* m_parent; + Settings& m_settings; + QAbstractButton* m_connect; + QAbstractButton* m_disconnect; + QAbstractButton* m_manual; + QListWidget* m_log; + std::unique_ptr m_nexusLogin; std::unique_ptr m_nexusValidator; - void on_nexusConnect_clicked(); - void on_nexusManualKey_clicked(); - void on_nexusDisconnect_clicked(); - void on_clearCacheButton_clicked(); - void on_associateButton_clicked(); + void addLog(const QString& s); + + void updateState(); void validateKey(const QString& key); bool setKey(const QString& key); bool clearKey(); - void updateNexusState(); - void updateNexusButtons(); - void updateNexusData(); - void onSSOKeyChanged(const QString& key); void onSSOStateChanged(NexusSSOLogin::States s, const QString& e); void onValidatorFinished( ValidationAttempt::Result r, const QString& message, std::optional useR); +}; + - void addNexusLog(const QString& s); +class NexusSettingsTab : public SettingsTab +{ +public: + NexusSettingsTab(Settings& settings, SettingsDialog& dialog); + void update(); + +private: + NexusConnectionUI m_connectionUI; + + void on_clearCacheButton_clicked(); + void on_associateButton_clicked(); + void updateNexusData(); }; #endif // SETTINGSDIALOGNEXUS_H -- cgit v1.3.1 From f67dc91aa1f00eb2005d8e576c24739df91802ce Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 14 Aug 2020 16:13:24 -0400 Subject: fixed boost bind warnings --- src/downloadmanager.cpp | 4 +++- src/mainwindow.cpp | 4 +++- src/pch.h | 2 +- src/selfupdater.cpp | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 5db0cbdf..2927a972 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -42,7 +42,7 @@ along with Mod Organizer. If not, see . #include #include -#include +#include #include @@ -1841,6 +1841,8 @@ int DownloadManager::indexByInfo(const DownloadInfo* info) const void DownloadManager::nxmDownloadURLsAvailable(QString gameName, int modID, int fileID, QVariant userData, QVariant resultData, int requestID) { + using namespace boost::placeholders; + std::set::iterator idIter = m_RequestIDs.find(requestID); if (idIter == m_RequestIDs.end()) { return; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9144210c..3ef34e93 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -168,7 +168,7 @@ along with Mod Organizer. If not, see . #ifndef Q_MOC_RUN #include #include -#include +#include #include #include #endif @@ -5903,6 +5903,8 @@ bool MainWindow::extractProgress(QProgressDialog &progress, int percentage, std: void MainWindow::extractBSATriggered() { + using namespace boost::placeholders; + QTreeWidgetItem *item = m_ContextItem; QString origin; diff --git a/src/pch.h b/src/pch.h index 02b6b1a2..2a2246ba 100644 --- a/src/pch.h +++ b/src/pch.h @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 904dbd83..c0f3b005 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -56,7 +56,7 @@ along with Mod Organizer. If not, see . #include #include -#include +#include #include //for VS_FIXEDFILEINFO, GetLastError -- cgit v1.3.1 From 4c5e3da2334a1d0c474148be8881b46d6ca6d3fa Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Mon, 17 Aug 2020 05:06:26 -0400 Subject: moved nexus api stuff to GlobalSettings pass a pointer to Settings around for things that can be called without settings, when creating the first instance added dummy plugin list, mod list and iorganizer to initialize plugins without an instance moved PluginContainer into the core filter, had nothing to do with the plugins list NexusInterface is now created manually instead of being a static singleton because it needs to know if the settings are available --- src/CMakeLists.txt | 2 +- src/createinstancedialog.cpp | 9 +- src/createinstancedialog.h | 6 +- src/createinstancedialogpages.cpp | 5 +- src/instancemanagerdialog.cpp | 2 +- src/main.cpp | 27 +++-- src/mainwindow.cpp | 4 +- src/modlist.cpp | 41 ++++++++ src/modlist.h | 14 +++ src/nexusinterface.cpp | 28 +++-- src/nexusinterface.h | 6 +- src/nxmaccessmanager.cpp | 37 +++++-- src/nxmaccessmanager.h | 11 +- src/organizercore.cpp | 4 +- src/organizerproxy.cpp | 212 ++++++++++++++++++++++++++++++++++++++ src/organizerproxy.h | 59 +++++++++++ src/plugincontainer.cpp | 88 ++++++++++------ src/pluginlist.cpp | 60 +++++++++++ src/pluginlist.h | 18 ++++ src/settings.cpp | 62 +++++------ src/settings.h | 36 +++---- src/settingsdialognexus.cpp | 18 ++-- src/settingsdialognexus.h | 4 +- 23 files changed, 623 insertions(+), 130 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 844f5e19..eec33460 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,6 +33,7 @@ add_filter(NAME src/core GROUPS nexusinterface nxmaccessmanager organizercore + plugincontainer apiuseraccount processrunner qdirfiletree @@ -136,7 +137,6 @@ add_filter(NAME src/modlist GROUPS ) add_filter(NAME src/plugins GROUPS - plugincontainer pluginlist pluginlistsortproxy pluginlistview diff --git a/src/createinstancedialog.cpp b/src/createinstancedialog.cpp index f4140e01..0f62fcf6 100644 --- a/src/createinstancedialog.cpp +++ b/src/createinstancedialog.cpp @@ -11,8 +11,8 @@ using namespace MOBase; CreateInstanceDialog::CreateInstanceDialog( - const PluginContainer& pc, QWidget *parent) : - QDialog(parent), ui(new Ui::CreateInstanceDialog), m_pc(pc), + const PluginContainer& pc, Settings* s, QWidget *parent) : + QDialog(parent), ui(new Ui::CreateInstanceDialog), m_pc(pc), m_settings(s), m_switching(false) { using namespace cid; @@ -55,6 +55,11 @@ const PluginContainer& CreateInstanceDialog::pluginContainer() return m_pc; } +Settings* CreateInstanceDialog::settings() +{ + return m_settings; +} + bool CreateInstanceDialog::isOnLastPage() const { for (int i=ui->pages->currentIndex() + 1; i < ui->pages->count(); ++i) { diff --git a/src/createinstancedialog.h b/src/createinstancedialog.h index 95d4fa68..0841ef29 100644 --- a/src/createinstancedialog.h +++ b/src/createinstancedialog.h @@ -8,6 +8,7 @@ namespace Ui { class CreateInstanceDialog; }; namespace cid { class Page; } class PluginContainer; +class Settings; class CreateInstanceDialog : public QDialog { @@ -47,12 +48,14 @@ public: explicit CreateInstanceDialog( - const PluginContainer& pc, QWidget *parent = nullptr); + const PluginContainer& pc, Settings* s, QWidget *parent = nullptr); ~CreateInstanceDialog(); Ui::CreateInstanceDialog* getUI(); + const PluginContainer& pluginContainer(); + Settings* settings(); void next(); void back(); @@ -77,6 +80,7 @@ public: private: std::unique_ptr ui; const PluginContainer& m_pc; + Settings* m_settings; std::vector> m_pages; QString m_originalNext; bool m_switching; diff --git a/src/createinstancedialogpages.cpp b/src/createinstancedialogpages.cpp index 73b265c8..d809079d 100644 --- a/src/createinstancedialogpages.cpp +++ b/src/createinstancedialogpages.cpp @@ -964,7 +964,8 @@ NexusPage::NexusPage(CreateInstanceDialog& dlg) : Page(dlg), m_skip(false) { m_connectionUI.reset(new NexusConnectionUI( - Settings::instance(), &m_dlg, + &m_dlg, + dlg.settings(), ui->nexusConnect, nullptr, ui->nexusManual, @@ -972,7 +973,7 @@ NexusPage::NexusPage(CreateInstanceDialog& dlg) // just check it once, or connecting and then going back and forth would skip // the page, which would be unexpected - m_skip = Settings::instance().nexus().hasApiKey(); + m_skip = GlobalSettings::hasNexusApiKey(); } NexusPage::~NexusPage() = default; diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index 3b9dd344..7b8522ee 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -718,7 +718,7 @@ void InstanceManagerDialog::onSelection() void InstanceManagerDialog::createNew() { - CreateInstanceDialog dlg(m_pc, this); + CreateInstanceDialog dlg(m_pc, &Settings::instance(), this); if (dlg.exec() != QDialog::Accepted) { return; } diff --git a/src/main.cpp b/src/main.cpp index 93580931..fd5a47c9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,7 @@ along with Mod Organizer. If not, see . #include "nxmaccessmanager.h" #include "instancemanager.h" #include "instancemanagerdialog.h" +#include "createinstancedialog.h" #include "organizercore.h" #include "env.h" #include "envmodule.h" @@ -329,6 +330,9 @@ int runApplication( // this must outlive `organizer` std::unique_ptr pluginContainer; + log::debug("initializing nexus interface"); + NexusInterface ni(&settings); + log::debug("initializing core"); OrganizerCore organizer(settings); if (!organizer.bootstrap()) { @@ -394,8 +398,8 @@ int runApplication( auto splash = createSplash(settings, dataPath, game); QString apiKey; - if (settings.nexus().apiKey(apiKey)) { - NexusInterface::instance().getAccessManager()->apiCheck(apiKey); + if (GlobalSettings::nexusApiKey(apiKey)) { + ni.getAccessManager()->apiCheck(apiKey); } log::debug("initializing tutorials"); @@ -415,8 +419,7 @@ int runApplication( // set up main window and its data structures MainWindow mainWindow(settings, organizer, *pluginContainer); - NexusInterface::instance() - .getAccessManager()->setTopLevelWidget(&mainWindow); + ni.getAccessManager()->setTopLevelWidget(&mainWindow); QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application, SLOT(setStyleFile(QString))); @@ -443,8 +446,7 @@ int runApplication( res = application.exec(); mainWindow.close(); - NexusInterface::instance() - .getAccessManager()->setTopLevelWidget(nullptr); + ni.getAccessManager()->setTopLevelWidget(nullptr); } settings.geometry().resetIfNeeded(); @@ -507,6 +509,7 @@ QString determineDataPath(const cl::CommandLine& cl) } } + int doOneRun( cl::CommandLine& cl, MOApplication& application, SingleInstance& instance) { @@ -515,6 +518,18 @@ int doOneRun( // resets things when MO is "restarted" resetForRestart(cl); + + //{ + // NexusInterface ni(nullptr); + // + // PluginContainer pc(nullptr); + // pc.loadPlugins(); + // + // CreateInstanceDialog dlg(pc, nullptr); + // dlg.exec(); + //} + + const QString dataPath = determineDataPath(cl); if (dataPath.isEmpty()) { return 1; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3ef34e93..9ad51510 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4226,7 +4226,7 @@ void MainWindow::checkModsForUpdates() NexusInterface::instance().requestTrackingInfo(this, QVariant(), QString()); } else { QString apiKey; - if (m_OrganizerCore.settings().nexus().apiKey(apiKey)) { + if (GlobalSettings::nexusApiKey(apiKey)) { m_OrganizerCore.doAfterLogin([this] () { this->checkModsForUpdates(); }); NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } else { @@ -5434,7 +5434,7 @@ void MainWindow::modUpdateCheck(std::multimap IDs) ModInfo::manualUpdateCheck(this, IDs); } else { QString apiKey; - if (m_OrganizerCore.settings().nexus().apiKey(apiKey)) { + if (GlobalSettings::nexusApiKey(apiKey)) { m_OrganizerCore.doAfterLogin([=]() { this->modUpdateCheck(IDs); }); NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } else diff --git a/src/modlist.cpp b/src/modlist.cpp index 1f845999..bf9aef83 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -1528,3 +1528,44 @@ void ModList::disableSelected(const QItemSelectionModel *selectionModel) m_Profile->setModsEnabled(QList(), modsToDisable); } } + + +QString DummyModList::displayName(const QString &internalName) const +{ + return {}; +} + +QStringList DummyModList::allMods() const +{ + return {}; +} + +IModList::ModStates DummyModList::state(const QString &name) const +{ + return 0; +} + +bool DummyModList::setActive(const QString &name, bool active) +{ + return true; +} + +int DummyModList::priority(const QString &name) const +{ + return -1; +} + +bool DummyModList::setPriority(const QString &name, int newPriority) +{ + return true; +} + +bool DummyModList::onModStateChanged(const std::function &func) +{ + return true; +} + +bool DummyModList::onModMoved(const std::function &func) +{ + return true; +} diff --git a/src/modlist.h b/src/modlist.h index 385ca04c..3ab486c9 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -397,5 +397,19 @@ private: }; + +class DummyModList : public MOBase::IModList +{ +public: + QString displayName(const QString &internalName) const override; + QStringList allMods() const override; + ModStates state(const QString &name) const override; + bool setActive(const QString &name, bool active) override; + int priority(const QString &name) const override; + bool setPriority(const QString &name, int newPriority) override; + bool onModStateChanged(const std::function &func) override; + bool onModMoved(const std::function &func) override; +}; + #endif // MODLIST_H diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 396cec11..1364d7e1 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see . #include "nxmaccessmanager.h" #include "selectiondialog.h" #include "bbcode.h" +#include "settings.h" #include #include "shared/util.h" #include @@ -235,31 +236,42 @@ APILimits NexusInterface::parseLimits( } -NexusInterface::NexusInterface() +static NexusInterface* g_instance = nullptr; + +NexusInterface::NexusInterface(Settings* s) : m_PluginContainer(nullptr) { + MO_ASSERT(!g_instance); + g_instance = this; + m_User.limits(defaultAPILimits()); m_MOVersion = createVersionInfo(); - m_AccessManager = new NXMAccessManager(this, m_MOVersion.displayString(3)); + m_AccessManager = new NXMAccessManager( + this, s, m_MOVersion.displayString(3)); + m_DiskCache = new QNetworkDiskCache(this); + connect(m_AccessManager, SIGNAL(requestNXMDownload(QString)), this, SLOT(downloadRequestedNXM(QString))); } -NXMAccessManager *NexusInterface::getAccessManager() +NexusInterface::~NexusInterface() { - return m_AccessManager; + cleanup(); + + MO_ASSERT(g_instance == this); + g_instance = nullptr; } -NexusInterface::~NexusInterface() +NXMAccessManager *NexusInterface::getAccessManager() { - cleanup(); + return m_AccessManager; } NexusInterface& NexusInterface::instance() { - static NexusInterface ni; - return ni; + MO_ASSERT(g_instance); + return *g_instance; } void NexusInterface::setCacheDirectory(const QString &directory) diff --git a/src/nexusinterface.h b/src/nexusinterface.h index 72f30a38..cf365b2e 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -40,7 +40,7 @@ namespace MOBase { class IPluginGame; } class NexusInterface; class NXMAccessManager; - +class Settings; /** * @brief convenience class to make nxm requests easier @@ -153,7 +153,9 @@ public: static APILimits parseLimits(const QNetworkReply* reply); static APILimits parseLimits(const QList& headers); + NexusInterface(Settings* s); ~NexusInterface(); + static NexusInterface& instance(); /** @@ -533,8 +535,6 @@ private: static const int MAX_ACTIVE_DOWNLOADS = 6; private: - - NexusInterface(); void nextRequest(); void requestFinished(std::list::iterator iter); MOBase::IPluginGame *getGame(QString gameName) const; diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 2fe676ba..6c8b9054 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -48,8 +48,8 @@ const QString NexusSSO("wss://sso.nexusmods.com"); const QString NexusSSOPage("https://www.nexusmods.com/sso?id=%1&application=modorganizer2"); -ValidationProgressDialog::ValidationProgressDialog(NexusKeyValidator& v) - : m_validator(v), m_updateTimer(nullptr), m_first(true) +ValidationProgressDialog::ValidationProgressDialog(Settings* s, NexusKeyValidator& v) + : m_settings(s), m_validator(v), m_updateTimer(nullptr), m_first(true) { ui.reset(new Ui::ValidationProgressDialog); ui->setupUi(this); @@ -98,7 +98,10 @@ void ValidationProgressDialog::stop() void ValidationProgressDialog::showEvent(QShowEvent* e) { if (m_first) { - Settings::instance().geometry().centerOnMainWindowMonitor(this); + if (m_settings) { + m_settings->geometry().centerOnMainWindowMonitor(this); + } + m_first = false; } } @@ -592,8 +595,8 @@ void ValidationAttempt::cleanup() } -NexusKeyValidator::NexusKeyValidator(NXMAccessManager& am) - : m_manager(am) +NexusKeyValidator::NexusKeyValidator(Settings* s, NXMAccessManager& am) + : m_settings(s), m_manager(am) { } @@ -602,6 +605,15 @@ NexusKeyValidator::~NexusKeyValidator() cancel(); } +std::vector NexusKeyValidator::getTimeouts() const +{ + if (m_settings) { + return m_settings->nexus().validationTimeouts(); + } else { + return {10s, 15s, 20s}; + } +} + void NexusKeyValidator::start(const QString& key, Behaviour b) { if (isActive()) { @@ -611,7 +623,7 @@ void NexusKeyValidator::start(const QString& key, Behaviour b) m_key = key; - const auto timeouts = Settings::instance().nexus().validationTimeouts(); + const auto timeouts = getTimeouts(); switch (b) { @@ -755,10 +767,11 @@ void NexusKeyValidator::setFinished( } -NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) +NXMAccessManager::NXMAccessManager(QObject *parent, Settings* s, const QString &moVersion) : QNetworkAccessManager(parent) + , m_Settings(s) , m_MOVersion(moVersion) - , m_validator(*this) + , m_validator(s, *this) , m_validationState(NotChecked) { m_validator.finished = [&](auto&& r, auto&& m, auto&& u) { @@ -769,8 +782,10 @@ NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) onValidatorAttemptFinished(a); }; - setCookieJar(new PersistentCookieJar(QDir::fromNativeSeparators( - Settings::instance().paths().cache() + "/nexus_cookies.dat"))); + if (m_Settings) { + setCookieJar(new PersistentCookieJar(QDir::fromNativeSeparators( + m_Settings->paths().cache() + "/nexus_cookies.dat"))); + } if (networkAccessible() == QNetworkAccessManager::UnknownAccessibility) { // why is this necessary all of a sudden? @@ -963,7 +978,7 @@ void NXMAccessManager::clearApiKey() void NXMAccessManager::startProgress() { if (!m_ProgressDialog) { - m_ProgressDialog.reset(new ValidationProgressDialog(m_validator)); + m_ProgressDialog.reset(new ValidationProgressDialog(m_Settings, m_validator)); } m_ProgressDialog->start(); diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index 6a45d880..60100467 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -33,6 +33,7 @@ along with Mod Organizer. If not, see . namespace MOBase { class IPluginGame; } namespace Ui { class ValidationProgressDialog; } class NXMAccessManager; +class Settings; class NexusSSOLogin { @@ -146,7 +147,7 @@ public: std::function finished; std::function attemptFinished; - NexusKeyValidator(NXMAccessManager& am); + NexusKeyValidator(Settings* s, NXMAccessManager& am); ~NexusKeyValidator(); void start(const QString& key, Behaviour b); @@ -157,11 +158,13 @@ public: const ValidationAttempt* currentAttempt() const; private: + Settings* m_settings; NXMAccessManager& m_manager; QString m_key; std::vector> m_attempts; void createAttempts(const std::vector& timeouts); + std::vector getTimeouts() const; bool nextTry(); void onAttemptSuccess(const ValidationAttempt& a, const APIUserAccount& u); @@ -178,7 +181,7 @@ class ValidationProgressDialog : public QDialog Q_OBJECT; public: - ValidationProgressDialog(NexusKeyValidator& v); + ValidationProgressDialog(Settings* s, NexusKeyValidator& v); void setParentWidget(QWidget* w); @@ -191,6 +194,7 @@ protected: private: std::unique_ptr ui; + Settings* m_settings; NexusKeyValidator& m_validator; QTimer* m_updateTimer; bool m_first; @@ -209,7 +213,7 @@ class NXMAccessManager : public QNetworkAccessManager { Q_OBJECT public: - NXMAccessManager(QObject *parent, const QString &moVersion); + NXMAccessManager(QObject *parent, Settings* s, const QString &moVersion); void setTopLevelWidget(QWidget* w); @@ -264,6 +268,7 @@ private: }; QWidget* m_TopLevel; + Settings* m_Settings; mutable std::unique_ptr m_ProgressDialog; QString m_MOVersion; NexusKeyValidator m_validator; diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 7fd8c33b..0d561581 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -339,7 +339,7 @@ bool OrganizerCore::nexusApi(bool retry) return false; } else { QString apiKey; - if (m_Settings.nexus().apiKey(apiKey)) { + if (GlobalSettings::nexusApiKey(apiKey)) { // credentials stored or user entered them manually log::debug("attempt to verify nexus api key"); accessManager->apiCheck(apiKey); @@ -1426,7 +1426,7 @@ void OrganizerCore::loggedInAction(QWidget* parent, std::function f) f(); } else { QString apiKey; - if (settings().nexus().apiKey(apiKey)) { + if (GlobalSettings::nexusApiKey(apiKey)) { doAfterLogin([f]{ f(); }); NexusInterface::instance().getAccessManager()->apiCheck(apiKey); } else { diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index 45efc00c..8cc95a8b 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -287,3 +287,215 @@ bool OrganizerProxy::onPluginSettingChanged(std::functiononPluginSettingChanged(func); } + + + +DummyOrganizerProxy::DummyOrganizerProxy(const QString &pluginName) : + m_PluginName(pluginName), + m_mods(new DummyModList), m_plugins(new DummyPluginList) +{ +} + +DummyOrganizerProxy::~DummyOrganizerProxy() = default; + +IModRepositoryBridge *DummyOrganizerProxy::createNexusBridge() const +{ + return nullptr; +} + +QString DummyOrganizerProxy::profileName() const +{ + return {}; +} + +QString DummyOrganizerProxy::profilePath() const +{ + return {}; +} + +QString DummyOrganizerProxy::downloadsPath() const +{ + return {}; +} + +QString DummyOrganizerProxy::overwritePath() const +{ + return {}; +} + +QString DummyOrganizerProxy::basePath() const +{ + return {}; +} + +QString DummyOrganizerProxy::modsPath() const +{ + return {}; +} + +VersionInfo DummyOrganizerProxy::appVersion() const +{ + return {}; +} + +IModInterface *DummyOrganizerProxy::getMod(const QString &name) const +{ + return nullptr; +} + +IPluginGame *DummyOrganizerProxy::getGame(const QString &gameName) const +{ + return nullptr; +} + +IModInterface *DummyOrganizerProxy::createMod(MOBase::GuessedValue &name) +{ + return nullptr; +} + +bool DummyOrganizerProxy::removeMod(IModInterface *mod) +{ + return true; +} + +void DummyOrganizerProxy::modDataChanged(IModInterface *mod) +{ +} + +QVariant DummyOrganizerProxy::pluginSetting(const QString &pluginName, const QString &key) const +{ + if (key == "enabled") { + return true; + } + + return {}; +} + +void DummyOrganizerProxy::setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value) +{ +} + +QVariant DummyOrganizerProxy::persistent(const QString &pluginName, const QString &key, const QVariant &def) const +{ + return {}; +} + +void DummyOrganizerProxy::setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync) +{ +} + +QString DummyOrganizerProxy::pluginDataPath() const +{ + return qApp->applicationDirPath() + "/" + ToQString(AppConfig::pluginPath()) + "/data"; +} + +HANDLE DummyOrganizerProxy::startApplication( + const QString& exe, const QStringList& args, const QString &cwd, + const QString& profile, const QString &overwrite, bool ignoreOverwrite) +{ + return INVALID_HANDLE_VALUE; +} + +bool DummyOrganizerProxy::waitForApplication(HANDLE handle, LPDWORD exitCode) const +{ + return true; +} + +bool DummyOrganizerProxy::onAboutToRun(const std::function &func) +{ + return true; +} + +bool DummyOrganizerProxy::onFinishedRun(const std::function &func) +{ + return true; +} + +bool DummyOrganizerProxy::onModInstalled(const std::function &func) +{ + return true; +} + +bool DummyOrganizerProxy::onUserInterfaceInitialized(std::function const& func) +{ + return true; +} + +bool DummyOrganizerProxy::onProfileChanged(std::function const& func) +{ + return true; +} + +bool DummyOrganizerProxy::onPluginSettingChanged(std::function const& func) +{ + return true; +} + +void DummyOrganizerProxy::refreshModList(bool saveChanges) +{ +} + +IModInterface *DummyOrganizerProxy::installMod(const QString &fileName, const QString &nameSuggestion) +{ + return nullptr; +} + +QString DummyOrganizerProxy::resolvePath(const QString &fileName) const +{ + return {}; +} + +QStringList DummyOrganizerProxy::listDirectories(const QString &directoryName) const +{ + return {}; +} + +QStringList DummyOrganizerProxy::findFiles(const QString &path, const std::function &filter) const +{ + return {}; +} + +QStringList DummyOrganizerProxy::findFiles(const QString& path, const QStringList& globFilters) const +{ + return {}; +} + +QStringList DummyOrganizerProxy::getFileOrigins(const QString &fileName) const +{ + return {}; +} + +QList DummyOrganizerProxy::findFileInfos(const QString &path, const std::function &filter) const +{ + return {}; +} + +MOBase::IDownloadManager *DummyOrganizerProxy::downloadManager() const +{ + return nullptr; +} + +MOBase::IPluginList *DummyOrganizerProxy::pluginList() const +{ + return m_plugins.get(); +} + +MOBase::IModList *DummyOrganizerProxy::modList() const +{ + return m_mods.get(); +} + +MOBase::IProfile *DummyOrganizerProxy::profile() const +{ + return nullptr; +} + +MOBase::IPluginGame const *DummyOrganizerProxy::managedGame() const +{ + return nullptr; +} + +QStringList DummyOrganizerProxy::modsSortedByProfilePriority() const +{ + return {}; +} diff --git a/src/organizerproxy.h b/src/organizerproxy.h index 6690d612..3bd70113 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -81,4 +81,63 @@ private: }; + +class DummyOrganizerProxy : public MOBase::IOrganizer +{ +public: + DummyOrganizerProxy(const QString &pluginName); + ~DummyOrganizerProxy(); + + virtual MOBase::IModRepositoryBridge *createNexusBridge() const; + virtual QString profileName() const; + virtual QString profilePath() const; + virtual QString downloadsPath() const; + virtual QString overwritePath() const; + virtual QString basePath() const; + virtual QString modsPath() const; + virtual MOBase::VersionInfo appVersion() const; + virtual MOBase::IModInterface *getMod(const QString &name) const; + virtual MOBase::IPluginGame *getGame(const QString &gameName) const; + virtual MOBase::IModInterface *createMod(MOBase::GuessedValue &name); + virtual bool removeMod(MOBase::IModInterface *mod); + virtual void modDataChanged(MOBase::IModInterface *mod); + virtual QVariant pluginSetting(const QString &pluginName, const QString &key) const; + virtual void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value); + virtual QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def = QVariant()) const; + virtual void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync = true); + virtual QString pluginDataPath() const; + virtual MOBase::IModInterface *installMod(const QString &fileName, const QString &nameSuggestion = QString()); + virtual QString resolvePath(const QString &fileName) const; + virtual QStringList listDirectories(const QString &directoryName) const; + virtual QStringList findFiles(const QString &path, const std::function &filter) const override; + virtual QStringList findFiles(const QString &path, const QStringList &globFilters) const override; + virtual QStringList getFileOrigins(const QString &fileName) const; + virtual QList findFileInfos(const QString &path, const std::function &filter) const; + + virtual MOBase::IDownloadManager *downloadManager() const; + virtual MOBase::IPluginList *pluginList() const; + virtual MOBase::IModList *modList() const; + virtual MOBase::IProfile *profile() const override; + virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", + const QString &profile = "", const QString &forcedCustomOverwrite = "", bool ignoreCustomOverwrite = false); + virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const; + virtual void refreshModList(bool saveChanges); + + virtual bool onAboutToRun(const std::function &func); + virtual bool onFinishedRun(const std::function &func); + virtual bool onModInstalled(const std::function &func); + virtual bool onUserInterfaceInitialized(std::function const& func); + virtual bool onProfileChanged(std::function const& func); + virtual bool onPluginSettingChanged(std::function const& func); + + virtual MOBase::IPluginGame const *managedGame() const; + + virtual QStringList modsSortedByProfilePriority() const; + +private: + const QString &m_PluginName; + std::unique_ptr m_plugins; + std::unique_ptr m_mods; +}; + #endif // ORGANIZERPROXY_H diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index 4771359d..6f2670dd 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -173,10 +173,21 @@ bool PluginContainer::verifyPlugin(IPlugin *plugin) { if (plugin == nullptr) { return false; - } else if (!plugin->init(new OrganizerProxy(m_Organizer, this, plugin))) { + } + + IOrganizer* proxy = nullptr; + + if (m_Organizer) { + proxy = new OrganizerProxy(m_Organizer, this, plugin); + } else { + proxy = new DummyOrganizerProxy(plugin); + } + + if (!plugin->init(proxy)) { log::warn("plugin failed to initialize"); return false; } + return true; } @@ -200,7 +211,9 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) return false; } plugin->setProperty("filename", fileName); - m_Organizer->settings().plugins().registerPlugin(pluginObj); + if (m_Organizer) { + m_Organizer->settings().plugins().registerPlugin(pluginObj); + } } { // diagnosis plugin @@ -244,7 +257,9 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) IPluginInstaller *installer = qobject_cast(plugin); if (verifyPlugin(installer)) { bf::at_key(m_Plugins).push_back(installer); - m_Organizer->installationManager()->registerInstaller(installer); + if (m_Organizer) { + m_Organizer->installationManager()->registerInstaller(installer); + } return true; } } @@ -317,7 +332,7 @@ void PluginContainer::unloadPlugins() } // disconnect all slots before unloading plugins so plugins don't have to take care of that - if (m_Organizer != nullptr) { + if (m_Organizer) { m_Organizer->disconnectPlugins(); } @@ -363,24 +378,28 @@ void PluginContainer::loadPlugins() registerPlugin(plugin, ""); } - QFile loadCheck(qApp->property("dataPath").toString() + "/plugin_loadcheck.tmp"); - if (loadCheck.exists() && loadCheck.open(QIODevice::ReadOnly)) { - // oh, there was a failed plugin load last time. Find out which plugin was loaded last - QString fileName; - while (!loadCheck.atEnd()) { - fileName = QString::fromUtf8(loadCheck.readLine().constData()).trimmed(); - } - if (QMessageBox::question(nullptr, QObject::tr("Plugin error"), - QObject::tr("It appears the plugin \"%1\" failed to load last startup and caused MO to crash. Do you want to disable it?\n" - "(Please note: If this is the first time you see this message for this plugin you may want to give it another try. " - "The plugin may be able to recover from the problem)").arg(fileName), - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { - m_Organizer->settings().plugins().addBlacklist(fileName); + QFile loadCheck; + + if (m_Organizer) { + loadCheck.setFileName(qApp->property("dataPath").toString() + "/plugin_loadcheck.tmp"); + if (loadCheck.exists() && loadCheck.open(QIODevice::ReadOnly)) { + // oh, there was a failed plugin load last time. Find out which plugin was loaded last + QString fileName; + while (!loadCheck.atEnd()) { + fileName = QString::fromUtf8(loadCheck.readLine().constData()).trimmed(); + } + if (QMessageBox::question(nullptr, QObject::tr("Plugin error"), + QObject::tr("It appears the plugin \"%1\" failed to load last startup and caused MO to crash. Do you want to disable it?\n" + "(Please note: If this is the first time you see this message for this plugin you may want to give it another try. " + "The plugin may be able to recover from the problem)").arg(fileName), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { + m_Organizer->settings().plugins().addBlacklist(fileName); + } + loadCheck.close(); } - loadCheck.close(); - } - loadCheck.open(QIODevice::WriteOnly); + loadCheck.open(QIODevice::WriteOnly); + } QString pluginPath = qApp->applicationDirPath() + "/" + ToQString(AppConfig::pluginPath()); log::debug("looking for plugins in {}", QDir::toNativeSeparators(pluginPath)); @@ -388,13 +407,20 @@ void PluginContainer::loadPlugins() while (iter.hasNext()) { iter.next(); - if (m_Organizer->settings().plugins().blacklisted(iter.fileName())) { - log::debug("plugin \"{}\" blacklisted", iter.fileName()); - continue; + + if (m_Organizer) { + if (m_Organizer->settings().plugins().blacklisted(iter.fileName())) { + log::debug("plugin \"{}\" blacklisted", iter.fileName()); + continue; + } } - loadCheck.write(iter.fileName().toUtf8()); - loadCheck.write("\n"); - loadCheck.flush(); + + if (loadCheck.isOpen()) { + loadCheck.write(iter.fileName().toUtf8()); + loadCheck.write("\n"); + loadCheck.flush(); + } + QString pluginName = iter.filePath(); if (QLibrary::isLibrary(pluginName)) { std::unique_ptr pluginLoader(new QPluginLoader(pluginName, this)); @@ -416,12 +442,16 @@ void PluginContainer::loadPlugins() } // remove the load check file on success - loadCheck.remove(); + if (loadCheck.isOpen()) { + loadCheck.remove(); + } - bf::at_key(m_Plugins).push_back(m_Organizer); bf::at_key(m_Plugins).push_back(this); - m_Organizer->connectPlugins(this); + if (m_Organizer) { + bf::at_key(m_Plugins).push_back(m_Organizer); + m_Organizer->connectPlugins(this); + } } diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index a4c1ec6d..7134d246 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -1671,3 +1671,63 @@ void PluginList::managedGameChanged(const IPluginGame *gamePlugin) { m_GamePlugin = gamePlugin; } + + + +QStringList DummyPluginList::pluginNames() const +{ + return {}; +} + +IPluginList::PluginStates DummyPluginList::state(const QString &name) const +{ + return 0; +} + +void DummyPluginList::setState(const QString &name, PluginStates state) +{ +} + +int DummyPluginList::priority(const QString &name) const +{ + return -1; +} + +int DummyPluginList::loadOrder(const QString &name) const +{ + return -1; +} + +void DummyPluginList::setLoadOrder(const QStringList &pluginList) +{ +} + +bool DummyPluginList::isMaster(const QString &name) const +{ + return false; +} + +QStringList DummyPluginList::masters(const QString &name) const +{ + return {}; +} + +QString DummyPluginList::origin(const QString &name) const +{ + return {}; +} + +bool DummyPluginList::onRefreshed(const std::function &callback) +{ + return true; +} + +bool DummyPluginList::onPluginMoved(const std::function &func) +{ + return true; +} + +bool DummyPluginList::onPluginStateChanged(const std::function &func) +{ + return true; +} diff --git a/src/pluginlist.h b/src/pluginlist.h index 0b49b86f..bfadaf4f 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -410,6 +410,24 @@ private: bool hasInfo(const ESPInfo& esp, const AdditionalInfo* info) const; }; + +class DummyPluginList : public MOBase::IPluginList +{ +public: + QStringList pluginNames() const override; + PluginStates state(const QString &name) const override; + void setState(const QString &name, PluginStates state) override; + int priority(const QString &name) const override; + int loadOrder(const QString &name) const override; + void setLoadOrder(const QStringList &pluginList) override; + bool isMaster(const QString &name) const override; + QStringList masters(const QString &name) const override; + QString origin(const QString &name) const override; + bool onRefreshed(const std::function &callback) override; + bool onPluginMoved(const std::function &func) override; + bool onPluginStateChanged(const std::function &func) override; +}; + #pragma warning(pop) #endif // PLUGINLIST_H diff --git a/src/settings.cpp b/src/settings.cpp index b286510d..593d66bf 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1812,37 +1812,6 @@ NexusSettings::NexusSettings(Settings& parent, QSettings& settings) { } -bool NexusSettings::apiKey(QString& apiKey) const -{ - QString tempKey = getWindowsCredential("APIKEY"); - if (tempKey.isEmpty()) - return false; - - apiKey = tempKey; - return true; -} - -bool NexusSettings::setApiKey(const QString& apiKey) -{ - if (!setWindowsCredential("APIKEY", apiKey)) { - const auto e = GetLastError(); - log::error("Storing API key failed: {}", formatSystemMessage(e)); - return false; - } - - return true; -} - -bool NexusSettings::clearApiKey() -{ - return setApiKey(""); -} - -bool NexusSettings::hasApiKey() const -{ - return !getWindowsCredential("APIKEY").isEmpty(); -} - bool NexusSettings::endorsementIntegration() const { return get(m_Settings, "Settings", "endorsement_integration", true); @@ -2224,6 +2193,37 @@ void GlobalSettings::setHideTutorialQuestion(bool b) settings().setValue("HideTutorialQuestion", b); } +bool GlobalSettings::nexusApiKey(QString& apiKey) +{ + QString tempKey = getWindowsCredential("APIKEY"); + if (tempKey.isEmpty()) + return false; + + apiKey = tempKey; + return true; +} + +bool GlobalSettings::setNexusApiKey(const QString& apiKey) +{ + if (!setWindowsCredential("APIKEY", apiKey)) { + const auto e = GetLastError(); + log::error("Storing API key failed: {}", formatSystemMessage(e)); + return false; + } + + return true; +} + +bool GlobalSettings::clearNexusApiKey() +{ + return setNexusApiKey(""); +} + +bool GlobalSettings::hasNexusApiKey() +{ + return !getWindowsCredential("APIKEY").isEmpty(); +} + void GlobalSettings::resetDialogs() { setHideCreateInstanceIntro(false); diff --git a/src/settings.h b/src/settings.h index a9501b9d..f71949d2 100644 --- a/src/settings.h +++ b/src/settings.h @@ -498,24 +498,6 @@ class NexusSettings public: NexusSettings(Settings& parent, QSettings& settings); - // if the key exists from the credentials store, puts it in `apiKey` and - // returns true; otherwise, returns false and leaves `apiKey` untouched - // - bool apiKey(QString& apiKey) const; - - // sets the api key in the credentials store, removes it if empty; returns - // false on errors - // - bool setApiKey(const QString& apiKey); - - // removes the api key from the credentials store; returns false on errors - // - bool clearApiKey(); - - // returns whether an API key is currently stored - // - bool hasApiKey() const; - // returns whether endorsement integration is enabled // bool endorsementIntegration() const; @@ -844,6 +826,24 @@ public: static bool hideTutorialQuestion(); static void setHideTutorialQuestion(bool b); + // if the key exists from the credentials store, puts it in `apiKey` and + // returns true; otherwise, returns false and leaves `apiKey` untouched + // + static bool nexusApiKey(QString& apiKey); + + // sets the api key in the credentials store, removes it if empty; returns + // false on errors + // + static bool setNexusApiKey(const QString& apiKey); + + // removes the api key from the credentials store; returns false on errors + // + static bool clearNexusApiKey(); + + // returns whether an API key is currently stored + // + static bool hasNexusApiKey(); + // resets anything that the user can disable static void resetDialogs(); diff --git a/src/settingsdialognexus.cpp b/src/settingsdialognexus.cpp index 54af9b59..1ed4c58f 100644 --- a/src/settingsdialognexus.cpp +++ b/src/settingsdialognexus.cpp @@ -72,13 +72,14 @@ private: NexusConnectionUI::NexusConnectionUI( - Settings& s, QWidget* parent, + Settings* s, QAbstractButton* connectButton, QAbstractButton* disconnectButton, QAbstractButton* manualButton, QListWidget* logList) : - m_parent(parent), m_settings(s), + m_parent(parent), + m_settings(s), m_connect(connectButton), m_disconnect(disconnectButton), m_manual(manualButton), @@ -96,7 +97,7 @@ NexusConnectionUI::NexusConnectionUI( QObject::connect(manualButton, &QPushButton::clicked, [&]{ manual(); }); } - if (m_settings.nexus().hasApiKey()) { + if (GlobalSettings::hasNexusApiKey()) { addLog(tr("Connected.")); } else { addLog(tr("Not connected.")); @@ -162,7 +163,7 @@ void NexusConnectionUI::validateKey(const QString& key) { if (!m_nexusValidator) { m_nexusValidator.reset(new NexusKeyValidator( - *NexusInterface::instance().getAccessManager())); + m_settings, *NexusInterface::instance().getAccessManager())); m_nexusValidator->finished = [&](auto&& r, auto&& m, auto&& u) { onValidatorFinished(r, m, u); @@ -231,7 +232,7 @@ void NexusConnectionUI::addLog(const QString& s) bool NexusConnectionUI::setKey(const QString& key) { - const bool ret = m_settings.nexus().setApiKey(key); + const bool ret = GlobalSettings::setNexusApiKey(key); updateState(); emit keyChanged(); @@ -241,7 +242,7 @@ bool NexusConnectionUI::setKey(const QString& key) bool NexusConnectionUI::clearKey() { - const auto ret = m_settings.nexus().clearApiKey(); + const auto ret = GlobalSettings::clearNexusApiKey(); NexusInterface::instance().getAccessManager()->clearApiKey(); updateState(); @@ -274,7 +275,7 @@ void NexusConnectionUI::updateState() setButton(m_disconnect, false); setButton(m_manual, true, QObject::tr("Cancel")); } - else if (m_settings.nexus().hasApiKey()) { + else if (GlobalSettings::hasNexusApiKey()) { // api key is present setButton(m_connect, false, QObject::tr("Connect to Nexus")); setButton(m_disconnect, true); @@ -327,7 +328,8 @@ NexusSettingsTab::NexusSettingsTab(Settings& s, SettingsDialog& d) } m_connectionUI.reset(new NexusConnectionUI( - settings(), &dialog(), + &dialog(), + &settings(), ui->nexusConnect, ui->nexusDisconnect, ui->nexusManualKey, diff --git a/src/settingsdialognexus.h b/src/settingsdialognexus.h index a2d6a4f8..c915accf 100644 --- a/src/settingsdialognexus.h +++ b/src/settingsdialognexus.h @@ -13,8 +13,8 @@ class NexusConnectionUI : public QObject public: NexusConnectionUI( - Settings& s, QWidget* parent, + Settings* s, QAbstractButton* connectButton, QAbstractButton* disconnectButton, QAbstractButton* manualButton, @@ -30,7 +30,7 @@ signals: private: QWidget* m_parent; - Settings& m_settings; + Settings* m_settings; QAbstractButton* m_connect; QAbstractButton* m_disconnect; QAbstractButton* m_manual; -- cgit v1.3.1 From 356d17b2ea70d9bfdc36d8199e12eb21cd3d4669 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 31 Oct 2020 16:08:05 -0400 Subject: fixes after rebasing --- src/mainwindow.cpp | 2 +- src/modinfo.cpp | 2 +- src/modinfo.h | 2 +- src/modinfodialogconflicts.cpp | 14 +++---- src/modlist.cpp | 48 +++++++++++++++++----- src/modlist.h | 8 +++- src/organizerproxy.cpp | 36 +++++++---------- src/organizerproxy.h | 91 ++++++++++++++++++++---------------------- src/pluginlist.cpp | 9 ++++- src/pluginlist.h | 3 +- src/thread_utils.h | 5 +-- 11 files changed, 126 insertions(+), 94 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9ad51510..6a648512 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -4221,7 +4221,7 @@ void MainWindow::checkModsForUpdates() { bool checkingModsForUpdate = false; if (NexusInterface::instance().getAccessManager()->validated()) { - checkingModsForUpdate = ModInfo::checkAllForUpdate(this); + checkingModsForUpdate = ModInfo::checkAllForUpdate(&m_PluginContainer, this); NexusInterface::instance().requestEndorsementInfo(this, QVariant(), QString()); NexusInterface::instance().requestTrackingInfo(this, QVariant(), QString()); } else { diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 04cb18ce..a0382fe8 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -295,7 +295,7 @@ ModInfo::ModInfo(PluginContainer *pluginContainer) } -bool ModInfo::checkAllForUpdate(QObject *receiver) +bool ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver) { bool updatesAvailable = true; diff --git a/src/modinfo.h b/src/modinfo.h index 480fe013..e5e46741 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -197,7 +197,7 @@ public: // Static functions: * * @return true if any mods are checked for update. */ - static bool checkAllForUpdate(QObject *receiver); + static bool checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver); /** * diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp index 0103b58a..cf7f6340 100644 --- a/src/modinfodialogconflicts.cpp +++ b/src/modinfodialogconflicts.cpp @@ -1001,7 +1001,7 @@ std::optional AdvancedConflictsTab::createItem( if (currOrigin->getID() == fileOrigin) { // current origin is the active winner, all alternatives go in 'before' - + if (showAllAlts) { for (const auto& alt : alternatives) { @@ -1023,7 +1023,7 @@ std::optional AdvancedConflictsTab::createItem( } else { // current mod is one of the alternatives, find its position - + auto currOrgId = currOrigin->getID(); auto currModIter = std::find_if(alternatives.begin(), alternatives.end(), @@ -1037,14 +1037,14 @@ std::optional AdvancedConflictsTab::createItem( } isCurrOrigArchive = currModIter->isFromArchive(); - + if (showAllAlts) { // fills 'before' and 'after' with all the alternatives that come - // before and after the current mod, trusting the alternatives vector to be + // before and after the current mod, trusting the alternatives vector to be // already sorted correctly - + for (auto iter = alternatives.begin(); iter != alternatives.end(); iter++) { - + const auto& altOrigin = ds.getOriginByID(iter->originID()); if (iter < currModIter) { @@ -1094,7 +1094,7 @@ std::optional AdvancedConflictsTab::createItem( after += ds.getOriginByID(fileOrigin).getName(); } - + } } } diff --git a/src/modlist.cpp b/src/modlist.cpp index bf9aef83..c98464a9 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -977,7 +977,7 @@ int ModList::setActive(const QStringList& names, bool active) { indices.append(modIndex); } else { - log::debug("Trying to {} mod {} which does not exist.", + log::debug("Trying to {} mod {} which does not exist.", active ? "enable" : "disable", name); } } @@ -1043,7 +1043,7 @@ void ModList::notifyModRemoved(QString const& modName) const m_ModRemoved(modName); } -void ModList::notifyModStateChanged(QList modIndices) const +void ModList::notifyModStateChanged(QList modIndices) const { std::map mods; for (auto modIndex : modIndices) { @@ -1530,7 +1530,7 @@ void ModList::disableSelected(const QItemSelectionModel *selectionModel) } -QString DummyModList::displayName(const QString &internalName) const +QString DummyModList::displayName(const QString&) const { return {}; } @@ -1540,32 +1540,62 @@ QStringList DummyModList::allMods() const return {}; } -IModList::ModStates DummyModList::state(const QString &name) const +QStringList DummyModList::allModsByProfilePriority(MOBase::IProfile*) const +{ + return {}; +} + +IModInterface* DummyModList::getMod(const QString&) const +{ + return nullptr; +} + +bool DummyModList::removeMod(MOBase::IModInterface*) +{ + return true; +} + +IModList::ModStates DummyModList::state(const QString&) const { return 0; } -bool DummyModList::setActive(const QString &name, bool active) +bool DummyModList::setActive(const QString&, bool) { return true; } -int DummyModList::priority(const QString &name) const +int DummyModList::setActive(const QStringList&, bool) +{ + return 0; +} + +int DummyModList::priority(const QString&) const { return -1; } -bool DummyModList::setPriority(const QString &name, int newPriority) +bool DummyModList::setPriority(const QString&, int) +{ + return true; +} + +bool DummyModList::onModInstalled(const std::function&) +{ + return true; +} + +bool DummyModList::onModRemoved(const std::function&) { return true; } -bool DummyModList::onModStateChanged(const std::function &func) +bool DummyModList::onModStateChanged(const std::function&)>&) { return true; } -bool DummyModList::onModMoved(const std::function &func) +bool DummyModList::onModMoved(const std::function&) { return true; } diff --git a/src/modlist.h b/src/modlist.h index 3ab486c9..1a469ee7 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -403,11 +403,17 @@ class DummyModList : public MOBase::IModList public: QString displayName(const QString &internalName) const override; QStringList allMods() const override; + QStringList allModsByProfilePriority(MOBase::IProfile *profile = nullptr) const override; + MOBase::IModInterface* getMod(const QString& name) const override; + bool removeMod(MOBase::IModInterface *mod) override; ModStates state(const QString &name) const override; bool setActive(const QString &name, bool active) override; + int setActive(const QStringList& names, bool active) override; int priority(const QString &name) const override; bool setPriority(const QString &name, int newPriority) override; - bool onModStateChanged(const std::function &func) override; + bool onModInstalled(const std::function& func) override; + bool onModRemoved(const std::function& func) override; + bool onModStateChanged(const std::function&)> &func) override; bool onModMoved(const std::function &func) override; }; diff --git a/src/organizerproxy.cpp b/src/organizerproxy.cpp index 8cc95a8b..b2a4f791 100644 --- a/src/organizerproxy.cpp +++ b/src/organizerproxy.cpp @@ -290,9 +290,8 @@ bool OrganizerProxy::onPluginSettingChanged(std::function &nam return nullptr; } -bool DummyOrganizerProxy::removeMod(IModInterface *mod) -{ - return true; -} - void DummyOrganizerProxy::modDataChanged(IModInterface *mod) { } @@ -411,12 +400,22 @@ bool DummyOrganizerProxy::onFinishedRun(const std::function &func) +bool DummyOrganizerProxy::onUserInterfaceInitialized(std::function const& func) { return true; } -bool DummyOrganizerProxy::onUserInterfaceInitialized(std::function const& func) +bool DummyOrganizerProxy::onProfileCreated(std::function const& func) +{ + return true; +} + +bool DummyOrganizerProxy::onProfileRenamed(std::function const& func) +{ + return true; +} + +bool DummyOrganizerProxy::onProfileRemoved(std::function const& func) { return true; } @@ -431,7 +430,7 @@ bool DummyOrganizerProxy::onPluginSettingChanged(std::function &name); - virtual bool removeMod(MOBase::IModInterface *mod); - virtual void modDataChanged(MOBase::IModInterface *mod); - virtual QVariant pluginSetting(const QString &pluginName, const QString &key) const; - virtual void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value); - virtual QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def = QVariant()) const; - virtual void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync = true); - virtual QString pluginDataPath() const; - virtual MOBase::IModInterface *installMod(const QString &fileName, const QString &nameSuggestion = QString()); - virtual QString resolvePath(const QString &fileName) const; - virtual QStringList listDirectories(const QString &directoryName) const; - virtual QStringList findFiles(const QString &path, const std::function &filter) const override; - virtual QStringList findFiles(const QString &path, const QStringList &globFilters) const override; - virtual QStringList getFileOrigins(const QString &fileName) const; - virtual QList findFileInfos(const QString &path, const std::function &filter) const; - - virtual MOBase::IDownloadManager *downloadManager() const; - virtual MOBase::IPluginList *pluginList() const; - virtual MOBase::IModList *modList() const; - virtual MOBase::IProfile *profile() const override; - virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", - const QString &profile = "", const QString &forcedCustomOverwrite = "", bool ignoreCustomOverwrite = false); - virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const; - virtual void refreshModList(bool saveChanges); - - virtual bool onAboutToRun(const std::function &func); - virtual bool onFinishedRun(const std::function &func); - virtual bool onModInstalled(const std::function &func); - virtual bool onUserInterfaceInitialized(std::function const& func); - virtual bool onProfileChanged(std::function const& func); - virtual bool onPluginSettingChanged(std::function const& func); - - virtual MOBase::IPluginGame const *managedGame() const; - - virtual QStringList modsSortedByProfilePriority() const; + MOBase::IModRepositoryBridge *createNexusBridge() const override; + QString profileName() const override; + QString profilePath() const override; + QString downloadsPath() const override; + QString overwritePath() const override; + QString basePath() const override; + QString modsPath() const override; + MOBase::VersionInfo appVersion() const override; + MOBase::IPluginGame *getGame(const QString &gameName) const override; + MOBase::IModInterface *createMod(MOBase::GuessedValue &name) override; + void modDataChanged(MOBase::IModInterface *mod) override; + QVariant pluginSetting(const QString &pluginName, const QString &key) const override; + void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value) override; + QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def = QVariant()) const override; + void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync = true) override; + QString pluginDataPath() const override; + MOBase::IModInterface *installMod(const QString &fileName, const QString &nameSuggestion = QString()) override; + QString resolvePath(const QString &fileName) const override; + QStringList listDirectories(const QString &directoryName) const override; + QStringList findFiles(const QString &path, const std::function &filter) const override; + QStringList findFiles(const QString &path, const QStringList &globFilters) const override; + QStringList getFileOrigins(const QString &fileName) const override; + QList findFileInfos(const QString &path, const std::function &filter) const override; + + MOBase::IDownloadManager *downloadManager() const override; + MOBase::IPluginList *pluginList() const override; + MOBase::IModList *modList() const override; + MOBase::IProfile *profile() const override; + HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", + const QString &profile = "", const QString &forcedCustomOverwrite = "", bool ignoreCustomOverwrite = false) override; + bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const override; + void refresh(bool saveChanges = true) override; + + bool onAboutToRun(const std::function &func) override; + bool onFinishedRun(const std::function &func) override; + bool onUserInterfaceInitialized(std::function const& func) override; + bool onProfileCreated(std::function const& func) override; + bool onProfileRenamed(std::function const& func) override; + bool onProfileRemoved(std::function const& func) override; + bool onProfileChanged(std::function const& func) override; + bool onPluginSettingChanged(std::function const& func) override; + + MOBase::IPluginGame const *managedGame() const override; private: - const QString &m_PluginName; std::unique_ptr m_plugins; std::unique_ptr m_mods; }; diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 7134d246..bda360ba 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -801,7 +801,7 @@ bool PluginList::setPriority(const QString& name, int newPriority) { int rowIndex = findPluginByPriority(oldPriority); - // We need to increment newPriority if its above the old one, otherwise the + // We need to increment newPriority if its above the old one, otherwise the // plugin is place right below the new priority. if (oldPriority < newPriority) { newPriority += 1; @@ -1702,6 +1702,11 @@ void DummyPluginList::setLoadOrder(const QStringList &pluginList) { } +bool DummyPluginList::setPriority(const QString&, int) +{ + return true; +} + bool DummyPluginList::isMaster(const QString &name) const { return false; @@ -1727,7 +1732,7 @@ bool DummyPluginList::onPluginMoved(const std::function &func) +bool DummyPluginList::onPluginStateChanged(const std::function&)> &func) { return true; } diff --git a/src/pluginlist.h b/src/pluginlist.h index bfadaf4f..27c15056 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -420,12 +420,13 @@ public: int priority(const QString &name) const override; int loadOrder(const QString &name) const override; void setLoadOrder(const QStringList &pluginList) override; + bool setPriority(const QString& name, int newPriority) override; bool isMaster(const QString &name) const override; QStringList masters(const QString &name) const override; QString origin(const QString &name) const override; bool onRefreshed(const std::function &callback) override; bool onPluginMoved(const std::function &func) override; - bool onPluginStateChanged(const std::function &func) override; + bool onPluginStateChanged(const std::function&)> &func) override; }; #pragma warning(pop) diff --git a/src/thread_utils.h b/src/thread_utils.h index 607d73a9..f64dd601 100644 --- a/src/thread_utils.h +++ b/src/thread_utils.h @@ -7,8 +7,7 @@ #include // in main.cpp -void setUnhandledExceptionHandler(); -LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs); +void setExceptionHandlers(); namespace MOShared { @@ -20,7 +19,7 @@ template std::thread startSafeThread(F&& f) { return std::thread([f=std::forward(f)] { - setUnhandledExceptionHandler(); + setExceptionHandlers(); f(); }); } -- cgit v1.3.1 From 38d2f87b31ba4af8f6ecb73e0432460778e26f82 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Tue, 3 Nov 2020 13:35:02 -0500 Subject: replaced #pragma once by ifdefs changed pointer to ref to NexusInterface on_actionChange_Game_triggered() now creates the dialog itself instead of calling test code fixed broken command line options, they'd be reset before they were used removed useless explicit --- src/commandline.h | 6 ++++-- src/createinstancedialog.h | 2 +- src/instancemanager.h | 26 ++++---------------------- src/instancemanagerdialog.cpp | 9 --------- src/main.cpp | 14 +++++++------- src/mainwindow.cpp | 31 +++++++++---------------------- src/moshortcut.h | 31 ++++++------------------------- src/pluginlistview.cpp | 2 -- src/shared/error_report.h | 8 ++++++-- src/uilocker.h | 5 ++++- 10 files changed, 41 insertions(+), 93 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/commandline.h b/src/commandline.h index 0e300327..72018ba3 100644 --- a/src/commandline.h +++ b/src/commandline.h @@ -1,5 +1,5 @@ -#pragma once - +#ifndef MODORGANIZER_COMMANDLINE_INCLUDED +#define MODORGANIZER_COMMANDLINE_INCLUDED #include "moshortcut.h" #include #include @@ -149,3 +149,5 @@ private: }; } // namespace + +#endif // MODORGANIZER_COMMANDLINE_INCLUDED diff --git a/src/createinstancedialog.h b/src/createinstancedialog.h index f05495c6..25e383eb 100644 --- a/src/createinstancedialog.h +++ b/src/createinstancedialog.h @@ -47,7 +47,7 @@ public: }; - explicit CreateInstanceDialog( + CreateInstanceDialog( const PluginContainer& pc, Settings* s, QWidget *parent = nullptr); ~CreateInstanceDialog(); diff --git a/src/instancemanager.h b/src/instancemanager.h index ddab4a2e..69536650 100644 --- a/src/instancemanager.h +++ b/src/instancemanager.h @@ -1,25 +1,5 @@ -/* -Copyright (C) 2016 Sebastian Herbord. All rights reserved. - -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 . -*/ - - -#pragma once - +#ifndef MODORGANIZER_INSTANCEMANAGER_INCLUDED +#define MODORGANIZER_INSTANCEMANAGER_INCLUDED #include #include @@ -112,3 +92,5 @@ private: bool m_overrideProfile{false}; QString m_overrideProfileName; }; + +#endif // MODORGANIZER_INSTANCEMANAGER_INCLUDED diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index f2e9a928..231835ba 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -13,15 +13,6 @@ using namespace MOBase; -void openInstanceManager(PluginContainer& pc, QWidget* parent) -{ - //CreateInstanceDialog dlg(pc, parent); - //dlg.exec(); - InstanceManagerDialog dlg(pc, parent); - dlg.exec(); -} - - class InstanceInfo { public: diff --git a/src/main.cpp b/src/main.cpp index bd7f8303..8f7af77d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -650,13 +650,6 @@ int doOneRun( // resets things when MO is "restarted" resetForRestart(cl); - if (cl.instance()) - InstanceManager::instance().overrideInstance(*cl.instance()); - - if (cl.profile()) { - InstanceManager::instance().overrideProfile(*cl.profile()); - } - auto currentInstance = InstanceManager::instance().currentInstance(); if (!currentInstance) @@ -707,6 +700,13 @@ int main(int argc, char *argv[]) tt.stop(); + if (cl.instance()) + InstanceManager::instance().overrideInstance(*cl.instance()); + + if (cl.profile()) { + InstanceManager::instance().overrideProfile(*cl.profile()); + } + for (;;) { const auto r = doOneRun(cl, application, instance); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6a648512..02900571 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -76,6 +76,7 @@ along with Mod Organizer. If not, see . #include "statusbar.h" #include "filterlist.h" #include "datatab.h" +#include "instancemanagerdialog.h" #include #include #include @@ -291,7 +292,7 @@ MainWindow::MainWindow(Settings &settings ui->statusBar->setup(ui, settings); { - auto* ni = &NexusInterface::instance(); + auto& ni = NexusInterface::instance(); // there are two ways to get here: // 1) the user just started MO, and @@ -311,8 +312,8 @@ MainWindow::MainWindow(Settings &settings // // in the rare case where the user restarts MO through the settings, this // will correctly pick up the previous values - updateWindowTitle(ni->getAPIUserAccount()); - ui->statusBar->setAPI(ni->getAPIStats(), ni->getAPIUserAccount()); + updateWindowTitle(ni.getAPIUserAccount()); + ui->statusBar->setAPI(ni.getAPIStats(), ni.getAPIUserAccount()); } m_Filters.reset(new FilterList(ui, &m_OrganizerCore, m_CategoryFactory)); @@ -1961,8 +1962,8 @@ void MainWindow::refreshSaveList() it.next(); files.append(it.fileInfo()); } - std::sort(files.begin(), files.end(), [](auto const& lhs, auto const& rhs) { - return lhs.fileTime(QFileDevice::FileModificationTime) < rhs.fileTime(QFileDevice::FileModificationTime); + std::sort(files.begin(), files.end(), [](auto const& lhs, auto const& rhs) { + return lhs.fileTime(QFileDevice::FileModificationTime) < rhs.fileTime(QFileDevice::FileModificationTime); }); for (const QFileInfo &file : files) { @@ -5569,7 +5570,7 @@ void MainWindow::nxmUpdateInfoAvailable(QString gameName, QVariant userData, QVa void MainWindow::finishUpdateInfo() { QFutureWatcher>>> *watcher = static_cast>>> *>(sender()); - + QString game = watcher->result().first; auto finalMods = watcher->result().second; @@ -5974,24 +5975,10 @@ void MainWindow::on_actionNotifications_triggered() scheduleCheckForProblems(); } -void openInstanceManager(PluginContainer& pc, QWidget* parent); - void MainWindow::on_actionChange_Game_triggered() { - openInstanceManager(m_PluginContainer, this); - - //if (m_OrganizerCore.settings().interface().showChangeGameConfirmation()) { - // const auto r = QMessageBox::question( - // this, tr("Are you sure?"), tr("This will restart MO, continue?"), - // QMessageBox::Yes | QMessageBox::Cancel); - // - // if (r != QMessageBox::Yes) { - // return; - // } - //} - // - //InstanceManager::instance().clearCurrentInstance(); - //ExitModOrganizer(Exit::Restart); + InstanceManagerDialog dlg(m_PluginContainer, this); + dlg.exec(); } void MainWindow::setCategoryListVisible(bool visible) diff --git a/src/moshortcut.h b/src/moshortcut.h index 0067b3bc..33346bb9 100644 --- a/src/moshortcut.h +++ b/src/moshortcut.h @@ -1,31 +1,10 @@ -/* -Copyright (C) 2016 Sebastian Herbord. All rights reserved. - -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 . -*/ - - -#pragma once - +#ifndef MODORGANIZER_MOSHORTCUT_INCLUDED +#define MODORGANIZER_MOSHORTCUT_INCLUDED #include - -class MOShortcut { - +class MOShortcut +{ public: MOShortcut(const QString& link={}); @@ -49,3 +28,5 @@ private: bool m_hasInstance; bool m_hasExecutable; }; + +#endif // MODORGANIZER_MOSHORTCUT_INCLUDED diff --git a/src/pluginlistview.cpp b/src/pluginlistview.cpp index 4217971d..a265d5d4 100644 --- a/src/pluginlistview.cpp +++ b/src/pluginlistview.cpp @@ -56,5 +56,3 @@ void PluginListView::setModel(QAbstractItemModel *model) QTreeView::setModel(model); setVerticalScrollBar(new ViewMarkingScrollBar(model, this)); } - -#pragma once diff --git a/src/shared/error_report.h b/src/shared/error_report.h index 17b25645..da07c728 100644 --- a/src/shared/error_report.h +++ b/src/shared/error_report.h @@ -17,16 +17,20 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#pragma once +#ifndef MODORGANIZER_SHARED_ERROR_REPORT_INCLUDED +#define MODORGANIZER_SHARED_ERROR_REPORT_INCLUDED #include #define WIN32_LEAN_AND_MEAN #include #include -namespace MOShared { +namespace MOShared +{ void reportError(LPCSTR format, ...); void reportError(LPCWSTR format, ...); } // namespace MOShared + +#endif // MODORGANIZER_SHARED_ERROR_REPORT_INCLUDED diff --git a/src/uilocker.h b/src/uilocker.h index cc467184..44d9d8a2 100644 --- a/src/uilocker.h +++ b/src/uilocker.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef MODORGANIZER_UILOCKER_INCLUDED +#define MODORGANIZER_UILOCKER_INCLUDED #include #include @@ -94,3 +95,5 @@ private: void enableAll(); void disable(QWidget* w); }; + +#endif // MODORGANIZER_UILOCKER_INCLUDED -- cgit v1.3.1 From ad8e9d99b30578676c15d10a74f010439e132406 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 6 Nov 2020 09:27:15 -0500 Subject: renamed InstanceManager::instance() to singleton() to avoid confusion --- src/createinstancedialog.cpp | 6 +++--- src/createinstancedialogpages.cpp | 18 +++++++++--------- src/envshortcut.cpp | 2 +- src/instancemanager.cpp | 2 +- src/instancemanager.h | 2 +- src/instancemanagerdialog.cpp | 20 ++++++++++---------- src/main.cpp | 14 +++++++------- src/mainwindow.cpp | 2 +- src/processrunner.cpp | 2 +- src/statusbar.cpp | 2 +- 10 files changed, 35 insertions(+), 35 deletions(-) (limited to 'src/mainwindow.cpp') diff --git a/src/createinstancedialog.cpp b/src/createinstancedialog.cpp index c976ee13..2ff8adf3 100644 --- a/src/createinstancedialog.cpp +++ b/src/createinstancedialog.cpp @@ -244,7 +244,7 @@ void CreateInstanceDialog::finish() ui->creationLog->clear(); logCreation(tr("Creating instance...")); - const auto& m = InstanceManager::instance(); + const auto& m = InstanceManager::singleton(); const auto ci = creationInfo(); auto logger = [&](QString s) { @@ -332,7 +332,7 @@ void CreateInstanceDialog::finish() } if (ui->launch->isChecked()) { - InstanceManager::instance().setCurrentInstance(ci.instanceName); + InstanceManager::singleton().setCurrentInstance(ci.instanceName); if (m_settings) { // don't restart without settings, it happens on startup when there are @@ -445,7 +445,7 @@ QString CreateInstanceDialog::dataPath() const if (instanceType() == Portable) { s = QDir(InstanceManager::portablePath()).absolutePath(); } else { - s = InstanceManager::instance().instancePath(instanceName()); + s = InstanceManager::singleton().instancePath(instanceName()); } return QDir::toNativeSeparators(s); diff --git a/src/createinstancedialogpages.cpp b/src/createinstancedialogpages.cpp index 00d49b99..26f2f61d 100644 --- a/src/createinstancedialogpages.cpp +++ b/src/createinstancedialogpages.cpp @@ -136,13 +136,13 @@ TypePage::TypePage(CreateInstanceDialog& dlg) { ui->createGlobal->setDescription( ui->createGlobal->description() - .arg(InstanceManager::instance().instancesPath())); + .arg(InstanceManager::singleton().instancesPath())); ui->createPortable->setDescription( ui->createPortable->description() .arg(InstanceManager::portablePath())); - if (InstanceManager::instance().portableInstanceExists()) { + if (InstanceManager::singleton().portableInstanceExists()) { ui->createPortable->setEnabled(false); ui->portableExistsLabel->setVisible(true); } else { @@ -722,7 +722,7 @@ void NamePage::activated() m_label.setText(g->gameName()); if (!m_modified || ui->instanceName->text().isEmpty()) { - const auto n = InstanceManager::instance().makeUniqueName(g->gameName()); + const auto n = InstanceManager::singleton().makeUniqueName(g->gameName()); ui->instanceName->setText(n); m_modified = false; } @@ -737,7 +737,7 @@ QString NamePage::selectedInstanceName() const } const auto text = ui->instanceName->text().trimmed(); - return InstanceManager::instance().sanitizeInstanceName(text); + return InstanceManager::singleton().sanitizeInstanceName(text); } void NamePage::onChanged() @@ -748,7 +748,7 @@ void NamePage::onChanged() void NamePage::updateWarnings() { - const auto root = InstanceManager::instance().instancesPath(); + const auto root = InstanceManager::singleton().instancesPath(); m_okay = checkName(root, ui->instanceName->text()); updateNavigation(); @@ -765,7 +765,7 @@ bool NamePage::checkName(QString parentDir, QString name) if (name.isEmpty()) { empty = true; } else { - if (InstanceManager::instance().validInstanceName(name)) { + if (InstanceManager::singleton().validInstanceName(name)) { exists = QDir(parentDir).exists(name); } else { invalid = true; @@ -901,7 +901,7 @@ void PathsPage::setPaths(const QString& name, bool force) if (m_dlg.instanceType() == CreateInstanceDialog::Portable) { path = InstanceManager::portablePath(); } else { - const auto root = InstanceManager::instance().instancesPath(); + const auto root = InstanceManager::singleton().instancesPath(); path = root + "/" + name; } @@ -938,11 +938,11 @@ bool PathsPage::checkPath( } else { const QDir d(path); - if (InstanceManager::instance().validInstanceName(d.dirName())) { + if (InstanceManager::singleton().validInstanceName(d.dirName())) { if (m_dlg.instanceType() == CreateInstanceDialog::Portable) { // the default data path for a portable instance is the application // directory, so it's not an error if it exists - if (QDir(path) != InstanceManager::instance().portablePath()) { + if (QDir(path) != InstanceManager::singleton().portablePath()) { exists = QDir(path).exists(); } } else { diff --git a/src/envshortcut.cpp b/src/envshortcut.cpp index 5222665b..b13a7d9f 100644 --- a/src/envshortcut.cpp +++ b/src/envshortcut.cpp @@ -149,7 +149,7 @@ Shortcut::Shortcut(const Executable& exe) m_target = QFileInfo(qApp->applicationFilePath()).absoluteFilePath(); m_arguments = QString("\"moshortcut://%1:%2\"") - .arg(InstanceManager::instance().currentInstance()->name()) + .arg(InstanceManager::singleton().currentInstance()->name()) .arg(exe.title()); m_description = QString("Run %1 with ModOrganizer").arg(exe.title()); diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp index 61c442be..8163149b 100644 --- a/src/instancemanager.cpp +++ b/src/instancemanager.cpp @@ -290,7 +290,7 @@ InstanceManager::InstanceManager() GlobalSettings::updateRegistryKey(); } -InstanceManager &InstanceManager::instance() +InstanceManager &InstanceManager::singleton() { static InstanceManager s_Instance; return s_Instance; diff --git a/src/instancemanager.h b/src/instancemanager.h index 69536650..79f1f30b 100644 --- a/src/instancemanager.h +++ b/src/instancemanager.h @@ -54,7 +54,7 @@ private: class InstanceManager { public: - static InstanceManager &instance(); + static InstanceManager& singleton(); void overrideInstance(const QString& instanceName); void overrideProfile(const QString& profileName); diff --git a/src/instancemanagerdialog.cpp b/src/instancemanagerdialog.cpp index 282329a5..3b6daeb8 100644 --- a/src/instancemanagerdialog.cpp +++ b/src/instancemanagerdialog.cpp @@ -101,7 +101,7 @@ public: QIcon icon(const PluginContainer& plugins) const { - const auto* game = InstanceManager::instance().gamePluginForDirectory( + const auto* game = InstanceManager::singleton().gamePluginForDirectory( m_dir, plugins); if (game) @@ -119,7 +119,7 @@ public: bool isActive() const { - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); if (auto i=m.currentInstance()) { @@ -347,7 +347,7 @@ InstanceManagerDialog::InstanceManagerDialog( void InstanceManagerDialog::updateInstances() { - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); m_instances.clear(); @@ -437,7 +437,7 @@ void InstanceManagerDialog::select(const QString& name) void InstanceManagerDialog::selectActiveInstance() { - const auto active = InstanceManager::instance().currentInstance(); + const auto active = InstanceManager::singleton().currentInstance(); if (active) { for (std::size_t i=0; iisPortable()) { - InstanceManager::instance().setCurrentInstance(""); + InstanceManager::singleton().setCurrentInstance(""); } else { - InstanceManager::instance().setCurrentInstance(m_instances[i]->name()); + InstanceManager::singleton().setCurrentInstance(m_instances[i]->name()); } if (m_restartOnSelect) { @@ -479,7 +479,7 @@ QString getInstanceName( QWidget* parent, const QString& title, const QString& moreText, const QString& label, const QString& oldName={}) { - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); QDialog dlg(parent); dlg.setWindowTitle(title); @@ -554,7 +554,7 @@ void InstanceManagerDialog::rename() const auto selIndex = singleSelectionIndex(); - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); if (i->isActive()) { QMessageBox::information(this, tr("Rename instance"), tr("The active instance cannot be renamed.")); @@ -622,7 +622,7 @@ void InstanceManagerDialog::deleteInstance() return; } - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); if (i->isActive()) { QMessageBox::information(this, tr("Deleting instance"), tr("The active instance cannot be deleted.")); @@ -800,7 +800,7 @@ void InstanceManagerDialog::fillData(const InstanceInfo& ii) ui->gameDir->setText(ii.gamePath()); setButtonsEnabled(true); - const auto& m = InstanceManager::instance(); + const auto& m = InstanceManager::singleton(); ui->rename->setEnabled(!ii.isPortable()); diff --git a/src/main.cpp b/src/main.cpp index 7005d374..e56197c9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -274,7 +274,7 @@ std::optional handleCommandLine( std::optional selectInstance() { - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); NexusInterface ni(nullptr); PluginContainer pc(nullptr); @@ -505,7 +505,7 @@ int runApplication( OrganizerCore organizer(settings); if (!organizer.bootstrap()) { reportError("failed to set up data paths"); - InstanceManager::instance().clearCurrentInstance(); + InstanceManager::singleton().clearCurrentInstance(); return 1; } @@ -522,7 +522,7 @@ int runApplication( } else if (setupResult == SetupInstanceResults::TryAgain) { continue; } else if (setupResult == SetupInstanceResults::SelectAnother) { - InstanceManager::instance().clearCurrentInstance(); + InstanceManager::singleton().clearCurrentInstance(); return RestartExitCode; } else { return 1; @@ -650,7 +650,7 @@ int doOneRun( // resets things when MO is "restarted" resetForRestart(cl); - auto& m = InstanceManager::instance(); + auto& m = InstanceManager::singleton(); auto currentInstance = m.currentInstance(); if (!currentInstance) @@ -689,7 +689,7 @@ int doOneRun( if (!setLogDirectory(dataPath)) { reportError("Failed to create log folder"); - InstanceManager::instance().clearCurrentInstance(); + InstanceManager::singleton().clearCurrentInstance(); return 1; } @@ -724,10 +724,10 @@ int main(int argc, char *argv[]) tt.stop(); if (cl.instance()) - InstanceManager::instance().overrideInstance(*cl.instance()); + InstanceManager::singleton().overrideInstance(*cl.instance()); if (cl.profile()) { - InstanceManager::instance().overrideProfile(*cl.profile()); + InstanceManager::singleton().overrideProfile(*cl.profile()); } // makes plugin data path available to plugins, see diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 02900571..ea8a0efe 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -837,7 +837,7 @@ void MainWindow::setupToolbar() log::warn("no separator found on the toolbar, icons won't be right-aligned"); } - if (!InstanceManager::instance().allowedToChangeInstance()) { + if (!InstanceManager::singleton().allowedToChangeInstance()) { ui->actionChange_Game->setVisible(false); } } diff --git a/src/processrunner.cpp b/src/processrunner.cpp index 8ee0914b..bc4e6227 100644 --- a/src/processrunner.cpp +++ b/src/processrunner.cpp @@ -586,7 +586,7 @@ ProcessRunner& ProcessRunner::setFromExecutable(const Executable& exe) ProcessRunner& ProcessRunner::setFromShortcut(const MOShortcut& shortcut) { - const auto currentInstance = InstanceManager::instance().currentInstance(); + const auto currentInstance = InstanceManager::singleton().currentInstance(); if (currentInstance) { diff --git a/src/statusbar.cpp b/src/statusbar.cpp index aefabc73..8fa43d5b 100644 --- a/src/statusbar.cpp +++ b/src/statusbar.cpp @@ -154,7 +154,7 @@ void StatusBar::updateNormalMessage(OrganizerCore& core) } QString instance = "?"; - if (auto i=InstanceManager::instance().currentInstance()) + if (auto i=InstanceManager::singleton().currentInstance()) instance = i->name(); QString profile = core.profileName(); -- cgit v1.3.1