This commit is contained in:
Dentomologist 2026-03-17 15:48:34 -04:00 committed by GitHub
commit f99e8b1836
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 119 additions and 0 deletions

View File

@ -265,6 +265,8 @@ add_executable(dolphin-emu
FIFO/FIFOAnalyzer.h
FIFO/FIFOPlayerWindow.cpp
FIFO/FIFOPlayerWindow.h
GameCount.cpp
GameCount.h
GameList/GameList.cpp
GameList/GameList.h
GameList/GameListModel.cpp

View File

@ -165,6 +165,7 @@
<ClCompile Include="EmulatedUSB\WiiSpeakWindow.cpp" />
<ClCompile Include="FIFO\FIFOAnalyzer.cpp" />
<ClCompile Include="FIFO\FIFOPlayerWindow.cpp" />
<ClCompile Include="GameCount.cpp" />
<ClCompile Include="GameList\GameList.cpp" />
<ClCompile Include="GameList\GameListModel.cpp" />
<ClCompile Include="GameList\GameTracker.cpp" />
@ -395,6 +396,7 @@
<QtMoc Include="EmulatedUSB\WiiSpeakWindow.h" />
<QtMoc Include="FIFO\FIFOAnalyzer.h" />
<QtMoc Include="FIFO\FIFOPlayerWindow.h" />
<QtMoc Include="GameCount.h" />
<QtMoc Include="GameList\GameList.h" />
<QtMoc Include="GameList\GameListModel.h" />
<QtMoc Include="GameList\GameTracker.h" />

View File

@ -0,0 +1,33 @@
// Copyright 2026 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "DolphinQt/GameCount.h"
#include <QFontMetrics>
#include <QLayout>
#include <QStatusBar>
GameCount::GameCount(QWidget* const parent) : QStatusBar(parent)
{
setSizeGripEnabled(false);
QFontMetrics font_metrics(font());
const int margin = font_metrics.height() / 5;
layout()->setContentsMargins(margin, margin, margin, margin);
}
void GameCount::OnGameCountUpdated(const int total_games, const int visible_games)
{
const int filtered_games = total_games - visible_games;
if (filtered_games > 0)
{
showMessage(tr("%1 game(s) in your collection (%2 visible, %3 filtered)")
.arg(total_games)
.arg(visible_games)
.arg(filtered_games));
}
else
{
showMessage(tr("%1 game(s) in your collection").arg(total_games));
}
}

View File

@ -0,0 +1,15 @@
// Copyright 2026 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QStatusBar>
class GameCount : public QStatusBar
{
Q_OBJECT
public:
explicit GameCount(QWidget* parent = nullptr);
void OnGameCountUpdated(int total_games, int visible_games);
};

View File

@ -139,6 +139,8 @@ GameList::GameList(QWidget* parent) : QStackedWidget(parent), m_model(this)
connect(m_grid, &QListView::doubleClicked, this, &GameList::GameSelected);
connect(&m_model, &QAbstractItemModel::rowsInserted, this, &GameList::ConsiderViewChange);
connect(&m_model, &QAbstractItemModel::rowsRemoved, this, &GameList::ConsiderViewChange);
connect(&m_model, &QAbstractItemModel::rowsInserted, this, &GameList::UpdateGameCount);
connect(&m_model, &QAbstractItemModel::rowsRemoved, this, &GameList::UpdateGameCount);
addWidget(m_list);
addWidget(m_grid);
@ -1043,6 +1045,8 @@ void GameList::OnGameListVisibilityChanged()
{
m_list_proxy->invalidate();
m_grid_proxy->invalidate();
UpdateGameCount();
}
void GameList::OnSectionResized(int index, int, int)
@ -1171,6 +1175,15 @@ void GameList::SetSearchTerm(const QString& term)
m_grid_proxy->invalidate();
UpdateColumnVisibility();
UpdateGameCount();
}
void GameList::UpdateGameCount() const
{
const int total_games = m_model.rowCount(QModelIndex{});
const int visible_games = m_list_proxy->rowCount();
emit GameCountUpdated(total_games, visible_games);
}
void GameList::ZoomIn()

View File

@ -43,6 +43,8 @@ public:
void OnColumnVisibilityToggled(const QString& row, bool visible);
void OnGameListVisibilityChanged();
void UpdateGameCount() const;
void resizeEvent(QResizeEvent* event) override;
void PurgeCache();
@ -51,6 +53,7 @@ public:
signals:
void GameSelected();
void GameCountUpdated(int total_games, int visible_games) const;
void OnStartWithRiivolution(const UICommon::GameFile& game);
void NetPlayHost(const UICommon::GameFile& game);
void SelectionChanged(std::shared_ptr<const UICommon::GameFile> game_file);

View File

