mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-03-18 19:32:41 +00:00
GameList: Add status bar with game count
The status bar shows the number of games in your collection. If any games are hidden by the platform, region, or search filters it will also show how many games are visible and how many are filtered. The visibility of the status bar can be toggled from the menu by selecting `View`->`Show Game Count`. Implements https://bugs.dolphin-emu.org/issues/9517.
This commit is contained in:
parent
49d5299f1e
commit
7209cf87cb
@ -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
|
||||
|
||||
@ -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" />
|
||||
|
||||
33
Source/Core/DolphinQt/GameCount.cpp
Normal file
33
Source/Core/DolphinQt/GameCount.cpp
Normal 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));
|
||||
}
|
||||
}
|
||||
15
Source/Core/DolphinQt/GameCount.h
Normal file
15
Source/Core/DolphinQt/GameCount.h
Normal 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);
|
||||
};
|
||||
@ -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()
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user