summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-01-24 17:23:40 -0500
committerMatthias Clasen <mclasen@redhat.com>2019-01-24 20:15:47 -0500
commit75a4ae2aba8bbd97689549b735ee149473b9e7eb (patch)
tree854db69c21a8f9be7ad28bfec265189eadf1b01d
parent9fe0ef42a1a7ff1074e8c38314a63d670287600f (diff)
downloadgtk+-75a4ae2aba8bbd97689549b735ee149473b9e7eb.tar.gz
switch: use icons
Use the newly added icons.
-rw-r--r--gtk/gtkswitch.c185
1 files changed, 68 insertions, 117 deletions
diff --git a/gtk/gtkswitch.c b/gtk/gtkswitch.c
index 4c49e243ed..88596c7d1f 100644
--- a/gtk/gtkswitch.c
+++ b/gtk/gtkswitch.c
@@ -63,6 +63,7 @@
#include "gtkactionhelper.h"
#include "gtkcsscustomgadgetprivate.h"
#include "gtkcssgadgetprivate.h"
+#include "gtkiconhelperprivate.h"
#include "gtkstylecontextprivate.h"
#include "gtkwidgetprivate.h"
#include "gtkcssshadowsvalueprivate.h"
@@ -86,8 +87,8 @@ struct _GtkSwitchPrivate
GtkCssGadget *gadget;
GtkCssGadget *slider_gadget;
- PangoLayout *off_layout;
- PangoLayout *on_layout;
+ GtkCssGadget *on_gadget;
+ GtkCssGadget *off_gadget;
double handle_pos;
guint tick_id;
@@ -293,82 +294,6 @@ gtk_switch_pan_gesture_drag_end (GtkGestureDrag *gesture,
gtk_widget_queue_allocate (GTK_WIDGET (sw));
}
-static void
-gtk_switch_create_pango_layouts (GtkSwitch *self)
-{
- GtkSwitchPrivate *priv = self->priv;
-
- /* Glyphs for the ON state, in descending order of preference */
- const char *on_glyphs[] = {
- "⏽", /* U+23FD POWER ON SYMBOL */
- "❙", /* U+2759 MEDIUM VERTICAL BAR */
- ""
- };
-
- /* Glyphs for the OFF state, in descending order of preference */
- const char *off_glyphs[] = {
- "⭘", /* U+2B58 HEAVY CIRCLE */
- "○", /* U+25CB WHITE CIRCLE */
- ""
- };
- int i;
-
- g_clear_object (&priv->on_layout);
-
- for (i = 0; i < G_N_ELEMENTS (on_glyphs); i++)
- {
- PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), on_glyphs[i]);
-
- if (pango_layout_get_unknown_glyphs_count (layout) == 0)
- {
- priv->on_layout = layout;
- break;
- }
-
- g_object_unref (layout);
- }
-
- g_clear_object (&priv->off_layout);
-
- for (i = 0; i < G_N_ELEMENTS (off_glyphs); i++)
- {
- PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), off_glyphs[i]);
-
- if (pango_layout_get_unknown_glyphs_count (layout) == 0)
- {
- priv->off_layout = layout;
- break;
- }
-
- g_object_unref (layout);
- }
-}
-
-static void
-gtk_switch_screen_changed (GtkWidget *widget,
- GdkScreen *prev_screen)
-{
- gtk_switch_create_pango_layouts (GTK_SWITCH (widget));
-}
-
-static void
-gtk_switch_style_updated (GtkWidget *widget)
-{
- GtkSwitch *self = GTK_SWITCH (widget);
- GtkStyleContext *context;
- GtkCssStyleChange *change;
-
- GTK_WIDGET_CLASS (gtk_switch_parent_class)->style_updated (widget);
-
- context = gtk_widget_get_style_context (widget);
- change = gtk_style_context_get_change (context);
-
- if (change == NULL || gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_FONT))
- gtk_switch_create_pango_layouts (self);
-}
-
-
-
static gboolean
gtk_switch_enter (GtkWidget *widget,
GdkEventCrossing *event)
@@ -454,7 +379,8 @@ gtk_switch_get_content_size (GtkCssGadget *gadget,
GtkSwitch *self;
GtkSwitchPrivate *priv;
gint slider_minimum, slider_natural;
- PangoRectangle on_rect, off_rect;
+ gint on_minimum, on_natural;
+ gint off_minimum, off_natural;
widget = gtk_css_gadget_get_owner (gadget);
self = GTK_SWITCH (widget);
@@ -466,20 +392,26 @@ gtk_switch_get_content_size (GtkCssGadget *gadget,
&slider_minimum, &slider_natural,
NULL, NULL);
- pango_layout_get_pixel_extents (priv->on_layout, NULL, &on_rect);
- pango_layout_get_pixel_extents (priv->off_layout, NULL, &off_rect);
+ gtk_css_gadget_get_preferred_size (priv->on_gadget,
+ orientation,
+ -1,
+ &on_minimum, &on_natural,
+ NULL, NULL);
+ gtk_css_gadget_get_preferred_size (priv->off_gadget,
+ orientation,
+ -1,
+ &off_minimum, &off_natural,
+ NULL, NULL);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
{
- int text_width = MAX (on_rect.width, off_rect.width);
- *minimum = 2 * MAX (slider_minimum, text_width);
- *natural = 2 * MAX (slider_natural, text_width);
+ *minimum = 2 * MAX (slider_minimum, MAX (on_minimum, off_minimum));
+ *natural = 2 * MAX (slider_natural, MAX (on_natural, off_natural));
}
else
{
- int text_height = MAX (on_rect.height, off_rect.height);
- *minimum = MAX (slider_minimum, text_height);
- *natural = MAX (slider_natural, text_height);
+ *minimum = MAX (slider_minimum, MAX (on_minimum, off_minimum));
+ *natural = MAX (slider_natural, MAX (on_natural, off_natural));
}
}
@@ -516,15 +448,28 @@ gtk_switch_allocate_contents (GtkCssGadget *gadget,
{
GtkSwitch *self = GTK_SWITCH (gtk_css_gadget_get_owner (gadget));
GtkSwitchPrivate *priv = self->priv;
- GtkAllocation slider_alloc;
+ GtkAllocation child_alloc;
- slider_alloc.x = allocation->x + round (priv->handle_pos * (allocation->width - allocation->width / 2));
- slider_alloc.y = allocation->y;
- slider_alloc.width = allocation->width / 2;
- slider_alloc.height = allocation->height;
+ child_alloc.x = allocation->x + round (priv->handle_pos * (allocation->width - allocation->width / 2));
+ child_alloc.y = allocation->y;
+ child_alloc.width = allocation->width / 2;
+ child_alloc.height = allocation->height;
gtk_css_gadget_allocate (priv->slider_gadget,
- &slider_alloc,
+ &child_alloc,
+ baseline,
+ out_clip);
+
+ child_alloc.x = allocation->x;
+
+ gtk_css_gadget_allocate (priv->on_gadget,
+ &child_alloc,
+ baseline,
+ out_clip);
+
+ child_alloc.x = allocation->x + allocation->width - child_alloc.width;
+ gtk_css_gadget_allocate (priv->off_gadget,
+ &child_alloc,
baseline,
out_clip);
@@ -653,24 +598,9 @@ gtk_switch_render_trough (GtkCssGadget *gadget,
{
GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
GtkSwitchPrivate *priv = GTK_SWITCH (widget)->priv;
- GtkStyleContext *context = gtk_widget_get_style_context (widget);
- PangoRectangle rect;
- gint label_x, label_y;
-
- pango_layout_get_pixel_extents (priv->on_layout, NULL, &rect);
-
- label_x = x + ((width / 2) - rect.width) / 2;
- label_y = y + (height - rect.height) / 2;
-
- gtk_render_layout (context, cr, label_x, label_y, priv->on_layout);
-
- pango_layout_get_pixel_extents (priv->off_layout, NULL, &rect);
-
- label_x = x + (width / 2) + ((width / 2) - rect.width) / 2;
- label_y = y + (height - rect.height) / 2;
-
- gtk_render_layout (context, cr, label_x, label_y, priv->off_layout);
+ gtk_css_gadget_draw (priv->on_gadget, cr);
+ gtk_css_gadget_draw (priv->off_gadget, cr);
gtk_css_gadget_draw (priv->slider_gadget, cr);
return FALSE;
@@ -686,6 +616,21 @@ gtk_switch_draw (GtkWidget *widget,
}
static void
+gtk_switch_state_flags_changed (GtkWidget *widget,
+ GtkStateFlags previous_state_flags)
+{
+ GtkSwitchPrivate *priv = GTK_SWITCH (widget)->priv;
+ GtkStateFlags state = gtk_widget_get_state_flags (widget);
+
+ gtk_css_gadget_set_state (priv->gadget, state);
+ gtk_css_gadget_set_state (priv->slider_gadget, state);
+ gtk_css_gadget_set_state (priv->on_gadget, state);
+ gtk_css_gadget_set_state (priv->off_gadget, state);
+
+ GTK_WIDGET_CLASS (gtk_switch_parent_class)->state_flags_changed (widget, previous_state_flags);
+}
+
+static void
gtk_switch_set_related_action (GtkSwitch *sw,
GtkAction *action)
{
@@ -861,13 +806,12 @@ gtk_switch_dispose (GObject *object)
g_clear_object (&priv->gadget);
g_clear_object (&priv->slider_gadget);
+ g_clear_object (&priv->on_gadget);
+ g_clear_object (&priv->off_gadget);
g_clear_object (&priv->pan_gesture);
g_clear_object (&priv->multipress_gesture);
- g_clear_object (&priv->on_layout);
- g_clear_object (&priv->off_layout);
-
G_OBJECT_CLASS (gtk_switch_parent_class)->dispose (object);
}
@@ -960,8 +904,7 @@ gtk_switch_class_init (GtkSwitchClass *klass)
widget_class->draw = gtk_switch_draw;
widget_class->enter_notify_event = gtk_switch_enter;
widget_class->leave_notify_event = gtk_switch_leave;
- widget_class->screen_changed = gtk_switch_screen_changed;
- widget_class->style_updated = gtk_switch_style_updated;
+ widget_class->state_flags_changed = gtk_switch_state_flags_changed;
klass->activate = gtk_switch_activate;
klass->state_set = state_set;
@@ -1091,6 +1034,16 @@ gtk_switch_init (GtkSwitch *self)
NULL,
NULL);
+ priv->on_gadget = gtk_icon_helper_new_named ("image", GTK_WIDGET (self));
+ _gtk_icon_helper_set_icon_name (GTK_ICON_HELPER (priv->on_gadget), "switch-on-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_css_node_set_parent (gtk_css_gadget_get_node (priv->on_gadget), widget_node);
+ gtk_css_node_set_state (gtk_css_gadget_get_node (priv->on_gadget), gtk_css_node_get_state (widget_node));
+
+ priv->off_gadget = gtk_icon_helper_new_named ("image", GTK_WIDGET (self));
+ _gtk_icon_helper_set_icon_name (GTK_ICON_HELPER (priv->off_gadget), "switch-off-symbolic", GTK_ICON_SIZE_MENU);
+ gtk_css_node_set_parent (gtk_css_gadget_get_node (priv->off_gadget), widget_node);
+ gtk_css_node_set_state (gtk_css_gadget_get_node (priv->off_gadget), gtk_css_node_get_state (widget_node));
+
gesture = gtk_gesture_multi_press_new (GTK_WIDGET (self));
gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (gesture), FALSE);
gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (gesture), TRUE);
@@ -1113,8 +1066,6 @@ gtk_switch_init (GtkSwitch *self)
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture),
GTK_PHASE_BUBBLE);
priv->pan_gesture = gesture;
-
- gtk_switch_create_pango_layouts (self);
}
/**