da14c7b8e4
Replaces every way of handling config for each frontend with SimpleIni. frontend_common's Config class is at the center where it saves and loads all of the cross-platform settings and provides a set of pure virtual functions for platform specific settings. As a result of making config handling platform specific, several parts had to be moved to each platform's own config class or to other parts. Default keys were put in platform specific config classes and translatable strings for Qt were moved to shared_translation. Default hotkeys, default_theme, window geometry, and qt metatypes were moved to uisettings. Additionally, to reduce dependence on Qt, QStrings were converted to std::strings where applicable.
113 lines
4.2 KiB
C++
113 lines
4.2 KiB
C++
// SPDX-FileCopyrightText: 2016 Citra Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include <QSettings>
|
|
#include "common/fs/fs.h"
|
|
#include "common/fs/path_util.h"
|
|
#include "yuzu/uisettings.h"
|
|
|
|
#ifndef CANNOT_EXPLICITLY_INSTANTIATE
|
|
namespace Settings {
|
|
template class Setting<bool>;
|
|
template class Setting<std::string>;
|
|
template class Setting<u16, true>;
|
|
template class Setting<u32>;
|
|
template class Setting<u8, true>;
|
|
template class Setting<u8>;
|
|
template class Setting<unsigned long long>;
|
|
} // namespace Settings
|
|
#endif
|
|
|
|
namespace FS = Common::FS;
|
|
|
|
namespace UISettings {
|
|
|
|
const Themes themes{{
|
|
{"Default", "default"},
|
|
{"Default Colorful", "colorful"},
|
|
{"Dark", "qdarkstyle"},
|
|
{"Dark Colorful", "colorful_dark"},
|
|
{"Midnight Blue", "qdarkstyle_midnight_blue"},
|
|
{"Midnight Blue Colorful", "colorful_midnight_blue"},
|
|
}};
|
|
|
|
bool IsDarkTheme() {
|
|
const auto& theme = UISettings::values.theme;
|
|
return theme == std::string("qdarkstyle") || theme == std::string("qdarkstyle_midnight_blue") ||
|
|
theme == std::string("colorful_dark") || theme == std::string("colorful_midnight_blue");
|
|
}
|
|
|
|
Values values = {};
|
|
|
|
u32 CalculateWidth(u32 height, Settings::AspectRatio ratio) {
|
|
switch (ratio) {
|
|
case Settings::AspectRatio::R4_3:
|
|
return height * 4 / 3;
|
|
case Settings::AspectRatio::R21_9:
|
|
return height * 21 / 9;
|
|
case Settings::AspectRatio::R16_10:
|
|
return height * 16 / 10;
|
|
case Settings::AspectRatio::R16_9:
|
|
case Settings::AspectRatio::Stretch:
|
|
// TODO: Move this function wherever appropriate to implement Stretched aspect
|
|
break;
|
|
}
|
|
return height * 16 / 9;
|
|
}
|
|
|
|
void SaveWindowState() {
|
|
const auto window_state_config_loc =
|
|
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "window_state.ini");
|
|
|
|
void(FS::CreateParentDir(window_state_config_loc));
|
|
QSettings config(QString::fromStdString(window_state_config_loc), QSettings::IniFormat);
|
|
|
|
config.setValue(QStringLiteral("geometry"), values.geometry);
|
|
config.setValue(QStringLiteral("state"), values.state);
|
|
config.setValue(QStringLiteral("geometryRenderWindow"), values.renderwindow_geometry);
|
|
config.setValue(QStringLiteral("gameListHeaderState"), values.gamelist_header_state);
|
|
config.setValue(QStringLiteral("microProfileDialogGeometry"), values.microprofile_geometry);
|
|
|
|
config.sync();
|
|
}
|
|
|
|
void RestoreWindowState(std::unique_ptr<QtConfig>& qtConfig) {
|
|
const auto window_state_config_loc =
|
|
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "window_state.ini");
|
|
|
|
// Migrate window state from old location
|
|
if (!FS::Exists(window_state_config_loc) && qtConfig->Exists("UI", "UILayout\\geometry")) {
|
|
const auto config_loc =
|
|
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "qt-config.ini");
|
|
QSettings config(QString::fromStdString(config_loc), QSettings::IniFormat);
|
|
|
|
config.beginGroup(QStringLiteral("UI"));
|
|
config.beginGroup(QStringLiteral("UILayout"));
|
|
values.geometry = config.value(QStringLiteral("geometry")).toByteArray();
|
|
values.state = config.value(QStringLiteral("state")).toByteArray();
|
|
values.renderwindow_geometry =
|
|
config.value(QStringLiteral("geometryRenderWindow")).toByteArray();
|
|
values.gamelist_header_state =
|
|
config.value(QStringLiteral("gameListHeaderState")).toByteArray();
|
|
values.microprofile_geometry =
|
|
config.value(QStringLiteral("microProfileDialogGeometry")).toByteArray();
|
|
config.endGroup();
|
|
config.endGroup();
|
|
return;
|
|
}
|
|
|
|
void(FS::CreateParentDir(window_state_config_loc));
|
|
const QSettings config(QString::fromStdString(window_state_config_loc), QSettings::IniFormat);
|
|
|
|
values.geometry = config.value(QStringLiteral("geometry")).toByteArray();
|
|
values.state = config.value(QStringLiteral("state")).toByteArray();
|
|
values.renderwindow_geometry =
|
|
config.value(QStringLiteral("geometryRenderWindow")).toByteArray();
|
|
values.gamelist_header_state =
|
|
config.value(QStringLiteral("gameListHeaderState")).toByteArray();
|
|
values.microprofile_geometry =
|
|
config.value(QStringLiteral("microProfileDialogGeometry")).toByteArray();
|
|
}
|
|
|
|
} // namespace UISettings
|