diff options
author | Timm Bäder <mail@baedert.org> | 2018-07-08 11:26:12 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2018-07-08 11:26:12 +0200 |
commit | a6920855ea089daec2a56670b634407c8a9d480e (patch) | |
tree | 3b7fe060ff32927a7453ced3da52f08d72d98d52 | |
parent | c85e2401fa439191fe6151212fffef9e2c2888c0 (diff) | |
download | gtk+-a6920855ea089daec2a56670b634407c8a9d480e.tar.gz |
Implement GtkInspectorLayoutOverlay
To properly replace the old "show layout borders" option.
-rw-r--r-- | gtk/gtkwidget.c | 90 | ||||
-rw-r--r-- | gtk/inspector/layoutoverlay.c | 222 | ||||
-rw-r--r-- | gtk/inspector/layoutoverlay.h | 19 | ||||
-rw-r--r-- | gtk/inspector/meson.build | 1 | ||||
-rw-r--r-- | gtk/inspector/visual.c | 35 |
5 files changed, 270 insertions, 97 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index e76c07279a..b4ae9442e4 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -13011,96 +13011,6 @@ gtk_widget_maybe_add_debug_render_nodes (GtkWidget *widget, /* We should be offset to priv->allocation at this point */ - if (GTK_DISPLAY_DEBUG_CHECK (display, LAYOUT)) - { - graphene_rect_t bounds; - GdkRGBA widget_margin_color = {0.7, 0, 0, 0.6}; - GdkRGBA margin_color = {0.7, 0.7, 0, 0.6}; - GdkRGBA padding_color = {0.7, 0, 0.7, 0.6}; - - style = gtk_css_node_get_style (priv->cssnode); - get_box_margin (style, &margin); - get_box_border (style, &border); - get_box_padding (style, &padding); - - gtk_snapshot_push_debug (snapshot, "Widget layout debugging"); - - /* Widget margins */ - graphene_rect_init (&bounds, - 0, -priv->margin.top, - priv->allocation.width, priv->margin.top); - gtk_snapshot_append_color (snapshot, &widget_margin_color, &bounds); - - graphene_rect_init (&bounds, - 0, priv->allocation.height, - priv->allocation.width, priv->margin.bottom); - gtk_snapshot_append_color (snapshot, &widget_margin_color, &bounds); - - graphene_rect_init (&bounds, - -priv->margin.left, 0, - priv->margin.left, priv->allocation.height); - gtk_snapshot_append_color (snapshot, &widget_margin_color, &bounds); - - graphene_rect_init (&bounds, - priv->allocation.width, 0, - priv->margin.right, priv->allocation.height); - gtk_snapshot_append_color (snapshot, &widget_margin_color, &bounds); - - - /* CSS Margins */ - graphene_rect_init (&bounds, - 0, 0, - priv->allocation.width, margin.top); - gtk_snapshot_append_color (snapshot, &margin_color, &bounds); - - graphene_rect_init (&bounds, - 0, priv->allocation.height - margin.bottom, - priv->allocation.width, margin.bottom); - gtk_snapshot_append_color (snapshot, &margin_color, &bounds); - - graphene_rect_init (&bounds, - 0, margin.top, - margin.left, priv->allocation.height - margin.top - margin.bottom); - gtk_snapshot_append_color (snapshot, &margin_color, &bounds); - - graphene_rect_init (&bounds, - priv->allocation.width - margin.right, margin.top, - margin.right, priv->allocation.height - margin.top - margin.bottom); - gtk_snapshot_append_color (snapshot, &margin_color, &bounds); - - - /* Padding */ - graphene_rect_init (&bounds, - margin.left + border.left, - margin.top + border.top, - priv->allocation.width - margin.left - margin.right - border.left - border.right, - padding.top); - gtk_snapshot_append_color (snapshot, &padding_color, &bounds); - - graphene_rect_init (&bounds, - margin.left + border.left, - priv->allocation.height - margin.bottom - border.bottom - padding.bottom, - priv->allocation.width - margin.left - margin.right - border.left - border.right, - padding.bottom); - gtk_snapshot_append_color (snapshot, &padding_color, &bounds); - - graphene_rect_init (&bounds, - margin.left + border.left, - margin.top + border.top + padding.top, - padding.left, - priv->allocation.height - margin.top - margin.bottom - border.top - border.bottom - padding.top - padding.bottom); - gtk_snapshot_append_color (snapshot, &padding_color, &bounds); - - graphene_rect_init (&bounds, - priv->allocation.width - margin.right - border.right - padding.right, - margin.top + border.top + padding.top, - padding.right, - priv->allocation.height - margin.top - margin.bottom - border.top - border.bottom - padding.top - padding.bottom); - gtk_snapshot_append_color (snapshot, &padding_color, &bounds); - - gtk_snapshot_pop (snapshot); - } - if (GTK_DISPLAY_DEBUG_CHECK (display, BASELINES)) { int baseline = gtk_widget_get_allocated_baseline (widget); diff --git a/gtk/inspector/layoutoverlay.c b/gtk/inspector/layoutoverlay.c new file mode 100644 index 0000000000..b2f860135d --- /dev/null +++ b/gtk/inspector/layoutoverlay.c @@ -0,0 +1,222 @@ + +#include "config.h" +#include "layoutoverlay.h" +#include "gtkwidgetprivate.h" +#include "gtkcssstyleprivate.h" +#include "gtkcssnodeprivate.h" +#include "gtkcssnumbervalueprivate.h" + +static const GdkRGBA WIDGET_MARGIN_COLOR = {0.7, 0, 0, 0.6}; +static const GdkRGBA MARGIN_COLOR = {0.7, 0.7, 0, 0.6}; +static const GdkRGBA PADDING_COLOR = {0.7, 0, 0.7, 0.6}; + +struct _GtkLayoutOverlay +{ + GtkInspectorOverlay parent_instance; +}; + +struct _GtkLayoutOverlayClass +{ + GtkInspectorOverlayClass parent_class; +}; + +G_DEFINE_TYPE (GtkLayoutOverlay, gtk_layout_overlay, GTK_TYPE_INSPECTOR_OVERLAY) + + +static gint +get_number (GtkCssStyle *style, + guint property) +{ + double d = _gtk_css_number_value_get (gtk_css_style_get_value (style, property), 100); + + if (d < 1) + return ceil (d); + else + return floor (d); +} + +static void +get_box_margin (GtkCssStyle *style, + GtkBorder *margin) +{ + margin->top = get_number (style, GTK_CSS_PROPERTY_MARGIN_TOP); + margin->left = get_number (style, GTK_CSS_PROPERTY_MARGIN_LEFT); + margin->bottom = get_number (style, GTK_CSS_PROPERTY_MARGIN_BOTTOM); + margin->right = get_number (style, GTK_CSS_PROPERTY_MARGIN_RIGHT); +} + +static void +get_box_border (GtkCssStyle *style, + GtkBorder *border) +{ + border->top = get_number (style, GTK_CSS_PROPERTY_BORDER_TOP_WIDTH); + border->left = get_number (style, GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH); + border->bottom = get_number (style, GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH); + border->right = get_number (style, GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH); +} + +static void +get_box_padding (GtkCssStyle *style, + GtkBorder *border) +{ + border->top = get_number (style, GTK_CSS_PROPERTY_PADDING_TOP); + border->left = get_number (style, GTK_CSS_PROPERTY_PADDING_LEFT); + border->bottom = get_number (style, GTK_CSS_PROPERTY_PADDING_BOTTOM); + border->right = get_number (style, GTK_CSS_PROPERTY_PADDING_RIGHT); +} + +static void +recurse_child_widgets (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + GtkBorder margin, border, padding; + GtkBorder widget_margin; + GtkAllocation allocation; + graphene_rect_t bounds; + GtkCssStyle *style; + GtkWidget *child; + + if (!gtk_widget_get_mapped (widget)) + return; + + style = gtk_css_node_get_style (gtk_widget_get_css_node (widget)); + get_box_margin (style, &margin); + get_box_border (style, &border); + get_box_padding (style, &padding); + + /* TODO: Eh, left = start? RTL? */ + widget_margin.left = gtk_widget_get_margin_start (widget); + widget_margin.top = gtk_widget_get_margin_top (widget); + widget_margin.right = gtk_widget_get_margin_end (widget); + widget_margin.bottom = gtk_widget_get_margin_bottom (widget); + + gtk_widget_get_allocation (widget, &allocation); + + + /* Offset for all of the drawing done here. We assume cooridinates relative to + * the widget allocation, not the content allocation. */ + gtk_snapshot_offset (snapshot, allocation.x, allocation.y); + + /* Now do all the stuff */ + gtk_snapshot_push_debug (snapshot, "Widget layout debugging"); + + /* Widget margins */ + graphene_rect_init (&bounds, + 0, -widget_margin.top, + allocation.width, widget_margin.top); + gtk_snapshot_append_color (snapshot, &WIDGET_MARGIN_COLOR, &bounds); + + graphene_rect_init (&bounds, + 0, allocation.height, + allocation.width, widget_margin.bottom); + gtk_snapshot_append_color (snapshot, &WIDGET_MARGIN_COLOR, &bounds); + + graphene_rect_init (&bounds, + -widget_margin.left, 0, + widget_margin.left, allocation.height); + gtk_snapshot_append_color (snapshot, &WIDGET_MARGIN_COLOR, &bounds); + + graphene_rect_init (&bounds, + allocation.width, 0, + widget_margin.right, allocation.height); + gtk_snapshot_append_color (snapshot, &WIDGET_MARGIN_COLOR, &bounds); + + + /* CSS Margins */ + graphene_rect_init (&bounds, + 0, 0, + allocation.width, margin.top); + gtk_snapshot_append_color (snapshot, &MARGIN_COLOR, &bounds); + + graphene_rect_init (&bounds, + 0, allocation.height - margin.bottom, + allocation.width, margin.bottom); + gtk_snapshot_append_color (snapshot, &MARGIN_COLOR, &bounds); + + graphene_rect_init (&bounds, + 0, margin.top, + margin.left, allocation.height - margin.top - margin.bottom); + gtk_snapshot_append_color (snapshot, &MARGIN_COLOR, &bounds); + + graphene_rect_init (&bounds, + allocation.width - margin.right, margin.top, + margin.right, allocation.height - margin.top - margin.bottom); + gtk_snapshot_append_color (snapshot, &MARGIN_COLOR, &bounds); + + + /* Padding */ + graphene_rect_init (&bounds, + margin.left + border.left, + margin.top + border.top, + allocation.width - margin.left - margin.right - border.left - border.right, + padding.top); + gtk_snapshot_append_color (snapshot, &PADDING_COLOR, &bounds); + + graphene_rect_init (&bounds, + margin.left + border.left, + allocation.height - margin.bottom - border.bottom - padding.bottom, + allocation.width - margin.left - margin.right - border.left - border.right, + padding.bottom); + gtk_snapshot_append_color (snapshot, &PADDING_COLOR, &bounds); + + graphene_rect_init (&bounds, + margin.left + border.left, + margin.top + border.top + padding.top, + padding.left, + allocation.height - margin.top - margin.bottom - border.top - border.bottom - padding.top - padding.bottom); + gtk_snapshot_append_color (snapshot, &PADDING_COLOR, &bounds); + + graphene_rect_init (&bounds, + allocation.width - margin.right - border.right - padding.right, + margin.top + border.top + padding.top, + padding.right, + allocation.height - margin.top - margin.bottom - border.top - border.bottom - padding.top - padding.bottom); + gtk_snapshot_append_color (snapshot, &PADDING_COLOR, &bounds); + + gtk_snapshot_pop (snapshot); + + + /* Recurse into child widgets */ + for (child = gtk_widget_get_first_child (widget); + child != NULL; + child = gtk_widget_get_next_sibling (child)) + { + const int offset_x = margin.left + border.left + padding.left; + const int offset_y = margin.top + border.top + padding.top; + + gtk_snapshot_offset (snapshot, offset_x, offset_y); + recurse_child_widgets (child, snapshot); + gtk_snapshot_offset (snapshot, - offset_x, - offset_y); + } + + gtk_snapshot_offset (snapshot, - allocation.x, - allocation.y); +} + +static void +gtk_layout_overlay_snapshot (GtkInspectorOverlay *overlay, + GtkSnapshot *snapshot, + GskRenderNode *node, + GtkWidget *widget) +{ + recurse_child_widgets (widget, snapshot); +} + +static void +gtk_layout_overlay_init (GtkLayoutOverlay *self) +{ + +} + +static void +gtk_layout_overlay_class_init (GtkLayoutOverlayClass *klass) +{ + GtkInspectorOverlayClass *overlay_class = (GtkInspectorOverlayClass *)klass; + + overlay_class->snapshot = gtk_layout_overlay_snapshot; +} + +GtkInspectorOverlay * +gtk_layout_overlay_new (void) +{ + return g_object_new (GTK_TYPE_LAYOUT_OVERLAY, NULL); +} diff --git a/gtk/inspector/layoutoverlay.h b/gtk/inspector/layoutoverlay.h new file mode 100644 index 0000000000..ef44dc10a1 --- /dev/null +++ b/gtk/inspector/layoutoverlay.h @@ -0,0 +1,19 @@ + + +#ifndef __GTK_LAYOUT_OVERLAY_H__ +#define __GTK_LAYOUT_OVERLAY_H__ + +#include "inspectoroverlay.h" + +G_BEGIN_DECLS + +#define GTK_TYPE_LAYOUT_OVERLAY (gtk_layout_overlay_get_type ()) +G_DECLARE_FINAL_TYPE (GtkLayoutOverlay, gtk_layout_overlay, GTK, LAYOUT_OVERLAY, GtkInspectorOverlay) + +GtkInspectorOverlay * gtk_layout_overlay_new (void); + +G_END_DECLS + + + +#endif diff --git a/gtk/inspector/meson.build b/gtk/inspector/meson.build index 3f241585f5..9184e14e5f 100644 --- a/gtk/inspector/meson.build +++ b/gtk/inspector/meson.build @@ -16,6 +16,7 @@ inspector_sources = files( 'init.c', 'inspect-button.c', 'inspectoroverlay.c', + 'layoutoverlay.c', 'logs.c', 'magnifier.c', 'menu.c', diff --git a/gtk/inspector/visual.c b/gtk/inspector/visual.c index 23bd753097..87ea1cf997 100644 --- a/gtk/inspector/visual.c +++ b/gtk/inspector/visual.c @@ -22,6 +22,7 @@ #include "fpsoverlay.h" #include "updatesoverlay.h" +#include "layoutoverlay.h" #include "window.h" #include "gtkadjustment.h" @@ -81,6 +82,7 @@ struct _GtkInspectorVisualPrivate GtkInspectorOverlay *fps_overlay; GtkInspectorOverlay *updates_overlay; + GtkInspectorOverlay *layout_overlay; }; G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorVisual, gtk_inspector_visual, GTK_TYPE_SCROLLED_WINDOW) @@ -313,18 +315,37 @@ baselines_activate (GtkSwitch *sw) } static void -layout_activate (GtkSwitch *sw) +layout_activate (GtkSwitch *sw, + GParamSpec *pspec, + GtkInspectorVisual *vis) { - guint flags; + GtkInspectorVisualPrivate *priv = vis->priv; + GtkInspectorWindow *iw; + gboolean draw_layout; - flags = gtk_get_debug_flags (); + draw_layout = gtk_switch_get_active (sw); + iw = GTK_INSPECTOR_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (vis))); + if (iw == NULL) + return; - if (gtk_switch_get_active (sw)) - flags |= GTK_DEBUG_LAYOUT; + if (draw_layout) + { + if (priv->updates_overlay == NULL) + { + priv->updates_overlay = gtk_layout_overlay_new (); + gtk_inspector_window_add_overlay (iw, priv->updates_overlay); + g_object_unref (priv->updates_overlay); + } + } else - flags &= ~GTK_DEBUG_LAYOUT; + { + if (priv->updates_overlay != NULL) + { + gtk_inspector_window_remove_overlay (iw, priv->updates_overlay); + priv->updates_overlay = NULL; + } + } - gtk_set_debug_flags (flags); redraw_everything (); } |