From 0694b9b204ed4ede7cdd56d690da9cb1c3438080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Wed, 23 Jan 2019 07:29:36 +0100 Subject: Inspector: add & use GtkWidgetView Use it to show a visual representation of the focus widget in a toplevel --- gtk/inspector/init.c | 2 + gtk/inspector/meson.build | 1 + gtk/inspector/misc-info.c | 18 +++------ gtk/inspector/misc-info.ui | 4 +- gtk/inspector/widgetview.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++ gtk/inspector/widgetview.h | 39 +++++++++++++++++++ 6 files changed, 141 insertions(+), 16 deletions(-) create mode 100644 gtk/inspector/widgetview.c create mode 100644 gtk/inspector/widgetview.h diff --git a/gtk/inspector/init.c b/gtk/inspector/init.c index 049126f401..eb00c10785 100644 --- a/gtk/inspector/init.c +++ b/gtk/inspector/init.c @@ -48,6 +48,7 @@ #include "visual.h" #include "window.h" #include "gtkstackcombo.h" +#include "widgetview.h" #include "gtkmagnifierprivate.h" @@ -85,6 +86,7 @@ gtk_inspector_init (void) g_type_ensure (GTK_TYPE_INSPECTOR_VISUAL); g_type_ensure (GTK_TYPE_INSPECTOR_WINDOW); g_type_ensure (GTK_TYPE_STACK_COMBO); + g_type_ensure (GTK_TYPE_WIDGET_VIEW); if (extension_point == NULL) { diff --git a/gtk/inspector/meson.build b/gtk/inspector/meson.build index a134f8f278..ae0fac76dd 100644 --- a/gtk/inspector/meson.build +++ b/gtk/inspector/meson.build @@ -37,5 +37,6 @@ inspector_sources = files( 'treewalk.c', 'updatesoverlay.c', 'visual.c', + 'widgetview.c', 'window.c', ) diff --git a/gtk/inspector/misc-info.c b/gtk/inspector/misc-info.c index fc522ea6b1..262457a987 100644 --- a/gtk/inspector/misc-info.c +++ b/gtk/inspector/misc-info.c @@ -29,6 +29,7 @@ #include "gtkframe.h" #include "gtkbutton.h" #include "gtkwidgetprivate.h" +#include "widgetview.h" struct _GtkInspectorMiscInfoPrivate { @@ -223,19 +224,10 @@ update_focus_widget (GtkInspectorMiscInfo *sl) GtkWidget *widget; widget = gtk_window_get_focus (GTK_WINDOW (sl->priv->object)); - if (widget) - { - gchar *tmp; - tmp = g_strdup_printf ("%p", widget); - gtk_label_set_label (GTK_LABEL (sl->priv->focus_widget), tmp); - g_free (tmp); - gtk_widget_set_sensitive (sl->priv->focus_widget_button, TRUE); - } - else - { - gtk_label_set_label (GTK_LABEL (sl->priv->focus_widget), "NULL"); - gtk_widget_set_sensitive (sl->priv->focus_widget_button, FALSE); - } + + gtk_widget_view_set_inspected_widget (GTK_WIDGET_VIEW (sl->priv->focus_widget), + widget); + gtk_widget_set_sensitive (sl->priv->focus_widget_button, widget != NULL); } static void diff --git a/gtk/inspector/misc-info.ui b/gtk/inspector/misc-info.ui index d82b73f272..96c62db5a3 100644 --- a/gtk/inspector/misc-info.ui +++ b/gtk/inspector/misc-info.ui @@ -176,11 +176,9 @@ - - 1 + end baseline - end diff --git a/gtk/inspector/widgetview.c b/gtk/inspector/widgetview.c new file mode 100644 index 0000000000..484577d8ac --- /dev/null +++ b/gtk/inspector/widgetview.c @@ -0,0 +1,93 @@ + +#include "widgetview.h" +#include "gtklabel.h" +#include "gtkpicture.h" +#include "gtkbox.h" + +G_DEFINE_TYPE (GtkWidgetView, gtk_widget_view, GTK_TYPE_WIDGET); + +static void +gtk_widget_view_measure (GtkWidget *widget, + GtkOrientation orientation, + int for_size, + int *minimum, + int *natural, + int *minimum_baseline, + int *natural_baseline) +{ + GtkWidgetView *self = GTK_WIDGET_VIEW (widget); + + gtk_widget_measure (self->box, orientation, for_size, + minimum, natural, minimum_baseline, natural_baseline); +} + +static void +gtk_widget_view_size_allocate (GtkWidget *widget, + int width, + int height, + int baseline) +{ + GtkWidgetView *self = GTK_WIDGET_VIEW (widget); + + gtk_widget_size_allocate (self->box, + &(GtkAllocation) { + 0, 0, + width, height + }, -1); +} + +static void +gtk_widget_view_class_init (GtkWidgetViewClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + widget_class->measure = gtk_widget_view_measure; + widget_class->size_allocate = gtk_widget_view_size_allocate; +} + + +static void +gtk_widget_view_init (GtkWidgetView *self) +{ + gtk_widget_set_has_surface (GTK_WIDGET (self), FALSE); + + self->typename_label = gtk_label_new (""); + self->paintable_picture = gtk_picture_new (); + self->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + + gtk_container_add (GTK_CONTAINER (self->box), self->typename_label); + gtk_container_add (GTK_CONTAINER (self->box), self->paintable_picture); + + gtk_widget_set_parent (self->box, GTK_WIDGET (self)); +} + + +GtkWidget * +gtk_widget_view_new (void) +{ + return (GtkWidget *) g_object_new (GTK_TYPE_WIDGET_VIEW, NULL); +} + +void +gtk_widget_view_set_inspected_widget (GtkWidgetView *self, + GtkWidget *inspected) +{ + char typename_buffer[512]; + GdkPaintable *paintable; + + g_set_object (&self->inspected, inspected); + + if (!self->inspected) + { + gtk_label_set_label (GTK_LABEL (self->typename_label), "NULL"); + return; + } + + g_snprintf (typename_buffer, sizeof (typename_buffer), + "%s", G_OBJECT_TYPE_NAME (inspected)); + gtk_label_set_label (GTK_LABEL (self->typename_label), typename_buffer); + + paintable = gtk_widget_paintable_new (inspected); + gtk_picture_set_paintable (GTK_PICTURE (self->paintable_picture), paintable); + g_object_unref (paintable); +} diff --git a/gtk/inspector/widgetview.h b/gtk/inspector/widgetview.h new file mode 100644 index 0000000000..6a3b89e033 --- /dev/null +++ b/gtk/inspector/widgetview.h @@ -0,0 +1,39 @@ + +#ifndef __GTK_WIDGET_VIEW_H__ +#define __GTK_WIDGET_VIEW_H__ + +#include "gtkwidget.h" +#include "gtkwidgetpaintable.h" + +#define GTK_TYPE_WIDGET_VIEW (gtk_widget_view_get_type ()) +#define GTK_WIDGET_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WIDGET_VIEW, GtkWidgetView)) +#define GTK_WIDGET_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WIDGET_VIEW, GtkWidgetViewClass)) +#define GTK_IS_WIDGET_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WIDGET_VIEW)) +#define GTK_IS_WIDGET_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WIDGET_VIEW)) +#define GTK_WIDGET_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WIDGET_VIEW, GtkWidgetViewClass)) + +typedef struct _GtkWidgetView GtkWidgetView; +typedef struct _GtkWidgetViewClass GtkWidgetViewClass; + +struct _GtkWidgetView +{ + GtkWidget parent_instance; + + GtkWidget *box; + GtkWidget *typename_label; + GtkWidget *paintable_picture; + + GtkWidget *inspected; +}; + +struct _GtkWidgetViewClass +{ + GtkWidgetClass parent_class; +}; + +GType gtk_widget_view_get_type (void) G_GNUC_CONST; +GtkWidget * gtk_widget_view_new (void); +void gtk_widget_view_set_inspected_widget (GtkWidgetView *self, + GtkWidget *inspected); + +#endif -- cgit v1.2.1