summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/frontend/applets/cabinet.cpp2
-rw-r--r--src/core/frontend/applets/cabinet.h7
-rw-r--r--src/core/hle/service/am/applets/applet_cabinet.cpp16
-rw-r--r--src/core/hle/service/am/applets/applet_cabinet.h11
-rw-r--r--src/core/hle/service/nfp/nfp_device.cpp4
-rw-r--r--src/input_common/drivers/virtual_amiibo.cpp2
-rw-r--r--src/input_common/drivers/virtual_amiibo.h2
-rw-r--r--src/yuzu/CMakeLists.txt6
-rw-r--r--src/yuzu/applets/qt_amiibo_manager.h93
-rw-r--r--src/yuzu/applets/qt_amiibo_settings.cpp (renamed from src/yuzu/applets/qt_amiibo_manager.cpp)127
-rw-r--r--src/yuzu/applets/qt_amiibo_settings.h83
-rw-r--r--src/yuzu/applets/qt_amiibo_settings.ui (renamed from src/yuzu/applets/qt_amiibo_manager.ui)17
-rw-r--r--src/yuzu/main.cpp14
-rw-r--r--src/yuzu/main.h6
14 files changed, 200 insertions, 190 deletions
diff --git a/src/core/frontend/applets/cabinet.cpp b/src/core/frontend/applets/cabinet.cpp
index 5ade75de0..26c7fefe3 100644
--- a/src/core/frontend/applets/cabinet.cpp
+++ b/src/core/frontend/applets/cabinet.cpp
@@ -11,7 +11,7 @@ namespace Core::Frontend {
11CabinetApplet::~CabinetApplet() = default; 11CabinetApplet::~CabinetApplet() = default;
12 12
13void DefaultCabinetApplet::ShowCabinetApplet( 13void DefaultCabinetApplet::ShowCabinetApplet(
14 std::function<void(bool, const std::string&)> callback, const CabinetParameters& parameters, 14 const CabinetCallback& callback, const CabinetParameters& parameters,
15 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const { 15 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const {
16 LOG_WARNING(Service_AM, "(STUBBED) called"); 16 LOG_WARNING(Service_AM, "(STUBBED) called");
17 callback(false, {}); 17 callback(false, {});
diff --git a/src/core/frontend/applets/cabinet.h b/src/core/frontend/applets/cabinet.h
index 1c68bf57d..c28a235c1 100644
--- a/src/core/frontend/applets/cabinet.h
+++ b/src/core/frontend/applets/cabinet.h
@@ -18,18 +18,19 @@ struct CabinetParameters {
18 Service::NFP::CabinetMode mode; 18 Service::NFP::CabinetMode mode;
19}; 19};
20 20
21using CabinetCallback = std::function<void(bool, const std::string&)>;
22
21class CabinetApplet { 23class CabinetApplet {
22public: 24public:
23 virtual ~CabinetApplet(); 25 virtual ~CabinetApplet();
24 virtual void ShowCabinetApplet(std::function<void(bool, const std::string&)> callback, 26 virtual void ShowCabinetApplet(const CabinetCallback& callback,
25 const CabinetParameters& parameters, 27 const CabinetParameters& parameters,
26 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const = 0; 28 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const = 0;
27}; 29};
28 30
29class DefaultCabinetApplet final : public CabinetApplet { 31class DefaultCabinetApplet final : public CabinetApplet {
30public: 32public:
31 void ShowCabinetApplet(std::function<void(bool, const std::string&)> callback, 33 void ShowCabinetApplet(const CabinetCallback& callback, const CabinetParameters& parameters,
32 const CabinetParameters& parameters,
33 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override; 34 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override;
34}; 35};
35 36
diff --git a/src/core/hle/service/am/applets/applet_cabinet.cpp b/src/core/hle/service/am/applets/applet_cabinet.cpp
index 01f577ab9..d0969b0f1 100644
--- a/src/core/hle/service/am/applets/applet_cabinet.cpp
+++ b/src/core/hle/service/am/applets/applet_cabinet.cpp
@@ -98,7 +98,7 @@ void Cabinet::Execute() {
98 } 98 }
99} 99}
100 100
101void Cabinet::DisplayCompleted(bool apply_changes, const std::string& amiibo_name) { 101void Cabinet::DisplayCompleted(bool apply_changes, std::string_view amiibo_name) {
102 Service::Mii::MiiManager manager; 102 Service::Mii::MiiManager manager;
103 ReturnValueForAmiiboSettings applet_output{}; 103 ReturnValueForAmiiboSettings applet_output{};
104 104
@@ -118,7 +118,7 @@ void Cabinet::DisplayCompleted(bool apply_changes, const std::string& amiibo_nam
118 switch (applet_input_common.applet_mode) { 118 switch (applet_input_common.applet_mode) {
119 case Service::NFP::CabinetMode::StartNicknameAndOwnerSettings: { 119 case Service::NFP::CabinetMode::StartNicknameAndOwnerSettings: {
120 Service::NFP::AmiiboName name{}; 120 Service::NFP::AmiiboName name{};
121 memcpy(name.data(), amiibo_name.data(), std::min(amiibo_name.size(), name.size() - 1)); 121 std::memcpy(name.data(), amiibo_name.data(), std::min(amiibo_name.size(), name.size() - 1));
122 nfp_device->SetNicknameAndOwner(name); 122 nfp_device->SetNicknameAndOwner(name);
123 break; 123 break;
124 } 124 }
@@ -142,12 +142,12 @@ void Cabinet::DisplayCompleted(bool apply_changes, const std::string& amiibo_nam
142 const auto tag_result = nfp_device->GetTagInfo(applet_output.tag_info); 142 const auto tag_result = nfp_device->GetTagInfo(applet_output.tag_info);
143 nfp_device->Finalize(); 143 nfp_device->Finalize();
144 144
145 if (reg_result.IsSuccess() && tag_result.IsSuccess()) { 145 if (reg_result.IsSuccess()) {
146 applet_output.result = CabinetResult::All; 146 applet_output.result |= CabinetResult::RegisterInfo;
147 } else if (reg_result.IsSuccess()) { 147 }
148 applet_output.result = CabinetResult::RegisterInfo; 148
149 } else if (tag_result.IsSuccess()) { 149 if (tag_result.IsSuccess()) {
150 applet_output.result = CabinetResult::TagInfo; 150 applet_output.result |= CabinetResult::TagInfo;
151 } 151 }
152 152
153 std::vector<u8> out_data(sizeof(ReturnValueForAmiiboSettings)); 153 std::vector<u8> out_data(sizeof(ReturnValueForAmiiboSettings));
diff --git a/src/core/hle/service/am/applets/applet_cabinet.h b/src/core/hle/service/am/applets/applet_cabinet.h
index 8466d5997..84197a807 100644
--- a/src/core/hle/service/am/applets/applet_cabinet.h
+++ b/src/core/hle/service/am/applets/applet_cabinet.h
@@ -25,16 +25,17 @@ class NfpDevice;
25 25
26namespace Service::AM::Applets { 26namespace Service::AM::Applets {
27 27
28enum class CabinetAppletVersion : s32 { 28enum class CabinetAppletVersion : u32 {
29 Version1 = 0x1, 29 Version1 = 0x1,
30}; 30};
31 31
32enum class CabinetResult : u8 { 32enum class CabinetResult : u8 {
33 Cancel, 33 Cancel = 0,
34 TagInfo = 1 << 1, 34 TagInfo = 1 << 1,
35 RegisterInfo = 1 << 2, 35 RegisterInfo = 1 << 2,
36 All = TagInfo | RegisterInfo, 36 All = TagInfo | RegisterInfo,
37}; 37};
38DECLARE_ENUM_FLAG_OPERATORS(CabinetResult)
38 39
39// This is nn::nfp::AmiiboSettingsStartParam 40// This is nn::nfp::AmiiboSettingsStartParam
40struct AmiiboSettingsStartParam { 41struct AmiiboSettingsStartParam {
@@ -45,7 +46,7 @@ struct AmiiboSettingsStartParam {
45static_assert(sizeof(AmiiboSettingsStartParam) == 0x30, 46static_assert(sizeof(AmiiboSettingsStartParam) == 0x30,
46 "AmiiboSettingsStartParam is an invalid size"); 47 "AmiiboSettingsStartParam is an invalid size");
47 48
48#pragma pack(1) 49#pragma pack(push, 1)
49// This is nn::nfp::StartParamForAmiiboSettings 50// This is nn::nfp::StartParamForAmiiboSettings
50struct StartParamForAmiiboSettings { 51struct StartParamForAmiiboSettings {
51 u8 param_1; 52 u8 param_1;
@@ -72,7 +73,7 @@ struct ReturnValueForAmiiboSettings {
72}; 73};
73static_assert(sizeof(ReturnValueForAmiiboSettings) == 0x188, 74static_assert(sizeof(ReturnValueForAmiiboSettings) == 0x188,
74 "ReturnValueForAmiiboSettings is an invalid size"); 75 "ReturnValueForAmiiboSettings is an invalid size");
75#pragma pack() 76#pragma pack(pop)
76 77
77class Cabinet final : public Applet { 78class Cabinet final : public Applet {
78public: 79public:
@@ -86,7 +87,7 @@ public:
86 Result GetStatus() const override; 87 Result GetStatus() const override;
87 void ExecuteInteractive() override; 88 void ExecuteInteractive() override;
88 void Execute() override; 89 void Execute() override;
89 void DisplayCompleted(bool apply_changes, const std::string& amiibo_name); 90 void DisplayCompleted(bool apply_changes, std::string_view amiibo_name);
90 void Cancel(); 91 void Cancel();
91 92
92private: 93private:
diff --git a/src/core/hle/service/nfp/nfp_device.cpp b/src/core/hle/service/nfp/nfp_device.cpp
index 2f9dfa9c2..e1bf90d7c 100644
--- a/src/core/hle/service/nfp/nfp_device.cpp
+++ b/src/core/hle/service/nfp/nfp_device.cpp
@@ -148,7 +148,7 @@ void NfpDevice::Finalize() {
148 device_state = DeviceState::Unavailable; 148 device_state = DeviceState::Unavailable;
149} 149}
150 150
151Result NfpDevice::StartDetection([[maybe_unused]] TagProtocol allowed_protocol) { 151Result NfpDevice::StartDetection(TagProtocol allowed_protocol) {
152 if (device_state != DeviceState::Initialized && device_state != DeviceState::TagRemoved) { 152 if (device_state != DeviceState::Initialized && device_state != DeviceState::TagRemoved) {
153 LOG_ERROR(Service_NFP, "Wrong device state {}", device_state); 153 LOG_ERROR(Service_NFP, "Wrong device state {}", device_state);
154 return WrongDeviceState; 154 return WrongDeviceState;
@@ -475,6 +475,8 @@ Result NfpDevice::OpenApplicationArea(u32 access_id) {
475} 475}
476 476
477Result NfpDevice::GetApplicationAreaId(u32& application_area_id) const { 477Result NfpDevice::GetApplicationAreaId(u32& application_area_id) const {
478 application_area_id = {};
479
478 if (device_state != DeviceState::TagMounted) { 480 if (device_state != DeviceState::TagMounted) {
479 LOG_ERROR(Service_NFP, "Wrong device state {}", device_state); 481 LOG_ERROR(Service_NFP, "Wrong device state {}", device_state);
480 if (device_state == DeviceState::TagRemoved) { 482 if (device_state == DeviceState::TagRemoved) {
diff --git a/src/input_common/drivers/virtual_amiibo.cpp b/src/input_common/drivers/virtual_amiibo.cpp
index 252c660d8..564a188e5 100644
--- a/src/input_common/drivers/virtual_amiibo.cpp
+++ b/src/input_common/drivers/virtual_amiibo.cpp
@@ -109,7 +109,7 @@ VirtualAmiibo::Info VirtualAmiibo::CloseAmiibo() {
109 return Info::Success; 109 return Info::Success;
110} 110}
111 111
112std::string VirtualAmiibo::GetLastFilePath() { 112std::string VirtualAmiibo::GetLastFilePath() const {
113 return file_path; 113 return file_path;
114} 114}
115 115
diff --git a/src/input_common/drivers/virtual_amiibo.h b/src/input_common/drivers/virtual_amiibo.h
index f2294b8b0..9baeb3997 100644
--- a/src/input_common/drivers/virtual_amiibo.h
+++ b/src/input_common/drivers/virtual_amiibo.h
@@ -50,7 +50,7 @@ public:
50 Info ReloadAmiibo(); 50 Info ReloadAmiibo();
51 Info CloseAmiibo(); 51 Info CloseAmiibo();
52 52
53 std::string GetLastFilePath(); 53 std::string GetLastFilePath() const;
54 54
55private: 55private:
56 static constexpr std::size_t amiibo_size = 0x21C; 56 static constexpr std::size_t amiibo_size = 0x21C;
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index 8571d9c7c..adad36221 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -18,9 +18,9 @@ add_executable(yuzu
18 about_dialog.cpp 18 about_dialog.cpp
19 about_dialog.h 19 about_dialog.h
20 aboutdialog.ui 20 aboutdialog.ui
21 applets/qt_amiibo_manager.cpp 21 applets/qt_amiibo_settings.cpp
22 applets/qt_amiibo_manager.h 22 applets/qt_amiibo_settings.h
23 applets/qt_amiibo_manager.ui 23 applets/qt_amiibo_settings.ui
24 applets/qt_controller.cpp 24 applets/qt_controller.cpp
25 applets/qt_controller.h 25 applets/qt_controller.h
26 applets/qt_controller.ui 26 applets/qt_controller.ui
diff --git a/src/yuzu/applets/qt_amiibo_manager.h b/src/yuzu/applets/qt_amiibo_manager.h
deleted file mode 100644
index 3f5866ed7..000000000
--- a/src/yuzu/applets/qt_amiibo_manager.h
+++ /dev/null
@@ -1,93 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <array>
7#include <memory>
8#include <QDialog>
9#include "core/frontend/applets/cabinet.h"
10
11class GMainWindow;
12class QCheckBox;
13class QComboBox;
14class QDialogButtonBox;
15class QGroupBox;
16class QLabel;
17
18class InputProfiles;
19
20namespace InputCommon {
21class InputSubsystem;
22}
23
24namespace Ui {
25class QtAmiiboManagerDialog;
26}
27
28namespace Core {
29class System;
30}
31
32namespace Core::HID {
33class HIDCore;
34enum class NpadStyleIndex : u8;
35} // namespace Core::HID
36
37namespace Service::NFP {
38class NfpDevice;
39} // namespace Service::NFP
40
41class QtAmiiboManagerDialog final : public QDialog {
42 Q_OBJECT
43
44public:
45 explicit QtAmiiboManagerDialog(QWidget* parent, Core::Frontend::CabinetParameters parameters_,
46 InputCommon::InputSubsystem* input_subsystem_,
47 std::shared_ptr<Service::NFP::NfpDevice> nfp_device_);
48 ~QtAmiiboManagerDialog() override;
49
50 int exec() override;
51
52 std::string GetName();
53
54private:
55 void LoadInfo();
56 void LoadAmiiboApiInfo(std::string amiibo_id);
57 void LoadAmiiboData();
58 void LoadAmiiboGameInfo();
59 void SetGameDataName(u32 application_area_id);
60 void SetManagerDescription();
61
62 std::unique_ptr<Ui::QtAmiiboManagerDialog> ui;
63
64 InputCommon::InputSubsystem* input_subsystem;
65 std::shared_ptr<Service::NFP::NfpDevice> nfp_device;
66
67 // Parameters sent in from the backend HLE applet.
68 Core::Frontend::CabinetParameters parameters;
69
70 // If false amiibo manager failed to load
71 bool is_initalized{};
72};
73
74class QtAmiiboManager final : public QObject, public Core::Frontend::CabinetApplet {
75 Q_OBJECT
76
77public:
78 explicit QtAmiiboManager(GMainWindow& parent);
79 ~QtAmiiboManager() override;
80
81 void ShowCabinetApplet(std::function<void(bool, const std::string&)> callback_,
82 const Core::Frontend::CabinetParameters& parameters,
83 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override;
84
85signals:
86 void MainWindowShowAmiiboManager(const Core::Frontend::CabinetParameters& parameters,
87 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const;
88
89private:
90 void MainWindowFinished(bool is_success, std::string name);
91
92 mutable std::function<void(bool, const std::string&)> callback;
93};
diff --git a/src/yuzu/applets/qt_amiibo_manager.cpp b/src/yuzu/applets/qt_amiibo_settings.cpp
index 9c7b15d06..efb7f6ecc 100644
--- a/src/yuzu/applets/qt_amiibo_manager.cpp
+++ b/src/yuzu/applets/qt_amiibo_settings.cpp
@@ -12,17 +12,17 @@
12#include "core/hle/service/nfp/nfp_result.h" 12#include "core/hle/service/nfp/nfp_result.h"
13#include "input_common/drivers/virtual_amiibo.h" 13#include "input_common/drivers/virtual_amiibo.h"
14#include "input_common/main.h" 14#include "input_common/main.h"
15#include "ui_qt_amiibo_manager.h" 15#include "ui_qt_amiibo_settings.h"
16#include "web_service/web_backend.h" 16#include "web_service/web_backend.h"
17#include "yuzu/applets/qt_amiibo_manager.h" 17#include "yuzu/applets/qt_amiibo_settings.h"
18#include "yuzu/main.h" 18#include "yuzu/main.h"
19 19
20QtAmiiboManagerDialog::QtAmiiboManagerDialog(QWidget* parent, 20QtAmiiboSettingsDialog::QtAmiiboSettingsDialog(QWidget* parent,
21 Core::Frontend::CabinetParameters parameters_, 21 Core::Frontend::CabinetParameters parameters_,
22 InputCommon::InputSubsystem* input_subsystem_, 22 InputCommon::InputSubsystem* input_subsystem_,
23 std::shared_ptr<Service::NFP::NfpDevice> nfp_device_) 23 std::shared_ptr<Service::NFP::NfpDevice> nfp_device_)
24 : QDialog(parent), ui(std::make_unique<Ui::QtAmiiboManagerDialog>()), 24 : QDialog(parent), ui(std::make_unique<Ui::QtAmiiboSettingsDialog>()),
25 input_subsystem{input_subsystem_}, nfp_device{nfp_device_}, 25 input_subsystem{input_subsystem_}, nfp_device{std::move(nfp_device_)},
26 parameters(std::move(parameters_)) { 26 parameters(std::move(parameters_)) {
27 ui->setupUi(this); 27 ui->setupUi(this);
28 28
@@ -31,20 +31,20 @@ QtAmiiboManagerDialog::QtAmiiboManagerDialog(QWidget* parent,
31 resize(0, 0); 31 resize(0, 0);
32} 32}
33 33
34QtAmiiboManagerDialog::~QtAmiiboManagerDialog() = default; 34QtAmiiboSettingsDialog::~QtAmiiboSettingsDialog() = default;
35 35
36int QtAmiiboManagerDialog::exec() { 36int QtAmiiboSettingsDialog::exec() {
37 if (!is_initalized) { 37 if (!is_initalized) {
38 return QDialog::Rejected; 38 return QDialog::Rejected;
39 } 39 }
40 return QDialog::exec(); 40 return QDialog::exec();
41} 41}
42 42
43std::string QtAmiiboManagerDialog::GetName() { 43std::string QtAmiiboSettingsDialog::GetName() const {
44 return ui->amiiboCustomNameValue->text().toStdString(); 44 return ui->amiiboCustomNameValue->text().toStdString();
45} 45}
46 46
47void QtAmiiboManagerDialog::LoadInfo() { 47void QtAmiiboSettingsDialog::LoadInfo() {
48 if (input_subsystem->GetVirtualAmiibo()->ReloadAmiibo() != 48 if (input_subsystem->GetVirtualAmiibo()->ReloadAmiibo() !=
49 InputCommon::VirtualAmiibo::Info::Success) { 49 InputCommon::VirtualAmiibo::Info::Success) {
50 return; 50 return;
@@ -56,29 +56,41 @@ void QtAmiiboManagerDialog::LoadInfo() {
56 } 56 }
57 nfp_device->Mount(Service::NFP::MountTarget::All); 57 nfp_device->Mount(Service::NFP::MountTarget::All);
58 58
59 Service::NFP::ModelInfo model_info{}; 59 LoadAmiiboInfo();
60 const auto model_result = nfp_device->GetModelInfo(model_info);
61
62 if (model_result.IsSuccess()) {
63 const auto amiibo_id =
64 fmt::format("{:04x}{:02x}{:02x}{:04x}{:02x}02", Common::swap16(model_info.character_id),
65 model_info.character_variant, model_info.amiibo_type,
66 model_info.model_number, model_info.series);
67 LOG_ERROR(Input, "{}", amiibo_id);
68 LoadAmiiboApiInfo(amiibo_id);
69 }
70
71 LoadAmiiboData(); 60 LoadAmiiboData();
72 LoadAmiiboGameInfo(); 61 LoadAmiiboGameInfo();
73 62
74 ui->amiiboDirectoryValue->setText( 63 ui->amiiboDirectoryValue->setText(
75 QString::fromStdString(input_subsystem->GetVirtualAmiibo()->GetLastFilePath())); 64 QString::fromStdString(input_subsystem->GetVirtualAmiibo()->GetLastFilePath()));
76 65
77 SetManagerDescription(); 66 SetSettingsDescription();
78 is_initalized = true; 67 is_initalized = true;
79} 68}
80 69
81void QtAmiiboManagerDialog::LoadAmiiboApiInfo(std::string amiibo_id) { 70void QtAmiiboSettingsDialog::LoadAmiiboInfo() {
71 Service::NFP::ModelInfo model_info{};
72 const auto model_result = nfp_device->GetModelInfo(model_info);
73
74 if (model_result.IsFailure()) {
75 ui->amiiboImageLabel->setVisible(false);
76 ui->amiiboInfoGroup->setVisible(false);
77 return;
78 }
79
80 const auto amiibo_id =
81 fmt::format("{:04x}{:02x}{:02x}{:04x}{:02x}02", Common::swap16(model_info.character_id),
82 model_info.character_variant, model_info.amiibo_type, model_info.model_number,
83 model_info.series);
84
85 LOG_DEBUG(Frontend, "Loading amiibo id {}", amiibo_id);
86 // Note: This function is not being used until we host the images on our server
87 // LoadAmiiboApiInfo(amiibo_id);
88 ui->amiiboImageLabel->setVisible(false);
89 ui->amiiboInfoGroup->setVisible(false);
90}
91
92void QtAmiiboSettingsDialog::LoadAmiiboApiInfo(std::string_view amiibo_id) {
93 // TODO: Host this data on our website
82 WebService::Client client{"https://amiiboapi.com", {}, {}}; 94 WebService::Client client{"https://amiiboapi.com", {}, {}};
83 WebService::Client image_client{"https://raw.githubusercontent.com", {}, {}}; 95 WebService::Client image_client{"https://raw.githubusercontent.com", {}, {}};
84 const auto url_path = fmt::format("/api/amiibo/?id={}", amiibo_id); 96 const auto url_path = fmt::format("/api/amiibo/?id={}", amiibo_id);
@@ -124,7 +136,7 @@ void QtAmiiboManagerDialog::LoadAmiiboApiInfo(std::string amiibo_id) {
124 ui->amiiboImageLabel->setPixmap(pixmap); 136 ui->amiiboImageLabel->setPixmap(pixmap);
125} 137}
126 138
127void QtAmiiboManagerDialog::LoadAmiiboData() { 139void QtAmiiboSettingsDialog::LoadAmiiboData() {
128 Service::NFP::RegisterInfo register_info{}; 140 Service::NFP::RegisterInfo register_info{};
129 Service::NFP::CommonInfo common_info{}; 141 Service::NFP::CommonInfo common_info{};
130 const auto register_result = nfp_device->GetRegisterInfo(register_info); 142 const auto register_result = nfp_device->GetRegisterInfo(register_info);
@@ -166,7 +178,7 @@ void QtAmiiboManagerDialog::LoadAmiiboData() {
166 ui->modificationDateValue->setDate(modification_date); 178 ui->modificationDateValue->setDate(modification_date);
167} 179}
168 180
169void QtAmiiboManagerDialog::LoadAmiiboGameInfo() { 181void QtAmiiboSettingsDialog::LoadAmiiboGameInfo() {
170 u32 application_area_id{}; 182 u32 application_area_id{};
171 const auto application_result = nfp_device->GetApplicationAreaId(application_area_id); 183 const auto application_result = nfp_device->GetApplicationAreaId(application_area_id);
172 184
@@ -179,27 +191,27 @@ void QtAmiiboManagerDialog::LoadAmiiboGameInfo() {
179 SetGameDataName(application_area_id); 191 SetGameDataName(application_area_id);
180} 192}
181 193
182void QtAmiiboManagerDialog::SetGameDataName(u32 application_area_id) { 194void QtAmiiboSettingsDialog::SetGameDataName(u32 application_area_id) {
183 const std::array<std::pair<u32, QString>, 12> game_name_list = { 195 static constexpr std::array<std::pair<u32, const char*>, 12> game_name_list = {
184 // 3ds, wii u 196 // 3ds, wii u
185 std::pair<u32, QString>{0x10110E00, QStringLiteral("Super Smash Bros (3DS/WiiU)")}, 197 std::pair<u32, const char*>{0x10110E00, "Super Smash Bros (3DS/WiiU)"},
186 {0x00132600, QStringLiteral("Mario & Luigi: Paper Jam")}, 198 {0x00132600, "Mario & Luigi: Paper Jam"},
187 {0x0014F000, QStringLiteral("Animal Crossing: Happy Home Designer")}, 199 {0x0014F000, "Animal Crossing: Happy Home Designer"},
188 {0x00152600, QStringLiteral("Chibi-Robo!: Zip Lash")}, 200 {0x00152600, "Chibi-Robo!: Zip Lash"},
189 {0x10161f00, QStringLiteral("Mario Party 10")}, 201 {0x10161f00, "Mario Party 10"},
190 {0x1019C800, QStringLiteral("The Legend of Zelda: Twilight Princess HD")}, 202 {0x1019C800, "The Legend of Zelda: Twilight Princess HD"},
191 // switch 203 // switch
192 {0x10162B00, QStringLiteral("Splatoon 2")}, 204 {0x10162B00, "Splatoon 2"},
193 {0x1016e100, QStringLiteral("Shovel Knight: Treasure Trove")}, 205 {0x1016e100, "Shovel Knight: Treasure Trove"},
194 {0x1019C800, QStringLiteral("The Legend of Zelda: Breath of the Wild")}, 206 {0x1019C800, "The Legend of Zelda: Breath of the Wild"},
195 {0x34F80200, QStringLiteral("Super Smash Bros. Ultimate")}, 207 {0x34F80200, "Super Smash Bros. Ultimate"},
196 {0x38600500, QStringLiteral("Splatoon 3")}, 208 {0x38600500, "Splatoon 3"},
197 {0x3B440400, QStringLiteral("The Legend of Zelda: Link's Awakening")}, 209 {0x3B440400, "The Legend of Zelda: Link's Awakening"},
198 }; 210 };
199 211
200 for (const auto& [game_id, game_name] : game_name_list) { 212 for (const auto& [game_id, game_name] : game_name_list) {
201 if (application_area_id == game_id) { 213 if (application_area_id == game_id) {
202 ui->gameIdValue->setText(game_name); 214 ui->gameIdValue->setText(QString::fromStdString(game_name));
203 return; 215 return;
204 } 216 }
205 } 217 }
@@ -208,11 +220,11 @@ void QtAmiiboManagerDialog::SetGameDataName(u32 application_area_id) {
208 ui->gameIdValue->setText(QString::fromStdString(application_area_string)); 220 ui->gameIdValue->setText(QString::fromStdString(application_area_string));
209} 221}
210 222
211void QtAmiiboManagerDialog::SetManagerDescription() { 223void QtAmiiboSettingsDialog::SetSettingsDescription() {
212 switch (parameters.mode) { 224 switch (parameters.mode) {
213 case Service::NFP::CabinetMode::StartFormatter: 225 case Service::NFP::CabinetMode::StartFormatter:
214 ui->cabinetActionDescriptionLabel->setText( 226 ui->cabinetActionDescriptionLabel->setText(
215 tr("The following amiibo data will be formated:")); 227 tr("The following amiibo data will be formatted:"));
216 break; 228 break;
217 case Service::NFP::CabinetMode::StartGameDataEraser: 229 case Service::NFP::CabinetMode::StartGameDataEraser:
218 ui->cabinetActionDescriptionLabel->setText(tr("The following game data will removed:")); 230 ui->cabinetActionDescriptionLabel->setText(tr("The following game data will removed:"));
@@ -221,27 +233,28 @@ void QtAmiiboManagerDialog::SetManagerDescription() {
221 ui->cabinetActionDescriptionLabel->setText(tr("Set nickname and owner:")); 233 ui->cabinetActionDescriptionLabel->setText(tr("Set nickname and owner:"));
222 break; 234 break;
223 case Service::NFP::CabinetMode::StartRestorer: 235 case Service::NFP::CabinetMode::StartRestorer:
224 ui->cabinetActionDescriptionLabel->setText(tr("Do you wish to restore this amiibo:")); 236 ui->cabinetActionDescriptionLabel->setText(tr("Do you wish to restore this amiibo?"));
225 break; 237 break;
226 } 238 }
227} 239}
228 240
229QtAmiiboManager::QtAmiiboManager(GMainWindow& parent) { 241QtAmiiboSettings::QtAmiiboSettings(GMainWindow& parent) {
230 connect(this, &QtAmiiboManager::MainWindowShowAmiiboManager, &parent, 242 connect(this, &QtAmiiboSettings::MainWindowShowAmiiboSettings, &parent,
231 &GMainWindow::AmiiboManagerShowDialog, Qt::QueuedConnection); 243 &GMainWindow::AmiiboSettingsShowDialog, Qt::QueuedConnection);
232 connect(&parent, &GMainWindow::AmiiboManagerFinished, this, 244 connect(&parent, &GMainWindow::AmiiboSettingsFinished, this,
233 &QtAmiiboManager::MainWindowFinished, Qt::QueuedConnection); 245 &QtAmiiboSettings::MainWindowFinished, Qt::QueuedConnection);
234} 246}
235 247
236QtAmiiboManager::~QtAmiiboManager() = default; 248QtAmiiboSettings::~QtAmiiboSettings() = default;
237 249
238void QtAmiiboManager::ShowCabinetApplet(std::function<void(bool, const std::string&)> callback_, 250void QtAmiiboSettings::ShowCabinetApplet(
239 const Core::Frontend::CabinetParameters& parameters, 251 const Core::Frontend::CabinetCallback& callback_,
240 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const { 252 const Core::Frontend::CabinetParameters& parameters,
253 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const {
241 callback = std::move(callback_); 254 callback = std::move(callback_);
242 emit MainWindowShowAmiiboManager(parameters, nfp_device); 255 emit MainWindowShowAmiiboSettings(parameters, nfp_device);
243} 256}
244 257
245void QtAmiiboManager::MainWindowFinished(bool is_success, std::string name) { 258void QtAmiiboSettings::MainWindowFinished(bool is_success, const std::string& name) {
246 callback(is_success, name); 259 callback(is_success, name);
247} 260}
diff --git a/src/yuzu/applets/qt_amiibo_settings.h b/src/yuzu/applets/qt_amiibo_settings.h
new file mode 100644
index 000000000..930c96739
--- /dev/null
+++ b/src/yuzu/applets/qt_amiibo_settings.h
@@ -0,0 +1,83 @@
1// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <array>
7#include <memory>
8#include <QDialog>
9#include "core/frontend/applets/cabinet.h"
10
11class GMainWindow;
12class QCheckBox;
13class QComboBox;
14class QDialogButtonBox;
15class QGroupBox;
16class QLabel;
17
18namespace InputCommon {
19class InputSubsystem;
20}
21
22namespace Ui {
23class QtAmiiboSettingsDialog;
24}
25
26namespace Service::NFP {
27class NfpDevice;
28} // namespace Service::NFP
29
30class QtAmiiboSettingsDialog final : public QDialog {
31 Q_OBJECT
32
33public:
34 explicit QtAmiiboSettingsDialog(QWidget* parent, Core::Frontend::CabinetParameters parameters_,
35 InputCommon::InputSubsystem* input_subsystem_,
36 std::shared_ptr<Service::NFP::NfpDevice> nfp_device_);
37 ~QtAmiiboSettingsDialog() override;
38
39 int exec() override;
40
41 std::string GetName() const;
42
43private:
44 void LoadInfo();
45 void LoadAmiiboInfo();
46 void LoadAmiiboApiInfo(std::string_view amiibo_id);
47 void LoadAmiiboData();
48 void LoadAmiiboGameInfo();
49 void SetGameDataName(u32 application_area_id);
50 void SetSettingsDescription();
51
52 std::unique_ptr<Ui::QtAmiiboSettingsDialog> ui;
53
54 InputCommon::InputSubsystem* input_subsystem;
55 std::shared_ptr<Service::NFP::NfpDevice> nfp_device;
56
57 // Parameters sent in from the backend HLE applet.
58 Core::Frontend::CabinetParameters parameters;
59
60 // If false amiibo settings failed to load
61 bool is_initalized{};
62};
63
64class QtAmiiboSettings final : public QObject, public Core::Frontend::CabinetApplet {
65 Q_OBJECT
66
67public:
68 explicit QtAmiiboSettings(GMainWindow& parent);
69 ~QtAmiiboSettings() override;
70
71 void ShowCabinetApplet(const Core::Frontend::CabinetCallback& callback_,
72 const Core::Frontend::CabinetParameters& parameters,
73 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const override;
74
75signals:
76 void MainWindowShowAmiiboSettings(const Core::Frontend::CabinetParameters& parameters,
77 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) const;
78
79private:
80 void MainWindowFinished(bool is_success, const std::string& name);
81
82 mutable Core::Frontend::CabinetCallback callback;
83};
diff --git a/src/yuzu/applets/qt_amiibo_manager.ui b/src/yuzu/applets/qt_amiibo_settings.ui
index eb6eabe59..f377a6e61 100644
--- a/src/yuzu/applets/qt_amiibo_manager.ui
+++ b/src/yuzu/applets/qt_amiibo_settings.ui
@@ -1,7 +1,7 @@
1<?xml version="1.0" encoding="UTF-8"?> 1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0"> 2<ui version="4.0">
3 <class>QtAmiiboManagerDialog</class> 3 <class>QtAmiiboSettingsDialog</class>
4 <widget class="QDialog" name="QtAmiiboManagerDialog"> 4 <widget class="QDialog" name="QtAmiiboSettingsDialog">
5 <property name="geometry"> 5 <property name="geometry">
6 <rect> 6 <rect>
7 <x>0</x> 7 <x>0</x>
@@ -11,7 +11,7 @@
11 </rect> 11 </rect>
12 </property> 12 </property>
13 <property name="windowTitle"> 13 <property name="windowTitle">
14 <string>Amiibo Manager</string> 14 <string>Amiibo Settings</string>
15 </property> 15 </property>
16 <property name="styleSheet"> 16 <property name="styleSheet">
17 <string notr="true"/> 17 <string notr="true"/>
@@ -121,9 +121,12 @@
121 </property> 121 </property>
122 <item> 122 <item>
123 <layout class="QHBoxLayout" name="horizontalLayout_2"> 123 <layout class="QHBoxLayout" name="horizontalLayout_2">
124 <property name="leftMargin"> 124 <property name="spacing">
125 <number>20</number> 125 <number>20</number>
126 </property> 126 </property>
127 <property name="leftMargin">
128 <number>15</number>
129 </property>
127 <property name="rightMargin"> 130 <property name="rightMargin">
128 <number>15</number> 131 <number>15</number>
129 </property> 132 </property>
@@ -152,7 +155,7 @@
152 <item> 155 <item>
153 <layout class="QVBoxLayout" name="verticalLayout_4"> 156 <layout class="QVBoxLayout" name="verticalLayout_4">
154 <property name="leftMargin"> 157 <property name="leftMargin">
155 <number>20</number> 158 <number>0</number>
156 </property> 159 </property>
157 <property name="topMargin"> 160 <property name="topMargin">
158 <number>8</number> 161 <number>8</number>
@@ -478,13 +481,13 @@
478 <connection> 481 <connection>
479 <sender>buttonBox</sender> 482 <sender>buttonBox</sender>
480 <signal>accepted()</signal> 483 <signal>accepted()</signal>
481 <receiver>QtAmiiboManagerDialog</receiver> 484 <receiver>QtAmiiboSettingsDialog</receiver>
482 <slot>accept()</slot> 485 <slot>accept()</slot>
483 </connection> 486 </connection>
484 <connection> 487 <connection>
485 <sender>buttonBox</sender> 488 <sender>buttonBox</sender>
486 <signal>rejected()</signal> 489 <signal>rejected()</signal>
487 <receiver>QtAmiiboManagerDialog</receiver> 490 <receiver>QtAmiiboSettingsDialog</receiver>
488 <slot>reject()</slot> 491 <slot>reject()</slot>
489 </connection> 492 </connection>
490 </connections> 493 </connections>
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 27266cae3..33f9237e2 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -15,7 +15,7 @@
15#endif 15#endif
16 16
17// VFS includes must be before glad as they will conflict with Windows file api, which uses defines. 17// VFS includes must be before glad as they will conflict with Windows file api, which uses defines.
18#include "applets/qt_amiibo_manager.h" 18#include "applets/qt_amiibo_settings.h"
19#include "applets/qt_controller.h" 19#include "applets/qt_controller.h"
20#include "applets/qt_error.h" 20#include "applets/qt_error.h"
21#include "applets/qt_profile_select.h" 21#include "applets/qt_profile_select.h"
@@ -577,19 +577,19 @@ void GMainWindow::RegisterMetaTypes() {
577 qRegisterMetaType<Core::SystemResultStatus>("Core::SystemResultStatus"); 577 qRegisterMetaType<Core::SystemResultStatus>("Core::SystemResultStatus");
578} 578}
579 579
580void GMainWindow::AmiiboManagerShowDialog(const Core::Frontend::CabinetParameters& parameters, 580void GMainWindow::AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters,
581 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) { 581 std::shared_ptr<Service::NFP::NfpDevice> nfp_device) {
582 QtAmiiboManagerDialog dialog(this, parameters, input_subsystem.get(), nfp_device); 582 QtAmiiboSettingsDialog dialog(this, parameters, input_subsystem.get(), nfp_device);
583 583
584 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | 584 dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |
585 Qt::WindowTitleHint | Qt::WindowSystemMenuHint); 585 Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
586 dialog.setWindowModality(Qt::WindowModal); 586 dialog.setWindowModality(Qt::WindowModal);
587 if (dialog.exec() == QDialog::Rejected) { 587 if (dialog.exec() == QDialog::Rejected) {
588 emit AmiiboManagerFinished(false, {}); 588 emit AmiiboSettingsFinished(false, {});
589 return; 589 return;
590 } 590 }
591 591
592 emit AmiiboManagerFinished(true, dialog.GetName()); 592 emit AmiiboSettingsFinished(true, dialog.GetName());
593} 593}
594 594
595void GMainWindow::ControllerSelectorReconfigureControllers( 595void GMainWindow::ControllerSelectorReconfigureControllers(
@@ -1569,7 +1569,7 @@ bool GMainWindow::LoadROM(const QString& filename, u64 program_id, std::size_t p
1569 system->SetFilesystem(vfs); 1569 system->SetFilesystem(vfs);
1570 1570
1571 system->SetAppletFrontendSet({ 1571 system->SetAppletFrontendSet({
1572 std::make_unique<QtAmiiboManager>(*this), // Amiibo Manager 1572 std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
1573 std::make_unique<QtControllerSelector>(*this), // Controller Selector 1573 std::make_unique<QtControllerSelector>(*this), // Controller Selector
1574 std::make_unique<QtErrorDisplay>(*this), // Error Display 1574 std::make_unique<QtErrorDisplay>(*this), // Error Display
1575 nullptr, // Mii Editor 1575 nullptr, // Mii Editor
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index 2724ecd52..6a9992d05 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -154,7 +154,7 @@ signals:
154 154
155 void UpdateInstallProgress(); 155 void UpdateInstallProgress();
156 156
157 void AmiiboManagerFinished(bool is_success, std::string name); 157 void AmiiboSettingsFinished(bool is_success, const std::string& name);
158 158
159 void ControllerSelectorReconfigureFinished(); 159 void ControllerSelectorReconfigureFinished();
160 160
@@ -177,8 +177,8 @@ public slots:
177 void OnExecuteProgram(std::size_t program_index); 177 void OnExecuteProgram(std::size_t program_index);
178 void OnExit(); 178 void OnExit();
179 void OnSaveConfig(); 179 void OnSaveConfig();
180 void AmiiboManagerShowDialog(const Core::Frontend::CabinetParameters& parameters, 180 void AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters,
181 std::shared_ptr<Service::NFP::NfpDevice> nfp_device); 181 std::shared_ptr<Service::NFP::NfpDevice> nfp_device);
182 void ControllerSelectorReconfigureControllers( 182 void ControllerSelectorReconfigureControllers(
183 const Core::Frontend::ControllerParameters& parameters); 183 const Core::Frontend::ControllerParameters& parameters);
184 void SoftwareKeyboardInitialize( 184 void SoftwareKeyboardInitialize(