Improve UI configuration responsive layout and add update channel selector

- Add update channel combo box (Stable/Nightly) in General settings
- Store channel preference in QSettings
- Change compact layout breakpoint from 950px to 550px
- Improve layout switching logic to move screenshots group box
- Add translation support for update channel labels

Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
Zephyron
2025-11-22 16:56:32 +10:00
parent 87a4d61789
commit f2987a428b
2 changed files with 51 additions and 21 deletions

View File

@@ -24,7 +24,9 @@
#include <QVariant> #include <QVariant>
#include <QListWidget> #include <QListWidget>
#include <QMessageBox> #include <QMessageBox>
#include <QSettings>
#include <QResizeEvent> #include <QResizeEvent>
#include <QLabel>
#include "common/common_types.h" #include "common/common_types.h"
#include "common/fs/path_util.h" #include "common/fs/path_util.h"
@@ -36,9 +38,6 @@
#include "ui_configure_ui.h" #include "ui_configure_ui.h"
#include "citron/uisettings.h" #include "citron/uisettings.h"
// If the window width is less than this value, the layout will switch to a single column.
constexpr int COMPACT_LAYOUT_BREAKPOINT = 950;
namespace { namespace {
constexpr std::array default_game_icon_sizes{ constexpr std::array default_game_icon_sizes{
std::make_pair(0, QT_TRANSLATE_NOOP("ConfigureUI", "None")), std::make_pair(0, QT_TRANSLATE_NOOP("ConfigureUI", "None")),
@@ -130,6 +129,14 @@ resolution_setting{Settings::values.resolution_setup.GetValue()}, system{system_
emit UIPositioningChanged(text); emit UIPositioningChanged(text);
}); });
auto* update_channel_combo = new QComboBox(this);
update_channel_combo->setObjectName(QStringLiteral("update_channel_combo"));
update_channel_combo->addItem(tr("Stable"), QStringLiteral("Stable"));
update_channel_combo->addItem(tr("Nightly"), QStringLiteral("Nightly"));
update_channel_combo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
ui->generalFormLayout->insertRow(2, tr("Update Channel"), update_channel_combo);
InitializeIconSizeComboBox(); InitializeIconSizeComboBox();
InitializeRowComboBoxes(); InitializeRowComboBoxes();
@@ -182,11 +189,6 @@ resolution_setting{Settings::values.resolution_setup.GetValue()}, system{system_
connect(ui->screenshot_height, &QComboBox::currentTextChanged, [this]() { UpdateWidthText(); }); connect(ui->screenshot_height, &QComboBox::currentTextChanged, [this]() { UpdateWidthText(); });
UpdateWidthText(); UpdateWidthText();
// Check initial size to apply the correct layout from the start.
if (width() < COMPACT_LAYOUT_BREAKPOINT) {
switchToCompactLayout();
}
} }
ConfigureUi::~ConfigureUi() = default; ConfigureUi::~ConfigureUi() = default;
@@ -195,6 +197,13 @@ void ConfigureUi::ApplyConfiguration() {
UISettings::values.theme = UISettings::values.theme =
ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString().toStdString(); ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString().toStdString();
UISettings::values.ui_positioning = ui->ui_positioning_combo->currentData().toString().toStdString(); UISettings::values.ui_positioning = ui->ui_positioning_combo->currentData().toString().toStdString();
auto* update_channel_combo = findChild<QComboBox*>("update_channel_combo");
if (update_channel_combo) {
QSettings settings;
settings.setValue("updater/channel", update_channel_combo->currentData().toString());
}
UISettings::values.enable_rainbow_mode = ui->rainbowModeCheckBox->isChecked(); UISettings::values.enable_rainbow_mode = ui->rainbowModeCheckBox->isChecked();
UISettings::values.show_add_ons = ui->show_add_ons->isChecked(); UISettings::values.show_add_ons = ui->show_add_ons->isChecked();
UISettings::values.show_compat = ui->show_compat->isChecked(); UISettings::values.show_compat = ui->show_compat->isChecked();
@@ -218,31 +227,31 @@ void ConfigureUi::ApplyConfiguration() {
} }
void ConfigureUi::resizeEvent(QResizeEvent* event) { void ConfigureUi::resizeEvent(QResizeEvent* event) {
QWidget::resizeEvent(event); if (event->oldSize() == event->size()) {
return;
}
const int currentWidth = event->size().width(); if (width() < 550 && !isCompact) {
if (currentWidth < COMPACT_LAYOUT_BREAKPOINT && !isCompact) {
switchToCompactLayout(); switchToCompactLayout();
} else if (currentWidth >= COMPACT_LAYOUT_BREAKPOINT && isCompact) { } else if (width() >= 550 && isCompact) {
switchToWideLayout(); switchToWideLayout();
} }
} }
void ConfigureUi::switchToCompactLayout() { void ConfigureUi::switchToCompactLayout() {
if (isCompact) return; // Already compact
// Move the right column layout to be below the left column layout
ui->mainHorizontalLayout->removeItem(ui->rightColumnLayout);
ui->leftColumnLayout->addLayout(ui->rightColumnLayout);
isCompact = true; isCompact = true;
if (ui->leftColumnLayout && ui->screenshots_GroupBox) {
ui->rightColumnLayout->removeWidget(ui->screenshots_GroupBox);
ui->leftColumnLayout->insertWidget(2, ui->screenshots_GroupBox);
}
} }
void ConfigureUi::switchToWideLayout() { void ConfigureUi::switchToWideLayout() {
if (!isCompact) return; // Already wide
// Move the right column layout from the left column back to the main horizontal layout
ui->leftColumnLayout->removeItem(ui->rightColumnLayout);
ui->mainHorizontalLayout->addLayout(ui->rightColumnLayout);
isCompact = false; isCompact = false;
if (ui->rightColumnLayout && ui->screenshots_GroupBox) {
ui->leftColumnLayout->removeWidget(ui->screenshots_GroupBox);
ui->rightColumnLayout->insertWidget(0, ui->screenshots_GroupBox);
}
} }
void ConfigureUi::RequestGameListUpdate() { void ConfigureUi::RequestGameListUpdate() {
@@ -256,6 +265,14 @@ void ConfigureUi::SetConfiguration() {
QString::fromStdString(UISettings::values.language.GetValue()))); QString::fromStdString(UISettings::values.language.GetValue())));
ui->ui_positioning_combo->setCurrentIndex(ui->ui_positioning_combo->findData( ui->ui_positioning_combo->setCurrentIndex(ui->ui_positioning_combo->findData(
QString::fromStdString(UISettings::values.ui_positioning.GetValue()))); QString::fromStdString(UISettings::values.ui_positioning.GetValue())));
auto* update_channel_combo = findChild<QComboBox*>("update_channel_combo");
if (update_channel_combo) {
QSettings settings;
QString channel = settings.value("updater/channel", QStringLiteral("Stable")).toString();
update_channel_combo->setCurrentIndex(update_channel_combo->findData(channel));
}
ui->rainbowModeCheckBox->setChecked(UISettings::values.enable_rainbow_mode.GetValue()); ui->rainbowModeCheckBox->setChecked(UISettings::values.enable_rainbow_mode.GetValue());
ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue()); ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue());
ui->show_compat->setChecked(UISettings::values.show_compat.GetValue()); ui->show_compat->setChecked(UISettings::values.show_compat.GetValue());
@@ -308,6 +325,18 @@ void ConfigureUi::RetranslateUI() {
ui->ui_positioning_combo->setItemText(1, tr("Horizontal")); ui->ui_positioning_combo->setItemText(1, tr("Horizontal"));
ui->ui_positioning_combo->setCurrentIndex(pos_index); ui->ui_positioning_combo->setCurrentIndex(pos_index);
auto* update_channel_combo = findChild<QComboBox*>("update_channel_combo");
if (update_channel_combo) {
const int channel_index = update_channel_combo->currentIndex();
update_channel_combo->setItemText(0, tr("Stable"));
update_channel_combo->setItemText(1, tr("Nightly"));
update_channel_combo->setCurrentIndex(channel_index);
if (auto* label = qobject_cast<QLabel*>(ui->generalFormLayout->labelForField(update_channel_combo))) {
label->setText(tr("Update Channel"));
}
}
for (int i = 0; i < ui->game_icon_size_combobox->count(); i++) { for (int i = 0; i < ui->game_icon_size_combobox->count(); i++) {
ui->game_icon_size_combobox->setItemText(i, ui->game_icon_size_combobox->setItemText(i,
GetTranslatedGameIconSize(static_cast<size_t>(i))); GetTranslatedGameIconSize(static_cast<size_t>(i)));

View File

@@ -64,6 +64,7 @@ private:
std::unique_ptr<Ui::ConfigureUi> ui; std::unique_ptr<Ui::ConfigureUi> ui;
QComboBox* ui_positioning_combo;
bool isCompact = false; bool isCompact = false;
Settings::AspectRatio ratio; Settings::AspectRatio ratio;