yuzu: Make controller keys easier to assign
This commit is contained in:
		| @@ -45,15 +45,23 @@ ConfigureHotkeys::ConfigureHotkeys(Core::HID::HIDCore& hid_core, QWidget* parent | |||||||
|  |  | ||||||
|     controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); |     controller = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); | ||||||
|  |  | ||||||
|     connect(timeout_timer.get(), &QTimer::timeout, [this] { SetPollingResult({}, true); }); |     connect(timeout_timer.get(), &QTimer::timeout, [this] { | ||||||
|  |         const bool is_button_pressed = pressed_buttons != Core::HID::NpadButton::None || | ||||||
|  |                                        pressed_home_button || pressed_capture_button; | ||||||
|  |         SetPollingResult(!is_button_pressed); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     connect(poll_timer.get(), &QTimer::timeout, [this] { |     connect(poll_timer.get(), &QTimer::timeout, [this] { | ||||||
|         const auto buttons = controller->GetNpadButtons(); |         pressed_buttons |= controller->GetNpadButtons().raw; | ||||||
|         const auto home_pressed = controller->GetHomeButtons().home != 0; |         pressed_home_button |= this->controller->GetHomeButtons().home != 0; | ||||||
|         const auto capture_pressed = controller->GetCaptureButtons().capture != 0; |         pressed_capture_button |= this->controller->GetCaptureButtons().capture != 0; | ||||||
|         if (home_pressed || capture_pressed) { |         if (pressed_buttons != Core::HID::NpadButton::None || pressed_home_button || | ||||||
|             SetPollingResult(buttons.raw, false); |             pressed_capture_button) { | ||||||
|             return; |             const QString button_name = | ||||||
|  |                 GetButtonCombinationName(pressed_buttons, pressed_home_button, | ||||||
|  |                                          pressed_capture_button) + | ||||||
|  |                 QStringLiteral("..."); | ||||||
|  |             model->setData(button_model_index, button_name); | ||||||
|         } |         } | ||||||
|     }); |     }); | ||||||
|     RetranslateUI(); |     RetranslateUI(); | ||||||
| @@ -154,16 +162,14 @@ void ConfigureHotkeys::ConfigureController(QModelIndex index) { | |||||||
|  |  | ||||||
|     const auto previous_key = model->data(index); |     const auto previous_key = model->data(index); | ||||||
|  |  | ||||||
|     input_setter = [this, index, previous_key](const Core::HID::NpadButton button, |     input_setter = [this, index, previous_key](const bool cancel) { | ||||||
|                                                const bool cancel) { |  | ||||||
|         if (cancel) { |         if (cancel) { | ||||||
|             model->setData(index, previous_key); |             model->setData(index, previous_key); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         const auto home_pressed = this->controller->GetHomeButtons().home != 0; |  | ||||||
|         const auto capture_pressed = this->controller->GetCaptureButtons().capture != 0; |  | ||||||
|         const QString button_string = |         const QString button_string = | ||||||
|             GetButtonCombinationName(button, home_pressed, capture_pressed); |             GetButtonCombinationName(pressed_buttons, pressed_home_button, pressed_capture_button); | ||||||
|  |  | ||||||
|         const auto [key_sequence_used, used_action] = IsUsedControllerKey(button_string); |         const auto [key_sequence_used, used_action] = IsUsedControllerKey(button_string); | ||||||
|  |  | ||||||
| @@ -177,17 +183,22 @@ void ConfigureHotkeys::ConfigureController(QModelIndex index) { | |||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     button_model_index = index; | ||||||
|  |     pressed_buttons = Core::HID::NpadButton::None; | ||||||
|  |     pressed_home_button = false; | ||||||
|  |     pressed_capture_button = false; | ||||||
|  |  | ||||||
|     model->setData(index, tr("[waiting]")); |     model->setData(index, tr("[waiting]")); | ||||||
|     timeout_timer->start(2500); // Cancel after 2.5 seconds |     timeout_timer->start(2500); // Cancel after 2.5 seconds | ||||||
|     poll_timer->start(200);     // Check for new inputs every 200ms |     poll_timer->start(100);     // Check for new inputs every 100ms | ||||||
|     // We need to disable configuration to be able to read npad buttons |     // We need to disable configuration to be able to read npad buttons | ||||||
|     controller->DisableConfiguration(); |     controller->DisableConfiguration(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ConfigureHotkeys::SetPollingResult(Core::HID::NpadButton button, const bool cancel) { | void ConfigureHotkeys::SetPollingResult(const bool cancel) { | ||||||
|     timeout_timer->stop(); |     timeout_timer->stop(); | ||||||
|     poll_timer->stop(); |     poll_timer->stop(); | ||||||
|     (*input_setter)(button, cancel); |     (*input_setter)(cancel); | ||||||
|     // Re-Enable configuration |     // Re-Enable configuration | ||||||
|     controller->EnableConfiguration(); |     controller->EnableConfiguration(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <QStandardItemModel> | ||||||
| #include <QWidget> | #include <QWidget> | ||||||
|  |  | ||||||
| namespace Common { | namespace Common { | ||||||
| @@ -54,14 +55,20 @@ private: | |||||||
|     void RestoreControllerHotkey(QModelIndex index); |     void RestoreControllerHotkey(QModelIndex index); | ||||||
|     void RestoreHotkey(QModelIndex index); |     void RestoreHotkey(QModelIndex index); | ||||||
|  |  | ||||||
|  |     void SetPollingResult(bool cancel); | ||||||
|  |     QString GetButtonCombinationName(Core::HID::NpadButton button, bool home, bool capture) const; | ||||||
|  |  | ||||||
|     std::unique_ptr<Ui::ConfigureHotkeys> ui; |     std::unique_ptr<Ui::ConfigureHotkeys> ui; | ||||||
|  |  | ||||||
|     QStandardItemModel* model; |     QStandardItemModel* model; | ||||||
|  |  | ||||||
|     void SetPollingResult(Core::HID::NpadButton button, bool cancel); |     bool pressed_home_button; | ||||||
|     QString GetButtonCombinationName(Core::HID::NpadButton button, bool home, bool capture) const; |     bool pressed_capture_button; | ||||||
|  |     QModelIndex button_model_index; | ||||||
|  |     Core::HID::NpadButton pressed_buttons; | ||||||
|  |  | ||||||
|     Core::HID::EmulatedController* controller; |     Core::HID::EmulatedController* controller; | ||||||
|     std::unique_ptr<QTimer> timeout_timer; |     std::unique_ptr<QTimer> timeout_timer; | ||||||
|     std::unique_ptr<QTimer> poll_timer; |     std::unique_ptr<QTimer> poll_timer; | ||||||
|     std::optional<std::function<void(Core::HID::NpadButton, bool)>> input_setter; |     std::optional<std::function<void(bool)>> input_setter; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -193,8 +193,7 @@ void ControllerShortcut::ControllerUpdateEvent(Core::HID::ControllerTriggerType | |||||||
|     if (!Settings::values.controller_navigation) { |     if (!Settings::values.controller_navigation) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     if (button_sequence.npad.raw == Core::HID::NpadButton::None && |     if (button_sequence.npad.raw == Core::HID::NpadButton::None) { | ||||||
|         button_sequence.capture.raw == 0 && button_sequence.home.raw == 0) { |  | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 german77
					german77