From 5bd0c1517fb3395bc0db1c787d1c0654b44eedfc Mon Sep 17 00:00:00 2001 From: german77 Date: Sun, 30 Jan 2022 22:42:26 -0600 Subject: input_common: Use attributes for analog range modifiers --- src/input_common/helpers/stick_from_buttons.cpp | 30 +++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/input_common/helpers/stick_from_buttons.cpp b/src/input_common/helpers/stick_from_buttons.cpp index e23394f5f..31e6f62ab 100644 --- a/src/input_common/helpers/stick_from_buttons.cpp +++ b/src/input_common/helpers/stick_from_buttons.cpp @@ -167,12 +167,34 @@ public: } void UpdateModButtonStatus(const Common::Input::CallbackStatus& button_callback) { - modifier_status = button_callback.button_status.value; + const auto& new_status = button_callback.button_status; + const bool new_button_value = new_status.inverted ? !new_status.value : new_status.value; + modifier_status.toggle = new_status.toggle; + + // Update button status with current + if (!modifier_status.toggle) { + modifier_status.locked = false; + if (modifier_status.value != new_button_value) { + modifier_status.value = new_button_value; + } + } else { + // Toggle button and lock status + if (new_button_value && !modifier_status.locked) { + modifier_status.locked = true; + modifier_status.value = !modifier_status.value; + } + + // Unlock button ready for next press + if (!new_button_value && modifier_status.locked) { + modifier_status.locked = false; + } + } + UpdateStatus(); } void UpdateStatus() { - const float coef = modifier_status ? modifier_scale : 1.0f; + const float coef = modifier_status.value ? modifier_scale : 1.0f; bool r = right_status; bool l = left_status; @@ -266,7 +288,7 @@ public: if (down_status) { --y; } - const float coef = modifier_status ? modifier_scale : 1.0f; + const float coef = modifier_status.value ? modifier_scale : 1.0f; status.x.raw_value = static_cast(x) * coef * (y == 0 ? 1.0f : SQRT_HALF); status.y.raw_value = static_cast(y) * coef * (x == 0 ? 1.0f : SQRT_HALF); return status; @@ -287,9 +309,9 @@ private: bool down_status{}; bool left_status{}; bool right_status{}; - bool modifier_status{}; float last_x_axis_value{}; float last_y_axis_value{}; + Common::Input::ButtonStatus modifier_status{}; const Common::Input::AnalogProperties properties{0.0f, 1.0f, 0.5f, 0.0f, false}; std::chrono::time_point last_update; }; -- cgit v1.2.3