From 1914583b35a3f3be77181f4ce390b9b82dae791c Mon Sep 17 00:00:00 2001 From: KojoZero Date: Tue, 2 Jun 2026 11:42:36 -0700 Subject: [PATCH] added output scaling and antialiasing filter to status bar --- dist/qt_themes/default/style.qss | 11 +++++++ src/citra_qt/citra_qt.cpp | 56 +++++++++++++++++++++++++++++++- src/citra_qt/citra_qt.h | 4 +++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index f4505cccf..52fe4d04f 100644 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -28,6 +28,17 @@ QPushButton#TogglableStatusBarButton:hover { border: 1px solid #76797C; } +QPushButton#StatusBarButton { + border: 1px solid transparent; + background-color: transparent; + padding: 0px 3px 0px 3px; + text-align: center; +} + +QPushButton#StatusBarButton:hover { + border: 1px solid #76797C; +} + QPushButton#button_reset_defaults { min-width: 57px; padding: 4px 8px; diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 62fb24b9b..ba377eec2 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -628,6 +628,23 @@ void GMainWindow::InitializeWidgets() { statusBar()->insertPermanentWidget(0, graphics_api_button); + // Setup Output Scaling button + output_scaling_button = new QPushButton(); + output_scaling_button->setObjectName(QStringLiteral("StatusBarButton")); + output_scaling_button->setFocusPolicy(Qt::NoFocus); + UpdateOutputScalingIndicator(); + connect(output_scaling_button, &QPushButton::clicked, this, [this] { UpdateOutputScalingIndicator(true); }); + statusBar()->insertPermanentWidget(1, output_scaling_button); + + // Setup Antialiasing Filter button + antialiasing_filter_button = new QPushButton(); + antialiasing_filter_button->setObjectName(QStringLiteral("StatusBarButton")); + antialiasing_filter_button->setFocusPolicy(Qt::NoFocus); + UpdateAntialiasingFilterIndicator(); + connect(antialiasing_filter_button, &QPushButton::clicked, this, [this] { UpdateAntialiasingFilterIndicator(true); }); + statusBar()->insertPermanentWidget(2, antialiasing_filter_button); + + // Setup Volume button and slider volume_popup = new QWidget(this); volume_popup->setWindowFlags(Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::Popup); volume_popup->setLayout(new QVBoxLayout()); @@ -658,7 +675,7 @@ void GMainWindow::InitializeWidgets() { bottomLeft.setY(bottomLeft.y() - volume_popup->geometry().height()); volume_popup->setGeometry(QRect(bottomLeft, QSize(rect.width(), rect.height()))); }); - statusBar()->insertPermanentWidget(1, volume_button); + statusBar()->insertPermanentWidget(3, volume_button); statusBar()->addPermanentWidget(multiplayer_state->GetStatusText()); statusBar()->addPermanentWidget(multiplayer_state->GetStatusIcon()); @@ -3821,8 +3838,45 @@ void GMainWindow::UpdateAPIIndicator(bool update) { graphics_api_button->setStyleSheet(style_sheet); } + +void GMainWindow::UpdateOutputScalingIndicator(bool update) { + static std::array output_scaling_options = { + QStringLiteral("NEAREST"), + QStringLiteral("BILINEAR"), + QStringLiteral("ADAPTIVE"), + QStringLiteral("FSR"), + QStringLiteral("SHARP BILINEAR"), + }; + + u32 selection_index = static_cast(Settings::values.output_scaling.GetValue()); + if (update) { + selection_index = (selection_index + 1) % output_scaling_options.size(); + Settings::values.output_scaling = static_cast(selection_index); + } + + output_scaling_button->setText(output_scaling_options[selection_index]); +} + +void GMainWindow::UpdateAntialiasingFilterIndicator(bool update) { + static std::array antialiasing_filter_options = { + QStringLiteral("NO AA"), + QStringLiteral("FXAA"), + QStringLiteral("SMAA"), + }; + + u32 selection_index = static_cast(Settings::values.antialiasing_filter.GetValue()); + if (update) { + selection_index = (selection_index + 1) % antialiasing_filter_options.size(); + Settings::values.antialiasing_filter = static_cast(selection_index); + } + + antialiasing_filter_button->setText(antialiasing_filter_options[selection_index]); +} + void GMainWindow::UpdateStatusButtons() { UpdateAPIIndicator(); + UpdateOutputScalingIndicator(); + UpdateAntialiasingFilterIndicator(); UpdateVolumeUI(); } diff --git a/src/citra_qt/citra_qt.h b/src/citra_qt/citra_qt.h index 01dcaabfb..2ec5f3d4b 100644 --- a/src/citra_qt/citra_qt.h +++ b/src/citra_qt/citra_qt.h @@ -333,6 +333,8 @@ private: void OpenPerGameConfiguration(u64 title_id, const QString& file_name); void UpdateVolumeUI(); void UpdateAPIIndicator(bool update = false); + void UpdateOutputScalingIndicator(bool update = false); + void UpdateAntialiasingFilterIndicator(bool update = false); void UpdateStatusButtons(); #ifdef __unix__ void SetGamemodeEnabled(bool state); @@ -359,6 +361,8 @@ private: QLabel* emu_frametime_label = nullptr; QPushButton* graphics_api_button = nullptr; QPushButton* volume_button = nullptr; + QPushButton* output_scaling_button = nullptr; + QPushButton* antialiasing_filter_button = nullptr; QWidget* volume_popup = nullptr; QSlider* volume_slider = nullptr; QTimer status_bar_update_timer;