[gnome-games/wip/abhinavsingh/gamepad-config: 8/25] gamepad: Add GamepadView & its dependency librsvg



commit 0e24ba148b12f14d4284100507ca9c56fb3ad8dd
Author: theawless <theawless gmail com>
Date:   Sun May 28 13:16:32 2017 +0530

    gamepad: Add GamepadView & its dependency librsvg
    
    This adds the ability to highlight gamepad svg's individual inputs.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=780754

 configure.ac             |    1 +
 src/Makefile.am          |    2 +
 src/ui/gamepad-view.vala |   68 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 71 insertions(+), 0 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 5d95cf6..e049478 100644
--- a/configure.ac
+++ b/configure.ac
@@ -41,6 +41,7 @@ PKG_CHECK_MODULES(GNOME_GAMES, [
        glib-2.0 >= $GLIB_MIN_VERSION
        grilo-0.3
        gtk+-3.0
+       librsvg-2.0
        libsoup-2.4
        libxml-2.0
        retro-gtk-0.10
diff --git a/src/Makefile.am b/src/Makefile.am
index f2cd399..bfccde8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -124,6 +124,7 @@ gnome_games_SOURCES = \
        ui/empty-collection.vala \
        ui/error-display.vala \
        ui/error-info-bar.vala \
+       ui/gamepad-view.vala \
        ui/game-icon-view.vala \
        ui/game-thumbnail.vala \
        ui/media-selector.vala \
@@ -187,6 +188,7 @@ gnome_games_VALAFLAGS = \
        --pkg glib-2.0 \
        --pkg grilo-0.3 \
        --pkg gtk+-3.0 \
+       --pkg librsvg-2.0 \
        --pkg libsoup-2.4 \
        --pkg libxml-2.0 \
        --pkg tracker-sparql-1.0 \
diff --git a/src/ui/gamepad-view.vala b/src/ui/gamepad-view.vala
new file mode 100644
index 0000000..3c6f1fa
--- /dev/null
+++ b/src/ui/gamepad-view.vala
@@ -0,0 +1,68 @@
+// This file is part of GNOME Games. License: GPL-3.0+.
+
+private class Games.GamepadView : Gtk.DrawingArea {
+       private const string STANDARD_GAMEPAD_SVG_PATH = 
"resource:///org/gnome/Games/gamepads/standard-gamepad.svg";
+
+       private Rsvg.Handle handle;
+       private string[] highlight_paths = { "ellipse395", "ellipse393", "ellipse431", "ellipse389",
+                                            "ellipse385", "ellipse370",
+                                            "rect397", "rect211", "rect399", "rect217",
+                                            "rect415", "rect427", "rect429", "rect425",
+                                            "rect387", "ellipse391", "rect223",
+                                            "ellipse385", "ellipse370", "ellipse385", "ellipse370" };
+       private GamepadInput[] inputs;
+       private int current_input_index;
+
+       construct {
+               try {
+                       handle = new Rsvg.Handle.from_file (STANDARD_GAMEPAD_SVG_PATH);
+                       set_size_request (handle.width, handle.height);
+               }
+               catch (Error e) {
+                       warning (e.message);
+               }
+
+               inputs = GamepadInput.get_standard_inputs ();
+               current_input_index = -1;
+       }
+
+       public GamepadInput? highlight_next () {
+               current_input_index += 1;
+               queue_draw ();
+
+               if (current_input_index >= inputs.length)
+                       return null;
+
+               return inputs[current_input_index];
+       }
+
+       public override bool draw (Cairo.Context gamepad_context) {
+               var color = get_style_context ().get_color (Gtk.StateFlags.LINK);
+               gamepad_context.set_source_rgba (color.red, color.green, color.blue, color.alpha);
+
+               handle.render_cairo (gamepad_context);
+
+               var highlight_context = make_highlight_context (gamepad_context);
+               if (highlight_context == null)
+                       return false;
+
+               var highlight_surface = highlight_context.get_target ();
+               gamepad_context.mask_surface (highlight_surface, 0, 0);
+
+               return false;
+       }
+
+       private Cairo.Context? make_highlight_context (Cairo.Context gamepad_context) {
+               if (!(0 <= current_input_index && current_input_index < inputs.length))
+                       return null;
+
+               var gamepad_surface = gamepad_context.get_target ();
+               var highlight_surface = new Cairo.Surface.similar (gamepad_surface, Cairo.Content.COLOR_ALPHA,
+                                                                  handle.width, handle.height);
+               var highlight_context = new Cairo.Context (highlight_surface);
+               var highlight_path = "#" + highlight_paths[current_input_index];
+               handle.render_cairo_sub (highlight_context, highlight_path);
+
+               return highlight_context;
+       }
+}


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