[gtk/dnd-demo-animation] gtk-demo: Add animated icons to the dnd demo
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/dnd-demo-animation] gtk-demo: Add animated icons to the dnd demo
- Date: Fri, 19 Jun 2020 23:27:37 +0000 (UTC)
commit eb25fc1d5adcc8c29876a6e3df6f05f4445ef171
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jun 19 19:18:45 2020 -0400
gtk-demo: Add animated icons to the dnd demo
This is to test animated drag icons.
demos/gtk-demo/demo.gresource.xml | 3 ++
demos/gtk-demo/dnd.c | 86 +++++++++++++++++++++++++++++++++++++--
demos/gtk-demo/dnd.css | 37 +++++++++++++++++
3 files changed, 123 insertions(+), 3 deletions(-)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index a1500f0b80..f547947245 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -105,6 +105,9 @@
<file>zoom_in_cursor.png</file>
<file>zoom_out_cursor.png</file>
</gresource>
+ <gresource prefix="/dnd">
+ <file>dnd.css</file>
+ </gresource>
<gresource prefix="/fishbowl">
<file>fishbowl.ui</file>
<file>gtkfishbowl.c</file>
diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c
index c7db016b84..b7826a63de 100644
--- a/demos/gtk-demo/dnd.c
+++ b/demos/gtk-demo/dnd.c
@@ -38,15 +38,20 @@ set_color (CanvasItem *item,
char *str;
GtkStyleContext *context;
GtkCssProvider *provider;
+ const char *old_class;
str = gdk_rgba_to_string (color);
- css = g_strdup_printf ("* { background: %s; padding: 10px; margin: 1px; }", str);
+ css = g_strdup_printf ("* { background: %s; }", str);
context = gtk_widget_get_style_context (item->label);
provider = g_object_get_data (G_OBJECT (context), "style-provider");
if (provider)
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
+ old_class = (const char *)g_object_get_data (G_OBJECT (item->label), "css-class");
+ if (old_class)
+ gtk_widget_remove_css_class (item->label, old_class);
+
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (provider, css, -1);
gtk_style_context_add_provider (gtk_widget_get_style_context (item->label), GTK_STYLE_PROVIDER (provider),
800);
@@ -56,6 +61,27 @@ set_color (CanvasItem *item,
g_free (css);
}
+static void
+set_css (CanvasItem *item,
+ const char *class)
+{
+ GtkStyleContext *context;
+ GtkCssProvider *provider;
+ const char *old_class;
+
+ context = gtk_widget_get_style_context (item->label);
+ provider = g_object_get_data (G_OBJECT (context), "style-provider");
+ if (provider)
+ gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
+
+ old_class = (const char *)g_object_get_data (G_OBJECT (item->label), "css-class");
+ if (old_class)
+ gtk_widget_remove_css_class (item->label, old_class);
+
+ g_object_set_data_full (G_OBJECT (item->label), "css-class", g_strdup (class), g_free);
+ gtk_widget_add_css_class (item->label, class);
+}
+
static gboolean
item_drag_drop (GtkDropTarget *dest,
const GValue *value,
@@ -65,7 +91,10 @@ item_drag_drop (GtkDropTarget *dest,
GtkWidget *label = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
CanvasItem *item = CANVAS_ITEM (gtk_widget_get_parent (gtk_widget_get_parent (label)));
- set_color (item, g_value_get_boxed (value));
+ if (G_VALUE_TYPE (value) == GDK_TYPE_RGBA)
+ set_color (item, g_value_get_boxed (value));
+ else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
+ set_css (item, g_value_get_string (value));
return TRUE;
}
@@ -132,11 +161,13 @@ canvas_item_init (CanvasItem *item)
GdkRGBA rgba;
GtkDropTarget *dest;
GtkGesture *gesture;
+ GType types[2] = { GDK_TYPE_RGBA, G_TYPE_STRING };
n_items++;
text = g_strdup_printf ("Item %d", n_items);
item->label = gtk_label_new (text);
+ gtk_widget_add_css_class (item->label, "canvasitem");
g_free (text);
item->fixed = gtk_fixed_new ();
@@ -154,7 +185,8 @@ canvas_item_init (CanvasItem *item)
item->angle = 0;
- dest = gtk_drop_target_new (GDK_TYPE_RGBA, GDK_ACTION_COPY);
+ dest = gtk_drop_target_new (G_TYPE_INVALID, GDK_ACTION_COPY);
+ gtk_drop_target_set_gtypes (dest, types, G_N_ELEMENTS (types));
g_signal_connect (dest, "drop", G_CALLBACK (item_drag_drop), NULL);
gtk_widget_add_controller (GTK_WIDGET (item->label), GTK_EVENT_CONTROLLER (dest));
@@ -529,6 +561,42 @@ canvas_new (void)
return canvas;
}
+static GdkContentProvider *
+css_drag_prepare (GtkDragSource *source,
+ double x,
+ double y,
+ GtkWidget *button)
+{
+ const char *class;
+ GdkPaintable *paintable;
+
+ class = (const char *)g_object_get_data (G_OBJECT (button), "css-class");
+
+ paintable = gtk_widget_paintable_new (button);
+ gtk_drag_source_set_icon (source, paintable, 0, 0);
+ g_object_unref (paintable);
+
+ return gdk_content_provider_new_typed (G_TYPE_STRING, class);
+}
+
+static GtkWidget *
+css_button_new (const char *class)
+{
+ GtkWidget *button;
+ GtkDragSource *source;
+
+ button = gtk_image_new ();
+ gtk_widget_set_size_request (button, 48, 32);
+ gtk_widget_add_css_class (button, class);
+ g_object_set_data (G_OBJECT (button), "css-class", (gpointer)class);
+
+ source = gtk_drag_source_new ();
+ g_signal_connect (source, "prepare", G_CALLBACK (css_drag_prepare), button);
+ gtk_widget_add_controller (button, GTK_EVENT_CONTROLLER (source));
+
+ return button;
+}
+
static GtkWidget *window = NULL;
GtkWidget *
@@ -548,10 +616,18 @@ do_dnd (GtkWidget *do_widget)
};
int i;
int x, y;
+ GtkCssProvider *provider;
button = gtk_color_button_new ();
g_object_unref (g_object_ref_sink (button));
+ provider = gtk_css_provider_new ();
+ gtk_css_provider_load_from_resource (provider, "/dnd/dnd.css");
+ gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+ GTK_STYLE_PROVIDER (provider),
+ 800);
+ g_object_unref (provider);
+
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
@@ -606,6 +682,10 @@ do_dnd (GtkWidget *do_widget)
NULL);
gtk_box_append (GTK_BOX (box3), swatch);
}
+
+ gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow1"));
+ gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow2"));
+ gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow3"));
}
if (!gtk_widget_get_visible (window))
diff --git a/demos/gtk-demo/dnd.css b/demos/gtk-demo/dnd.css
new file mode 100644
index 0000000000..c19a1f1e49
--- /dev/null
+++ b/demos/gtk-demo/dnd.css
@@ -0,0 +1,37 @@
+label.canvasitem {
+ padding: 10px;
+ margin: 1px;
+}
+
+.canvasitem.rainbow1,
+image.rainbow1 {
+ background: linear-gradient(140deg,red,orange,yellow,green,blue,purple);
+}
+
+.canvasitem.rainbow2,
+image.rainbow2 {
+ animation: rainbow2 1s infinite linear;
+}
+
+@keyframes rainbow2 {
+ 0% { background: linear-gradient(0deg,red,orange,yellow,green,blue,purple); }
+ 25% { background: linear-gradient(90deg,red,orange,yellow,green,blue,purple); }
+ 50% { background: linear-gradient(180deg,red,orange,yellow,green,blue,purple); }
+ 75% { background: linear-gradient(270deg,red,orange,yellow,green,blue,purple); }
+ 100% { background: linear-gradient(360deg,red,orange,yellow,green,blue,purple); }
+}
+
+.canvasitem.rainbow3,
+image.rainbow3 {
+ animation: rainbow3 1s infinite linear;
+}
+
+@keyframes rainbow3 {
+ 0% { background: linear-gradient(140deg,red,orange,yellow,green,blue,purple); }
+ 16.6% { background: linear-gradient(140deg,purple,red,orange,yellow,green,blue); }
+ 33.2% { background: linear-gradient(140deg,blue,purple,red,orange,yellow,green); }
+ 50% { background: linear-gradient(140deg,green,blue,purple,red,orange,yellow); }
+ 66.6% { background: linear-gradient(140deg,yellow,green,blue,purple,red,orange); }
+ 83.2% { background: linear-gradient(140deg,orange,yellow,green,blue,purple,red); }
+ 100% { background: linear-gradient(140deg,red,orange,yellow,green,blue,purple); }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]