[gtk/matthiasc/for-master: 29/29] gtk-demo: Don't use GtkColorSwatch
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master: 29/29] gtk-demo: Don't use GtkColorSwatch
- Date: Sat, 18 Jul 2020 00:45:19 +0000 (UTC)
commit 0e476c1f287c67cd4a57da14d449e821a19dc6c5
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jul 17 20:44:06 2020 -0400
gtk-demo: Don't use GtkColorSwatch
Making our own is 80 lines of code, so just do it.
demos/gtk-demo/dnd.c | 90 +++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 78 insertions(+), 12 deletions(-)
---
diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c
index 667f2b6f2f..70ea875c1c 100644
--- a/demos/gtk-demo/dnd.c
+++ b/demos/gtk-demo/dnd.c
@@ -597,6 +597,83 @@ css_button_new (const char *class)
return button;
}
+typedef struct
+{
+ GtkWidget parent_instance;
+ GdkRGBA color;
+} ColorSwatch;
+
+typedef struct
+{
+ GtkWidgetClass parent_class;
+} ColorSwatchClass;
+
+G_DEFINE_TYPE (ColorSwatch, color_swatch, GTK_TYPE_WIDGET)
+
+static GdkContentProvider *
+color_swatch_drag_prepare (GtkDragSource *source,
+ double x,
+ double y,
+ ColorSwatch *swatch)
+{
+ return gdk_content_provider_new_typed (GDK_TYPE_RGBA, &swatch->color);
+}
+
+static void
+color_swatch_init (ColorSwatch *swatch)
+{
+ GtkDragSource *source = gtk_drag_source_new ();
+ g_signal_connect (source, "prepare", G_CALLBACK (color_swatch_drag_prepare), swatch);
+ gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (source));
+}
+
+static void
+color_swatch_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
+{
+ ColorSwatch *swatch = (ColorSwatch *)widget;
+ float w = gtk_widget_get_width (widget);
+ float h = gtk_widget_get_height (widget);
+
+ gtk_snapshot_append_color (snapshot, &swatch->color,
+ &GRAPHENE_RECT_INIT(0, 0, w, h));
+}
+
+void
+color_swatch_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ int for_size,
+ int *minimum_size,
+ int *natural_size,
+ int *minimum_baseline,
+ int *natural_baseline)
+{
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ *minimum_size = *natural_size = 48;
+ else
+ *minimum_size = *natural_size = 32;
+}
+
+static void
+color_swatch_class_init (ColorSwatchClass *class)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+ widget_class->snapshot = color_swatch_snapshot;
+ widget_class->measure = color_swatch_measure;
+ gtk_widget_class_set_css_name (widget_class, "colorswatch");
+}
+
+static GtkWidget *
+color_swatch_new (const char *color)
+{
+ ColorSwatch *swatch = g_object_new (color_swatch_get_type (), NULL);
+
+ gdk_rgba_parse (&swatch->color, color);
+
+ return GTK_WIDGET (swatch);
+}
+
static GtkWidget *window = NULL;
GtkWidget *
@@ -670,18 +747,7 @@ do_dnd (GtkWidget *do_widget)
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), box3);
for (i = 0; colors[i]; i++)
- {
- GdkRGBA rgba;
- GtkWidget *swatch;
-
- gdk_rgba_parse (&rgba, colors[i]);
-
- swatch = g_object_new (g_type_from_name ("GtkColorSwatch"),
- "rgba", &rgba,
- "selectable", FALSE,
- NULL);
- gtk_box_append (GTK_BOX (box3), swatch);
- }
+ gtk_box_append (GTK_BOX (box3), color_swatch_new (colors[i]));
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow1"));
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow2"));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]