@ -95,6 +95,7 @@
#include "DolphinQt/EmulatedUSB/WiiSpeakWindow.h"
#include "DolphinQt/FIFO/FIFOPlayerWindow.h"
#include "DolphinQt/GCMemcardManager.h"
#include "DolphinQt/GameCount.h"
#include "DolphinQt/GameList/GameList.h"
#include "DolphinQt/Host.h"
#include "DolphinQt/HotkeyScheduler.h"
@ -449,6 +450,7 @@ void MainWindow::CreateComponents()
m_menu_bar = new MenuBar(this);
m_tool_bar = new ToolBar(this);
m_search_bar = new SearchBar(this);
m_game_count = new GameCount(this);
m_game_list = new GameList(this);
m_render_widget = new RenderWidget;
m_stack = new QStackedWidget(this);
@ -738,9 +740,30 @@ void MainWindow::ConnectStack()
layout->addWidget(m_game_list);
layout->addWidget(m_search_bar);
layout->addWidget(m_game_count);
layout->setSpacing(0);
layout->setContentsMargins(0, 0, 0, 0);
connect(m_search_bar, &SearchBar::Search, m_game_list, &GameList::SetSearchTerm);
connect(m_game_list, &GameList::GameCountUpdated, m_game_count, &GameCount::OnGameCountUpdated);
m_game_list->UpdateGameCount();
const auto update_spacing = [this](const bool game_count_is_visible) {
// The bottom margin of the search bar and the top margin of the game count are both suitable
// when the other widget is hidden, but when both are visible the gap created by the combination
// is too large. To fix this we set the bottom margin of the search bar to 0 when the game count
// is visible and set it to the top margin when the game count is hidden.
m_game_count->setVisible(game_count_is_visible);
auto* const search_layout = m_search_bar->layout();
QMargins search_margins = search_layout->contentsMargins();
const int new_bottom_margin = game_count_is_visible ? 0 : search_margins.top();
search_margins.setBottom(new_bottom_margin);
search_layout->setContentsMargins(search_margins);
};
update_spacing(Settings::Instance().IsGameCountVisible());
connect(&Settings::Instance(), &Settings::GameCountVisibilityChanged, update_spacing);
m_stack->addWidget(widget);

View File

@ -31,6 +31,7 @@ class CodeWidget;
class DiscordHandler;
class DragEnterEvent;
class FreeLookWindow;
class GameCount;
class GameList;
class GBATASInputWindow;
class GCTASInputWindow;
@ -241,6 +242,7 @@ private:
MenuBar* m_menu_bar;
SearchBar* m_search_bar;
GameList* m_game_list;
GameCount* m_game_count;
RenderWidget* m_render_widget = nullptr;
bool m_rendering_to_main;
bool m_stop_confirm_showing = false;

View File

@ -595,6 +595,13 @@ void MenuBar::AddViewMenu()
AddShowPlatformsMenu(view_menu);
AddShowRegionsMenu(view_menu);
view_menu->addSeparator();
QAction* const show_game_count = view_menu->addAction(tr("Show Game Count"));
show_game_count->setCheckable(true);
show_game_count->setChecked(Settings::Instance().IsGameCountVisible());
connect(show_game_count, &QAction::toggled, &Settings::Instance(),
&Settings::SetGameCountVisible);
view_menu->addSeparator();
QAction* const purge_action =
view_menu->addAction(tr("Purge Game List Cache"), this, &MenuBar::PurgeGameListCache);

View File

@ -514,6 +514,21 @@ void Settings::SetAutoRefreshEnabled(bool enabled)
emit AutoRefreshToggled(enabled);
}
bool Settings::IsGameCountVisible() const
{
return GetQSettings().value(QStringLiteral("GameCount/Visible"), true).toBool();
}
void Settings::SetGameCountVisible(const bool visible)
{
if (IsGameCountVisible() == visible)
return;
GetQSettings().setValue(QStringLiteral("GameCount/Visible"), visible);
emit GameCountVisibilityChanged(visible);
}
QString Settings::GetDefaultGame() const
{
return QString::fromStdString(Config::Get(Config::MAIN_DEFAULT_ISO));
@ -815,6 +830,7 @@ void Settings::RefreshWidgetVisibility()
emit DebugModeToggled(IsDebugModeEnabled());
emit LogVisibilityChanged(IsLogVisible());
emit LogConfigVisibilityChanged(IsLogConfigVisible());
emit GameCountVisibilityChanged(IsGameCountVisible());
}
void Settings::SetDebugFont(QFont font)

View File

@ -110,6 +110,8 @@ public:
void ReloadTitleDB();
bool IsAutoRefreshEnabled() const;
void SetAutoRefreshEnabled(bool enabled);
bool IsGameCountVisible() const;
void SetGameCountVisible(bool visible);
// Emulation
int GetStateSlot() const;
@ -228,6 +230,7 @@ signals:
void DevicesChanged();
void WiiSpeakMuteChanged(bool muted);
void EnableGfxModsChanged(bool enabled);
void GameCountVisibilityChanged(bool visible);
private:
Settings();