diff options
author | Timm Bäder <mail@baedert.org> | 2017-05-07 21:39:37 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2017-07-19 21:27:12 -0400 |
commit | 6e74975e4124b6aded16868d4c46d56b513991f6 (patch) | |
tree | a1a406a87d23e3758181f6ee66b29f000de84d01 | |
parent | c7c08cf9a11fc2b431cddd9bf0ab59be272141c3 (diff) | |
download | gtk+-6e74975e4124b6aded16868d4c46d56b513991f6.tar.gz |
range: make the slider a gadget
-rw-r--r-- | gtk/gtkrange.c | 160 | ||||
-rw-r--r-- | gtk/gtkrangeprivate.h | 2 | ||||
-rw-r--r-- | gtk/gtkscale.c | 6 |
3 files changed, 82 insertions, 86 deletions
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index 4b80c22f2b..51030472bd 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -32,9 +32,7 @@ #include "gtkrangeprivate.h" #include "gtkadjustmentprivate.h" -#include "gtkboxgadgetprivate.h" #include "gtkbuiltiniconprivate.h" -#include "gtkcsscustomgadgetprivate.h" #include "gtkcolorscaleprivate.h" #include "gtkintl.h" #include "gtkgesturelongpressprivate.h" @@ -49,6 +47,7 @@ #include "gtkwidgetprivate.h" #include "a11y/gtkrangeaccessible.h" #include "gtkgizmoprivate.h" +#include "gtkiconprivate.h" /** * SECTION:gtkrange @@ -74,11 +73,11 @@ typedef struct _GtkRangeStepTimer GtkRangeStepTimer; struct _GtkRangePrivate { - GtkCssGadget *mouse_location; + GtkWidget *mouse_location; /* last mouse coords we got, or G_MININT if mouse is outside the range */ gint mouse_x; gint mouse_y; - GtkCssGadget *grab_location; /* "grabbed" mouse location, NULL for no grab */ + GtkWidget *grab_location; /* "grabbed" mouse location, NULL for no grab */ GtkRangeStepTimer *timer; @@ -87,7 +86,7 @@ struct _GtkRangePrivate GtkWidget *trough_widget; GtkWidget *fill_widget; GtkWidget *highlight_widget; - GtkCssGadget *slider_gadget; + GtkWidget *slider_widget; GtkOrientation orientation; @@ -258,6 +257,16 @@ static guint signals[LAST_SIGNAL]; static GParamSpec *properties[LAST_PROP]; static void +gtk_range_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + GtkRange *range = GTK_RANGE (widget); + GtkRangePrivate *priv = gtk_range_get_instance_private (range); + + gtk_widget_snapshot_child (widget, priv->trough_widget, snapshot); +} + +static void gtk_range_class_init (GtkRangeClass *class) { GObjectClass *gobject_class; @@ -272,6 +281,7 @@ gtk_range_class_init (GtkRangeClass *class) widget_class->destroy = gtk_range_destroy; widget_class->measure = gtk_range_measure; + widget_class->snapshot = gtk_range_snapshot; widget_class->size_allocate = gtk_range_size_allocate; widget_class->unmap = gtk_range_unmap; widget_class->snapshot = gtk_range_snapshot; @@ -540,7 +550,6 @@ static void gtk_range_init (GtkRange *range) { GtkRangePrivate *priv; - GtkCssNode *widget_node; range->priv = gtk_range_get_instance_private (range); priv = range->priv; @@ -562,7 +571,6 @@ gtk_range_init (GtkRange *range) _gtk_orientable_set_style_classes (GTK_ORIENTABLE (range)); - widget_node = gtk_widget_get_css_node (GTK_WIDGET (range)); priv->trough_widget = gtk_gizmo_new ("trough", gtk_range_measure_trough, gtk_range_allocate_trough, @@ -570,13 +578,8 @@ gtk_range_init (GtkRange *range) gtk_widget_set_parent (priv->trough_widget, GTK_WIDGET (range)); - priv->slider_gadget = gtk_builtin_icon_new ("slider", - GTK_WIDGET (range), - NULL, NULL); - gtk_css_node_set_parent (gtk_css_gadget_get_node (priv->slider_gadget), - gtk_widget_get_css_node (priv->trough_widget)); - gtk_css_gadget_set_state (priv->slider_gadget, - gtk_css_node_get_state (widget_node)); + priv->slider_widget = gtk_icon_new ("slider"); + gtk_widget_set_parent (priv->slider_widget, priv->trough_widget); /* Note: Order is important here. * The ::drag-begin handler relies on the state set up by the @@ -878,7 +881,7 @@ gtk_range_set_slider_size_fixed (GtkRange *range, priv->slider_size_fixed = size_fixed ? TRUE : FALSE; if (priv->adjustment && gtk_widget_get_mapped (GTK_WIDGET (range))) - gtk_css_gadget_queue_allocate (priv->slider_gadget); + gtk_widget_queue_allocate (priv->trough_widget); } } @@ -902,21 +905,6 @@ gtk_range_get_slider_size_fixed (GtkRange *range) return range->priv->slider_size_fixed; } -static void -measure_one_gadget (GtkCssGadget *gadget, - int *width_out, - int *height_out) -{ - gtk_css_gadget_get_preferred_size (gadget, - GTK_ORIENTATION_HORIZONTAL, -1, - width_out, NULL, - NULL, NULL); - gtk_css_gadget_get_preferred_size (gadget, - GTK_ORIENTATION_VERTICAL, -1, - height_out, NULL, - NULL, NULL); -} - /** * gtk_range_get_range_rect: * @range: a #GtkRange @@ -966,7 +954,7 @@ gtk_range_get_slider_range (GtkRange *range, priv = range->priv; - gtk_css_gadget_get_margin_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_margin_allocation (priv->slider_widget, &slider_alloc); if (priv->orientation == GTK_ORIENTATION_VERTICAL) { @@ -1317,8 +1305,7 @@ gtk_range_finalize (GObject *object) g_clear_object (&priv->multipress_gesture); g_clear_object (&priv->long_press_gesture); - g_clear_object (&priv->slider_gadget); - + gtk_widget_unparent (priv->slider_widget); if (priv->fill_widget) gtk_widget_unparent (priv->fill_widget); @@ -1345,10 +1332,10 @@ gtk_range_measure_trough (GtkGizmo *gizmo, GtkRangePrivate *priv = range->priv; gint min, nat; - gtk_css_gadget_get_preferred_size (priv->slider_gadget, - orientation, -1, - minimum, natural, - NULL, NULL); + gtk_widget_measure (priv->slider_widget, + orientation, -1, + minimum, natural, + NULL, NULL); if (priv->fill_widget) { @@ -1440,10 +1427,8 @@ gtk_range_allocate_trough (GtkGizmo *gizmo, gtk_adjustment_get_value (priv->adjustment), &slider_alloc); - gtk_css_gadget_allocate (priv->slider_gadget, - &slider_alloc, - gtk_widget_get_allocated_baseline (widget), - out_clip); + gtk_widget_size_allocate (priv->slider_widget, &slider_alloc); + gtk_widget_get_clip (priv->slider_widget, out_clip); value = (gtk_adjustment_get_value (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment)) / (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment)); @@ -1679,14 +1664,14 @@ update_slider_state (GtkRange *range) state &= ~(GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_ACTIVE); - if (priv->mouse_location == priv->slider_gadget && + if (priv->mouse_location == priv->slider_widget && !(state & GTK_STATE_FLAG_INSENSITIVE)) state |= GTK_STATE_FLAG_PRELIGHT; - if (priv->grab_location == priv->slider_gadget) + if (priv->grab_location == priv->slider_widget) state |= GTK_STATE_FLAG_ACTIVE; - gtk_css_gadget_set_state (priv->slider_gadget, state); + gtk_widget_set_state_flags (priv->slider_widget, state, TRUE); } static void @@ -1766,16 +1751,27 @@ gtk_range_snapshot (GtkWidget *widget, { GtkRange *range = GTK_RANGE (widget); GtkRangePrivate *priv = range->priv; + GtkAllocation range_allocation; + GtkAllocation trough_allocation; + int x, y; gtk_widget_snapshot_child (widget, priv->trough_widget, snapshot); /* Draw the slider last, so that e.g. the focus ring stays below it */ - gtk_css_gadget_snapshot (priv->slider_gadget, snapshot); + gtk_widget_get_allocation (widget, &range_allocation); + gtk_widget_get_content_allocation (priv->trough_widget, &trough_allocation); + + x = trough_allocation.x - range_allocation.x; + y = trough_allocation.y - range_allocation.y; + + gtk_snapshot_offset (snapshot, x, y); + gtk_widget_snapshot_child (priv->trough_widget, priv->slider_widget, snapshot); + gtk_snapshot_offset (snapshot, -x, -y); } static void -range_grab_add (GtkRange *range, - GtkCssGadget *location) +range_grab_add (GtkRange *range, + GtkWidget *location) { GtkRangePrivate *priv = range->priv; GtkStyleContext *context; @@ -1788,7 +1784,7 @@ range_grab_add (GtkRange *range, * is the only widget receiving the pointer events. */ priv->grab_location = location; - gtk_css_gadget_queue_allocate (location); + gtk_widget_queue_resize (location); update_trough_state (range); update_slider_state (range); @@ -1823,7 +1819,7 @@ range_grab_remove (GtkRange *range) context = gtk_widget_get_style_context (GTK_WIDGET (range)); - gtk_css_gadget_queue_allocate (priv->grab_location); + gtk_widget_queue_resize (priv->grab_location); priv->grab_location = NULL; gtk_range_update_mouse_location (range); @@ -1866,7 +1862,7 @@ coord_to_value (GtkRange *range, gint slider_length; GtkAllocation slider_alloc, trough_alloc; - gtk_css_gadget_get_margin_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_margin_allocation (priv->slider_widget, &slider_alloc); gtk_widget_get_content_allocation (priv->trough_widget, &trough_alloc); if (priv->orientation == GTK_ORIENTATION_VERTICAL) @@ -1923,7 +1919,7 @@ gtk_range_key_press (GtkWidget *widget, { GtkAllocation slider_alloc; - gtk_css_gadget_get_margin_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_margin_allocation (priv->slider_widget, &slider_alloc); if (priv->orientation == GTK_ORIENTATION_VERTICAL) priv->slide_initial_slider_position = slider_alloc.y; @@ -1967,11 +1963,11 @@ gtk_range_long_press_gesture_pressed (GtkGestureLongPress *gesture, gtk_range_update_mouse_location (range); - if (priv->mouse_location == priv->slider_gadget && !priv->zoom) + if (priv->mouse_location == priv->slider_widget && !priv->zoom) { GtkAllocation slider_alloc; - gtk_css_gadget_get_margin_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_margin_allocation (priv->slider_widget, &slider_alloc); update_initial_slider_position (range, x, y, &slider_alloc); update_zoom_state (range, TRUE); } @@ -2012,13 +2008,13 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture, priv->mouse_y = y; gtk_range_update_mouse_location (range); - gtk_css_gadget_get_margin_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_margin_allocation (priv->slider_widget, &slider_alloc); g_object_get (gtk_widget_get_settings (widget), "gtk-primary-button-warps-slider", &primary_warps, NULL); - if (priv->mouse_location == priv->slider_gadget && + if (priv->mouse_location == priv->slider_widget && gdk_event_triggers_context_menu (event)) { gboolean handled; @@ -2028,14 +2024,14 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture, return; } - if (priv->mouse_location == priv->slider_gadget) + if (priv->mouse_location == priv->slider_widget) { /* Shift-click in the slider = fine adjustment */ if (shift_pressed) update_zoom_state (range, TRUE); update_initial_slider_position (range, x, y, &slider_alloc); - range_grab_add (range, priv->slider_gadget); + range_grab_add (range, priv->slider_widget); gtk_widget_queue_draw (widget); } @@ -2065,7 +2061,7 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture, gtk_range_compute_slider_position (range, new_value, &slider); update_initial_slider_position (range, x, y, &slider); - range_grab_add (range, priv->slider_gadget); + range_grab_add (range, priv->slider_widget); gtk_widget_queue_draw (widget); @@ -2108,7 +2104,7 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture, add_autoscroll (range); } - if (priv->grab_location == priv->slider_gadget); + if (priv->grab_location == priv->slider_widget); /* leave it to ::drag-begin to claim the sequence */ else if (priv->grab_location != NULL) gtk_gesture_set_state (priv->multipress_gesture, GTK_EVENT_SEQUENCE_CLAIMED); @@ -2169,7 +2165,7 @@ update_slider_position (GtkRange *range, { GtkAllocation slider_alloc; - gtk_css_gadget_get_margin_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_margin_allocation (priv->slider_widget, &slider_alloc); if (priv->orientation == GTK_ORIENTATION_VERTICAL) priv->slide_initial_slider_position = (zoom * (mouse_y - priv->slide_initial_coordinate_delta) - slider_alloc.y) / (zoom - 1.0); @@ -2440,7 +2436,7 @@ gtk_range_drag_gesture_update (GtkGestureDrag *gesture, GtkRangePrivate *priv = range->priv; gdouble start_x, start_y; - if (priv->grab_location == priv->slider_gadget) + if (priv->grab_location == priv->slider_widget) { gtk_gesture_drag_get_start_point (gesture, &start_x, &start_y); priv->mouse_x = start_x + offset_x; @@ -2461,7 +2457,7 @@ gtk_range_drag_gesture_begin (GtkGestureDrag *gesture, { GtkRangePrivate *priv = range->priv; - if (priv->grab_location == priv->slider_gadget) + if (priv->grab_location == priv->slider_widget) gtk_gesture_set_state (priv->drag_gesture, GTK_EVENT_SEQUENCE_CLAIMED); } @@ -2751,7 +2747,7 @@ gtk_range_update_mouse_location (GtkRange *range) { GtkRangePrivate *priv = range->priv; gint x, y; - GtkCssGadget *old_location; + GtkWidget *old_location; GtkWidget *widget = GTK_WIDGET (range); GdkRectangle trough_alloc, slider_alloc, slider_trace; @@ -2761,13 +2757,15 @@ gtk_range_update_mouse_location (GtkRange *range) y = priv->mouse_y; gtk_widget_get_border_allocation (priv->trough_widget, &trough_alloc); - gtk_css_gadget_get_border_box (priv->slider_gadget, &slider_alloc); + gtk_widget_get_border_allocation (priv->slider_widget, &slider_alloc); gdk_rectangle_union (&slider_alloc, &trough_alloc, &slider_trace); if (priv->grab_location != NULL) priv->mouse_location = priv->grab_location; +#if 0 else if (gtk_css_gadget_border_box_contains_point (priv->slider_gadget, x, y)) - priv->mouse_location = priv->slider_gadget; + priv->mouse_location = priv->slider_widget; +#endif else if (rectangle_contains_point (&slider_trace, x, y)) priv->mouse_location = priv->trough_widget; #if 0 @@ -2780,21 +2778,13 @@ gtk_range_update_mouse_location (GtkRange *range) if (old_location != priv->mouse_location) { if (old_location != NULL) - { - if (GTK_IS_CSS_GADGET (old_location)) - gtk_css_gadget_queue_allocate (old_location); - else - gtk_widget_queue_allocate (GTK_WIDGET (old_location)); - } + gtk_widget_queue_allocate (GTK_WIDGET (old_location)); if (priv->mouse_location != NULL) { gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_PRELIGHT, FALSE); - if (GTK_IS_CSS_GADGET (priv->mouse_location)) - gtk_css_gadget_queue_allocate (priv->mouse_location); - else - gtk_widget_queue_allocate (GTK_WIDGET (priv->mouse_location)); + gtk_widget_queue_allocate (GTK_WIDGET (priv->mouse_location)); } else { @@ -2815,7 +2805,15 @@ gtk_range_compute_slider_position (GtkRange *range, GtkAllocation trough_content_alloc; int slider_width, slider_height, min_slider_size; - measure_one_gadget (priv->slider_gadget, &slider_width, &slider_height); + gtk_widget_measure (priv->slider_widget, + GTK_ORIENTATION_HORIZONTAL, -1, + &slider_width, NULL, + NULL, NULL); + gtk_widget_measure (priv->slider_widget, + GTK_ORIENTATION_VERTICAL, slider_width, + &slider_height, NULL, + NULL, NULL); + gtk_widget_get_content_allocation (priv->trough_widget, &trough_content_alloc); if (priv->orientation == GTK_ORIENTATION_VERTICAL) @@ -2938,9 +2936,7 @@ gtk_range_calc_slider (GtkRange *range) else visible = TRUE; - gtk_css_gadget_set_visible (priv->slider_gadget, visible); - - gtk_css_gadget_queue_allocate (priv->slider_gadget); + gtk_widget_set_visible (priv->slider_widget, visible); if (priv->has_origin) gtk_widget_queue_allocate (priv->trough_widget); @@ -3177,8 +3173,8 @@ gtk_range_get_round_digits (GtkRange *range) return range->priv->round_digits; } -GtkCssGadget * -gtk_range_get_slider_gadget (GtkRange *range) +GtkWidget * +gtk_range_get_slider_widget (GtkRange *range) { - return range->priv->slider_gadget; + return range->priv->slider_widget; } diff --git a/gtk/gtkrangeprivate.h b/gtk/gtkrangeprivate.h index f1d082a407..fcfd861641 100644 --- a/gtk/gtkrangeprivate.h +++ b/gtk/gtkrangeprivate.h @@ -43,7 +43,7 @@ void _gtk_range_set_stop_values (GtkRange *range gint _gtk_range_get_stop_positions (GtkRange *range, gint **values); -GtkCssGadget *gtk_range_get_slider_gadget (GtkRange *range); +GtkWidget *gtk_range_get_slider_widget (GtkRange *range); G_END_DECLS diff --git a/gtk/gtkscale.c b/gtk/gtkscale.c index 93125a9d18..d27e21c499 100644 --- a/gtk/gtkscale.c +++ b/gtk/gtkscale.c @@ -290,13 +290,13 @@ gtk_scale_allocate_value (GtkScale *scale, GtkScalePrivate *priv = scale->priv; GtkWidget *widget = GTK_WIDGET (scale); GtkRange *range = GTK_RANGE (widget); - GtkCssGadget *slider_gadget; + GtkWidget *slider_widget; GtkAllocation range_alloc, slider_alloc, value_alloc; gtk_widget_get_margin_allocation (widget, &range_alloc); - slider_gadget = gtk_range_get_slider_gadget (range); - gtk_css_gadget_get_border_allocation (slider_gadget, &slider_alloc, NULL); + slider_widget = gtk_range_get_slider_widget (range); + gtk_widget_get_border_allocation (slider_widget, &slider_alloc); gtk_css_gadget_get_preferred_size (priv->value_gadget, GTK_ORIENTATION_HORIZONTAL, -1, |