mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-06 16:50:11 +00:00
Make GtkSwitch use GtkStyleContext
This commit is contained in:
parent
18b333bfe7
commit
029fb53ac2
148
gtk/gtkswitch.c
148
gtk/gtkswitch.c
@ -151,16 +151,20 @@ gtk_switch_motion (GtkWidget *widget,
|
||||
{
|
||||
gint position = event->x - priv->offset;
|
||||
GtkAllocation allocation;
|
||||
GtkStyle *style;
|
||||
GtkStyleContext *context;
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding;
|
||||
|
||||
style = gtk_widget_get_style (widget);
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
gtk_style_context_get_padding (context, state, &padding);
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
|
||||
/* constrain the handle within the trough width */
|
||||
if (position > (allocation.width / 2 - style->xthickness))
|
||||
priv->handle_x = allocation.width / 2 - style->xthickness;
|
||||
else if (position < style->xthickness)
|
||||
priv->handle_x = style->xthickness;
|
||||
if (position > (allocation.width / 2 - padding.right))
|
||||
priv->handle_x = allocation.width / 2 - padding.right;
|
||||
else if (position < padding.left)
|
||||
priv->handle_x = padding.left;
|
||||
else
|
||||
priv->handle_x = position;
|
||||
|
||||
@ -274,12 +278,18 @@ gtk_switch_get_preferred_width (GtkWidget *widget,
|
||||
gint *minimum,
|
||||
gint *natural)
|
||||
{
|
||||
GtkStyle *style = gtk_widget_get_style (widget);
|
||||
GtkStyleContext *context;
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding;
|
||||
gint width, slider_width, focus_width, focus_pad;
|
||||
PangoLayout *layout;
|
||||
PangoRectangle logical_rect;
|
||||
|
||||
width = style->xthickness * 2;
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
gtk_style_context_get_padding (context, state, &padding);
|
||||
|
||||
width = padding.left + padding.right;
|
||||
|
||||
gtk_widget_style_get (widget,
|
||||
"slider-width", &slider_width,
|
||||
@ -320,13 +330,19 @@ gtk_switch_get_preferred_height (GtkWidget *widget,
|
||||
gint *minimum,
|
||||
gint *natural)
|
||||
{
|
||||
GtkStyle *style = gtk_widget_get_style (widget);
|
||||
GtkStyleContext *context;
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding;
|
||||
gint height, focus_width, focus_pad;
|
||||
PangoLayout *layout;
|
||||
PangoRectangle logical_rect;
|
||||
gchar *str;
|
||||
|
||||
height = style->ythickness * 2;
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
gtk_style_context_get_padding (context, state, &padding);
|
||||
|
||||
height = padding.top + padding.bottom;
|
||||
|
||||
gtk_widget_style_get (widget,
|
||||
"focus-line-width", &focus_width,
|
||||
@ -452,17 +468,21 @@ gtk_switch_paint_handle (GtkWidget *widget,
|
||||
cairo_t *cr,
|
||||
GdkRectangle *box)
|
||||
{
|
||||
GtkStyle *style = gtk_widget_get_style (widget);
|
||||
GtkStyleContext *context = gtk_widget_get_style_context (widget);
|
||||
GtkStateFlags state;
|
||||
|
||||
gtk_paint_slider (style, cr,
|
||||
gtk_widget_get_state (widget),
|
||||
GTK_SHADOW_OUT,
|
||||
GTK_WIDGET (widget), "switch-slider",
|
||||
box->x,
|
||||
box->y,
|
||||
box->width,
|
||||
box->height,
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
|
||||
gtk_style_context_save (context);
|
||||
gtk_style_context_set_state (context, state);
|
||||
gtk_style_context_add_class (context, GTK_STYLE_CLASS_SLIDER);
|
||||
|
||||
gtk_render_slider (context, cr,
|
||||
box->x, box->y,
|
||||
box->width, box->height,
|
||||
GTK_ORIENTATION_HORIZONTAL);
|
||||
|
||||
gtk_style_context_restore (context);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -470,12 +490,13 @@ gtk_switch_draw (GtkWidget *widget,
|
||||
cairo_t *cr)
|
||||
{
|
||||
GtkSwitchPrivate *priv = GTK_SWITCH (widget)->priv;
|
||||
GtkStyle *style;
|
||||
GtkStyleContext *context;
|
||||
GdkRectangle handle;
|
||||
PangoLayout *layout;
|
||||
PangoRectangle rect;
|
||||
gint label_x, label_y;
|
||||
GtkStateType state;
|
||||
GtkStateFlags state;
|
||||
GtkBorder padding;
|
||||
gint focus_width, focus_pad;
|
||||
gint x, y, width, height;
|
||||
|
||||
@ -484,7 +505,13 @@ gtk_switch_draw (GtkWidget *widget,
|
||||
"focus-padding", &focus_pad,
|
||||
NULL);
|
||||
|
||||
style = gtk_widget_get_style (widget);
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
state = gtk_widget_get_state_flags (widget);
|
||||
|
||||
if (priv->is_active)
|
||||
state |= GTK_STATE_FLAG_ACTIVE;
|
||||
|
||||
gtk_style_context_get_padding (context, state, &padding);
|
||||
|
||||
x = 0;
|
||||
y = 0;
|
||||
@ -492,37 +519,27 @@ gtk_switch_draw (GtkWidget *widget,
|
||||
height = gtk_widget_get_allocated_height (widget);
|
||||
|
||||
if (gtk_widget_has_focus (widget))
|
||||
gtk_paint_focus (style, cr,
|
||||
gtk_widget_get_state (widget),
|
||||
widget, "button",
|
||||
x, y, width, height);
|
||||
gtk_render_focus (context, cr, x, y, width, height);
|
||||
|
||||
gtk_style_context_save (context);
|
||||
gtk_style_context_set_state (context, state);
|
||||
|
||||
x += focus_width + focus_pad;
|
||||
y += focus_width + focus_pad;
|
||||
width -= 2 * (focus_width + focus_pad);
|
||||
height -= 2 * (focus_width + focus_pad);
|
||||
|
||||
state = priv->is_active ? GTK_STATE_SELECTED : gtk_widget_get_state (widget);
|
||||
gtk_style_context_add_class (context, GTK_STYLE_CLASS_TROUGH);
|
||||
|
||||
/* background - XXX should this be a flat box instead? we're missing
|
||||
* the border given by the shadow with that, which would require
|
||||
* fixing all theme engines to add a subtle border for this widget
|
||||
*/
|
||||
gtk_paint_box (style, cr,
|
||||
state,
|
||||
GTK_SHADOW_IN,
|
||||
widget, "switch-background",
|
||||
x, y, width, height);
|
||||
|
||||
if (!gtk_widget_is_sensitive (widget))
|
||||
state = GTK_STATE_INSENSITIVE;
|
||||
gtk_render_background (context, cr, x, y, width, height);
|
||||
gtk_render_frame (context, cr, x, y, width, height);
|
||||
|
||||
/* XXX the +1/-1 it's pixel wriggling after checking with the default
|
||||
* theme and xmag
|
||||
*/
|
||||
handle.y = y + style->ythickness + 1;
|
||||
handle.width = (width - style->xthickness * 2) / 2;
|
||||
handle.height = (height - style->ythickness * 2) - 1;
|
||||
handle.y = y + padding.top + 1;
|
||||
handle.width = (width - padding.left - padding.right) / 2;
|
||||
handle.height = (height - padding.top - padding.bottom) - 1;
|
||||
|
||||
/* Translators: if the "on" state label requires more than three
|
||||
* glyphs then use MEDIUM VERTICAL BAR (U+2759) as the text for
|
||||
@ -532,17 +549,12 @@ gtk_switch_draw (GtkWidget *widget,
|
||||
pango_layout_get_extents (layout, NULL, &rect);
|
||||
pango_extents_to_pixels (&rect, NULL);
|
||||
|
||||
label_x = x + style->xthickness
|
||||
+ ((width / 2) - rect.width - (style->xthickness * 2)) / 2;
|
||||
label_y = y + style->ythickness
|
||||
+ (height - rect.height - (style->ythickness * 2)) / 2;
|
||||
label_x = x + padding.left
|
||||
+ ((width / 2) - rect.width - padding.left - padding.right) / 2;
|
||||
label_y = y + padding.top
|
||||
+ (height - rect.height - padding.top - padding.bottom) / 2;
|
||||
|
||||
gtk_paint_layout (style, cr,
|
||||
state,
|
||||
FALSE,
|
||||
widget, "switch-on-label",
|
||||
label_x, label_y,
|
||||
layout);
|
||||
gtk_render_layout (context, cr, label_x, label_y, layout);
|
||||
|
||||
g_object_unref (layout);
|
||||
|
||||
@ -553,27 +565,24 @@ gtk_switch_draw (GtkWidget *widget,
|
||||
pango_layout_get_extents (layout, NULL, &rect);
|
||||
pango_extents_to_pixels (&rect, NULL);
|
||||
|
||||
label_x = x + style->xthickness
|
||||
label_x = x + padding.left
|
||||
+ (width / 2)
|
||||
+ ((width / 2) - rect.width - (style->xthickness * 2)) / 2;
|
||||
label_y = y + style->ythickness
|
||||
+ (height - rect.height - (style->ythickness * 2)) / 2;
|
||||
+ ((width / 2) - rect.width - padding.left - padding.right) / 2;
|
||||
label_y = y + padding.top
|
||||
+ (height - rect.height - padding.top - padding.bottom) / 2;
|
||||
|
||||
gtk_paint_layout (style, cr,
|
||||
state,
|
||||
FALSE,
|
||||
widget, "switch-off-label",
|
||||
label_x, label_y,
|
||||
layout);
|
||||
gtk_render_layout (context, cr, label_x, label_y, layout);
|
||||
|
||||
g_object_unref (layout);
|
||||
|
||||
if (priv->is_dragging)
|
||||
handle.x = x + priv->handle_x;
|
||||
else if (priv->is_active)
|
||||
handle.x = x + width - handle.width - style->xthickness;
|
||||
handle.x = x + width - handle.width - padding.right;
|
||||
else
|
||||
handle.x = x + style->xthickness;
|
||||
handle.x = x + padding.left;
|
||||
|
||||
gtk_style_context_restore (context);
|
||||
|
||||
gtk_switch_paint_handle (widget, cr, &handle);
|
||||
|
||||
@ -824,7 +833,10 @@ gtk_switch_set_active (GtkSwitch *sw,
|
||||
if (priv->is_active != is_active)
|
||||
{
|
||||
AtkObject *accessible;
|
||||
GtkWidget *widget;
|
||||
GtkStyleContext *context;
|
||||
|
||||
widget = GTK_WIDGET (sw);
|
||||
priv->is_active = is_active;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (sw), switch_props[PROP_ACTIVE]);
|
||||
@ -835,6 +847,14 @@ gtk_switch_set_active (GtkSwitch *sw,
|
||||
accessible = gtk_widget_get_accessible (GTK_WIDGET (sw));
|
||||
atk_object_notify_state_change (accessible, ATK_STATE_CHECKED, priv->is_active);
|
||||
|
||||
if (gtk_widget_get_realized (widget))
|
||||
{
|
||||
context = gtk_widget_get_style_context (widget);
|
||||
gtk_style_context_notify_state_change (context,
|
||||
gtk_widget_get_window (widget),
|
||||
NULL, GTK_STATE_ACTIVE, is_active);
|
||||
}
|
||||
|
||||
gtk_widget_queue_draw (GTK_WIDGET (sw));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user