From 702af87f0dedf9d369d9f91e13f9529b9c49721b Mon Sep 17 00:00:00 2001 From: Tobias Date: Mon, 7 Dec 2020 16:05:13 +0100 Subject: [PATCH] Port yuzu-emu/yuzu#4700: "game_list: Eliminate redundant argument copies" (#5571) * game_list: Eliminate redundant argument copies Several functions can be taken by const reference to avoid copies Co-Authored-By: LC <712067+lioncash@users.noreply.github.com> * game_list: Make game list function naming consistent Makes the naming consistent with the rest of the functions that are present. Co-Authored-By: LC <712067+lioncash@users.noreply.github.com> Co-authored-by: Lioncash Co-authored-by: LC <712067+lioncash@users.noreply.github.com> --- src/citra_qt/game_list.cpp | 80 ++++++++++++++++++++++---------------- src/citra_qt/game_list.h | 24 ++++++------ src/citra_qt/main.cpp | 16 ++++---- 3 files changed, 67 insertions(+), 53 deletions(-) diff --git a/src/citra_qt/game_list.cpp b/src/citra_qt/game_list.cpp index 582e3d00d..162e1358f 100644 --- a/src/citra_qt/game_list.cpp +++ b/src/citra_qt/game_list.cpp @@ -64,7 +64,7 @@ bool GameListSearchField::KeyReleaseEater::eventFilter(QObject* obj, QEvent* eve case Qt::Key_Return: case Qt::Key_Enter: { if (gamelist->search_field->visible == 1) { - QString file_path = gamelist->getLastFilterResultItem(); + const QString file_path = gamelist->GetLastFilterResultItem(); // To avoid loading error dialog loops while confirming them using enter // Also users usually want to run a different game after closing one @@ -99,22 +99,25 @@ void GameListSearchField::setFilterResult(int visible, int total) { QStringLiteral("%1 %2 %3 %4").arg(visible).arg(result_of_text).arg(total).arg(result_text)); } -QString GameList::getLastFilterResultItem() const { - QStandardItem* folder; - QStandardItem* child; +QString GameList::GetLastFilterResultItem() const { QString file_path; const int folderCount = item_model->rowCount(); + for (int i = 0; i < folderCount; ++i) { - folder = item_model->item(i, 0); + const QStandardItem* folder = item_model->item(i, 0); const QModelIndex folder_index = folder->index(); const int children_count = folder->rowCount(); + for (int j = 0; j < children_count; ++j) { - if (!tree_view->isRowHidden(j, folder_index)) { - child = folder->child(j, 0); - file_path = child->data(GameListItemPath::FullPathRole).toString(); + if (tree_view->isRowHidden(j, folder_index)) { + continue; } + + const QStandardItem* child = folder->child(j, 0); + file_path = child->data(GameListItemPath::FullPathRole).toString(); } } + return file_path; } @@ -139,7 +142,7 @@ GameListSearchField::GameListSearchField(GameList* parent) : QWidget{parent} { edit_filter->setPlaceholderText(tr("Enter pattern to filter")); edit_filter->installEventFilter(key_release_eater); edit_filter->setClearButtonEnabled(true); - connect(edit_filter, &QLineEdit::textChanged, parent, &GameList::onTextChanged); + connect(edit_filter, &QLineEdit::textChanged, parent, &GameList::OnTextChanged); label_filter_result = new QLabel; button_filter_close = new QToolButton(this); button_filter_close->setText(QStringLiteral("X")); @@ -149,7 +152,7 @@ GameListSearchField::GameListSearchField(GameList* parent) : QWidget{parent} { "#000000; font-weight: bold; background: #F0F0F0; }" "QToolButton:hover{ border: none; padding: 0px; color: " "#EEEEEE; font-weight: bold; background: #E81123}")); - connect(button_filter_close, &QToolButton::clicked, parent, &GameList::onFilterCloseClicked); + connect(button_filter_close, &QToolButton::clicked, parent, &GameList::OnFilterCloseClicked); layout_filter->setSpacing(10); layout_filter->addWidget(label_filter); layout_filter->addWidget(edit_filter); @@ -175,16 +178,22 @@ static bool ContainsAllWords(const QString& haystack, const QString& userinput) } // Syncs the expanded state of Game Directories with settings to persist across sessions -void GameList::onItemExpanded(const QModelIndex& item) { +void GameList::OnItemExpanded(const QModelIndex& item) { const auto type = item.data(GameListItem::TypeRole).value(); - if (type == GameListItemType::CustomDir || type == GameListItemType::InstalledDir || - type == GameListItemType::SystemDir) - UISettings::values.game_dirs[item.data(GameListDir::GameDirRole).toInt()].expanded = - tree_view->isExpanded(item); + const bool is_dir = type == GameListItemType::CustomDir || + type == GameListItemType::InstalledDir || + type == GameListItemType::SystemDir; + + if (!is_dir) { + return; + } + + UISettings::values.game_dirs[item.data(GameListDir::GameDirRole).toInt()].expanded = + tree_view->isExpanded(item); } // Event in order to filter the gamelist after editing the searchfield -void GameList::onTextChanged(const QString& new_text) { +void GameList::OnTextChanged(const QString& new_text) { const int folder_count = tree_view->model()->rowCount(); QString edit_filter_text = new_text.toLower(); QStandardItem* folder; @@ -240,7 +249,7 @@ void GameList::onTextChanged(const QString& new_text) { } } -void GameList::onUpdateThemedIcons() { +void GameList::OnUpdateThemedIcons() { for (int i = 0; i < item_model->invisibleRootItem()->rowCount(); i++) { QStandardItem* child = item_model->invisibleRootItem()->child(i); @@ -270,7 +279,7 @@ void GameList::onUpdateThemedIcons() { } } -void GameList::onFilterCloseClicked() { +void GameList::OnFilterCloseClicked() { main_window->filterBarSetChecked(false); } @@ -304,11 +313,11 @@ GameList::GameList(GMainWindow* parent) : QWidget{parent} { item_model->setHeaderData(COLUMN_SIZE, Qt::Horizontal, tr("Size")); item_model->setSortRole(GameListItemPath::SortRole); - connect(main_window, &GMainWindow::UpdateThemedIcons, this, &GameList::onUpdateThemedIcons); + connect(main_window, &GMainWindow::UpdateThemedIcons, this, &GameList::OnUpdateThemedIcons); connect(tree_view, &QTreeView::activated, this, &GameList::ValidateEntry); connect(tree_view, &QTreeView::customContextMenuRequested, this, &GameList::PopupContextMenu); - connect(tree_view, &QTreeView::expanded, this, &GameList::onItemExpanded); - connect(tree_view, &QTreeView::collapsed, this, &GameList::onItemExpanded); + connect(tree_view, &QTreeView::expanded, this, &GameList::OnItemExpanded); + connect(tree_view, &QTreeView::collapsed, this, &GameList::OnItemExpanded); // We must register all custom types with the Qt Automoc system so that we are able to use // it with signals/slots. In this case, QList falls under the umbrells of custom types. @@ -325,17 +334,17 @@ GameList::~GameList() { emit ShouldCancelWorker(); } -void GameList::setFilterFocus() { +void GameList::SetFilterFocus() { if (tree_view->model()->rowCount() > 0) { search_field->setFocus(); } } -void GameList::setFilterVisible(bool visibility) { +void GameList::SetFilterVisible(bool visibility) { search_field->setVisible(visibility); } -void GameList::setDirectoryWatcherEnabled(bool enabled) { +void GameList::SetDirectoryWatcherEnabled(bool enabled) { if (enabled) { connect(watcher, &QFileSystemWatcher::directoryChanged, this, &GameList::RefreshGameDirectory, Qt::UniqueConnection); @@ -345,7 +354,7 @@ void GameList::setDirectoryWatcherEnabled(bool enabled) { } } -void GameList::clearFilter() { +void GameList::ClearFilter() { search_field->clear(); } @@ -384,21 +393,23 @@ void GameList::ValidateEntry(const QModelIndex& item) { } } -bool GameList::isEmpty() const { +bool GameList::IsEmpty() const { for (int i = 0; i < item_model->rowCount(); i++) { const QStandardItem* child = item_model->invisibleRootItem()->child(i); const auto type = static_cast(child->type()); + if (!child->hasChildren() && (type == GameListItemType::InstalledDir || type == GameListItemType::SystemDir)) { item_model->invisibleRootItem()->removeRow(child->row()); i--; } } + return !item_model->invisibleRootItem()->hasChildren(); } -void GameList::DonePopulating(QStringList watch_list) { - emit ShowList(!isEmpty()); +void GameList::DonePopulating(const QStringList& watch_list) { + emit ShowList(!IsEmpty()); item_model->invisibleRootItem()->appendRow(new GameListAddDir()); @@ -689,12 +700,15 @@ void GameList::SaveInterfaceLayout() { } void GameList::LoadInterfaceLayout() { - auto header = tree_view->header(); - if (!header->restoreState(UISettings::values.gamelist_header_state)) { - // We are using the name column to display icons and titles - // so make it as large as possible as default. - header->resizeSection(COLUMN_NAME, header->width()); + auto* header = tree_view->header(); + + if (header->restoreState(UISettings::values.gamelist_header_state)) { + return; } + + // We are using the name column to display icons and titles + // so make it as large as possible as default. + header->resizeSection(COLUMN_NAME, header->width()); } const QStringList GameList::supported_file_extensions = { diff --git a/src/citra_qt/game_list.h b/src/citra_qt/game_list.h index 334089037..8383f9aaf 100644 --- a/src/citra_qt/game_list.h +++ b/src/citra_qt/game_list.h @@ -55,12 +55,12 @@ public: explicit GameList(GMainWindow* parent = nullptr); ~GameList() override; - QString getLastFilterResultItem() const; - void clearFilter(); - void setFilterFocus(); - void setFilterVisible(bool visibility); - void setDirectoryWatcherEnabled(bool enabled); - bool isEmpty() const; + QString GetLastFilterResultItem() const; + void ClearFilter(); + void SetFilterFocus(); + void SetFilterVisible(bool visibility); + void SetDirectoryWatcherEnabled(bool enabled); + bool IsEmpty() const; void LoadCompatibilityList(); void PopulateAsync(QVector& game_dirs); @@ -77,7 +77,7 @@ public: static const QStringList supported_file_extensions; signals: - void GameChosen(QString game_path); + void GameChosen(const QString& game_path); void ShouldCancelWorker(); void OpenFolderRequested(u64 program_id, GameListOpenTarget target); void NavigateToGamedbEntryRequested(u64 program_id, @@ -89,16 +89,16 @@ signals: void PopulatingCompleted(); private slots: - void onItemExpanded(const QModelIndex& item); - void onTextChanged(const QString& new_text); - void onFilterCloseClicked(); - void onUpdateThemedIcons(); + void OnItemExpanded(const QModelIndex& item); + void OnTextChanged(const QString& new_text); + void OnFilterCloseClicked(); + void OnUpdateThemedIcons(); private: void AddDirEntry(GameListDir* entry_items); void AddEntry(const QList& entry_items, GameListDir* parent); void ValidateEntry(const QModelIndex& item); - void DonePopulating(QStringList watch_list); + void DonePopulating(const QStringList& watch_list); void PopupContextMenu(const QPoint& menu_location); void AddGamePopup(QMenu& context_menu, const QString& path, u64 program_id, u64 extdata_id); diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index a804bfb98..e4a1832ee 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -619,7 +619,7 @@ void GMainWindow::RestoreUIState() { OnDisplayTitleBars(ui->action_Display_Dock_Widget_Headers->isChecked()); ui->action_Show_Filter_Bar->setChecked(UISettings::values.show_filter_bar); - game_list->setFilterVisible(ui->action_Show_Filter_Bar->isChecked()); + game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked()); ui->action_Show_Status_Bar->setChecked(UISettings::values.show_status_bar); statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked()); @@ -1143,11 +1143,11 @@ void GMainWindow::ShutdownGame() { render_window->hide(); loading_screen->hide(); loading_screen->Clear(); - if (game_list->isEmpty()) + if (game_list->IsEmpty()) game_list_placeholder->show(); else game_list->show(); - game_list->setFilterFocus(); + game_list->SetFilterFocus(); setMouseTracking(false); @@ -1449,7 +1449,7 @@ void GMainWindow::OnMenuInstallCIA() { void GMainWindow::InstallCIA(QStringList filepaths) { ui->action_Install_CIA->setEnabled(false); - game_list->setDirectoryWatcherEnabled(false); + game_list->SetDirectoryWatcherEnabled(false); progress_bar->show(); progress_bar->setMaximum(INT_MAX); @@ -1503,7 +1503,7 @@ void GMainWindow::OnCIAInstallReport(Service::AM::InstallStatus status, QString void GMainWindow::OnCIAInstallFinished() { progress_bar->hide(); progress_bar->setValue(0); - game_list->setDirectoryWatcherEnabled(true); + game_list->SetDirectoryWatcherEnabled(true); ui->action_Install_CIA->setEnabled(true); game_list->PopulateAsync(UISettings::values.game_dirs); } @@ -1818,11 +1818,11 @@ void GMainWindow::OnOpenCitraFolder() { } void GMainWindow::OnToggleFilterBar() { - game_list->setFilterVisible(ui->action_Show_Filter_Bar->isChecked()); + game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked()); if (ui->action_Show_Filter_Bar->isChecked()) { - game_list->setFilterFocus(); + game_list->SetFilterFocus(); } else { - game_list->clearFilter(); + game_list->ClearFilter(); } }