diff options
| author | AL <26797547+Al12rs@users.noreply.github.com> | 2020-06-06 18:08:30 +0200 |
|---|---|---|
| committer | AL <26797547+Al12rs@users.noreply.github.com> | 2020-06-06 18:08:30 +0200 |
| commit | 1497685ea5d7059b34bfb65643388a4f4edf4d49 (patch) | |
| tree | 78c13bae0f6d0335c51848748f2dcaec0682d5c6 | |
| parent | 226b2b1843bbf41581757f44f8a2f4728f0a4b19 (diff) | |
Make checkForProblems update local variable with the problem count,
Make updateProblemsButton just update the ui using that variable (no heavy operation)
Add checkForProblemsAsync to perform the heavy checks in another thread.
| -rw-r--r-- | src/mainwindow.cpp | 20 | ||||
| -rw-r--r-- | src/mainwindow.h | 18 |
2 files changed, 28 insertions, 10 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 477cbc70..c49b0bdd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -266,6 +266,7 @@ MainWindow::MainWindow(Settings &settings , m_LinkToolbar(nullptr) , m_LinkDesktop(nullptr) , m_LinkStartMenu(nullptr) + , m_NumberOfProblems(0) { // disables incredibly slow menu fade in effect that looks and feels like crap. // this was only happening to users with the windows @@ -473,7 +474,8 @@ MainWindow::MainWindow(Settings &settings setFilterShortcuts(ui->downloadView, ui->downloadFilterEdit); m_UpdateProblemsTimer.setSingleShot(true); - connect(&m_UpdateProblemsTimer, SIGNAL(timeout()), this, SLOT(updateProblemsButton())); + connect(&m_UpdateProblemsTimer, SIGNAL(timeout()), this, SLOT(checkForProblemsAsync())); + connect(this, SIGNAL(checkForProblemsDone()), this, SLOT(updateProblemsButton()), Qt::ConnectionType::QueuedConnection); m_SaveMetaTimer.setSingleShot(false); connect(&m_SaveMetaTimer, SIGNAL(timeout()), this, SLOT(saveModMetas())); @@ -1000,7 +1002,7 @@ void MainWindow::on_centralWidget_customContextMenuRequested(const QPoint &pos) createPopupMenu()->exec(ui->centralWidget->mapToGlobal(pos)); } -void MainWindow::scheduleUpdateButton() +void MainWindow::scheduleCheckForProblems() { if (!m_UpdateProblemsTimer.isActive()) { m_UpdateProblemsTimer.start(1000); @@ -1014,7 +1016,7 @@ void MainWindow::updateProblemsButton() // if the current stylesheet doesn't provide an icon, this is used instead const char* DefaultIconName = ":/MO/gui/warning"; - const std::size_t numProblems = checkForProblems(); + const std::size_t numProblems = m_NumberOfProblems; // original icon without a count painted on it const QIcon original = m_originalNotificationIcon.isNull() ? @@ -1097,8 +1099,13 @@ bool MainWindow::errorReported(QString &logFile) return false; } +void MainWindow::checkForProblemsAsync() { + QtConcurrent::run([this]() { + checkForProblems(); + }); +} -size_t MainWindow::checkForProblems() +void MainWindow::checkForProblems() { size_t numProblems = 0; for (QObject *pluginObj : m_PluginContainer.plugins<QObject>()) { @@ -1109,7 +1116,8 @@ size_t MainWindow::checkForProblems() numProblems += diagnose->activeProblems().size(); } } - return numProblems; + m_NumberOfProblems = numProblems; + emit checkForProblemsDone(); } void MainWindow::about() @@ -1353,7 +1361,7 @@ void MainWindow::showEvent(QShowEvent *event) m_OrganizerCore.settings().nexus().registerAsNXMHandler(false); m_WasVisible = true; - updateProblemsButton(); + updateProblemsButton(); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 25d09584..1f66c860 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -178,6 +178,8 @@ signals: void modListDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + void checkForProblemsDone(); + protected: virtual void showEvent(QShowEvent *event); @@ -244,8 +246,9 @@ private: void fixCategories(); bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName); - - size_t checkForProblems(); + + // Performs checks, sets the problemCount and singnals checkForProblemsDone(). + void checkForProblems(); void setCategoryListVisible(bool visible); @@ -267,8 +270,6 @@ private: QMenu *openFolderMenu(); - void scheduleUpdateButton(); - QDir currentSavesDir() const; void startMonitorSaves(); @@ -358,6 +359,8 @@ private: // when painting the count QIcon m_originalNotificationIcon; + size_t m_NumberOfProblems; + Executable* getSelectedExecutable(); private slots: @@ -523,8 +526,15 @@ private slots: void checkBSAList(); + // Only visually update the problems icon. void updateProblemsButton(); + // Queue a problem check to allow collapsing of multiple requests in short amount of time. + void scheduleCheckForProblems(); + + // Perform the actual problem check in another thread. + void checkForProblemsAsync(); + void saveModMetas(); void updateStyle(const QString &style); |
