From ffb5682b436cee725b72e8c1d5641fb4e7c2c75c Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 5 May 2024 22:11:03 +1000 Subject: [PATCH] Qt: Add game list excluded folders as well as files Backport of https://github.com/PCSX2/pcsx2/pull/9730 --- src/core/game_list.cpp | 3 +- src/duckstation-qt/gamelistsettingswidget.cpp | 32 +++++++++++++++++-- src/duckstation-qt/gamelistsettingswidget.h | 5 ++- src/duckstation-qt/gamelistsettingswidget.ui | 29 +++++++++++++++-- src/duckstation-qt/setupwizarddialog.cpp | 8 +++++ src/duckstation-qt/setupwizarddialog.h | 1 + 6 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/core/game_list.cpp b/src/core/game_list.cpp index 753df11ec..064744321 100644 --- a/src/core/game_list.cpp +++ b/src/core/game_list.cpp @@ -479,7 +479,8 @@ void GameList::DeleteCacheFile() static bool IsPathExcluded(const std::vector& excluded_paths, const std::string& path) { - return (std::find(excluded_paths.begin(), excluded_paths.end(), path) != excluded_paths.end()); + return std::find_if(excluded_paths.begin(), excluded_paths.end(), + [&path](const std::string& entry) { return path.starts_with(entry); }) != excluded_paths.end(); } void GameList::ScanDirectory(const char* path, bool recursive, bool only_cache, diff --git a/src/duckstation-qt/gamelistsettingswidget.cpp b/src/duckstation-qt/gamelistsettingswidget.cpp index f4baf370b..2593f96b8 100644 --- a/src/duckstation-qt/gamelistsettingswidget.cpp +++ b/src/duckstation-qt/gamelistsettingswidget.cpp @@ -44,9 +44,15 @@ GameListSettingsWidget::GameListSettingsWidget(SettingsWindow* dialog, QWidget* &GameListSettingsWidget::onAddSearchDirectoryButtonClicked); connect(m_ui.removeSearchDirectoryButton, &QPushButton::clicked, this, &GameListSettingsWidget::onRemoveSearchDirectoryButtonClicked); - connect(m_ui.addExcludedPath, &QPushButton::clicked, this, &GameListSettingsWidget::onAddExcludedPathButtonClicked); + connect(m_ui.searchDirectoryList->selectionModel(), &QItemSelectionModel::selectionChanged, this, + &GameListSettingsWidget::onSearchDirectoriesSelectionChanged); + connect(m_ui.addExcludedFile, &QPushButton::clicked, this, &GameListSettingsWidget::onAddExcludedFileButtonClicked); + connect(m_ui.addExcludedFolder, &QPushButton::clicked, this, + &GameListSettingsWidget::onAddExcludedFolderButtonClicked); connect(m_ui.removeExcludedPath, &QPushButton::clicked, this, &GameListSettingsWidget::onRemoveExcludedPathButtonClicked); + connect(m_ui.excludedPaths, &QListWidget::itemSelectionChanged, this, + &GameListSettingsWidget::onExcludedPathsSelectionChanged); connect(m_ui.rescanAllGames, &QPushButton::clicked, this, &GameListSettingsWidget::onRescanAllGamesClicked); connect(m_ui.scanForNewGames, &QPushButton::clicked, this, &GameListSettingsWidget::onScanForNewGamesClicked); @@ -73,6 +79,8 @@ void GameListSettingsWidget::refreshExclusionList() const std::vector paths(Host::GetBaseStringListSetting("GameList", "ExcludedPaths")); for (const std::string& path : paths) m_ui.excludedPaths->addItem(QString::fromStdString(path)); + + m_ui.removeExcludedPath->setEnabled(false); } void GameListSettingsWidget::resizeEvent(QResizeEvent* event) @@ -147,7 +155,12 @@ void GameListSettingsWidget::onRemoveSearchDirectoryButtonClicked() m_search_directories_model->removeEntry(row); } -void GameListSettingsWidget::onAddExcludedPathButtonClicked() +void GameListSettingsWidget::onSearchDirectoriesSelectionChanged() +{ + m_ui.removeSearchDirectoryButton->setEnabled(m_ui.searchDirectoryList->selectionModel()->hasSelection()); +} + +void GameListSettingsWidget::onAddExcludedFileButtonClicked() { QString path = QDir::toNativeSeparators(QFileDialog::getOpenFileName(QtUtils::GetRootWidget(this), tr("Select Path"))); @@ -157,6 +170,16 @@ void GameListSettingsWidget::onAddExcludedPathButtonClicked() addExcludedPath(path.toStdString()); } +void GameListSettingsWidget::onAddExcludedFolderButtonClicked() +{ + QString path = + QDir::toNativeSeparators(QFileDialog::getExistingDirectory(QtUtils::GetRootWidget(this), tr("Select Directory"))); + if (path.isEmpty()) + return; + + addExcludedPath(path.toStdString()); +} + void GameListSettingsWidget::onRemoveExcludedPathButtonClicked() { const int row = m_ui.excludedPaths->currentRow(); @@ -171,6 +194,11 @@ void GameListSettingsWidget::onRemoveExcludedPathButtonClicked() g_main_window->refreshGameList(false); } +void GameListSettingsWidget::onExcludedPathsSelectionChanged() +{ + m_ui.removeExcludedPath->setEnabled(!m_ui.excludedPaths->selectedItems().isEmpty()); +} + void GameListSettingsWidget::onRescanAllGamesClicked() { g_main_window->refreshGameList(true); diff --git a/src/duckstation-qt/gamelistsettingswidget.h b/src/duckstation-qt/gamelistsettingswidget.h index 09239fdf6..d1aa19eab 100644 --- a/src/duckstation-qt/gamelistsettingswidget.h +++ b/src/duckstation-qt/gamelistsettingswidget.h @@ -29,8 +29,11 @@ private Q_SLOTS: void onDirectoryListContextMenuRequested(const QPoint& point); void onAddSearchDirectoryButtonClicked(); void onRemoveSearchDirectoryButtonClicked(); - void onAddExcludedPathButtonClicked(); + void onSearchDirectoriesSelectionChanged(); + void onAddExcludedFileButtonClicked(); + void onAddExcludedFolderButtonClicked(); void onRemoveExcludedPathButtonClicked(); + void onExcludedPathsSelectionChanged(); void onScanForNewGamesClicked(); void onRescanAllGamesClicked(); diff --git a/src/duckstation-qt/gamelistsettingswidget.ui b/src/duckstation-qt/gamelistsettingswidget.ui index 8a9f3525c..0bd3dc6ce 100644 --- a/src/duckstation-qt/gamelistsettingswidget.ui +++ b/src/duckstation-qt/gamelistsettingswidget.ui @@ -105,7 +105,7 @@ - + 0 @@ -113,11 +113,33 @@ - Add + File... + + + + + + Qt::ToolButtonTextBesideIcon + + + + + + + + 0 + 0 + + + + Folder... + + Qt::ToolButtonTextBesideIcon + @@ -134,6 +156,9 @@ + + Qt::ToolButtonTextBesideIcon + diff --git a/src/duckstation-qt/setupwizarddialog.cpp b/src/duckstation-qt/setupwizarddialog.cpp index aa7931e8a..1dace938d 100644 --- a/src/duckstation-qt/setupwizarddialog.cpp +++ b/src/duckstation-qt/setupwizarddialog.cpp @@ -251,6 +251,8 @@ void SetupWizardDialog::setupGameListPage() &SetupWizardDialog::onAddSearchDirectoryButtonClicked); connect(m_ui.removeSearchDirectoryButton, &QPushButton::clicked, this, &SetupWizardDialog::onRemoveSearchDirectoryButtonClicked); + connect(m_ui.searchDirectoryList, &QTableWidget::itemSelectionChanged, this, + &SetupWizardDialog::onSearchDirectoryListSelectionChanged); refreshDirectoryList(); } @@ -314,6 +316,11 @@ void SetupWizardDialog::onRemoveSearchDirectoryButtonClicked() refreshDirectoryList(); } +void SetupWizardDialog::onSearchDirectoryListSelectionChanged() +{ + m_ui.removeSearchDirectoryButton->setEnabled(!m_ui.searchDirectoryList->selectedItems().isEmpty()); +} + void SetupWizardDialog::addPathToTable(const std::string& path, bool recursive) { const int row = m_ui.searchDirectoryList->rowCount(); @@ -359,6 +366,7 @@ void SetupWizardDialog::refreshDirectoryList() addPathToTable(entry, true); m_ui.searchDirectoryList->sortByColumn(0, Qt::AscendingOrder); + m_ui.removeSearchDirectoryButton->setEnabled(false); } void SetupWizardDialog::resizeDirectoryListColumns() diff --git a/src/duckstation-qt/setupwizarddialog.h b/src/duckstation-qt/setupwizarddialog.h index b15c94783..c32cfd251 100644 --- a/src/duckstation-qt/setupwizarddialog.h +++ b/src/duckstation-qt/setupwizarddialog.h @@ -38,6 +38,7 @@ private Q_SLOTS: void onDirectoryListContextMenuRequested(const QPoint& point); void onAddSearchDirectoryButtonClicked(); void onRemoveSearchDirectoryButtonClicked(); + void onSearchDirectoryListSelectionChanged(); void refreshDirectoryList(); void resizeDirectoryListColumns();