[gnome-games/wip/exalm/gameapd: 10/10] gamepad-mapper: Animate analog sticks when mapping them



commit c27b57f21946f1067ca0037a67ab167a368a14d5
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Wed Mar 4 20:14:28 2020 +0500

    gamepad-mapper: Animate analog sticks when mapping them

 src/ui/gamepad-mapper.vala | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)
---
diff --git a/src/ui/gamepad-mapper.vala b/src/ui/gamepad-mapper.vala
index 4b6bd099..d9ccb340 100644
--- a/src/ui/gamepad-mapper.vala
+++ b/src/ui/gamepad-mapper.vala
@@ -2,6 +2,8 @@
 
 [GtkTemplate (ui = "/org/gnome/Games/ui/gamepad-mapper.ui")]
 private class Games.GamepadMapper : Gtk.Bin {
+       private const double ANALOG_ANIMATION_SPEED = 166660.0;
+
        public signal void finished (string sdl_string);
 
        [GtkChild]
@@ -12,6 +14,9 @@ private class Games.GamepadMapper : Gtk.Bin {
        private GamepadInput input;
        private uint current_input_index;
 
+       private uint tick_cb;
+       private uint64 animation_start_time;
+
        public string info_message { get; private set; }
 
        private ulong gamepad_event_handler_id;
@@ -124,9 +129,35 @@ private class Games.GamepadMapper : Gtk.Bin {
                        return;
                }
 
+               if (tick_cb != 0) {
+                       remove_tick_callback (tick_cb);
+                       tick_cb = 0;
+               }
+
                gamepad_view.reset ();
                input = mapping_inputs[current_input_index++];
-               gamepad_view.highlight (input, true);
+
+               switch (input.type) {
+               case EventCode.EV_KEY:
+                       gamepad_view.highlight (input, true);
+
+                       break;
+               case EventCode.EV_ABS:
+                       animation_start_time = get_frame_clock ().get_frame_time ();
+                       tick_cb = add_tick_callback ((widget, clock) => {
+                               var time = clock.get_frame_time () - animation_start_time;
+
+                               double t = time / ANALOG_ANIMATION_SPEED;
+
+                               gamepad_view.set_analog (input, Math.sin (t));
+
+                               return Source.CONTINUE;
+                       });
+
+                       break;
+               default:
+                       break;
+               }
 
                update_info_message ();
        }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]