expander: Let gadget render focus

This lets us drop lots of allocation fiddling, and reduces
the code that is consulting the style properties we want
to get rid of.
This commit is contained in:
Matthias Clasen 2015-12-18 08:29:49 -05:00
parent d81f8c1025
commit 53787d29ad

View File

@ -208,8 +208,6 @@ static void gtk_expander_forall (GtkContainer *container,
static void gtk_expander_activate (GtkExpander *expander);
static void get_expander_bounds (GtkExpander *expander,
GdkRectangle *rect);
/* GtkBuildable */
static void gtk_expander_buildable_init (GtkBuildableIface *iface);
@ -695,60 +693,6 @@ gtk_expander_unrealize (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_expander_parent_class)->unrealize (widget);
}
static void
get_expander_bounds (GtkExpander *expander,
GdkRectangle *rect)
{
GtkAllocation allocation;
GtkWidget *widget;
GtkExpanderPrivate *priv;
gint border_width;
gint expander_size;
gint expander_spacing;
gboolean ltr;
widget = GTK_WIDGET (expander);
priv = expander->priv;
gtk_widget_get_allocation (widget, &allocation);
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
gtk_widget_style_get (widget,
"expander-size", &expander_size,
"expander-spacing", &expander_spacing,
NULL);
ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
rect->x = border_width;
rect->y = border_width;
if (ltr)
rect->x += expander_spacing;
else
rect->x += allocation.width - border_width -
expander_spacing - expander_size;
if (priv->label_widget && gtk_widget_get_visible (priv->label_widget))
{
GtkAllocation label_allocation;
gtk_widget_get_allocation (priv->label_widget, &label_allocation);
if (expander_size < label_allocation.height)
rect->y += (label_allocation.height - expander_size) / 2;
else
rect->y += expander_spacing;
}
else
{
rect->y += expander_spacing;
}
rect->width = rect->height = expander_size;
}
static void
gtk_expander_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
@ -975,75 +919,7 @@ gtk_expander_render_title (GtkCssGadget *gadget,
gtk_css_gadget_draw (priv->arrow_gadget, cr);
return FALSE;
}
static void
gtk_expander_paint_focus (GtkExpander *expander,
cairo_t *cr)
{
GtkWidget *widget;
GtkExpanderPrivate *priv;
GdkRectangle rect;
GtkStyleContext *context;
gint x, y, width, height;
gint border_width;
gint expander_size;
gint expander_spacing;
gboolean ltr;
GtkAllocation allocation;
widget = GTK_WIDGET (expander);
priv = expander->priv;
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
gtk_widget_get_allocation (widget, &allocation);
gtk_widget_style_get (widget,
"expander-size", &expander_size,
"expander-spacing", &expander_spacing,
NULL);
ltr = gtk_widget_get_direction (widget) != GTK_TEXT_DIR_RTL;
width = height = 0;
if (priv->label_widget)
{
if (gtk_widget_get_visible (priv->label_widget))
{
GtkAllocation label_allocation;
gtk_widget_get_allocation (priv->label_widget, &label_allocation);
width = label_allocation.width;
height = label_allocation.height;
}
x = border_width;
y = border_width;
if (ltr)
{
x += expander_spacing * 2 + expander_size;
}
else
{
x += allocation.width - 2 * border_width
- expander_spacing * 2 - expander_size - width;
}
}
else
{
get_expander_bounds (expander, &rect);
x = rect.x;
y = rect.y;
width = rect.width;
height = rect.height;
}
context = gtk_widget_get_style_context (widget);
gtk_render_focus (context, cr, x, y, width, height);
return gtk_widget_has_visible_focus (widget);
}
static gboolean
@ -1071,9 +947,6 @@ gtk_expander_render (GtkCssGadget *gadget,
GTK_WIDGET_CLASS (gtk_expander_parent_class)->draw (widget, cr);
if (gtk_widget_has_visible_focus (widget))
gtk_expander_paint_focus (expander, cr);
return FALSE;
}