summaryrefslogtreecommitdiff
path: root/src/mainwindow.cpp
diff options
context:
space:
mode:
authorJeremy Rimpo <jeremy.rimpo@servermonkey.com>2023-09-25 17:39:41 -0500
committerGitHub <noreply@github.com>2023-09-25 17:39:41 -0500
commit79d457f598bcfa7a8d094a87033a31f370c9c4c1 (patch)
tree3674e6b1223ac104422ce77b06d020c50ad31cc0 /src/mainwindow.cpp
parent70509275405d2a5c5e94743786f03b17ef2051f2 (diff)
parent74668b9363d877d055a5e8b8c7d001ba448dc832 (diff)
Merge pull request #1880 from ModOrganizer2/qt6-category
WIP: Category Revamp
Diffstat (limited to 'src/mainwindow.cpp')
-rw-r--r--src/mainwindow.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index ebe7da98..ce2c4dd0 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -290,6 +290,8 @@ MainWindow::MainWindow(Settings& settings, OrganizerCore& organizerCore,
ui->statusBar->setAPI(ni.getAPIStats(), ni.getAPIUserAccount());
}
+ m_CategoryFactory.loadCategories();
+
ui->logList->setCore(m_OrganizerCore);
setupToolbar();
@@ -453,6 +455,10 @@ MainWindow::MainWindow(Settings& settings, OrganizerCore& organizerCore,
connect(&m_OrganizerCore, &OrganizerCore::modInstalled, this,
&MainWindow::modInstalled);
+ connect(&m_CategoryFactory, SIGNAL(nexusCategoryRefresh(CategoriesDialog*)), this,
+ SLOT(refreshNexusCategories(CategoriesDialog*)));
+ connect(&m_CategoryFactory, SIGNAL(categoriesSaved()), this, SLOT(categoriesSaved()));
+
m_CheckBSATimer.setSingleShot(true);
connect(&m_CheckBSATimer, SIGNAL(timeout()), this, SLOT(checkBSAList()));
@@ -1266,7 +1272,78 @@ void MainWindow::showEvent(QShowEvent* event)
gameSupportTriggered();
}
+ QMessageBox newCatDialog;
+ newCatDialog.setWindowTitle(tr("Category Setup"));
+ newCatDialog.setText(
+ tr("Please choose how to handle the default category setup.\n\n"
+ "If you've already connected to Nexus, you can automatically import Nexus "
+ "categories for this game (if applicable). Otherwise, use the old Mod "
+ "Organizer default category structure, or leave the categories blank (for "
+ "manual setup)."));
+ QPushButton importBtn(tr("&Import Nexus Categories"));
+ QPushButton defaultBtn(tr("Use &Old Category Defaults"));
+ QPushButton cancelBtn(tr("Do &Nothing"));
+ if (NexusInterface::instance().getAccessManager()->validated()) {
+ newCatDialog.addButton(&importBtn, QMessageBox::ButtonRole::AcceptRole);
+ }
+ newCatDialog.addButton(&defaultBtn, QMessageBox::ButtonRole::AcceptRole);
+ newCatDialog.addButton(&cancelBtn, QMessageBox::ButtonRole::RejectRole);
+ newCatDialog.exec();
+ if (newCatDialog.clickedButton() == &importBtn) {
+ importCategories(false);
+ } else if (newCatDialog.clickedButton() == &cancelBtn) {
+ m_CategoryFactory.reset();
+ } else if (newCatDialog.clickedButton() == &defaultBtn) {
+ m_CategoryFactory.loadCategories();
+ }
+ m_CategoryFactory.saveCategories();
+
m_OrganizerCore.settings().setFirstStart(false);
+ } else {
+ auto& settings = m_OrganizerCore.settings();
+ if (m_LastVersion < QVersionNumber(2, 5) &&
+ !GlobalSettings::hideCategoryReminder()) {
+ QMessageBox migrateCatDialog;
+ migrateCatDialog.setWindowTitle("Category Migration");
+ migrateCatDialog.setText(
+ tr("This is your first time running version 2.5 or higher with an old MO2 "
+ "instance. The category system now relies on an updated system to map "
+ "Nexus categories.\n\n"
+ "In order to assign Nexus categories automatically, you will need to "
+ "import the Nexus categories for the currently managed game and map "
+ "them to your preferred category structure.\n\n"
+ "You can either manually open the category editor, via the Settings "
+ "dialog or the category filter sidebar, and set up the mappings as you "
+ "see fit, or you can automatically import and map the categories as "
+ "defined on Nexus.\n\n"
+ "As a final option, you can disable Nexus category mapping altogether, "
+ "which can be changed at any time in the Settings dialog."));
+ QPushButton importBtn(tr("&Import Nexus Categories"));
+ QPushButton openSettingsBtn(tr("&Open Categories Dialog"));
+ QPushButton disableBtn(tr("&Disable Nexus Mappings"));
+ QPushButton closeBtn(tr("&Close"));
+ QCheckBox dontShow(tr("&Don't show this again"));
+ if (NexusInterface::instance().getAccessManager()->validated()) {
+ migrateCatDialog.addButton(&importBtn, QMessageBox::ButtonRole::AcceptRole);
+ }
+ migrateCatDialog.addButton(&openSettingsBtn,
+ QMessageBox::ButtonRole::ActionRole);
+ migrateCatDialog.addButton(&disableBtn,
+ QMessageBox::ButtonRole::DestructiveRole);
+ migrateCatDialog.addButton(&closeBtn, QMessageBox::ButtonRole::RejectRole);
+ migrateCatDialog.setCheckBox(&dontShow);
+ migrateCatDialog.exec();
+ if (migrateCatDialog.clickedButton() == &importBtn) {
+ importCategories(dontShow.isChecked());
+ } else if (migrateCatDialog.clickedButton() == &openSettingsBtn) {
+ this->ui->filtersEdit->click();
+ } else if (migrateCatDialog.clickedButton() == &disableBtn) {
+ Settings::instance().nexus().setCategoryMappings(false);
+ }
+ if (dontShow.isChecked()) {
+ GlobalSettings::setHideCategoryReminder(true);
+ }
+ }
}
m_OrganizerCore.settings().widgets().restoreIndex(ui->groupCombo);
@@ -2097,6 +2174,8 @@ void MainWindow::processUpdates()
const auto lastVersion = settings.version().value_or(earliest);
const auto currentVersion = m_OrganizerCore.getVersion().asQVersionNumber();
+ m_LastVersion = lastVersion;
+
settings.processUpdates(currentVersion, lastVersion);
if (!settings.firstStart()) {
@@ -2371,6 +2450,14 @@ void MainWindow::modInstalled(const QString& modName)
{m_OrganizerCore.modList()->index(index, 0)});
}
+void MainWindow::importCategories(bool)
+{
+ NexusInterface& nexus = NexusInterface::instance();
+ nexus.setPluginContainer(&m_OrganizerCore.pluginContainer());
+ nexus.requestGameInfo(Settings::instance().game().plugin()->gameShortName(), this,
+ QVariant(), QString());
+}
+
void MainWindow::showMessage(const QString& message)
{
MessageDialog::showMessage(message, this);
@@ -2745,6 +2832,25 @@ void MainWindow::onPluginRegistrationChanged()
m_DownloadsTab->update();
}
+void MainWindow::refreshNexusCategories(CategoriesDialog* dialog)
+{
+ NexusInterface& nexus = NexusInterface::instance();
+ nexus.setPluginContainer(&m_PluginContainer);
+ nexus.requestGameInfo(Settings::instance().game().plugin()->gameShortName(), dialog,
+ QVariant(), QString());
+}
+
+void MainWindow::categoriesSaved()
+{
+ for (auto modName : m_OrganizerCore.modList()->allMods()) {
+ auto mod = ModInfo::getByName(modName);
+ for (auto category : mod->getCategories()) {
+ if (!m_CategoryFactory.categoryExists(category))
+ mod->setCategory(category, false);
+ }
+ }
+}
+
void MainWindow::on_actionNexus_triggered()
{
const IPluginGame* game = m_OrganizerCore.managedGame();
@@ -3220,6 +3326,8 @@ void MainWindow::nxmModInfoAvailable(QString gameName, int modID, QVariant userD
mod->setNexusDescription(result["description"].toString());
+ mod->setNexusCategory(result["category_id"].toInt());
+
if ((mod->endorsedState() != EndorsedState::ENDORSED_NEVER) &&
(result.contains("endorsement"))) {
QVariantMap endorsement = result["endorsement"].toMap();
@@ -3353,6 +3461,22 @@ void MainWindow::nxmDownloadURLs(QString, int, int, QVariant, QVariant resultDat
m_OrganizerCore.settings().network().updateServers(servers);
}
+void MainWindow::nxmGameInfoAvailable(QString gameName, QVariant, QVariant resultData,
+ int)
+{
+ QVariantMap result = resultData.toMap();
+ QVariantList categories = result["categories"].toList();
+ CategoryFactory& catFactory = CategoryFactory::instance();
+ catFactory.reset();
+ for (auto category : categories) {
+ auto catMap = category.toMap();
+ std::vector<CategoryFactory::NexusCategory> nexusCat;
+ nexusCat.push_back(CategoryFactory::NexusCategory(catMap["name"].toString(),
+ catMap["category_id"].toInt()));
+ catFactory.addCategory(catMap["name"].toString(), nexusCat, 0);
+ }
+}
+
void MainWindow::nxmRequestFailed(QString gameName, int modID, int, QVariant, int,
int errorCode, const QString& errorString)
{