summaryrefslogtreecommitdiff
path: root/src/yuzu
diff options
context:
space:
mode:
Diffstat (limited to 'src/yuzu')
-rw-r--r--src/yuzu/configuration/config.cpp13
-rw-r--r--src/yuzu/configuration/config.h14
-rw-r--r--src/yuzu/configuration/configure_system.cpp64
-rw-r--r--src/yuzu/configuration/configure_system.h35
-rw-r--r--src/yuzu/game_list_worker.cpp13
-rw-r--r--src/yuzu/main.cpp51
6 files changed, 109 insertions, 81 deletions
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 1fe9a7edd..d4fd60a73 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -13,11 +13,16 @@ Config::Config() {
// TODO: Don't hardcode the path; let the frontend decide where to put the config files.
qt_config_loc = FileUtil::GetUserPath(FileUtil::UserPath::ConfigDir) + "qt-config.ini";
FileUtil::CreateFullPath(qt_config_loc);
- qt_config = new QSettings(QString::fromStdString(qt_config_loc), QSettings::IniFormat);
+ qt_config =
+ std::make_unique<QSettings>(QString::fromStdString(qt_config_loc), QSettings::IniFormat);
Reload();
}
+Config::~Config() {
+ Save();
+}
+
const std::array<int, Settings::NativeButton::NumButtons> Config::default_buttons = {
Qt::Key_A, Qt::Key_S, Qt::Key_Z, Qt::Key_X, Qt::Key_3, Qt::Key_4, Qt::Key_Q,
Qt::Key_W, Qt::Key_1, Qt::Key_2, Qt::Key_N, Qt::Key_M, Qt::Key_F, Qt::Key_T,
@@ -342,9 +347,3 @@ void Config::Reload() {
void Config::Save() {
SaveValues();
}
-
-Config::~Config() {
- Save();
-
- delete qt_config;
-}
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index cbf745ea2..9c99c1b75 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -5,6 +5,7 @@
#pragma once
#include <array>
+#include <memory>
#include <string>
#include <QVariant>
#include "core/settings.h"
@@ -12,12 +13,6 @@
class QSettings;
class Config {
- QSettings* qt_config;
- std::string qt_config_loc;
-
- void ReadValues();
- void SaveValues();
-
public:
Config();
~Config();
@@ -27,4 +22,11 @@ public:
static const std::array<int, Settings::NativeButton::NumButtons> default_buttons;
static const std::array<std::array<int, 5>, Settings::NativeAnalog::NumAnalogs> default_analogs;
+
+private:
+ void ReadValues();
+ void SaveValues();
+
+ std::unique_ptr<QSettings> qt_config;
+ std::string qt_config_loc;
};
diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp
index 83cc49dfc..20ffb0a9a 100644
--- a/src/yuzu/configuration/configure_system.cpp
+++ b/src/yuzu/configuration/configure_system.cpp
@@ -21,12 +21,8 @@
#include "yuzu/configuration/configure_system.h"
#include "yuzu/main.h"
-static std::string GetImagePath(Service::Account::UUID uuid) {
- return FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) +
- "/system/save/8000000000000010/su/avators/" + uuid.FormatSwitch() + ".jpg";
-}
-
-static const std::array<int, 12> days_in_month = {{
+namespace {
+constexpr std::array<int, 12> days_in_month = {{
31,
29,
31,
@@ -42,7 +38,7 @@ static const std::array<int, 12> days_in_month = {{
}};
// Same backup JPEG used by acc IProfile::GetImage if no jpeg found
-static constexpr std::array<u8, 107> backup_jpeg{
+constexpr std::array<u8, 107> backup_jpeg{
0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02,
0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x06, 0x06, 0x05,
0x06, 0x09, 0x08, 0x0a, 0x0a, 0x09, 0x08, 0x09, 0x09, 0x0a, 0x0c, 0x0f, 0x0c, 0x0a, 0x0b, 0x0e,
@@ -52,15 +48,32 @@ static constexpr std::array<u8, 107> backup_jpeg{
0x01, 0x01, 0x00, 0x00, 0x3f, 0x00, 0xd2, 0xcf, 0x20, 0xff, 0xd9,
};
+std::string GetImagePath(Service::Account::UUID uuid) {
+ return FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) +
+ "/system/save/8000000000000010/su/avators/" + uuid.FormatSwitch() + ".jpg";
+}
+
+std::string GetAccountUsername(const Service::Account::ProfileManager& manager,
+ Service::Account::UUID uuid) {
+ Service::Account::ProfileBase profile;
+ if (!manager.GetProfileBase(uuid, profile)) {
+ return "";
+ }
+
+ return Common::StringFromFixedZeroTerminatedBuffer(
+ reinterpret_cast<const char*>(profile.username.data()), profile.username.size());
+}
+} // Anonymous namespace
+
ConfigureSystem::ConfigureSystem(QWidget* parent)
: QWidget(parent), ui(new Ui::ConfigureSystem),
profile_manager(std::make_unique<Service::Account::ProfileManager>()) {
ui->setupUi(this);
connect(ui->combo_birthmonth,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
- &ConfigureSystem::updateBirthdayComboBox);
+ &ConfigureSystem::UpdateBirthdayComboBox);
connect(ui->button_regenerate_console_id, &QPushButton::clicked, this,
- &ConfigureSystem::refreshConsoleID);
+ &ConfigureSystem::RefreshConsoleID);
layout = new QVBoxLayout;
tree_view = new QTreeView;
@@ -153,8 +166,8 @@ void ConfigureSystem::UpdateCurrentUser() {
ui->pm_add->setEnabled(profile_manager->GetUserCount() < Service::Account::MAX_USERS);
const auto& current_user = profile_manager->GetUser(Settings::values.current_user);
- ASSERT(current_user != boost::none);
- const auto username = GetAccountUsername(*current_user);
+ ASSERT(current_user != std::nullopt);
+ const auto username = GetAccountUsername(*profile_manager, *current_user);
scene->clear();
scene->addPixmap(
@@ -164,14 +177,6 @@ void ConfigureSystem::UpdateCurrentUser() {
void ConfigureSystem::ReadSystemSettings() {}
-std::string ConfigureSystem::GetAccountUsername(Service::Account::UUID uuid) const {
- Service::Account::ProfileBase profile;
- if (!profile_manager->GetProfileBase(uuid, profile))
- return "";
- return Common::StringFromFixedZeroTerminatedBuffer(
- reinterpret_cast<const char*>(profile.username.data()), profile.username.size());
-}
-
void ConfigureSystem::applyConfiguration() {
if (!enabled)
return;
@@ -180,7 +185,7 @@ void ConfigureSystem::applyConfiguration() {
Settings::Apply();
}
-void ConfigureSystem::updateBirthdayComboBox(int birthmonth_index) {
+void ConfigureSystem::UpdateBirthdayComboBox(int birthmonth_index) {
if (birthmonth_index < 0 || birthmonth_index >= 12)
return;
@@ -205,7 +210,7 @@ void ConfigureSystem::updateBirthdayComboBox(int birthmonth_index) {
ui->combo_birthday->setCurrentIndex(birthday_index);
}
-void ConfigureSystem::refreshConsoleID() {
+void ConfigureSystem::RefreshConsoleID() {
QMessageBox::StandardButton reply;
QString warning_text = tr("This will replace your current virtual Switch with a new one. "
"Your current virtual Switch will not be recoverable. "
@@ -232,8 +237,7 @@ void ConfigureSystem::SelectUser(const QModelIndex& index) {
}
void ConfigureSystem::AddUser() {
- Service::Account::UUID uuid;
- uuid.Generate();
+ const auto uuid = Service::Account::UUID::Generate();
bool ok = false;
const auto username =
@@ -252,8 +256,8 @@ void ConfigureSystem::AddUser() {
void ConfigureSystem::RenameUser() {
const auto user = tree_view->currentIndex().row();
const auto uuid = profile_manager->GetUser(user);
- ASSERT(uuid != boost::none);
- const auto username = GetAccountUsername(*uuid);
+ ASSERT(uuid != std::nullopt);
+ const auto username = GetAccountUsername(*profile_manager, *uuid);
Service::Account::ProfileBase profile;
if (!profile_manager->GetProfileBase(*uuid, profile))
@@ -292,8 +296,8 @@ void ConfigureSystem::RenameUser() {
void ConfigureSystem::DeleteUser() {
const auto index = tree_view->currentIndex().row();
const auto uuid = profile_manager->GetUser(index);
- ASSERT(uuid != boost::none);
- const auto username = GetAccountUsername(*uuid);
+ ASSERT(uuid != std::nullopt);
+ const auto username = GetAccountUsername(*profile_manager, *uuid);
const auto confirm =
QMessageBox::question(this, tr("Confirm Delete"),
@@ -320,11 +324,11 @@ void ConfigureSystem::DeleteUser() {
void ConfigureSystem::SetUserImage() {
const auto index = tree_view->currentIndex().row();
const auto uuid = profile_manager->GetUser(index);
- ASSERT(uuid != boost::none);
- const auto username = GetAccountUsername(*uuid);
+ ASSERT(uuid != std::nullopt);
+ const auto username = GetAccountUsername(*profile_manager, *uuid);
const auto file = QFileDialog::getOpenFileName(this, tr("Select User Image"), QString(),
- "JPEG Images (*.jpg *.jpeg)");
+ tr("JPEG Images (*.jpg *.jpeg)"));
if (file.isEmpty())
return;
diff --git a/src/yuzu/configuration/configure_system.h b/src/yuzu/configuration/configure_system.h
index b73e0719c..07764e1f7 100644
--- a/src/yuzu/configuration/configure_system.h
+++ b/src/yuzu/configuration/configure_system.h
@@ -9,17 +9,16 @@
#include <QList>
#include <QWidget>
-namespace Service::Account {
-class ProfileManager;
-struct UUID;
-} // namespace Service::Account
-
class QGraphicsScene;
class QStandardItem;
class QStandardItemModel;
class QTreeView;
class QVBoxLayout;
+namespace Service::Account {
+class ProfileManager;
+}
+
namespace Ui {
class ConfigureSystem;
}
@@ -29,28 +28,25 @@ class ConfigureSystem : public QWidget {
public:
explicit ConfigureSystem(QWidget* parent = nullptr);
- ~ConfigureSystem();
+ ~ConfigureSystem() override;
void applyConfiguration();
void setConfiguration();
- void PopulateUserList();
- void UpdateCurrentUser();
+private:
+ void ReadSystemSettings();
-public slots:
- void updateBirthdayComboBox(int birthmonth_index);
- void refreshConsoleID();
+ void UpdateBirthdayComboBox(int birthmonth_index);
+ void RefreshConsoleID();
+ void PopulateUserList();
+ void UpdateCurrentUser();
void SelectUser(const QModelIndex& index);
void AddUser();
void RenameUser();
void DeleteUser();
void SetUserImage();
-private:
- void ReadSystemSettings();
- std::string GetAccountUsername(Service::Account::UUID uuid) const;
-
QVBoxLayout* layout;
QTreeView* tree_view;
QStandardItemModel* item_model;
@@ -59,11 +55,12 @@ private:
std::vector<QList<QStandardItem*>> list_items;
std::unique_ptr<Ui::ConfigureSystem> ui;
- bool enabled;
+ bool enabled = false;
- int birthmonth, birthday;
- int language_index;
- int sound_index;
+ int birthmonth = 0;
+ int birthday = 0;
+ int language_index = 0;
+ int sound_index = 0;
std::unique_ptr<Service::Account::ProfileManager> profile_manager;
};
diff --git a/src/yuzu/game_list_worker.cpp b/src/yuzu/game_list_worker.cpp
index 3881aba5f..3d865a12d 100644
--- a/src/yuzu/game_list_worker.cpp
+++ b/src/yuzu/game_list_worker.cpp
@@ -62,19 +62,24 @@ QString FormatPatchNameVersions(const FileSys::PatchManager& patch_manager,
FileSys::VirtualFile update_raw;
loader.ReadUpdateRaw(update_raw);
for (const auto& kv : patch_manager.GetPatchVersionNames(update_raw)) {
- if (!updatable && kv.first == "Update")
+ const bool is_update = kv.first == "Update";
+ if (!updatable && is_update) {
continue;
+ }
+
+ const QString type = QString::fromStdString(kv.first);
if (kv.second.empty()) {
- out.append(fmt::format("{}\n", kv.first).c_str());
+ out.append(QStringLiteral("%1\n").arg(type));
} else {
auto ver = kv.second;
// Display container name for packed updates
- if (ver == "PACKED" && kv.first == "Update")
+ if (is_update && ver == "PACKED") {
ver = Loader::GetFileTypeString(loader.GetFileType());
+ }
- out.append(fmt::format("{} ({})\n", kv.first, ver).c_str());
+ out.append(QStringLiteral("%1 (%2)\n").arg(type, QString::fromStdString(ver)));
}
}
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 47f494841..b5bfa6741 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -30,6 +30,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#define QT_NO_OPENGL
#include <QDesktopWidget>
#include <QDialogButtonBox>
+#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QtConcurrent/QtConcurrent>
@@ -785,7 +786,7 @@ void GMainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target
ASSERT(index != -1 && index < 8);
const auto user_id = manager.GetUser(index);
- ASSERT(user_id != boost::none);
+ ASSERT(user_id != std::nullopt);
path = nand_dir + FileSys::SaveDataFactory::GetFullPath(FileSys::SaveDataSpaceId::NandUser,
FileSys::SaveDataType::SaveData,
program_id, user_id->uuid, 0);
@@ -1336,20 +1337,40 @@ void GMainWindow::OnLoadAmiibo() {
const QString extensions{"*.bin"};
const QString file_filter = tr("Amiibo File (%1);; All Files (*.*)").arg(extensions);
const QString filename = QFileDialog::getOpenFileName(this, tr("Load Amiibo"), "", file_filter);
- if (!filename.isEmpty()) {
- Core::System& system{Core::System::GetInstance()};
- Service::SM::ServiceManager& sm = system.ServiceManager();
- auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");
- if (nfc != nullptr) {
- auto nfc_file = FileUtil::IOFile(filename.toStdString(), "rb");
- if (!nfc_file.IsOpen()) {
- return;
- }
- std::vector<u8> amiibo_buffer(nfc_file.GetSize());
- nfc_file.ReadBytes(amiibo_buffer.data(), amiibo_buffer.size());
- nfc_file.Close();
- nfc->LoadAmiibo(amiibo_buffer);
- }
+
+ if (filename.isEmpty()) {
+ return;
+ }
+
+ Core::System& system{Core::System::GetInstance()};
+ Service::SM::ServiceManager& sm = system.ServiceManager();
+ auto nfc = sm.GetService<Service::NFP::Module::Interface>("nfp:user");
+ if (nfc == nullptr) {
+ return;
+ }
+
+ QFile nfc_file{filename};
+ if (!nfc_file.open(QIODevice::ReadOnly)) {
+ QMessageBox::warning(this, tr("Error opening Amiibo data file"),
+ tr("Unable to open Amiibo file \"%1\" for reading.").arg(filename));
+ return;
+ }
+
+ const u64 nfc_file_size = nfc_file.size();
+ std::vector<u8> buffer(nfc_file_size);
+ const u64 read_size = nfc_file.read(reinterpret_cast<char*>(buffer.data()), nfc_file_size);
+ if (nfc_file_size != read_size) {
+ QMessageBox::warning(this, tr("Error reading Amiibo data file"),
+ tr("Unable to fully read Amiibo data. Expected to read %1 bytes, but "
+ "was only able to read %2 bytes.")
+ .arg(nfc_file_size)
+ .arg(read_size));
+ return;
+ }
+
+ if (!nfc->LoadAmiibo(buffer)) {
+ QMessageBox::warning(this, tr("Error loading Amiibo data"),
+ tr("Unable to load Amiibo data."));
}
}