From ddcc29c8a62fee68ecf23dd2f2ec19deaf830b1f Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sun, 24 Jan 2021 18:55:35 +1000 Subject: [PATCH] Qt: Delay showing game list refresh progress Otherwise we spend more time updating the visuals than actually scanning. --- src/duckstation-qt/qthostinterface.cpp | 2 +- src/duckstation-qt/qtprogresscallback.cpp | 32 ++++++++++++++++++----- src/duckstation-qt/qtprogresscallback.h | 7 ++++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index ee225aef5..927c4ab96 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -339,7 +339,7 @@ void QtHostInterface::refreshGameList(bool invalidate_cache /* = false */, bool std::lock_guard lock(m_settings_mutex); m_game_list->SetSearchDirectoriesFromSettings(*m_settings_interface.get()); - QtProgressCallback progress(m_main_window); + QtProgressCallback progress(m_main_window, invalidate_cache ? 0.0f : 1.0f); m_game_list->Refresh(invalidate_cache, invalidate_database, &progress); emit gameListRefreshed(); } diff --git a/src/duckstation-qt/qtprogresscallback.cpp b/src/duckstation-qt/qtprogresscallback.cpp index a391fb844..1940bdf0a 100644 --- a/src/duckstation-qt/qtprogresscallback.cpp +++ b/src/duckstation-qt/qtprogresscallback.cpp @@ -4,13 +4,13 @@ #include #include -QtProgressCallback::QtProgressCallback(QWidget* parent_widget) - : QObject(parent_widget), m_dialog(QString(), QString(), 0, 1, parent_widget) +QtProgressCallback::QtProgressCallback(QWidget* parent_widget, float show_delay) + : QObject(parent_widget), m_dialog(QString(), QString(), 0, 1, parent_widget), m_show_delay(show_delay) { m_dialog.setWindowTitle(tr("DuckStation")); m_dialog.setMinimumSize(QSize(500, 0)); m_dialog.setModal(parent_widget != nullptr); - m_dialog.show(); + checkForDelayedShow(); } QtProgressCallback::~QtProgressCallback() = default; @@ -37,20 +37,27 @@ void QtProgressCallback::SetTitle(const char* title) void QtProgressCallback::SetStatusText(const char* text) { BaseProgressCallback::SetStatusText(text); - m_dialog.setLabelText(QString::fromUtf8(text)); + checkForDelayedShow(); + + if (m_dialog.isVisible()) + m_dialog.setLabelText(QString::fromUtf8(text)); } void QtProgressCallback::SetProgressRange(u32 range) { BaseProgressCallback::SetProgressRange(range); - m_dialog.setRange(0, m_progress_range); + checkForDelayedShow(); + + if (m_dialog.isVisible()) + m_dialog.setRange(0, m_progress_range); } void QtProgressCallback::SetProgressValue(u32 value) { BaseProgressCallback::SetProgressValue(value); + checkForDelayedShow(); - if (static_cast(m_dialog.value()) == m_progress_range) + if (!m_dialog.isVisible() || static_cast(m_dialog.value()) == m_progress_range) return; m_dialog.setValue(m_progress_value); @@ -92,3 +99,16 @@ void QtProgressCallback::ModalInformation(const char* message) { QMessageBox::information(&m_dialog, tr("Information"), QString::fromUtf8(message)); } + +void QtProgressCallback::checkForDelayedShow() +{ + if (m_dialog.isVisible()) + return; + + if (m_show_timer.GetTimeSeconds() >= m_show_delay) + { + m_dialog.setRange(0, m_progress_range); + m_dialog.setValue(m_progress_value); + m_dialog.show(); + } +} diff --git a/src/duckstation-qt/qtprogresscallback.h b/src/duckstation-qt/qtprogresscallback.h index bbe78f8eb..6f93c3883 100644 --- a/src/duckstation-qt/qtprogresscallback.h +++ b/src/duckstation-qt/qtprogresscallback.h @@ -1,5 +1,6 @@ #pragma once #include "common/progress_callback.h" +#include "common/timer.h" #include class QtProgressCallback final : public QObject, public BaseProgressCallback @@ -7,7 +8,7 @@ class QtProgressCallback final : public QObject, public BaseProgressCallback Q_OBJECT public: - QtProgressCallback(QWidget* parent_widget); + QtProgressCallback(QWidget* parent_widget, float show_delay = 0.0f); ~QtProgressCallback(); bool IsCancelled() const override; @@ -28,5 +29,9 @@ public: void ModalInformation(const char* message) override; private: + void checkForDelayedShow(); + QProgressDialog m_dialog; + Common::Timer m_show_timer; + float m_show_delay; }; \ No newline at end of file