summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainwindow.cpp24
-rw-r--r--src/modinfo.cpp18
-rw-r--r--src/modinfo.h12
3 files changed, 45 insertions, 9 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 669820be..8fe786ba 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -4075,28 +4075,40 @@ void MainWindow::saveArchiveList()
void MainWindow::checkModsForUpdates()
{
- statusBar()->show();
+ bool checkingModsForUpdate = false;
if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
- ModInfo::checkAllForUpdate(&m_PluginContainer, this);
+ checkingModsForUpdate = ModInfo::checkAllForUpdate(&m_PluginContainer, this);
NexusInterface::instance(&m_PluginContainer)->requestEndorsementInfo(this, QVariant(), QString());
NexusInterface::instance(&m_PluginContainer)->requestTrackingInfo(this, QVariant(), QString());
} else {
QString apiKey;
if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
m_OrganizerCore.doAfterLogin([this] () { this->checkModsForUpdates(); });
+ statusBar()->show();
NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
} else {
qWarning("You are not currently authenticated with Nexus. Please do so under Settings -> Nexus.");
}
}
- m_ModListSortProxy->setCategoryFilter(boost::assign::list_of(CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE));
- for (int i = 0; i < ui->categoriesList->topLevelItemCount(); ++i) {
- if (ui->categoriesList->topLevelItem(i)->data(0, Qt::UserRole) == CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE) {
- ui->categoriesList->setCurrentItem(ui->categoriesList->topLevelItem(i));
+ bool updatesAvailable = false;
+ for (auto mod : m_OrganizerCore.modList()->allMods()) {
+ ModInfo::Ptr modInfo = ModInfo::getByName(mod);
+ if (modInfo->updateAvailable()) {
+ updatesAvailable = true;
break;
}
}
+
+ if (updatesAvailable || checkingModsForUpdate) {
+ m_ModListSortProxy->setCategoryFilter(boost::assign::list_of(CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE));
+ for (int i = 0; i < ui->categoriesList->topLevelItemCount(); ++i) {
+ if (ui->categoriesList->topLevelItem(i)->data(0, Qt::UserRole) == CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE) {
+ ui->categoriesList->setCurrentItem(ui->categoriesList->topLevelItem(i));
+ break;
+ }
+ }
+ }
}
void MainWindow::changeVersioningScheme() {
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 0afd92e6..28e9b8f2 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -166,6 +166,14 @@ std::vector<ModInfo::Ptr> ModInfo::getByModID(QString game, int modID)
}
+ModInfo::Ptr ModInfo::getByName(const QString &name)
+{
+ QMutexLocker locker(&s_Mutex);
+
+ return s_Collection[ModInfo::getIndex(name)];
+}
+
+
bool ModInfo::removeMod(unsigned int index)
{
QMutexLocker locker(&s_Mutex);
@@ -285,8 +293,10 @@ ModInfo::ModInfo(PluginContainer *pluginContainer)
}
-void ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver)
+bool ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver)
{
+ bool updatesAvailable = true;
+
QDateTime earliest = QDateTime::currentDateTimeUtc();
QDateTime latest;
std::set<QString> games;
@@ -308,8 +318,10 @@ void ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *recei
}
}
- if (organizedGames.empty())
+ if (organizedGames.empty()) {
qWarning("All of your mods have been checked recently. We restrict update checks to help preserve your available API requests.");
+ updatesAvailable = false;
+ }
for (auto game : organizedGames) {
NexusInterface::instance(pluginContainer)->requestUpdates(game.second, receiver, QVariant(), game.first, QString());
@@ -327,6 +339,8 @@ void ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *recei
for (auto gameName : games)
NexusInterface::instance(pluginContainer)->requestUpdateInfo(gameName, NexusInterface::UpdatePeriod::DAY, receiver, QVariant(false), QString());
}
+
+ return updatesAvailable;
}
std::set<QSharedPointer<ModInfo>> ModInfo::filteredMods(QString gameName, QVariantList updateData, bool addOldMods, bool markUpdated)
diff --git a/src/modinfo.h b/src/modinfo.h
index 81f59b61..f1d816fe 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -168,6 +168,15 @@ public:
static std::vector<ModInfo::Ptr> getByModID(QString game, int modID);
/**
+ * @brief retrieve a ModInfo object based on its name
+ *
+ * @param name the name to look up
+ * @return a reference counting pointer to the mod info
+ * @note since the pointer is reference counter, the pointer remains valid even if the collection is refreshed in a different thread
+ **/
+ static ModInfo::Ptr getByName(const QString &name);
+
+ /**
* @brief remove a mod by index
*
* this physically deletes the specified mod from the disc and updates the ModInfo collection
@@ -199,8 +208,9 @@ public:
/**
* @brief query nexus information for every mod and update the "newest version" information
+ * @return true if any mods are checked for update
**/
- static void checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver);
+ static bool checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiver);
static std::set<QSharedPointer<ModInfo>> filteredMods(QString gameName, QVariantList updateData, bool addOldMods = false, bool markUpdated = false);