From ee0cb6076c8924cf2b5a1b3d4466f947edfd3a78 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 22 Jun 2025 02:33:00 +1000 Subject: [PATCH] Qt: Add additional toolbar properties for labels/icons --- src/duckstation-qt/mainwindow.cpp | 109 +++++++++++++++++++++++++++--- src/duckstation-qt/mainwindow.h | 6 +- src/duckstation-qt/mainwindow.ui | 27 ++++++++ 3 files changed, 131 insertions(+), 11 deletions(-) diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp index 66cf03292..d99980789 100644 --- a/src/duckstation-qt/mainwindow.cpp +++ b/src/duckstation-qt/mainwindow.cpp @@ -172,6 +172,7 @@ void MainWindow::initialize() m_ui.setupUi(this); setupAdditionalUi(); updateToolbarActions(); + updateToolbarIconStyle(); updateEmulationActions(false, false, false); connectSignals(); @@ -1308,11 +1309,48 @@ void MainWindow::onViewToolbarActionToggled(bool checked) m_ui.toolBar->setVisible(checked); } -void MainWindow::onViewLockToolbarActionToggled(bool checked) +void MainWindow::onViewToolbarLockActionToggled(bool checked) { - Host::SetBaseBoolSettingValue("UI", "LockToolbar", checked); + Host::SetBaseBoolSettingValue("UI", "LockToolbar", !checked); Host::CommitBaseSettingChanges(); m_ui.toolBar->setMovable(!checked); + + // ensure synced + const QSignalBlocker sb(m_ui.actionViewLockToolbar); + m_ui.actionViewLockToolbar->setChecked(checked); +} + +void MainWindow::onViewToolbarSmallIconsActionToggled(bool checked) +{ + Host::SetBaseBoolSettingValue("UI", "ToolbarSmallIcons", checked); + Host::CommitBaseSettingChanges(); + updateToolbarIconStyle(); + + // ensure synced + const QSignalBlocker sb(m_ui.actionViewSmallToolbarIcons); + m_ui.actionViewSmallToolbarIcons->setChecked(checked); +} + +void MainWindow::onViewToolbarLabelsActionToggled(bool checked) +{ + Host::SetBaseBoolSettingValue("UI", "ToolbarLabels", checked); + Host::CommitBaseSettingChanges(); + updateToolbarIconStyle(); + + // ensure synced + const QSignalBlocker sb(m_ui.actionViewToolbarLabels); + m_ui.actionViewToolbarLabels->setChecked(checked); +} + +void MainWindow::onViewToolbarLabelsBesideIconsActionToggled(bool checked) +{ + Host::SetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", checked); + Host::CommitBaseSettingChanges(); + updateToolbarIconStyle(); + + // ensure synced + const QSignalBlocker sb(m_ui.actionViewToolbarLabelsBesidesText); + m_ui.actionViewToolbarLabelsBesidesText->setChecked(checked); } void MainWindow::onViewStatusBarActionToggled(bool checked) @@ -1672,6 +1710,11 @@ void MainWindow::setupAdditionalUi() m_ui.actionViewLockToolbar->setChecked(toolbars_locked); m_ui.toolBar->setMovable(!toolbars_locked); + m_ui.actionViewSmallToolbarIcons->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarSmallIcons", false)); + m_ui.actionViewToolbarLabels->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarLabels", true)); + m_ui.actionViewToolbarLabelsBesidesText->setChecked( + Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false)); + m_game_list_widget = new GameListWidget(m_ui.mainContainer); m_game_list_widget->initialize(); m_ui.mainContainer->addWidget(m_game_list_widget); @@ -1768,6 +1811,27 @@ void MainWindow::updateToolbarActions() } } +void MainWindow::updateToolbarIconStyle() +{ + const bool show_labels = Host::GetBaseBoolSettingValue("UI", "ToolbarLabels", true); + const bool small_icons = Host::GetBaseBoolSettingValue("UI", "ToolbarSmallIcons", false); + const bool labels_beside_icons = Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false); + + Qt::ToolButtonStyle style; + if (!show_labels) + style = Qt::ToolButtonIconOnly; + else if (labels_beside_icons) + style = Qt::ToolButtonTextBesideIcon; + else + style = Qt::ToolButtonTextUnderIcon; + if (m_ui.toolBar->toolButtonStyle() != style) + m_ui.toolBar->setToolButtonStyle(style); + + const QSize icon_size = QSize(small_icons ? 16 : 32, small_icons ? 16 : 32); + if (m_ui.toolBar->iconSize() != icon_size) + m_ui.toolBar->setIconSize(icon_size); +} + void MainWindow::onToolbarContextMenuRequested(const QPoint& pos) { { @@ -1778,6 +1842,28 @@ void MainWindow::onToolbarContextMenuRequested(const QPoint& pos) QMenu menu; + QAction* action = menu.addAction(tr("Lock Toolbar")); + action->setCheckable(true); + action->setChecked(m_ui.toolBar->isMovable()); + connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarLockActionToggled); + + action = menu.addAction(tr("Small Icons")); + action->setCheckable(true); + action->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarSmallIcons", false)); + connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarSmallIconsActionToggled); + + action = menu.addAction(tr("Show Labels")); + action->setCheckable(true); + action->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarLabels", true)); + connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarLabelsActionToggled); + + action = menu.addAction(tr("Labels Beside Icons")); + action->setCheckable(true); + action->setChecked(Host::GetBaseBoolSettingValue("UI", "ToolbarLabelsBesideIcons", false)); + connect(action, &QAction::toggled, this, &MainWindow::onViewToolbarLabelsBesideIconsActionToggled); + + menu.addSeparator(); + for (const auto& [name, action_ptr] : s_toolbar_actions) { if (!name) @@ -1786,8 +1872,7 @@ void MainWindow::onToolbarContextMenuRequested(const QPoint& pos) continue; } - QAction* action = (m_ui.*action_ptr); - QAction* menu_action = menu.addAction(action->text()); + QAction* menu_action = menu.addAction((m_ui.*action_ptr)->text()); menu_action->setCheckable(true); menu_action->setChecked(StringUtil::IsInStringList(active_buttons, name)); connect(menu_action, &QAction::toggled, this, [&active_buttons, &active_buttons_changed, name](bool checked) { @@ -1801,11 +1886,11 @@ void MainWindow::onToolbarContextMenuRequested(const QPoint& pos) menu.exec(m_ui.toolBar->mapToGlobal(pos)); - if (!active_buttons_changed) - return; - - Host::SetBaseStringSettingValue("UI", "ToolbarButtons", StringUtil::JoinString(active_buttons, ',').c_str()); - Host::CommitBaseSettingChanges(); + if (active_buttons_changed) + { + Host::SetBaseStringSettingValue("UI", "ToolbarButtons", StringUtil::JoinString(active_buttons, ',').c_str()); + Host::CommitBaseSettingChanges(); + } } updateToolbarActions(); @@ -2107,7 +2192,11 @@ void MainWindow::connectSignals() connect(m_ui.actionAdvancedSettings, &QAction::triggered, [this]() { doSettings("Advanced"); }); connect(m_ui.actionControllerProfiles, &QAction::triggered, this, &MainWindow::onSettingsControllerProfilesTriggered); connect(m_ui.actionViewToolbar, &QAction::toggled, this, &MainWindow::onViewToolbarActionToggled); - connect(m_ui.actionViewLockToolbar, &QAction::toggled, this, &MainWindow::onViewLockToolbarActionToggled); + connect(m_ui.actionViewLockToolbar, &QAction::toggled, this, &MainWindow::onViewToolbarLockActionToggled); + connect(m_ui.actionViewSmallToolbarIcons, &QAction::toggled, this, &MainWindow::onViewToolbarSmallIconsActionToggled); + connect(m_ui.actionViewToolbarLabels, &QAction::toggled, this, &MainWindow::onViewToolbarLabelsActionToggled); + connect(m_ui.actionViewToolbarLabelsBesidesText, &QAction::toggled, this, + &MainWindow::onViewToolbarLabelsBesideIconsActionToggled); connect(m_ui.actionViewStatusBar, &QAction::toggled, this, &MainWindow::onViewStatusBarActionToggled); connect(m_ui.actionViewGameList, &QAction::triggered, this, &MainWindow::onViewGameListActionTriggered); connect(m_ui.actionViewGameGrid, &QAction::triggered, this, &MainWindow::onViewGameGridActionTriggered); diff --git a/src/duckstation-qt/mainwindow.h b/src/duckstation-qt/mainwindow.h index c300f4267..c60ecc7a6 100644 --- a/src/duckstation-qt/mainwindow.h +++ b/src/duckstation-qt/mainwindow.h @@ -182,7 +182,10 @@ private Q_SLOTS: void onRemoveDiscActionTriggered(); void onScanForNewGamesTriggered(); void onViewToolbarActionToggled(bool checked); - void onViewLockToolbarActionToggled(bool checked); + void onViewToolbarLockActionToggled(bool checked); + void onViewToolbarSmallIconsActionToggled(bool checked); + void onViewToolbarLabelsActionToggled(bool checked); + void onViewToolbarLabelsBesideIconsActionToggled(bool checked); void onViewStatusBarActionToggled(bool checked); void onViewGameListActionTriggered(); void onViewGameGridActionTriggered(); @@ -238,6 +241,7 @@ private: void connectSignals(); void updateToolbarActions(); + void updateToolbarIconStyle(); void updateEmulationActions(bool starting, bool running, bool cheevos_challenge_mode); void updateShortcutActions(bool starting); void updateStatusBarWidgetVisibility(); diff --git a/src/duckstation-qt/mainwindow.ui b/src/duckstation-qt/mainwindow.ui index 422657d8e..2cb789bc2 100644 --- a/src/duckstation-qt/mainwindow.ui +++ b/src/duckstation-qt/mainwindow.ui @@ -198,6 +198,9 @@ + + + @@ -746,6 +749,30 @@ Lock Toolbar + + + true + + + Small Toolbar Icons + + + + + true + + + Toolbar Labels + + + + + true + + + Toolbar Labels Besides Text + + true