[maemo-commits] [maemo-commits] r9026 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Wed Jan 10 15:10:46 EET 2007
- Previous message: [maemo-commits] r9025 - projects/haf/trunk/osso-application-installer/debian
- Next message: [maemo-commits] r9027 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildonwm test
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: mitch Date: 2007-01-10 15:10:43 +0200 (Wed, 10 Jan 2007) New Revision: 9026 Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.c projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.h Log: 2007-01-10 Michael Natterer <mitch at imendio.com> Merged from upstream trunk: * gtk/gtkrange.[ch]: added properties "fill-level", "show-fill-level" and "restrict-to-fill-level" and getters/setters for them. The "fill level" is an additional marker on the range's trough than can be e.g. used to indicate the amount of pre-buffering in a range showing the play position of streamed media. See the embedded API docs for details. Made GtkRangeLayout a GTypeInstance private struct and removed finalize() implementation. Fixes bug #349808 * gtk/gtk.symbols: added the new symbols. Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog 2007-01-10 13:06:05 UTC (rev 9025) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog 2007-01-10 13:10:43 UTC (rev 9026) @@ -1,3 +1,18 @@ +2007-01-10 Michael Natterer <mitch at imendio.com> + + Merged from upstream trunk: + + * gtk/gtkrange.[ch]: added properties "fill-level", + "show-fill-level" and "restrict-to-fill-level" and getters/setters + for them. The "fill level" is an additional marker on the range's + trough than can be e.g. used to indicate the amount of + pre-buffering in a range showing the play position of streamed + media. See the embedded API docs for details. Made GtkRangeLayout + a GTypeInstance private struct and removed finalize() + implementation. Fixes bug #349808 + + * gtk/gtk.symbols: added the new symbols. + 2007-01-05 Michael Natterer <mitch at imendio.com> * gtk/gtkwindow.c (gtk_window_key_release_event): chain up to Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols 2007-01-10 13:06:05 UTC (rev 9025) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols 2007-01-10 13:10:43 UTC (rev 9026) @@ -2959,17 +2959,23 @@ #if IN_HEADER(__GTK_RANGE_H__) #if IN_FILE(__GTK_RANGE_C__) gtk_range_get_adjustment +gtk_range_get_fill_level gtk_range_get_inverted gtk_range_get_lower_stepper_sensitivity +gtk_range_get_restrict_to_fill_level +gtk_range_get_show_fill_level gtk_range_get_type G_GNUC_CONST gtk_range_get_update_policy gtk_range_get_upper_stepper_sensitivity gtk_range_get_value gtk_range_set_adjustment +gtk_range_set_fill_level gtk_range_set_increments gtk_range_set_inverted gtk_range_set_lower_stepper_sensitivity gtk_range_set_range +gtk_range_set_restrict_to_fill_level +gtk_range_set_show_fill_level gtk_range_set_update_policy gtk_range_set_upper_stepper_sensitivity gtk_range_set_value Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.c =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.c 2007-01-10 13:06:05 UTC (rev 9025) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.c 2007-01-10 13:10:43 UTC (rev 9026) @@ -47,7 +47,10 @@ PROP_ADJUSTMENT, PROP_INVERTED, PROP_LOWER_STEPPER_SENSITIVITY, - PROP_UPPER_STEPPER_SENSITIVITY + PROP_UPPER_STEPPER_SENSITIVITY, + PROP_SHOW_FILL_LEVEL, + PROP_RESTRICT_TO_FILL_LEVEL, + PROP_FILL_LEVEL }; enum { @@ -69,6 +72,8 @@ MOUSE_WIDGET /* inside widget but not in any of the above GUI elements */ } MouseLocation; +#define GTK_RANGE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RANGE, GtkRangeLayout)) + struct _GtkRangeLayout { /* These are in widget->window coordinates */ @@ -97,8 +102,14 @@ guint lower_sensitive : 1; guint upper_sensitive : 1; + /* Fill level */ + guint show_fill_level : 1; + guint restrict_to_fill_level : 1; + GtkSensitivityType lower_sensitivity; GtkSensitivityType upper_sensitivity; + + gdouble fill_level; }; @@ -111,7 +122,6 @@ GValue *value, GParamSpec *pspec); static void gtk_range_destroy (GtkObject *object); -static void gtk_range_finalize (GObject *object); static void gtk_range_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_range_size_allocate (GtkWidget *widget, @@ -215,7 +225,6 @@ gobject_class->set_property = gtk_range_set_property; gobject_class->get_property = gtk_range_get_property; - gobject_class->finalize = gtk_range_finalize; object_class->destroy = gtk_range_destroy; widget_class->size_request = gtk_range_size_request; @@ -352,6 +361,58 @@ GTK_SENSITIVITY_AUTO, GTK_PARAM_READWRITE)); + /** + * GtkRange:show-fill-level: + * + * The show-fill-level property controls wether fill level indicator + * graphics are displayed on the trough. See + * gtk_range_set_show_fill_level(). + * + * Since: 2.12 + **/ + g_object_class_install_property (gobject_class, + PROP_SHOW_FILL_LEVEL, + g_param_spec_boolean ("show-fill-level", + P_("Show Fill Level"), + P_("Whether to display a fill level indicator graphics on trough."), + FALSE, + GTK_PARAM_READWRITE)); + + /** + * GtkRange:restrict-to-fill-level: + * + * The restrict-to-fill-level proeprty controls whether slider + * movement is restricted to an upper boundary set by the + * fill-level. See gtk_range_set_restrict_to_fill_level(). + * + * Since: 2.12 + **/ + g_object_class_install_property (gobject_class, + PROP_RESTRICT_TO_FILL_LEVEL, + g_param_spec_boolean ("restrict-to-fill-level", + P_("Restrict to Fill Level"), + P_("Whether to restrict the upper boundary to the fill level."), + TRUE, + GTK_PARAM_READWRITE)); + + /** + * GtkRange:fill-level: + * + * The fill level (e.g. prebuffering of a network stream). + * See gtk_range_set_fill_level(). + * + * Since: 2.12 + **/ + g_object_class_install_property (gobject_class, + PROP_FILL_LEVEL, + g_param_spec_double ("fill-level", + P_("Fill Level"), + P_("The fill level."), + -G_MAXDOUBLE, + G_MAXDOUBLE, + G_MAXDOUBLE, + GTK_PARAM_READWRITE)); + gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("slider-width", P_("Slider Width"), @@ -444,6 +505,8 @@ P_("Whether to draw trought for full length of range or exclude the steppers and spacing"), TRUE, GTK_PARAM_READABLE)); + + g_type_class_add_private (class, sizeof (GtkRangeLayout)); } static void @@ -473,6 +536,15 @@ case PROP_UPPER_STEPPER_SENSITIVITY: gtk_range_set_upper_stepper_sensitivity (range, g_value_get_enum (value)); break; + case PROP_SHOW_FILL_LEVEL: + gtk_range_set_show_fill_level (range, g_value_get_boolean (value)); + break; + case PROP_RESTRICT_TO_FILL_LEVEL: + gtk_range_set_restrict_to_fill_level (range, g_value_get_boolean (value)); + break; + case PROP_FILL_LEVEL: + gtk_range_set_fill_level (range, g_value_get_double (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -506,6 +578,15 @@ case PROP_UPPER_STEPPER_SENSITIVITY: g_value_set_enum (value, gtk_range_get_upper_stepper_sensitivity (range)); break; + case PROP_SHOW_FILL_LEVEL: + g_value_set_boolean (value, gtk_range_get_show_fill_level (range)); + break; + case PROP_RESTRICT_TO_FILL_LEVEL: + g_value_set_boolean (value, gtk_range_get_restrict_to_fill_level (range)); + break; + case PROP_FILL_LEVEL: + g_value_set_double (value, gtk_range_get_fill_level (range)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -528,7 +609,7 @@ range->has_stepper_d = FALSE; range->need_recalc = TRUE; range->round_digits = -1; - range->layout = g_new0 (GtkRangeLayout, 1); + range->layout = GTK_RANGE_GET_PRIVATE (range); range->layout->mouse_location = MOUSE_OUTSIDE; range->layout->mouse_x = -1; range->layout->mouse_y = -1; @@ -538,6 +619,9 @@ range->layout->upper_sensitivity = GTK_SENSITIVITY_AUTO; range->layout->lower_sensitive = TRUE; range->layout->upper_sensitive = TRUE; + range->layout->show_fill_level = FALSE; + range->layout->restrict_to_fill_level = TRUE; + range->layout->fill_level = G_MAXDOUBLE; range->timer = NULL; } @@ -845,8 +929,13 @@ range->adjustment->lower = min; range->adjustment->upper = max; - value = CLAMP (range->adjustment->value, - range->adjustment->lower, + value = range->adjustment->value; + + if (range->layout->restrict_to_fill_level) + value = MIN (value, MAX (range->adjustment->lower, + range->layout->fill_level)); + + value = CLAMP (value, range->adjustment->lower, (range->adjustment->upper - range->adjustment->page_size)); gtk_adjustment_set_value (range->adjustment, value); @@ -869,7 +958,11 @@ gdouble value) { g_return_if_fail (GTK_IS_RANGE (range)); - + + if (range->layout->restrict_to_fill_level) + value = MIN (value, MAX (range->adjustment->lower, + range->layout->fill_level)); + value = CLAMP (value, range->adjustment->lower, (range->adjustment->upper - range->adjustment->page_size)); @@ -892,6 +985,153 @@ return range->adjustment->value; } +/** + * gtk_range_set_show_fill_level: + * @range: A #GtkRange + * @show_fill_level: Whether a fill level indicator graphics is shown. + * + * Sets whether a graphical fill level is show on the trough. See + * gtk_range_set_fill_level() for a general description of the fill + * level concept. + * + * Since: 2.12 + **/ +void +gtk_range_set_show_fill_level (GtkRange *range, + gboolean show_fill_level) +{ + g_return_if_fail (GTK_IS_RANGE (range)); + + show_fill_level = show_fill_level ? TRUE : FALSE; + + if (show_fill_level != range->layout->show_fill_level) + { + range->layout->show_fill_level = show_fill_level; + g_object_notify (G_OBJECT (range), "show-fill-level"); + gtk_widget_queue_draw (GTK_WIDGET (range)); + } +} + +/** + * gtk_range_get_show_fill_level: + * @range: A #GtkRange + * + * Return value: Whether GtkRange displays a fill level graphics. + * + * Since: 2.12 + **/ +gboolean +gtk_range_get_show_fill_level (GtkRange *range) +{ + g_return_val_if_fail (GTK_IS_RANGE (range), FALSE); + + return range->layout->show_fill_level; +} + +/** + * gtk_range_set_restrict_to_fill_level: + * @range: A #GtkRange + * @restrict_to_fill_level: Whether the fill level restricts slider movement. + * + * Sets whether the slider is restricted to the fill level. See + * gtk_range_set_fill_level() for a general description of the fill + * level concept. + * + * Since: 2.12 + **/ +void +gtk_range_set_restrict_to_fill_level (GtkRange *range, + gboolean restrict_to_fill_level) +{ + g_return_if_fail (GTK_IS_RANGE (range)); + + restrict_to_fill_level = restrict_to_fill_level ? TRUE : FALSE; + + if (restrict_to_fill_level != range->layout->restrict_to_fill_level) + { + range->layout->restrict_to_fill_level = restrict_to_fill_level; + g_object_notify (G_OBJECT (range), "restrict-to-fill-level"); + + gtk_range_set_value (range, gtk_range_get_value (range)); + } +} + +/** + * gtk_range_get_restrict_to_fill_level: + * @range: A #GtkRange + * + * Return value: Whether GtkRange is restricted to the fill level. + * + * Since: 2.12 + **/ +gboolean +gtk_range_get_restrict_to_fill_level (GtkRange *range) +{ + g_return_val_if_fail (GTK_IS_RANGE (range), FALSE); + + return range->layout->restrict_to_fill_level; +} + +/** + * gtk_range_set_fill_level: + * @range: A #GtkRange + * @positon: The new position of the fill level indicator + * + * Set the new position of the fill level indicator. + * + * The "fill level" is probably best described by its most prominent + * use case, which is an indicator for the amount of pre-buffering in + * a streaming media player. In that use case, the value of the range + * would indicate the current play position, and the fill level would + * be the position up to which the file/stream has been downloaded. + * + * This amount of prebuffering can be displayed on the range's trough + * and is themeable separately from the trough. To enable fill level + * display, use gtk_range_set_show_fill_level(). The range defaults + * to not showing the fill level. + * + * Additionally, it's possible to restrict the range's slider position + * to values which are smaller than the fill level. This is controller + * by gtk_range_set_restrict_to_fill_level() and is by default + * enabled. + * + * Since: 2.12 + **/ +void +gtk_range_set_fill_level (GtkRange *range, + gdouble fill_level) +{ + g_return_if_fail (GTK_IS_RANGE (range)); + + if (fill_level != range->layout->fill_level) + { + range->layout->fill_level = fill_level; + g_object_notify (G_OBJECT (range), "fill-level"); + + if (range->layout->show_fill_level) + gtk_widget_queue_draw (GTK_WIDGET (range)); + + if (range->layout->restrict_to_fill_level) + gtk_range_set_value (range, gtk_range_get_value (range)); + } +} + +/** + * gtk_range_get_fill_level: + * @range : A #GtkRange + * + * Return value: The current position of the fill level indicator. + * + * Since: 2.12 + **/ +gdouble +gtk_range_get_fill_level (GtkRange *range) +{ + g_return_val_if_fail (GTK_IS_RANGE (range), 0.0); + + return range->layout->fill_level; +} + static gboolean should_invert (GtkRange *range) { @@ -905,16 +1145,6 @@ } static void -gtk_range_finalize (GObject *object) -{ - GtkRange *range = GTK_RANGE (object); - - g_free (range->layout); - - (* G_OBJECT_CLASS (gtk_range_parent_class)->finalize) (object); -} - -static void gtk_range_destroy (GtkObject *object) { GtkRange *range = GTK_RANGE (object); @@ -1315,6 +1545,64 @@ height - trough_change_pos_y); } + if (range->layout->show_fill_level && + range->adjustment->upper - range->adjustment->page_size - + range->adjustment->lower != 0) + { + gdouble fill_level = range->layout->fill_level; + gint fill_x = x; + gint fill_y = y; + gint fill_width = width; + gint fill_height = height; + gchar *fill_detail; + + fill_level = CLAMP (fill_level, range->adjustment->lower, + range->adjustment->upper - + range->adjustment->page_size); + + if (range->orientation == GTK_ORIENTATION_HORIZONTAL) + { + fill_x = widget->allocation.x + range->layout->trough.x; + fill_width = (range->layout->slider.width + + (fill_level - range->adjustment->lower) / + (range->adjustment->upper - + range->adjustment->lower - + range->adjustment->page_size) * + (range->layout->trough.width - + range->layout->slider.width)); + + if (should_invert (range)) + fill_x += range->layout->trough.width - fill_width; + } + else + { + fill_y = widget->allocation.y + range->layout->trough.y; + fill_height = (range->layout->slider.height + + (fill_level - range->adjustment->lower) / + (range->adjustment->upper - + range->adjustment->lower - + range->adjustment->page_size) * + (range->layout->trough.height - + range->layout->slider.height)); + + if (should_invert (range)) + fill_y += range->layout->trough.height - fill_height; + } + + if (fill_level < range->adjustment->upper - range->adjustment->page_size) + fill_detail = "trough-fill-level-full"; + else + fill_detail = "trough-fill-level"; + + gtk_paint_box (widget->style, + widget->window, + sensitive ? GTK_STATE_ACTIVE : GTK_STATE_INSENSITIVE, + GTK_SHADOW_OUT, + &area, GTK_WIDGET (range), fill_detail, + fill_x, fill_y, + fill_width, fill_height); + } + if (sensitive && GTK_WIDGET_HAS_FOCUS (range)) gtk_paint_focus (widget->style, widget->window, GTK_WIDGET_STATE (widget), @@ -2901,6 +3189,10 @@ /* potentially adjust the bounds _before we clamp */ g_signal_emit (range, signals[ADJUST_BOUNDS], 0, value); + if (range->layout->restrict_to_fill_level) + value = MIN (value, MAX (range->adjustment->lower, + range->layout->fill_level)); + value = CLAMP (value, range->adjustment->lower, (range->adjustment->upper - range->adjustment->page_size)); Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.h =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.h 2007-01-10 13:06:05 UTC (rev 9025) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrange.h 2007-01-10 13:10:43 UTC (rev 9026) @@ -160,7 +160,17 @@ gdouble value); gdouble gtk_range_get_value (GtkRange *range); -gdouble _gtk_range_get_wheel_delta (GtkRange *range, +void gtk_range_set_show_fill_level (GtkRange *range, + gboolean show_fill_level); +gboolean gtk_range_get_show_fill_level (GtkRange *range); +void gtk_range_set_restrict_to_fill_level (GtkRange *range, + gboolean restrict_to_fill_level); +gboolean gtk_range_get_restrict_to_fill_level (GtkRange *range); +void gtk_range_set_fill_level (GtkRange *range, + gdouble fill_level); +gdouble gtk_range_get_fill_level (GtkRange *range); + +gdouble _gtk_range_get_wheel_delta (GtkRange *range, GdkScrollDirection direction); /* MAEMO START */
- Previous message: [maemo-commits] r9025 - projects/haf/trunk/osso-application-installer/debian
- Next message: [maemo-commits] r9027 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildonwm test
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]