Qt: Refactor GameListWidget tool buttons and corresponding menu actions

This commit is contained in:
Davide Pesavento 2025-07-14 00:10:11 -04:00 committed by Connor McLaughlin
parent 01b81c74ef
commit 21f44b3782
6 changed files with 105 additions and 142 deletions

View File

@ -930,7 +930,10 @@ void GameListModel::setColumnDisplayNames()
class GameListSortModel final : public QSortFilterProxyModel class GameListSortModel final : public QSortFilterProxyModel
{ {
public: public:
explicit GameListSortModel(GameListModel* parent) : QSortFilterProxyModel(parent), m_model(parent) {} explicit GameListSortModel(GameListModel* parent) : QSortFilterProxyModel(parent), m_model(parent)
{
m_merge_disc_sets = Host::GetBaseBoolSettingValue("UI", "GameListMergeDiscSets", true);
}
bool isMergingDiscSets() const { return m_merge_disc_sets; } bool isMergingDiscSets() const { return m_merge_disc_sets; }
@ -945,11 +948,13 @@ public:
m_filter_type = type; m_filter_type = type;
invalidateRowsFilter(); invalidateRowsFilter();
} }
void setFilterRegion(DiscRegion region) void setFilterRegion(DiscRegion region)
{ {
m_filter_region = region; m_filter_region = region;
invalidateRowsFilter(); invalidateRowsFilter();
} }
void setFilterName(std::string name) void setFilterName(std::string name)
{ {
m_filter_name = std::move(name); m_filter_name = std::move(name);
@ -1133,16 +1138,14 @@ GameListWidget::GameListWidget(QWidget* parent /* = nullptr */) : QWidget(parent
GameListWidget::~GameListWidget() = default; GameListWidget::~GameListWidget() = default;
void GameListWidget::initialize() void GameListWidget::initialize(QAction* actionGameList, QAction* actionGameGrid, QAction* actionMergeDiscSets,
QAction* actionListShowIcons, QAction* actionGridShowTitles)
{ {
const bool merge_disc_sets = Host::GetBaseBoolSettingValue("UI", "GameListMergeDiscSets", true);
m_model = new GameListModel(this); m_model = new GameListModel(this);
connect(m_model, &GameListModel::coverScaleChanged, this, &GameListWidget::onCoverScaleChanged); connect(m_model, &GameListModel::coverScaleChanged, this, &GameListWidget::onCoverScaleChanged);
m_sort_model = new GameListSortModel(m_model); m_sort_model = new GameListSortModel(m_model);
m_sort_model->setSourceModel(m_model); m_sort_model->setSourceModel(m_model);
m_sort_model->setMergeDiscSets(merge_disc_sets);
m_ui.setupUi(this); m_ui.setupUi(this);
for (u32 type = 0; type < static_cast<u32>(GameList::EntryType::MaxCount); type++) for (u32 type = 0; type < static_cast<u32>(GameList::EntryType::MaxCount); type++)
@ -1168,11 +1171,12 @@ void GameListWidget::initialize()
m_empty_ui.supportedFormats->setText(qApp->translate("GameListWidget", SUPPORTED_FORMATS_STRING)); m_empty_ui.supportedFormats->setText(qApp->translate("GameListWidget", SUPPORTED_FORMATS_STRING));
m_ui.stack->insertWidget(2, m_empty_widget); m_ui.stack->insertWidget(2, m_empty_widget);
connect(m_ui.viewGameList, &QPushButton::clicked, this, &GameListWidget::showGameList); m_ui.viewGameList->setDefaultAction(actionGameList);
connect(m_ui.viewGameGrid, &QPushButton::clicked, this, &GameListWidget::showGameGrid); m_ui.viewGameGrid->setDefaultAction(actionGameGrid);
m_ui.viewMergeDiscSets->setDefaultAction(actionMergeDiscSets);
m_ui.viewGridTitles->setDefaultAction(actionGridShowTitles);
connect(m_ui.gridScale, &QSlider::valueChanged, m_grid_view, &GameListGridView::setZoomPct); connect(m_ui.gridScale, &QSlider::valueChanged, m_grid_view, &GameListGridView::setZoomPct);
connect(m_ui.viewGridTitles, &QPushButton::toggled, this, &GameListWidget::setShowCoverTitles);
connect(m_ui.viewMergeDiscSets, &QPushButton::toggled, this, &GameListWidget::setMergeDiscSets);
connect(m_ui.filterType, &QComboBox::currentIndexChanged, this, [this](int index) { connect(m_ui.filterType, &QComboBox::currentIndexChanged, this, [this](int index) {
m_sort_model->setFilterType((index == 0) ? GameList::EntryType::MaxCount : m_sort_model->setFilterType((index == 0) ? GameList::EntryType::MaxCount :
static_cast<GameList::EntryType>(index - 1)); static_cast<GameList::EntryType>(index - 1));
@ -1199,13 +1203,16 @@ void GameListWidget::initialize()
const bool grid_view = Host::GetBaseBoolSettingValue("UI", "GameListGridView", false); const bool grid_view = Host::GetBaseBoolSettingValue("UI", "GameListGridView", false);
if (grid_view) if (grid_view)
m_ui.stack->setCurrentIndex(1); actionGameGrid->setChecked(true);
else else
m_ui.stack->setCurrentIndex(0); actionGameList->setChecked(true);
setFocusProxy(grid_view ? static_cast<QWidget*>(m_grid_view) : static_cast<QWidget*>(m_list_view)); actionMergeDiscSets->setChecked(m_sort_model->isMergingDiscSets());
actionListShowIcons->setChecked(m_model->getShowGameIcons());
actionGridShowTitles->setChecked(m_model->getShowCoverTitles());
onCoverScaleChanged(m_model->getCoverScale());
updateToolbar(); updateView(grid_view);
resizeListViewColumnsToFit(); updateToolbar(grid_view);
updateBackground(true); updateBackground(true);
} }
@ -1219,21 +1226,6 @@ bool GameListWidget::isShowingGameGrid() const
return m_ui.stack->currentIndex() == 1; return m_ui.stack->currentIndex() == 1;
} }
bool GameListWidget::isShowingGridCoverTitles() const
{
return m_model->getShowCoverTitles();
}
bool GameListWidget::isMergingDiscSets() const
{
return m_sort_model->isMergingDiscSets();
}
bool GameListWidget::isShowingGameIcons() const
{
return m_model->getShowGameIcons();
}
void GameListWidget::refresh(bool invalidate_cache) void GameListWidget::refresh(bool invalidate_cache)
{ {
cancelRefresh(); cancelRefresh();
@ -1317,8 +1309,8 @@ void GameListWidget::onRefreshProgress(const QString& status, int current, int t
if (m_ui.stack->currentIndex() == 2) if (m_ui.stack->currentIndex() == 2)
{ {
const bool grid_view = Host::GetBaseBoolSettingValue("UI", "GameListGridView", false); const bool grid_view = Host::GetBaseBoolSettingValue("UI", "GameListGridView", false);
m_ui.stack->setCurrentIndex(grid_view ? 1 : 0); updateView(grid_view);
setFocusProxy(grid_view ? static_cast<QWidget*>(m_grid_view) : static_cast<QWidget*>(m_list_view)); updateToolbar(grid_view);
} }
if (!m_model->hasTakenGameList() || time >= SHORT_REFRESH_TIME) if (!m_model->hasTakenGameList() || time >= SHORT_REFRESH_TIME)
@ -1417,68 +1409,42 @@ void GameListWidget::onSearchReturnPressed()
void GameListWidget::showGameList() void GameListWidget::showGameList()
{ {
if (m_ui.stack->currentIndex() == 0 || m_model->rowCount() == 0) if (isShowingGameList())
{
updateToolbar();
return; return;
}
Host::SetBaseBoolSettingValue("UI", "GameListGridView", false); Host::SetBaseBoolSettingValue("UI", "GameListGridView", false);
Host::CommitBaseSettingChanges(); Host::CommitBaseSettingChanges();
m_ui.stack->setCurrentIndex(0);
setFocusProxy(m_list_view); // keep showing the placeholder widget if we have no games
resizeListViewColumnsToFit(); if (m_model->rowCount() > 0)
updateToolbar(); updateView(false);
emit layoutChanged();
updateToolbar(false);
} }
void GameListWidget::showGameGrid() void GameListWidget::showGameGrid()
{ {
if (m_ui.stack->currentIndex() == 1 || m_model->rowCount() == 0) if (isShowingGameGrid())
{
updateToolbar();
return; return;
}
Host::SetBaseBoolSettingValue("UI", "GameListGridView", true); Host::SetBaseBoolSettingValue("UI", "GameListGridView", true);
Host::CommitBaseSettingChanges(); Host::CommitBaseSettingChanges();
m_ui.stack->setCurrentIndex(1);
setFocusProxy(m_grid_view);
updateToolbar();
emit layoutChanged();
}
void GameListWidget::setShowCoverTitles(bool enabled) // keep showing the placeholder widget if we have no games
{ if (m_model->rowCount() > 0)
if (m_model->getShowCoverTitles() == enabled) updateView(true);
{
updateToolbar();
return;
}
Host::SetBaseBoolSettingValue("UI", "GameListShowCoverTitles", enabled); updateToolbar(true);
Host::CommitBaseSettingChanges();
m_model->setShowCoverTitles(enabled);
m_grid_view->updateLayout();
if (isShowingGameGrid())
m_model->refresh();
updateToolbar();
emit layoutChanged();
} }
void GameListWidget::setMergeDiscSets(bool enabled) void GameListWidget::setMergeDiscSets(bool enabled)
{ {
if (m_sort_model->isMergingDiscSets() == enabled) if (m_sort_model->isMergingDiscSets() == enabled)
{
updateToolbar();
return; return;
}
Host::SetBaseBoolSettingValue("UI", "GameListMergeDiscSets", enabled); Host::SetBaseBoolSettingValue("UI", "GameListMergeDiscSets", enabled);
Host::CommitBaseSettingChanges(); Host::CommitBaseSettingChanges();
m_sort_model->setMergeDiscSets(enabled); m_sort_model->setMergeDiscSets(enabled);
updateToolbar();
emit layoutChanged();
} }
void GameListWidget::setShowGameIcons(bool enabled) void GameListWidget::setShowGameIcons(bool enabled)
@ -1491,30 +1457,36 @@ void GameListWidget::setShowGameIcons(bool enabled)
m_model->setShowGameIcons(enabled); m_model->setShowGameIcons(enabled);
} }
void GameListWidget::updateToolbar() void GameListWidget::setShowCoverTitles(bool enabled)
{ {
const bool grid_view = isShowingGameGrid(); if (m_model->getShowCoverTitles() == enabled)
{ return;
QSignalBlocker sb(m_ui.viewGameGrid);
m_ui.viewGameGrid->setChecked(grid_view);
}
{
QSignalBlocker sb(m_ui.viewGameList);
m_ui.viewGameList->setChecked(!grid_view);
}
{
QSignalBlocker sb(m_ui.viewGridTitles);
m_ui.viewGridTitles->setChecked(m_model->getShowCoverTitles());
}
{
QSignalBlocker sb(m_ui.viewMergeDiscSets);
m_ui.viewMergeDiscSets->setChecked(m_sort_model->isMergingDiscSets());
}
{
QSignalBlocker sb(m_ui.gridScale);
m_ui.gridScale->setValue(static_cast<int>(m_model->getCoverScale() * 100.0f));
}
Host::SetBaseBoolSettingValue("UI", "GameListShowCoverTitles", enabled);
Host::CommitBaseSettingChanges();
m_model->setShowCoverTitles(enabled);
m_grid_view->updateLayout();
if (isShowingGameGrid())
m_model->refresh();
}
void GameListWidget::updateView(bool grid_view)
{
if (grid_view)
{
m_ui.stack->setCurrentIndex(1);
setFocusProxy(m_grid_view);
}
else
{
m_ui.stack->setCurrentIndex(0);
setFocusProxy(m_list_view);
resizeListViewColumnsToFit();
}
}
void GameListWidget::updateToolbar(bool grid_view)
{
m_ui.viewGridTitles->setEnabled(grid_view); m_ui.viewGridTitles->setEnabled(grid_view);
m_ui.gridScale->setEnabled(grid_view); m_ui.gridScale->setEnabled(grid_view);
} }
@ -1538,7 +1510,7 @@ void GameListWidget::resizeListViewColumnsToFit()
const GameList::Entry* GameListWidget::getSelectedEntry() const const GameList::Entry* GameListWidget::getSelectedEntry() const
{ {
if (m_ui.stack->currentIndex() == 0) if (isShowingGameList())
{ {
const QItemSelectionModel* selection_model = m_list_view->selectionModel(); const QItemSelectionModel* selection_model = m_list_view->selectionModel();
if (!selection_model->hasSelection()) if (!selection_model->hasSelection())
@ -1727,7 +1699,7 @@ void GameListListView::onHeaderContextMenuRequested(const QPoint& point)
QAction* action = menu.addAction(m_model->getColumnDisplayName(column)); QAction* action = menu.addAction(m_model->getColumnDisplayName(column));
action->setCheckable(true); action->setCheckable(true);
action->setChecked(!isColumnHidden(column)); action->setChecked(!isColumnHidden(column));
connect(action, &QAction::toggled, [this, column](bool enabled) { connect(action, &QAction::triggered, [this, column](bool enabled) {
setAndSaveColumnHidden(column, !enabled); setAndSaveColumnHidden(column, !enabled);
resizeColumnsToFit(); resizeColumnsToFit();
}); });

View File

@ -221,7 +221,8 @@ public:
ALWAYS_INLINE GameListListView* getListView() const { return m_list_view; } ALWAYS_INLINE GameListListView* getListView() const { return m_list_view; }
ALWAYS_INLINE GameListGridView* getGridView() const { return m_grid_view; } ALWAYS_INLINE GameListGridView* getGridView() const { return m_grid_view; }
void initialize(); void initialize(QAction* actionGameList, QAction* actionGameGrid, QAction* actionMergeDiscSets,
QAction* actionListShowIcons, QAction* actionGridShowTitles);
void resizeListViewColumnsToFit(); void resizeListViewColumnsToFit();
void refresh(bool invalidate_cache); void refresh(bool invalidate_cache);
@ -232,9 +233,6 @@ public:
bool isShowingGameList() const; bool isShowingGameList() const;
bool isShowingGameGrid() const; bool isShowingGameGrid() const;
bool isShowingGridCoverTitles() const;
bool isMergingDiscSets() const;
bool isShowingGameIcons() const;
const GameList::Entry* getSelectedEntry() const; const GameList::Entry* getSelectedEntry() const;
@ -247,7 +245,6 @@ Q_SIGNALS:
void entryContextMenuRequested(const QPoint& point); void entryContextMenuRequested(const QPoint& point);
void addGameDirectoryRequested(); void addGameDirectoryRequested();
void layoutChanged();
private Q_SLOTS: private Q_SLOTS:
void onRefreshProgress(const QString& status, int current, int total, float time); void onRefreshProgress(const QString& status, int current, int total, float time);
@ -265,9 +262,9 @@ private Q_SLOTS:
public Q_SLOTS: public Q_SLOTS:
void showGameList(); void showGameList();
void showGameGrid(); void showGameGrid();
void setShowCoverTitles(bool enabled);
void setMergeDiscSets(bool enabled); void setMergeDiscSets(bool enabled);
void setShowGameIcons(bool enabled); void setShowGameIcons(bool enabled);
void setShowCoverTitles(bool enabled);
void refreshGridCovers(); void refreshGridCovers();
void focusSearchWidget(); void focusSearchWidget();
@ -275,7 +272,8 @@ protected:
void resizeEvent(QResizeEvent* event); void resizeEvent(QResizeEvent* event);
private: private:
void updateToolbar(); void updateView(bool grid_view);
void updateToolbar(bool grid_view);
Ui::GameListWidget m_ui; Ui::GameListWidget m_ui;

View File

@ -54,9 +54,6 @@
<property name="text"> <property name="text">
<string>Game List</string> <string>Game List</string>
</property> </property>
<property name="icon">
<iconset theme="list-check"/>
</property>
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -76,9 +73,6 @@
<property name="text"> <property name="text">
<string>Game Grid</string> <string>Game Grid</string>
</property> </property>
<property name="icon">
<iconset theme="function-line"/>
</property>
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -98,9 +92,6 @@
<property name="text"> <property name="text">
<string>Merge Multi-Disc Games</string> <string>Merge Multi-Disc Games</string>
</property> </property>
<property name="icon">
<iconset theme="play-list-2-line"/>
</property>
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -120,9 +111,6 @@
<property name="text"> <property name="text">
<string>Show Titles</string> <string>Show Titles</string>
</property> </property>
<property name="icon">
<iconset theme="price-tag-3-line"/>
</property>
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>

View File

@ -398,6 +398,7 @@ void MainWindow::createDisplayWidget(bool fullscreen, bool render_to_main, bool
AssertMsg(m_ui.mainContainer->count() == 1, "Has no display widget"); AssertMsg(m_ui.mainContainer->count() == 1, "Has no display widget");
m_ui.mainContainer->addWidget(container); m_ui.mainContainer->addWidget(container);
m_ui.mainContainer->setCurrentIndex(1); m_ui.mainContainer->setCurrentIndex(1);
m_ui.actionViewSystemDisplay->setChecked(true);
} }
updateDisplayRelatedActions(true, render_to_main, fullscreen); updateDisplayRelatedActions(true, render_to_main, fullscreen);
@ -460,7 +461,10 @@ void MainWindow::destroyDisplayWidget(bool show_game_list)
if (show_game_list) if (show_game_list)
{ {
m_ui.mainContainer->setCurrentIndex(0); m_ui.mainContainer->setCurrentIndex(0);
m_game_list_widget->resizeListViewColumnsToFit(); if (m_game_list_widget->isShowingGameGrid())
m_ui.actionViewGameGrid->setChecked(true);
else
m_ui.actionViewGameList->setChecked(true);
} }
} }
@ -542,6 +546,7 @@ void MainWindow::onSystemStarted()
m_was_disc_change_request = false; m_was_disc_change_request = false;
s_system_starting = false; s_system_starting = false;
s_system_valid = true; s_system_valid = true;
updateEmulationActions(false, true, s_achievements_hardcore_mode); updateEmulationActions(false, true, s_achievements_hardcore_mode);
updateWindowTitle(); updateWindowTitle();
updateStatusBarWidgetVisibility(); updateStatusBarWidgetVisibility();
@ -1383,14 +1388,14 @@ void MainWindow::onViewStatusBarActionToggled(bool checked)
void MainWindow::onViewGameListActionTriggered() void MainWindow::onViewGameListActionTriggered()
{ {
switchToGameListView();
m_game_list_widget->showGameList(); m_game_list_widget->showGameList();
switchToGameListView();
} }
void MainWindow::onViewGameGridActionTriggered() void MainWindow::onViewGameGridActionTriggered()
{ {
switchToGameListView();
m_game_list_widget->showGameGrid(); m_game_list_widget->showGameGrid();
switchToGameListView();
} }
void MainWindow::onViewSystemDisplayTriggered() void MainWindow::onViewSystemDisplayTriggered()
@ -1443,25 +1448,6 @@ void MainWindow::onGameListRefreshComplete()
clearProgressBar(); clearProgressBar();
} }
void MainWindow::onGameListLayoutChanged()
{
// re-sync with menu
{
QSignalBlocker sb(m_ui.actionGridViewShowTitles);
m_ui.actionGridViewShowTitles->setChecked(m_game_list_widget->isShowingGridCoverTitles());
}
{
QSignalBlocker sb(m_ui.actionMergeDiscSets);
m_ui.actionMergeDiscSets->setChecked(m_game_list_widget->isMergingDiscSets());
}
{
QSignalBlocker sb(m_ui.actionShowGameIcons);
m_ui.actionShowGameIcons->setChecked(m_game_list_widget->isShowingGameIcons());
}
}
void MainWindow::onGameListSelectionChanged() void MainWindow::onGameListSelectionChanged()
{ {
auto lock = GameList::GetLock(); auto lock = GameList::GetLock();
@ -1735,8 +1721,15 @@ void MainWindow::setupAdditionalUi()
m_ui.actionViewToolbarLabelsBesideIcons->setChecked( m_ui.actionViewToolbarLabelsBesideIcons->setChecked(
Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false)); Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false));
// mutually exclusive actions
QActionGroup* group = new QActionGroup(this);
group->addAction(m_ui.actionViewGameList);
group->addAction(m_ui.actionViewGameGrid);
group->addAction(m_ui.actionViewSystemDisplay);
m_game_list_widget = new GameListWidget(m_ui.mainContainer); m_game_list_widget = new GameListWidget(m_ui.mainContainer);
m_game_list_widget->initialize(); m_game_list_widget->initialize(m_ui.actionViewGameList, m_ui.actionViewGameGrid, m_ui.actionMergeDiscSets,
m_ui.actionShowGameIcons, m_ui.actionGridViewShowTitles);
m_ui.mainContainer->addWidget(m_game_list_widget); m_ui.mainContainer->addWidget(m_game_list_widget);
m_status_progress_widget = new QProgressBar(m_ui.statusBar); m_status_progress_widget = new QProgressBar(m_ui.statusBar);
@ -1774,7 +1767,6 @@ void MainWindow::setupAdditionalUi()
connect(action, &QAction::triggered, [scale]() { g_emu_thread->requestDisplaySize(scale); }); connect(action, &QAction::triggered, [scale]() { g_emu_thread->requestDisplaySize(scale); });
} }
onGameListLayoutChanged();
updateDebugMenuVisibility(); updateDebugMenuVisibility();
m_shortcuts.open_file = new QShortcut(QKeySequence::Open, this, this, &MainWindow::onStartFileActionTriggered); m_shortcuts.open_file = new QShortcut(QKeySequence::Open, this, this, &MainWindow::onStartFileActionTriggered);
@ -2154,7 +2146,7 @@ void MainWindow::switchToEmulationView()
if (!wantsDisplayWidget() || !isShowingGameList()) if (!wantsDisplayWidget() || !isShowingGameList())
return; return;
// we're no longer surfaceless! this will call back to UpdateDisplay(), which will swap the widget out. // we're no longer surfaceless! this will call back to acquireRenderWindow(), which will swap the widget out.
g_emu_thread->setSurfaceless(false); g_emu_thread->setSurfaceless(false);
// resume if we weren't paused at switch time // resume if we weren't paused at switch time
@ -2313,7 +2305,6 @@ void MainWindow::connectSignals()
// These need to be queued connections to stop crashing due to menus opening/closing and switching focus. // These need to be queued connections to stop crashing due to menus opening/closing and switching focus.
connect(m_game_list_widget, &GameListWidget::refreshProgress, this, &MainWindow::onGameListRefreshProgress); connect(m_game_list_widget, &GameListWidget::refreshProgress, this, &MainWindow::onGameListRefreshProgress);
connect(m_game_list_widget, &GameListWidget::refreshComplete, this, &MainWindow::onGameListRefreshComplete); connect(m_game_list_widget, &GameListWidget::refreshComplete, this, &MainWindow::onGameListRefreshComplete);
connect(m_game_list_widget, &GameListWidget::layoutChanged, this, &MainWindow::onGameListLayoutChanged);
connect(m_game_list_widget, &GameListWidget::selectionChanged, this, &MainWindow::onGameListSelectionChanged, connect(m_game_list_widget, &GameListWidget::selectionChanged, this, &MainWindow::onGameListSelectionChanged,
Qt::QueuedConnection); Qt::QueuedConnection);
connect(m_game_list_widget, &GameListWidget::entryActivated, this, &MainWindow::onGameListEntryActivated, connect(m_game_list_widget, &GameListWidget::entryActivated, this, &MainWindow::onGameListEntryActivated,

View File

@ -213,7 +213,6 @@ private Q_SLOTS:
void onGameListRefreshComplete(); void onGameListRefreshComplete();
void onGameListRefreshProgress(const QString& status, int current, int total); void onGameListRefreshProgress(const QString& status, int current, int total);
void onGameListLayoutChanged();
void onGameListSelectionChanged(); void onGameListSelectionChanged();
void onGameListEntryActivated(); void onGameListEntryActivated();
void onGameListEntryContextMenuRequested(const QPoint& point); void onGameListEntryContextMenuRequested(const QPoint& point);

View File

@ -743,9 +743,6 @@
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="checked">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Lock Toolbar</string> <string>Lock Toolbar</string>
</property> </property>
@ -786,6 +783,9 @@
</property> </property>
</action> </action>
<action name="actionViewGameList"> <action name="actionViewGameList">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon"> <property name="icon">
<iconset theme="list-check"/> <iconset theme="list-check"/>
</property> </property>
@ -794,6 +794,9 @@
</property> </property>
</action> </action>
<action name="actionViewSystemDisplay"> <action name="actionViewSystemDisplay">
<property name="checkable">
<bool>true</bool>
</property>
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -826,6 +829,9 @@
</property> </property>
</action> </action>
<action name="actionViewGameGrid"> <action name="actionViewGameGrid">
<property name="checkable">
<bool>true</bool>
</property>
<property name="icon"> <property name="icon">
<iconset theme="function-line"/> <iconset theme="function-line"/>
</property> </property>
@ -840,6 +846,9 @@
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset theme="play-list-2-line"/>
</property>
<property name="text"> <property name="text">
<string>Merge Multi-Disc Games</string> <string>Merge Multi-Disc Games</string>
</property> </property>
@ -851,9 +860,15 @@
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="icon">
<iconset theme="price-tag-3-line"/>
</property>
<property name="text"> <property name="text">
<string>Show Titles (Grid View)</string> <string>Show Titles (Grid View)</string>
</property> </property>
<property name="toolTip">
<string>Show Titles</string>
</property>
</action> </action>
<action name="actionGridViewZoomIn"> <action name="actionGridViewZoomIn">
<property name="text"> <property name="text">