diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index e23d14d57e..fdd3f5b90f 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -139,17 +139,8 @@ game_list_frame::game_list_frame(std::shared_ptr gui_settings, std connect(&m_refresh_watcher, &QFutureWatcher::finished, this, &game_list_frame::OnRefreshFinished); connect(&m_refresh_watcher, &QFutureWatcher::canceled, this, [this]() { - if (m_size_watcher.isRunning()) - { - m_size_watcher.cancel(); - m_size_watcher.waitForFinished(); - } - - if (m_repaint_watcher.isRunning()) - { - m_repaint_watcher.cancel(); - m_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_size_watcher, true); + gui::utils::stop_future_watcher(m_repaint_watcher, true); m_path_list.clear(); m_game_data.clear(); @@ -266,6 +257,10 @@ void game_list_frame::LoadSettings() game_list_frame::~game_list_frame() { + gui::utils::stop_future_watcher(m_size_watcher, true); + gui::utils::stop_future_watcher(m_repaint_watcher, true); + gui::utils::stop_future_watcher(m_refresh_watcher, true); + SaveSettings(); } @@ -434,26 +429,9 @@ std::string game_list_frame::GetDataDirBySerial(const std::string& serial) void game_list_frame::Refresh(const bool from_drive, const bool scroll_after) { - if (m_size_watcher.isRunning()) - { - m_size_watcher.cancel(); - m_size_watcher.waitForFinished(); - } - - if (m_repaint_watcher.isRunning()) - { - m_repaint_watcher.cancel(); - m_repaint_watcher.waitForFinished(); - } - - if (m_refresh_watcher.isRunning()) - { - if (from_drive) - { - m_refresh_watcher.cancel(); - } - m_refresh_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_size_watcher, true); + gui::utils::stop_future_watcher(m_repaint_watcher, true); + gui::utils::stop_future_watcher(m_refresh_watcher, from_drive); if (from_drive) { @@ -729,17 +707,8 @@ void game_list_frame::Refresh(const bool from_drive, const bool scroll_after) void game_list_frame::OnRefreshFinished() { - if (m_size_watcher.isRunning()) - { - m_size_watcher.cancel(); - m_size_watcher.waitForFinished(); - } - - if (m_repaint_watcher.isRunning()) - { - m_repaint_watcher.cancel(); - m_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_size_watcher, true); + gui::utils::stop_future_watcher(m_repaint_watcher, true); for (auto&& g : m_games.pop_all()) { @@ -2319,11 +2288,7 @@ void game_list_frame::ResizeIcons(const int& slider_pos) void game_list_frame::RepaintIcons(const bool& from_settings) { - if (m_repaint_watcher.isRunning()) - { - m_repaint_watcher.cancel(); - m_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_repaint_watcher, true); if (from_settings) { diff --git a/rpcs3/rpcs3qt/qt_utils.h b/rpcs3/rpcs3qt/qt_utils.h index f682eca607..0292b5631d 100644 --- a/rpcs3/rpcs3qt/qt_utils.h +++ b/rpcs3/rpcs3qt/qt_utils.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -127,5 +128,18 @@ namespace gui // Convert an arbitrary count of bytes to a readable format using global units (KB, MB...) QString format_byte_size(usz size); + + template + void stop_future_watcher(QFutureWatcher& watcher, bool cancel) + { + if (watcher.isRunning()) + { + if (cancel) + { + watcher.cancel(); + } + watcher.waitForFinished(); + } + } } // utils } // gui diff --git a/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp b/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp index fe1d38bc34..61d18179bb 100644 --- a/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/screenshot_manager_dialog.cpp @@ -66,8 +66,7 @@ screenshot_manager_dialog::screenshot_manager_dialog(QWidget* parent) : QDialog( } } - m_icon_loader = new QFutureWatcher(this); - connect(m_icon_loader, &QFutureWatcher::resultReadyAt, this, &screenshot_manager_dialog::update_icon); + connect(&m_icon_loader, &QFutureWatcher::resultReadyAt, this, &screenshot_manager_dialog::update_icon); connect(m_grid, &QListWidget::itemDoubleClicked, this, &screenshot_manager_dialog::show_preview); connect(m_grid->verticalScrollBar(), &QScrollBar::valueChanged, this, &screenshot_manager_dialog::update_icons); @@ -82,8 +81,7 @@ screenshot_manager_dialog::screenshot_manager_dialog(QWidget* parent) : QDialog( screenshot_manager_dialog::~screenshot_manager_dialog() { - m_icon_loader->cancel(); - m_icon_loader->waitForFinished(); + gui::utils::stop_future_watcher(m_icon_loader, true); } void screenshot_manager_dialog::show_preview(QListWidgetItem* item) @@ -101,7 +99,7 @@ void screenshot_manager_dialog::show_preview(QListWidgetItem* item) void screenshot_manager_dialog::update_icon(int index) const { - const thumbnail tn = m_icon_loader->resultAt(index); + const thumbnail tn = m_icon_loader.resultAt(index); if (QListWidgetItem* item = m_grid->item(tn.index)) { @@ -144,11 +142,7 @@ void screenshot_manager_dialog::update_icons(int value) } } - if (m_icon_loader->isRunning()) - { - m_icon_loader->cancel(); - m_icon_loader->waitForFinished(); - } + gui::utils::stop_future_watcher(m_icon_loader, true); const std::function load = [icon_size = m_icon_size](thumbnail tn) -> thumbnail { @@ -156,7 +150,7 @@ void screenshot_manager_dialog::update_icons(int value) return tn; }; - m_icon_loader->setFuture(QtConcurrent::mapped(thumbnails_to_load, load)); + m_icon_loader.setFuture(QtConcurrent::mapped(thumbnails_to_load, load)); } void screenshot_manager_dialog::resizeEvent(QResizeEvent* event) diff --git a/rpcs3/rpcs3qt/screenshot_manager_dialog.h b/rpcs3/rpcs3qt/screenshot_manager_dialog.h index 842095f725..a67313f843 100644 --- a/rpcs3/rpcs3qt/screenshot_manager_dialog.h +++ b/rpcs3/rpcs3qt/screenshot_manager_dialog.h @@ -44,7 +44,7 @@ private: QListWidget* m_grid = nullptr; - QFutureWatcher* m_icon_loader; + QFutureWatcher m_icon_loader; QSize m_icon_size; QIcon m_placeholder; diff --git a/rpcs3/rpcs3qt/trophy_manager_dialog.cpp b/rpcs3/rpcs3qt/trophy_manager_dialog.cpp index f23746554c..939c5a0c42 100644 --- a/rpcs3/rpcs3qt/trophy_manager_dialog.cpp +++ b/rpcs3/rpcs3qt/trophy_manager_dialog.cpp @@ -368,6 +368,8 @@ trophy_manager_dialog::trophy_manager_dialog(std::shared_ptr gui_s trophy_manager_dialog::~trophy_manager_dialog() { + gui::utils::stop_future_watcher(m_game_repaint_watcher, true); + gui::utils::stop_future_watcher(m_trophy_repaint_watcher, true); } bool trophy_manager_dialog::LoadTrophyFolderToDB(const std::string& trop_name) @@ -559,11 +561,7 @@ void trophy_manager_dialog::ResizeGameIcons() if (m_game_combo->count() <= 0) return; - if (m_game_repaint_watcher.isRunning()) - { - m_game_repaint_watcher.cancel(); - m_game_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_game_repaint_watcher, true); QPixmap placeholder(m_game_icon_size); placeholder.fill(Qt::transparent); @@ -594,11 +592,7 @@ void trophy_manager_dialog::ResizeTrophyIcons() if (m_game_combo->count() <= 0) return; - if (m_trophy_repaint_watcher.isRunning()) - { - m_trophy_repaint_watcher.cancel(); - m_trophy_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_trophy_repaint_watcher, true); const int db_pos = m_game_combo->currentData().toInt(); const qreal dpr = devicePixelRatioF(); @@ -825,15 +819,8 @@ void trophy_manager_dialog::ShowGameTableContextMenu(const QPoint& pos) void trophy_manager_dialog::StartTrophyLoadThreads() { - if (m_game_repaint_watcher.isRunning()) - { - m_game_repaint_watcher.waitForFinished(); - } - - if (m_trophy_repaint_watcher.isRunning()) - { - m_trophy_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_game_repaint_watcher, false); + gui::utils::stop_future_watcher(m_trophy_repaint_watcher, false); m_trophies_db.clear(); @@ -894,11 +881,7 @@ void trophy_manager_dialog::StartTrophyLoadThreads() void trophy_manager_dialog::PopulateGameTable() { - if (m_game_repaint_watcher.isRunning()) - { - m_game_repaint_watcher.cancel(); - m_game_repaint_watcher.waitForFinished(); - } + gui::utils::stop_future_watcher(m_game_repaint_watcher, true); m_game_table->setSortingEnabled(false); // Disable sorting before using setItem calls