diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 13 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.h | 14 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_system.cpp | 64 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_system.h | 35 | ||||
| -rw-r--r-- | src/yuzu/game_list_worker.cpp | 13 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 51 | 
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."));      }  }  | 
