| |
| |
|
|
| #include <algorithm> |
| #include "common/settings.h" |
| #include "input_common/helpers/touch_from_buttons.h" |
|
|
| namespace InputCommon { |
|
|
| class TouchFromButtonDevice final : public Common::Input::InputDevice { |
| public: |
| using Button = std::unique_ptr<Common::Input::InputDevice>; |
| TouchFromButtonDevice(Button button_, float x_, float y_) |
| : button(std::move(button_)), x(x_), y(y_) { |
| last_button_value = false; |
| button->SetCallback({ |
| .on_change = |
| [this](const Common::Input::CallbackStatus& callback_) { |
| UpdateButtonStatus(callback_); |
| }, |
| }); |
| button->ForceUpdate(); |
| } |
|
|
| void ForceUpdate() override { |
| button->ForceUpdate(); |
| } |
|
|
| Common::Input::TouchStatus GetStatus(bool pressed) const { |
| const Common::Input::ButtonStatus button_status{ |
| .value = pressed, |
| }; |
| Common::Input::TouchStatus status{ |
| .pressed = button_status, |
| .x = {}, |
| .y = {}, |
| }; |
| status.x.properties = properties; |
| status.y.properties = properties; |
|
|
| if (!pressed) { |
| return status; |
| } |
|
|
| status.x.raw_value = x; |
| status.y.raw_value = y; |
| return status; |
| } |
|
|
| void UpdateButtonStatus(const Common::Input::CallbackStatus& button_callback) { |
| const Common::Input::CallbackStatus status{ |
| .type = Common::Input::InputType::Touch, |
| .touch_status = GetStatus(button_callback.button_status.value), |
| }; |
| if (last_button_value != button_callback.button_status.value) { |
| last_button_value = button_callback.button_status.value; |
| TriggerOnChange(status); |
| } |
| } |
|
|
| private: |
| static constexpr Common::Input::AnalogProperties properties{ |
| .deadzone = 0.0f, |
| .range = 1.0f, |
| .threshold = 0.5f, |
| .offset = 0.0f, |
| .inverted = false, |
| .toggle = false, |
| }; |
|
|
| Button button; |
| bool last_button_value; |
| const float x; |
| const float y; |
| }; |
|
|
| std::unique_ptr<Common::Input::InputDevice> TouchFromButton::Create( |
| const Common::ParamPackage& params) { |
| const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize(); |
| auto button = Common::Input::CreateInputDeviceFromString(params.Get("button", null_engine)); |
| const float x = params.Get("x", 0.0f) / 1280.0f; |
| const float y = params.Get("y", 0.0f) / 720.0f; |
| return std::make_unique<TouchFromButtonDevice>(std::move(button), x, y); |
| } |
|
|
| } |
|
|