forked from AuroraMiddleware/gtk
range: add positional style classes to fill/highlight
Requested by Lapo.
This commit is contained in:
parent
832742e1f3
commit
7ff2f451ce
@ -278,6 +278,8 @@ static gboolean gtk_range_key_press (GtkWidget *range,
|
||||
GdkEventKey *event);
|
||||
static void gtk_range_state_flags_changed (GtkWidget *widget,
|
||||
GtkStateFlags previous_state);
|
||||
static void gtk_range_direction_changed (GtkWidget *widget,
|
||||
GtkTextDirection previous_direction);
|
||||
static void gtk_range_measure_trough (GtkCssGadget *gadget,
|
||||
GtkOrientation orientation,
|
||||
gint for_size,
|
||||
@ -352,6 +354,7 @@ gtk_range_class_init (GtkRangeClass *class)
|
||||
widget_class->scroll_event = gtk_range_scroll_event;
|
||||
widget_class->key_press_event = gtk_range_key_press;
|
||||
widget_class->state_flags_changed = gtk_range_state_flags_changed;
|
||||
widget_class->direction_changed = gtk_range_direction_changed;
|
||||
|
||||
class->move_slider = gtk_range_move_slider;
|
||||
class->change_value = gtk_range_real_change_value;
|
||||
@ -961,6 +964,60 @@ gtk_range_set_adjustment (GtkRange *range,
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
should_invert (GtkRange *range)
|
||||
{
|
||||
GtkRangePrivate *priv = range->priv;
|
||||
|
||||
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||
return
|
||||
(priv->inverted && !priv->flippable) ||
|
||||
(priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_LTR) ||
|
||||
(!priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_RTL);
|
||||
else
|
||||
return priv->inverted;
|
||||
}
|
||||
|
||||
static void
|
||||
update_highlight_position (GtkRange *range)
|
||||
{
|
||||
GtkRangePrivate *priv = range->priv;
|
||||
|
||||
if (!priv->highlight_gadget)
|
||||
return;
|
||||
|
||||
if (should_invert (range))
|
||||
{
|
||||
gtk_css_gadget_remove_class (priv->highlight_gadget, GTK_STYLE_CLASS_TOP);
|
||||
gtk_css_gadget_add_class (priv->highlight_gadget, GTK_STYLE_CLASS_BOTTOM);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_css_gadget_remove_class (priv->highlight_gadget, GTK_STYLE_CLASS_BOTTOM);
|
||||
gtk_css_gadget_add_class (priv->highlight_gadget, GTK_STYLE_CLASS_TOP);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
update_fill_position (GtkRange *range)
|
||||
{
|
||||
GtkRangePrivate *priv = range->priv;
|
||||
|
||||
if (!priv->fill_gadget)
|
||||
return;
|
||||
|
||||
if (should_invert (range))
|
||||
{
|
||||
gtk_css_gadget_remove_class (priv->fill_gadget, GTK_STYLE_CLASS_TOP);
|
||||
gtk_css_gadget_add_class (priv->fill_gadget, GTK_STYLE_CLASS_BOTTOM);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_css_gadget_remove_class (priv->fill_gadget, GTK_STYLE_CLASS_BOTTOM);
|
||||
gtk_css_gadget_add_class (priv->fill_gadget, GTK_STYLE_CLASS_TOP);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
update_stepper_state (GtkRange *range,
|
||||
Stepper stepper,
|
||||
@ -1039,6 +1096,9 @@ gtk_range_set_inverted (GtkRange *range,
|
||||
priv->inverted = setting;
|
||||
|
||||
update_steppers_state (range);
|
||||
update_fill_position (range);
|
||||
update_highlight_position (range);
|
||||
|
||||
gtk_widget_queue_resize (GTK_WIDGET (range));
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (range), properties[PROP_INVERTED]);
|
||||
@ -1088,6 +1148,8 @@ gtk_range_set_flippable (GtkRange *range,
|
||||
if (flippable != priv->flippable)
|
||||
{
|
||||
priv->flippable = flippable;
|
||||
update_fill_position (range);
|
||||
update_highlight_position (range);
|
||||
|
||||
gtk_widget_queue_allocate (GTK_WIDGET (range));
|
||||
}
|
||||
@ -1565,6 +1627,8 @@ gtk_range_set_show_fill_level (GtkRange *range,
|
||||
NULL, NULL);
|
||||
gtk_css_gadget_set_state (priv->fill_gadget,
|
||||
gtk_css_node_get_state (gtk_css_gadget_get_node (priv->trough_gadget)));
|
||||
|
||||
update_fill_position (range);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1710,20 +1774,6 @@ gtk_range_get_fill_level (GtkRange *range)
|
||||
return range->priv->fill_level;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
should_invert (GtkRange *range)
|
||||
{
|
||||
GtkRangePrivate *priv = range->priv;
|
||||
|
||||
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||
return
|
||||
(priv->inverted && !priv->flippable) ||
|
||||
(priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_LTR) ||
|
||||
(!priv->inverted && priv->flippable && gtk_widget_get_direction (GTK_WIDGET (range)) == GTK_TEXT_DIR_RTL);
|
||||
else
|
||||
return priv->inverted;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_range_destroy (GtkWidget *widget)
|
||||
{
|
||||
@ -2264,6 +2314,18 @@ update_trough_state (GtkRange *range)
|
||||
gtk_css_gadget_set_state (priv->fill_gadget, state);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_range_direction_changed (GtkWidget *widget,
|
||||
GtkTextDirection previous_direction)
|
||||
{
|
||||
GtkRange *range = GTK_RANGE (widget);
|
||||
|
||||
update_fill_position (range);
|
||||
update_highlight_position (range);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_range_parent_class)->direction_changed (widget, previous_direction);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_range_state_flags_changed (GtkWidget *widget,
|
||||
GtkStateFlags previous_state)
|
||||
@ -3805,6 +3867,8 @@ _gtk_range_set_has_origin (GtkRange *range,
|
||||
NULL, NULL);
|
||||
gtk_css_gadget_set_state (priv->highlight_gadget,
|
||||
gtk_css_node_get_state (gtk_css_gadget_get_node (priv->trough_gadget)));
|
||||
|
||||
update_highlight_position (range);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user