[gtk+/multitouch: 8/121] themingengine: Implement press-and-hold notification renderer



commit b688eb2b5df0529aae95e87ce2b21063206fa4b9
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Nov 1 02:45:33 2011 +0100

    themingengine: Implement press-and-hold notification renderer
    
    gtk_render_activity() uses it for the GTK_STYLE_CLASS_PRESS_AND_HOLD
    style class.

 gtk/gtkcssprovider.c   |    6 ++++
 gtk/gtkstylecontext.h  |    7 +++++
 gtk/gtkthemingengine.c |   61 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 74 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 280cd55..c6bf6ac 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -3120,6 +3120,12 @@ gtk_css_provider_get_default (void)
         "  border-width: 0;\n"
         "  padding: 2;\n"
         "}\n"
+        "\n"
+        ".press-and-hold {\n"
+        "  background-color: alpha (@bg_color, 0.5);\n"
+        "  color: alpha (lighter (@selected_bg_color), 0.8);\n"
+        "  border-width: 10;\n"
+        "}\n"
         "\n";
 
       provider = gtk_css_provider_new ();
diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h
index 9a76c54..f1167b8 100644
--- a/gtk/gtkstylecontext.h
+++ b/gtk/gtkstylecontext.h
@@ -648,6 +648,13 @@ struct _GtkStyleContextClass
  */
 #define GTK_STYLE_CLASS_RIGHT "right"
 
+/**
+ * GTK_STYLE_CLASS_PRESS_AND_HOLD:
+ *
+ * A CSS class for the press and hold activity indicator.
+ */
+#define GTK_STYLE_CLASS_PRESS_AND_HOLD "press-and-hold"
+
 /* Predefined set of widget regions */
 
 /**
diff --git a/gtk/gtkthemingengine.c b/gtk/gtkthemingengine.c
index bac1f72..9775e5d 100644
--- a/gtk/gtkthemingengine.c
+++ b/gtk/gtkthemingengine.c
@@ -2774,6 +2774,63 @@ render_spinner (GtkThemingEngine *engine,
 }
 
 static void
+render_press_and_hold (GtkThemingEngine *engine,
+                       cairo_t          *cr,
+                       gdouble           x,
+                       gdouble           y,
+                       gdouble           width,
+                       gdouble           height)
+{
+  gdouble progress, radius, border_width;
+  GdkRGBA color, bg_color;
+  GtkStateFlags flags;
+  GtkBorder border;
+
+  cairo_save (cr);
+
+  if (!gtk_theming_engine_state_is_running (engine,
+                                            GTK_STATE_FLAG_ACTIVE,
+                                            &progress))
+    progress = 0;
+
+  flags = gtk_theming_engine_get_state (engine);
+  gtk_theming_engine_get_background_color (engine, flags, &bg_color);
+  gtk_theming_engine_get_color (engine, flags, &color);
+  gtk_theming_engine_get_border (engine, flags, &border);
+
+  border_width = (gdouble) MAX (MAX (border.top, border.bottom),
+                                MAX (border.left, border.right));
+
+  radius = MIN (width, height) / 2;
+
+  if (border_width == 0 ||
+      border_width >= radius - border_width)
+    border_width = MAX (1, radius / 4);
+
+  cairo_set_line_width (cr, border_width);
+  radius -= border_width;
+
+  /* Arcs start from the negative Y axis */
+  cairo_arc (cr,
+             width / 2, height / 2,
+             radius,
+             - G_PI_2, - G_PI_2 + (2 * G_PI));
+
+  gdk_cairo_set_source_rgba (cr, &bg_color);
+  cairo_stroke (cr);
+
+  cairo_arc (cr,
+             width / 2, height / 2,
+             radius,
+             - G_PI_2,
+             - G_PI_2 + (2 * G_PI * progress));
+  gdk_cairo_set_source_rgba (cr, &color);
+  cairo_stroke (cr);
+
+  cairo_restore (cr);
+}
+
+static void
 gtk_theming_engine_render_activity (GtkThemingEngine *engine,
                                     cairo_t          *cr,
                                     gdouble           x,
@@ -2785,6 +2842,10 @@ gtk_theming_engine_render_activity (GtkThemingEngine *engine,
     {
       render_spinner (engine, cr, x, y, width, height);
     }
+  else if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_PRESS_AND_HOLD))
+    {
+      render_press_and_hold (engine, cr, x, y, width, height);
+    }
   else
     {
       gtk_theming_engine_render_background (engine, cr, x, y, width, height);



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