mirror of
https://github.com/PabloMK7/citra.git
synced 2025-12-15 19:58:47 +00:00
Add per game configuration options (#6187)
* common: Move settings to common from core. - Removes a dependency on core and input_common from common. * code: Wrap settings values * Port from yuzu to allow per game settings * citra_qt: Initial per-game settings dialog * citra_qt: Use new API for read/save of config values * citra_qt: Per game audio settings * citra_qt: Per game graphics settings * citra_qt: Per game system settings * citra_qt: Per game general settings * citra_qt: Document and run clang format * citra_qt: Make icon smaller and centered * citra_qt: Remove version number * Not sure how to extract that, can always add it back later * citra_qt: Wrap UISettings * citra_qt: Fix unthottled fps setting * citra_qt: Remove margin in emulation tab * citra_qt: Implement some suggestions * Bring back speed switch hotkey * Allow configuration when game is running * Rename/adjust UI stuff * citra_qt: Fix build with separate windows * citra_qt: Address feedback * citra_qt: Log per-game settings before launching games * citra_qt: Add shader cache options * Also fix android build * citra_qt: Add DLC menu option * citra_qt: Run clang-format * citra_qt: Adjust for time offset * citra_qt: Implement suggestions * Run clang-format Co-authored-by: bunnei <bunneidev@gmail.com>
This commit is contained in:
parent
f261daf2fa
commit
48ee112ceb
92 changed files with 3171 additions and 1546 deletions
|
|
@ -6,10 +6,11 @@
|
|||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
#include <QUrl>
|
||||
#include "citra_qt/configuration/configuration_shared.h"
|
||||
#include "citra_qt/configuration/configure_general.h"
|
||||
#include "citra_qt/uisettings.h"
|
||||
#include "core/core.h"
|
||||
#include "core/settings.h"
|
||||
#include "common/file_util.h"
|
||||
#include "common/settings.h"
|
||||
#include "ui_configure_general.h"
|
||||
|
||||
// The QSlider doesn't have an easy way to set a custom step amount,
|
||||
|
|
@ -31,14 +32,17 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
|||
// Set a minimum width for the label to prevent the slider from changing size.
|
||||
// This scales across DPIs, and is acceptable for uncapitalized strings.
|
||||
ui->emulation_speed_display_label->setMinimumWidth(tr("unthrottled").size() * 6);
|
||||
ui->emulation_speed_combo->setVisible(!Settings::IsConfiguringGlobal());
|
||||
ui->screenshot_combo->setVisible(!Settings::IsConfiguringGlobal());
|
||||
|
||||
SetupPerGameUI();
|
||||
SetConfiguration();
|
||||
|
||||
ui->updateBox->setVisible(UISettings::values.updater_found);
|
||||
connect(ui->button_reset_defaults, &QPushButton::clicked, this,
|
||||
&ConfigureGeneral::ResetDefaults);
|
||||
|
||||
connect(ui->frame_limit, &QSlider::valueChanged, [&](int value) {
|
||||
connect(ui->frame_limit, &QSlider::valueChanged, this, [&](int value) {
|
||||
if (value == ui->frame_limit->maximum()) {
|
||||
ui->emulation_speed_display_label->setText(tr("unthrottled"));
|
||||
} else {
|
||||
|
|
@ -49,17 +53,6 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
|||
}
|
||||
});
|
||||
|
||||
connect(ui->frame_limit_alternate, &QSlider::valueChanged, [&](int value) {
|
||||
if (value == ui->frame_limit_alternate->maximum()) {
|
||||
ui->emulation_speed_alternate_display_label->setText(tr("unthrottled"));
|
||||
} else {
|
||||
ui->emulation_speed_alternate_display_label->setText(
|
||||
QStringLiteral("%1%")
|
||||
.arg(SliderToSettings(value))
|
||||
.rightJustified(tr("unthrottled").size()));
|
||||
}
|
||||
});
|
||||
|
||||
connect(ui->change_screenshot_dir, &QToolButton::clicked, this, [this] {
|
||||
const QString dir_path = QFileDialog::getExistingDirectory(
|
||||
this, tr("Select Screenshot Directory"), ui->screenshot_dir_path->text(),
|
||||
|
|
@ -73,20 +66,21 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
|
|||
ConfigureGeneral::~ConfigureGeneral() = default;
|
||||
|
||||
void ConfigureGeneral::SetConfiguration() {
|
||||
ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing);
|
||||
ui->toggle_background_pause->setChecked(UISettings::values.pause_when_in_background);
|
||||
ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse);
|
||||
if (Settings::IsConfiguringGlobal()) {
|
||||
ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing.GetValue());
|
||||
ui->toggle_background_pause->setChecked(
|
||||
UISettings::values.pause_when_in_background.GetValue());
|
||||
ui->toggle_hide_mouse->setChecked(UISettings::values.hide_mouse.GetValue());
|
||||
|
||||
ui->toggle_update_check->setChecked(UISettings::values.check_for_update_on_start);
|
||||
ui->toggle_auto_update->setChecked(UISettings::values.update_on_close);
|
||||
ui->toggle_update_check->setChecked(
|
||||
UISettings::values.check_for_update_on_start.GetValue());
|
||||
ui->toggle_auto_update->setChecked(UISettings::values.update_on_close.GetValue());
|
||||
}
|
||||
|
||||
// The first item is "auto-select" with actual value -1, so plus one here will do the trick
|
||||
ui->region_combobox->setCurrentIndex(Settings::values.region_value + 1);
|
||||
|
||||
if (Settings::values.frame_limit == 0) {
|
||||
if (Settings::values.frame_limit.GetValue() == 0) {
|
||||
ui->frame_limit->setValue(ui->frame_limit->maximum());
|
||||
} else {
|
||||
ui->frame_limit->setValue(SettingsToSlider(Settings::values.frame_limit));
|
||||
ui->frame_limit->setValue(SettingsToSlider(Settings::values.frame_limit.GetValue()));
|
||||
}
|
||||
if (ui->frame_limit->value() == ui->frame_limit->maximum()) {
|
||||
ui->emulation_speed_display_label->setText(tr("unthrottled"));
|
||||
|
|
@ -97,32 +91,48 @@ void ConfigureGeneral::SetConfiguration() {
|
|||
.rightJustified(tr("unthrottled").size()));
|
||||
}
|
||||
|
||||
ui->toggle_alternate_speed->setChecked(Settings::values.use_frame_limit_alternate);
|
||||
|
||||
if (Settings::values.frame_limit_alternate == 0) {
|
||||
ui->frame_limit_alternate->setValue(ui->frame_limit_alternate->maximum());
|
||||
if (!Settings::IsConfiguringGlobal()) {
|
||||
if (Settings::values.frame_limit.UsingGlobal()) {
|
||||
ui->emulation_speed_combo->setCurrentIndex(0);
|
||||
ui->frame_limit->setEnabled(false);
|
||||
} else {
|
||||
ui->emulation_speed_combo->setCurrentIndex(1);
|
||||
ui->frame_limit->setEnabled(true);
|
||||
}
|
||||
if (UISettings::values.screenshot_path.UsingGlobal()) {
|
||||
ui->screenshot_combo->setCurrentIndex(0);
|
||||
ui->screenshot_dir_path->setEnabled(false);
|
||||
ui->change_screenshot_dir->setEnabled(false);
|
||||
} else {
|
||||
ui->screenshot_combo->setCurrentIndex(1);
|
||||
ui->screenshot_dir_path->setEnabled(true);
|
||||
ui->change_screenshot_dir->setEnabled(true);
|
||||
}
|
||||
ConfigurationShared::SetHighlight(ui->widget_screenshot,
|
||||
!UISettings::values.screenshot_path.UsingGlobal());
|
||||
ConfigurationShared::SetHighlight(ui->emulation_speed_layout,
|
||||
!Settings::values.frame_limit.UsingGlobal());
|
||||
ConfigurationShared::SetHighlight(ui->widget_region,
|
||||
!Settings::values.region_value.UsingGlobal());
|
||||
const bool is_region_global = Settings::values.region_value.UsingGlobal();
|
||||
ui->region_combobox->setCurrentIndex(
|
||||
is_region_global ? ConfigurationShared::USE_GLOBAL_INDEX
|
||||
: static_cast<int>(Settings::values.region_value.GetValue()) +
|
||||
ConfigurationShared::USE_GLOBAL_OFFSET + 1);
|
||||
} else {
|
||||
ui->frame_limit_alternate->setValue(
|
||||
SettingsToSlider(Settings::values.frame_limit_alternate));
|
||||
}
|
||||
if (ui->frame_limit_alternate->value() == ui->frame_limit_alternate->maximum()) {
|
||||
ui->emulation_speed_alternate_display_label->setText(tr("unthrottled"));
|
||||
} else {
|
||||
ui->emulation_speed_alternate_display_label->setText(
|
||||
QStringLiteral("%1%")
|
||||
.arg(SliderToSettings(ui->frame_limit_alternate->value()))
|
||||
.rightJustified(tr("unthrottled").size()));
|
||||
// The first item is "auto-select" with actual value -1, so plus one here will do the trick
|
||||
ui->region_combobox->setCurrentIndex(Settings::values.region_value.GetValue() + 1);
|
||||
}
|
||||
|
||||
QString screenshot_path = UISettings::values.screenshot_path;
|
||||
if (screenshot_path.isEmpty()) {
|
||||
screenshot_path =
|
||||
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::UserDir));
|
||||
screenshot_path.append(QStringLiteral("screenshots/"));
|
||||
FileUtil::CreateFullPath(screenshot_path.toStdString());
|
||||
UISettings::values.screenshot_path.SetGlobal(ui->screenshot_combo->currentIndex() ==
|
||||
ConfigurationShared::USE_GLOBAL_INDEX);
|
||||
std::string screenshot_path = UISettings::values.screenshot_path.GetValue();
|
||||
if (screenshot_path.empty()) {
|
||||
screenshot_path = FileUtil::GetUserPath(FileUtil::UserPath::UserDir) + "screenshots/";
|
||||
FileUtil::CreateFullPath(screenshot_path);
|
||||
UISettings::values.screenshot_path = screenshot_path;
|
||||
}
|
||||
ui->screenshot_dir_path->setText(screenshot_path);
|
||||
ui->screenshot_dir_path->setText(QString::fromStdString(screenshot_path));
|
||||
}
|
||||
|
||||
void ConfigureGeneral::ResetDefaults() {
|
||||
|
|
@ -139,31 +149,57 @@ void ConfigureGeneral::ResetDefaults() {
|
|||
}
|
||||
|
||||
void ConfigureGeneral::ApplyConfiguration() {
|
||||
UISettings::values.confirm_before_closing = ui->toggle_check_exit->isChecked();
|
||||
UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked();
|
||||
UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked();
|
||||
ConfigurationShared::ApplyPerGameSetting(&Settings::values.region_value, ui->region_combobox,
|
||||
[](s32 index) { return index - 1; });
|
||||
|
||||
UISettings::values.check_for_update_on_start = ui->toggle_update_check->isChecked();
|
||||
UISettings::values.update_on_close = ui->toggle_auto_update->isChecked();
|
||||
ConfigurationShared::ApplyPerGameSetting(
|
||||
&Settings::values.frame_limit, ui->emulation_speed_combo, [this](s32) {
|
||||
const bool is_maximum = ui->frame_limit->value() == ui->frame_limit->maximum();
|
||||
return is_maximum ? 0 : SliderToSettings(ui->frame_limit->value());
|
||||
});
|
||||
|
||||
UISettings::values.screenshot_path = ui->screenshot_dir_path->text();
|
||||
ConfigurationShared::ApplyPerGameSetting(
|
||||
&UISettings::values.screenshot_path, ui->screenshot_combo,
|
||||
[this](s32) { return ui->screenshot_dir_path->text().toStdString(); });
|
||||
|
||||
Settings::values.region_value = ui->region_combobox->currentIndex() - 1;
|
||||
if (Settings::IsConfiguringGlobal()) {
|
||||
UISettings::values.confirm_before_closing = ui->toggle_check_exit->isChecked();
|
||||
UISettings::values.pause_when_in_background = ui->toggle_background_pause->isChecked();
|
||||
UISettings::values.hide_mouse = ui->toggle_hide_mouse->isChecked();
|
||||
|
||||
if (ui->frame_limit->value() == ui->frame_limit->maximum()) {
|
||||
Settings::values.frame_limit = 0;
|
||||
} else {
|
||||
Settings::values.frame_limit = SliderToSettings(ui->frame_limit->value());
|
||||
}
|
||||
Settings::values.use_frame_limit_alternate = ui->toggle_alternate_speed->isChecked();
|
||||
if (ui->frame_limit_alternate->value() == ui->frame_limit_alternate->maximum()) {
|
||||
Settings::values.frame_limit_alternate = 0;
|
||||
} else {
|
||||
Settings::values.frame_limit_alternate =
|
||||
SliderToSettings(ui->frame_limit_alternate->value());
|
||||
UISettings::values.check_for_update_on_start = ui->toggle_update_check->isChecked();
|
||||
UISettings::values.update_on_close = ui->toggle_auto_update->isChecked();
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigureGeneral::RetranslateUI() {
|
||||
ui->retranslateUi(this);
|
||||
}
|
||||
|
||||
void ConfigureGeneral::SetupPerGameUI() {
|
||||
if (Settings::IsConfiguringGlobal()) {
|
||||
ui->region_combobox->setEnabled(Settings::values.region_value.UsingGlobal());
|
||||
ui->frame_limit->setEnabled(Settings::values.frame_limit.UsingGlobal());
|
||||
return;
|
||||
}
|
||||
|
||||
connect(ui->emulation_speed_combo, qOverload<int>(&QComboBox::activated), this,
|
||||
[this](int index) {
|
||||
ui->frame_limit->setEnabled(index == 1);
|
||||
ConfigurationShared::SetHighlight(ui->emulation_speed_layout, index == 1);
|
||||
});
|
||||
|
||||
connect(ui->screenshot_combo, qOverload<int>(&QComboBox::activated), this, [this](int index) {
|
||||
ui->screenshot_dir_path->setEnabled(index == 1);
|
||||
ui->change_screenshot_dir->setEnabled(index == 1);
|
||||
ConfigurationShared::SetHighlight(ui->widget_screenshot, index == 1);
|
||||
});
|
||||
|
||||
ui->general_group->setVisible(false);
|
||||
ui->updateBox->setVisible(false);
|
||||
ui->button_reset_defaults->setVisible(false);
|
||||
|
||||
ConfigurationShared::SetColoredComboBox(
|
||||
ui->region_combobox, ui->widget_region,
|
||||
static_cast<u32>(Settings::values.region_value.GetValue(true) + 1));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue