]> Pileus Git - ~andy/gtk/commitdiff
Added per-stepper API for GtkRange's stepper sensitivity as discussed in
authorMichael Natterer <mitch@imendio.com>
Fri, 11 Nov 2005 12:48:29 +0000 (12:48 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Fri, 11 Nov 2005 12:48:29 +0000 (12:48 +0000)
2005-11-11  Michael Natterer  <mitch@imendio.com>

Added per-stepper API for GtkRange's stepper sensitivity as
discussed in bug #321056:

* gtk/gtkenums.h: added GtkSensitivityType which can be
{ AUTO, ON, OFF }.

* gtk/gtkrange.[ch]: added properties "lower-stepper-sensitivity"
and "upper-stepper-sensitivity" and public getters/setters for
them. Changed stepper drawing to honor the new properties.

* gtk/gtk.symbols: added the new symbols.

ChangeLog
ChangeLog.pre-2-10
gtk/gtk.symbols
gtk/gtkenums.h
gtk/gtkrange.c
gtk/gtkrange.h

index e68539e17292b5ca360d9f1e7e6bc3e9d09a8f04..5d6ca97c3c35a99e7f768b31e3c083fadba8d24d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2005-11-11  Michael Natterer  <mitch@imendio.com>
+
+       Added per-stepper API for GtkRange's stepper sensitivity as
+       discussed in bug #321056:
+
+       * gtk/gtkenums.h: added GtkSensitivityType which can be
+       { AUTO, ON, OFF }.
+
+       * gtk/gtkrange.[ch]: added properties "lower-stepper-sensitivity"
+       and "upper-stepper-sensitivity" and public getters/setters for
+       them. Changed stepper drawing to honor the new properties.
+
+       * gtk/gtk.symbols: added the new symbols.
+
 2005-11-10  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkcombobox.c: Add show-popup and hide-popup signals and
index e68539e17292b5ca360d9f1e7e6bc3e9d09a8f04..5d6ca97c3c35a99e7f768b31e3c083fadba8d24d 100644 (file)
@@ -1,3 +1,17 @@
+2005-11-11  Michael Natterer  <mitch@imendio.com>
+
+       Added per-stepper API for GtkRange's stepper sensitivity as
+       discussed in bug #321056:
+
+       * gtk/gtkenums.h: added GtkSensitivityType which can be
+       { AUTO, ON, OFF }.
+
+       * gtk/gtkrange.[ch]: added properties "lower-stepper-sensitivity"
+       and "upper-stepper-sensitivity" and public getters/setters for
+       them. Changed stepper drawing to honor the new properties.
+
+       * gtk/gtk.symbols: added the new symbols.
+
 2005-11-10  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkcombobox.c: Add show-popup and hide-popup signals and
index d45b16ab9b38d7b0c3310978366bf3b9dc7945d4..4a42eb045d5c5721f2e934bd992e293004befdae 100644 (file)
@@ -2492,14 +2492,18 @@ gtk_radio_tool_button_set_group
 #if IN_FILE(__GTK_RANGE_C__)
 gtk_range_get_adjustment
 gtk_range_get_inverted
+gtk_range_get_lower_stepper_sensitivity
 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_increments
 gtk_range_set_inverted
+gtk_range_set_lower_stepper_sensitivity
 gtk_range_set_range
 gtk_range_set_update_policy
+gtk_range_set_upper_stepper_sensitivity
 gtk_range_set_value
 #endif
 #endif
index b55d31cd75007d03cc590dda429fdd5304631979..e87ec53e0f9b31fe67525f4cf715891923fe9b6c 100644 (file)
@@ -133,6 +133,14 @@ typedef enum
   GTK_ICON_SIZE_DIALOG
 } GtkIconSize;
 
+/* automatic sensitivity */
+typedef enum
+{
+  GTK_SENSITIVITY_AUTO,
+  GTK_SENSITIVITY_ON,
+  GTK_SENSITIVITY_OFF
+} GtkSensitivityType;
+
 #ifndef GTK_DISABLE_DEPRECATED
 /* side types */
 typedef enum
index 1dc4d4b215bf6e78c97cdf50f02586c6a0c4b9f1..f9c62932a59f23e9883600a0ef557454de0df6aa 100644 (file)
@@ -45,7 +45,9 @@ enum {
   PROP_0,
   PROP_UPDATE_POLICY,
   PROP_ADJUSTMENT,
-  PROP_INVERTED
+  PROP_INVERTED,
+  PROP_LOWER_STEPPER_SENSITIVITY,
+  PROP_UPPER_STEPPER_SENSITIVITY
 };
 
 enum {
@@ -89,6 +91,10 @@ struct _GtkRangeLayout
   /* "grabbed" mouse location, OUTSIDE for no grab */
   MouseLocation grab_location;
   gint grab_button; /* 0 if none */
+
+  /* Stepper sensitivity */
+  GtkSensitivityType lower_sensitivity;
+  GtkSensitivityType upper_sensitivity;
 };
 
 
@@ -347,7 +353,25 @@ gtk_range_class_init (GtkRangeClass *class)
                                                        P_("Invert direction slider moves to increase range value"),
                                                          FALSE,
                                                          GTK_PARAM_READWRITE));
-  
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_LOWER_STEPPER_SENSITIVITY,
+                                   g_param_spec_enum ("lower-stepper-sensitivity",
+                                                     P_("Lower stepper sensitivity"),
+                                                     P_("The sensitivity policy for the stepper that points to the adjustment's lower side"),
+                                                     GTK_TYPE_SENSITIVITY_TYPE,
+                                                     GTK_SENSITIVITY_AUTO,
+                                                     GTK_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_UPPER_STEPPER_SENSITIVITY,
+                                   g_param_spec_enum ("upper-stepper-sensitivity",
+                                                     P_("Upper stepper sensitivity"),
+                                                     P_("The sensitivity policy for the stepper that points to the adjustment's upper side"),
+                                                     GTK_TYPE_SENSITIVITY_TYPE,
+                                                     GTK_SENSITIVITY_AUTO,
+                                                     GTK_PARAM_READWRITE));
+
   gtk_widget_class_install_style_property (widget_class,
                                           g_param_spec_int ("slider-width",
                                                             P_("Slider Width"),
@@ -419,6 +443,12 @@ gtk_range_set_property (GObject      *object,
     case PROP_INVERTED:
       gtk_range_set_inverted (range, g_value_get_boolean (value));
       break;
+    case PROP_LOWER_STEPPER_SENSITIVITY:
+      gtk_range_set_lower_stepper_sensitivity (range, g_value_get_enum (value));
+      break;
+    case PROP_UPPER_STEPPER_SENSITIVITY:
+      gtk_range_set_upper_stepper_sensitivity (range, g_value_get_enum (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -446,6 +476,12 @@ gtk_range_get_property (GObject      *object,
     case PROP_INVERTED:
       g_value_set_boolean (value, range->inverted);
       break;
+    case PROP_LOWER_STEPPER_SENSITIVITY:
+      g_value_set_enum (value, gtk_range_get_lower_stepper_sensitivity (range));
+      break;
+    case PROP_UPPER_STEPPER_SENSITIVITY:
+      g_value_set_enum (value, gtk_range_get_upper_stepper_sensitivity (range));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -474,6 +510,8 @@ gtk_range_init (GtkRange *range)
   range->layout->mouse_y = -1;
   range->layout->grab_location = MOUSE_OUTSIDE;
   range->layout->grab_button = 0;
+  range->layout->lower_sensitivity = GTK_SENSITIVITY_AUTO;
+  range->layout->upper_sensitivity = GTK_SENSITIVITY_AUTO;
   range->timer = NULL;  
 }
 
@@ -640,6 +678,92 @@ gtk_range_get_inverted (GtkRange *range)
   return range->inverted;
 }
 
+/**
+ * gtk_range_set_lower_stepper_sensitivity:
+ * @range:       a #GtkRange
+ * @sensitivity: the lower stepper's sensitivity policy.
+ *
+ * Sets the sensitivity policy for the stepper that points to the
+ * 'lower' end of the GtkRange's adjustment.
+ *
+ * Sine: 2.10
+ **/
+void
+gtk_range_set_lower_stepper_sensitivity (GtkRange           *range,
+                                         GtkSensitivityType  sensitivity)
+{
+  g_return_if_fail (GTK_IS_RANGE (range));
+
+  if (range->layout->lower_sensitivity != sensitivity)
+    {
+      range->layout->lower_sensitivity = sensitivity;
+      gtk_widget_queue_draw (GTK_WIDGET (range));
+      g_object_notify (G_OBJECT (range), "lower-stepper-sensitivity");
+    }
+}
+
+/**
+ * gtk_range_get_lower_stepper_sensitivity:
+ * @range: a #GtkRange
+ *
+ * Gets the sensitivity policy for the stepper that points to the
+ * 'lower' end of the GtkRange's adjustment.
+ *
+ * Return value: The lower stepper's sensitivity policy.
+ *
+ * Since: 2.10
+ **/
+GtkSensitivityType
+gtk_range_get_lower_stepper_sensitivity (GtkRange *range)
+{
+  g_return_val_if_fail (GTK_IS_RANGE (range), GTK_SENSITIVITY_AUTO);
+
+  return range->layout->lower_sensitivity;
+}
+
+/**
+ * gtk_range_set_upper_stepper_sensitivity:
+ * @range:       a #GtkRange
+ * @sensitivity: the upper stepper's sensitivity policy.
+ *
+ * Sets the sensitivity policy for the stepper that points to the
+ * 'upper' end of the GtkRange's adjustment.
+ *
+ * Sine: 2.10
+ **/
+void
+gtk_range_set_upper_stepper_sensitivity (GtkRange           *range,
+                                         GtkSensitivityType  sensitivity)
+{
+  g_return_if_fail (GTK_IS_RANGE (range));
+
+  if (range->layout->upper_sensitivity != sensitivity)
+    {
+      range->layout->upper_sensitivity = sensitivity;
+      gtk_widget_queue_draw (GTK_WIDGET (range));
+      g_object_notify (G_OBJECT (range), "upper-stepper-sensitivity");
+    }
+}
+
+/**
+ * gtk_range_get_upper_stepper_sensitivity:
+ * @range: a #GtkRange
+ *
+ * Gets the sensitivity policy for the stepper that points to the
+ * 'upper' end of the GtkRange's adjustment.
+ *
+ * Return value: The upper stepper's sensitivity policy.
+ *
+ * Since: 2.10
+ **/
+GtkSensitivityType
+gtk_range_get_upper_stepper_sensitivity (GtkRange *range)
+{
+  g_return_val_if_fail (GTK_IS_RANGE (range), GTK_SENSITIVITY_AUTO);
+
+  return range->layout->upper_sensitivity;
+}
+
 /**
  * gtk_range_set_increments:
  * @range: a #GtkRange
@@ -919,7 +1043,7 @@ draw_stepper (GtkRange     *range,
   gint arrow_width;
   gint arrow_height;
 
-  gboolean arrow_insensitive = FALSE;
+  gboolean arrow_sensitive = TRUE;
 
   /* More to get the right clip region than for efficiency */
   if (!gdk_rectangle_intersect (area, rect, &intersection))
@@ -928,25 +1052,48 @@ draw_stepper (GtkRange     *range,
   intersection.x += widget->allocation.x;
   intersection.y += widget->allocation.y;
 
-  if (((!range->inverted && (arrow_type == GTK_ARROW_DOWN ||
-                             arrow_type == GTK_ARROW_RIGHT)) ||
-       (range->inverted  && (arrow_type == GTK_ARROW_UP ||
-                             arrow_type == GTK_ARROW_LEFT))) &&
-      range->adjustment->value >=
-      (range->adjustment->upper - range->adjustment->page_size))
+  if ((!range->inverted && (arrow_type == GTK_ARROW_DOWN ||
+                            arrow_type == GTK_ARROW_RIGHT)) ||
+      (range->inverted  && (arrow_type == GTK_ARROW_UP ||
+                            arrow_type == GTK_ARROW_LEFT)))
     {
-      arrow_insensitive = TRUE;
+      switch (range->layout->upper_sensitivity)
+        {
+        case GTK_SENSITIVITY_AUTO:
+          arrow_sensitive =
+            (range->adjustment->value <
+             (range->adjustment->upper - range->adjustment->page_size));
+          break;
+
+        case GTK_SENSITIVITY_ON:
+          arrow_sensitive = TRUE;
+          break;
+
+        case GTK_SENSITIVITY_OFF:
+          arrow_sensitive = FALSE;
+          break;
+        }
     }
-  else if (((!range->inverted && (arrow_type == GTK_ARROW_UP ||
-                                  arrow_type == GTK_ARROW_LEFT)) ||
-            (range->inverted  && (arrow_type == GTK_ARROW_DOWN ||
-                                  arrow_type == GTK_ARROW_RIGHT))) &&
-           range->adjustment->value <= range->adjustment->lower)
+  else
     {
-      arrow_insensitive = TRUE;
+      switch (range->layout->lower_sensitivity)
+        {
+        case GTK_SENSITIVITY_AUTO:
+          arrow_sensitive =
+            (range->adjustment->value > range->adjustment->lower);
+          break;
+
+        case GTK_SENSITIVITY_ON:
+          arrow_sensitive = TRUE;
+          break;
+
+        case GTK_SENSITIVITY_OFF:
+          arrow_sensitive = FALSE;
+          break;
+        }
     }
 
-  if (!GTK_WIDGET_IS_SENSITIVE (range) || arrow_insensitive)
+  if (!GTK_WIDGET_IS_SENSITIVE (range) || !arrow_sensitive)
     state_type = GTK_STATE_INSENSITIVE;
   else if (clicked)
     state_type = GTK_STATE_ACTIVE;
@@ -955,7 +1102,7 @@ draw_stepper (GtkRange     *range,
   else 
     state_type = GTK_STATE_NORMAL;
 
-  if (clicked && ! arrow_insensitive)
+  if (clicked && arrow_sensitive)
     shadow_type = GTK_SHADOW_IN;
   else
     shadow_type = GTK_SHADOW_OUT;
@@ -975,7 +1122,7 @@ draw_stepper (GtkRange     *range,
   arrow_x = widget->allocation.x + rect->x + (rect->width - arrow_width) / 2;
   arrow_y = widget->allocation.y + rect->y + (rect->height - arrow_height) / 2;
   
-  if (clicked && ! arrow_insensitive)
+  if (clicked && arrow_sensitive)
     {
       gint arrow_displacement_x;
       gint arrow_displacement_y;
index 7bd057e51b5b86b467ffc7826e4bc32335e5dc62..d4ef1b3e81b639d165968fa649651d3125dca5ba 100644 (file)
@@ -129,29 +129,39 @@ struct _GtkRangeClass
 };
 
 
-GType          gtk_range_get_type               (void) G_GNUC_CONST;
-
-void           gtk_range_set_update_policy (GtkRange      *range,
-                                            GtkUpdateType  policy);
-GtkUpdateType  gtk_range_get_update_policy (GtkRange      *range);
-void           gtk_range_set_adjustment    (GtkRange      *range,
-                                            GtkAdjustment *adjustment);
-GtkAdjustment* gtk_range_get_adjustment    (GtkRange      *range);
-void           gtk_range_set_inverted      (GtkRange      *range,
-                                            gboolean       setting);
-gboolean       gtk_range_get_inverted      (GtkRange      *range);
-void           gtk_range_set_increments    (GtkRange      *range,
-                                            gdouble        step,
-                                            gdouble        page);
-void           gtk_range_set_range         (GtkRange      *range,
-                                            gdouble        min,
-                                            gdouble        max);
-void           gtk_range_set_value         (GtkRange      *range,
-                                            gdouble        value);
-gdouble        gtk_range_get_value         (GtkRange      *range);
-
-gdouble              _gtk_range_get_wheel_delta   (GtkRange           *range,
-                                           GdkScrollDirection  direction);
+GType              gtk_range_get_type                      (void) G_GNUC_CONST;
+
+void               gtk_range_set_update_policy             (GtkRange      *range,
+                                                            GtkUpdateType  policy);
+GtkUpdateType      gtk_range_get_update_policy             (GtkRange      *range);
+
+void               gtk_range_set_adjustment                (GtkRange      *range,
+                                                            GtkAdjustment *adjustment);
+GtkAdjustment*     gtk_range_get_adjustment                (GtkRange      *range);
+
+void               gtk_range_set_inverted                  (GtkRange      *range,
+                                                            gboolean       setting);
+gboolean           gtk_range_get_inverted                  (GtkRange      *range);
+
+void               gtk_range_set_lower_stepper_sensitivity (GtkRange      *range,
+                                                            GtkSensitivityType sensitivity);
+GtkSensitivityType gtk_range_get_lower_stepper_sensitivity (GtkRange      *range);
+void               gtk_range_set_upper_stepper_sensitivity (GtkRange      *range,
+                                                            GtkSensitivityType sensitivity);
+GtkSensitivityType gtk_range_get_upper_stepper_sensitivity (GtkRange      *range);
+
+void               gtk_range_set_increments                (GtkRange      *range,
+                                                            gdouble        step,
+                                                            gdouble        page);
+void               gtk_range_set_range                     (GtkRange      *range,
+                                                            gdouble        min,
+                                                            gdouble        max);
+void               gtk_range_set_value                     (GtkRange      *range,
+                                                            gdouble        value);
+gdouble            gtk_range_get_value                     (GtkRange      *range);
+
+gdouble                  _gtk_range_get_wheel_delta               (GtkRange      *range,
+                                                            GdkScrollDirection direction);
 
 
 G_END_DECLS