diff options
author | Benjamin Otte <otte@redhat.com> | 2020-03-02 03:11:14 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2020-03-02 04:43:56 +0100 |
commit | 2a697827e18e06aa2727cc6dbab5e05154127392 (patch) | |
tree | 72f9ded0ff66b0e3143476ba0e1a3dcd4cea3ad9 /gtk/gtkdragicon.c | |
parent | b2c3e39c89e4b2687422caf37284d0084bfd784f (diff) | |
download | gtk+-2a697827e18e06aa2727cc6dbab5e05154127392.tar.gz |
dragicon: Add gtk_drag_icon_create_widget_for_value()
... and use it to set a drag icon.
Diffstat (limited to 'gtk/gtkdragicon.c')
-rw-r--r-- | gtk/gtkdragicon.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/gtk/gtkdragicon.c b/gtk/gtkdragicon.c index 4e1afa522a..a01e088946 100644 --- a/gtk/gtkdragicon.c +++ b/gtk/gtkdragicon.c @@ -29,6 +29,11 @@ #include "gtkpicture.h" #include "gtkcssnumbervalueprivate.h" +/* for the drag icons */ +#include "gtkcolorswatchprivate.h" +#include "gtklabel.h" +#include "gtktextutil.h" + /** * SECTION:gtkdragicon @@ -497,3 +502,62 @@ gtk_drag_icon_get_child (GtkDragIcon *self) return self->child; } +/** + * gtk_drag_icon_create_widget_for_value: + * @value: a #GValue + * + * Creates a widget that can be used as a drag icon for the given + * @value. + * + * If GTK does not know how to create a widget for a given value, + * it will return %NULL. + * + * This method is used to set the default drag icon on drag'n'drop + * operations started by #GtkDragSource, so you don't need to set + * a drag icon using this function there. + * + * Returns: (nullable) (transfer full): A new #GtkWidget + * for displaying @value as a drag icon. + **/ +GtkWidget * +gtk_drag_icon_create_widget_for_value (const GValue *value) +{ + g_return_val_if_fail (G_IS_VALUE (value), NULL); + + if (G_VALUE_HOLDS (value, G_TYPE_STRING)) + { + return gtk_label_new (g_value_get_string (value)); + } + else if (G_VALUE_HOLDS (value, GDK_TYPE_RGBA)) + { + GtkWidget *swatch; + + swatch = gtk_color_swatch_new (); + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (swatch), g_value_get_boxed (value)); + + return swatch; + } + else if (G_VALUE_HOLDS (value, GTK_TYPE_TEXT_BUFFER)) + { + GtkTextBuffer *buffer = g_value_get_object (value); + GtkTextIter start, end; + GdkPaintable *paintable; + GtkWidget *picture; + + if (buffer == NULL || !gtk_text_buffer_get_selection_bounds (buffer, &start, &end)) + return NULL; + + picture = gtk_picture_new (); + paintable = gtk_text_util_create_rich_drag_icon (picture, buffer, &start, &end); + gtk_picture_set_paintable (GTK_PICTURE (picture), paintable); + gtk_picture_set_can_shrink (GTK_PICTURE (picture), FALSE); + g_object_unref (paintable); + + return picture; + } + else + { + return NULL; + } +} + |