* src/hildon-pannable_area.h: * src/hildon-pannable_area.c: (hildon_pannable_area_cla...
authorAlejandro G. Castro <alex@igalia.com>
Tue, 9 Dec 2008 13:16:20 +0000 (13:16 +0000)
committerAlejandro G. Castro <alex@igalia.com>
Tue, 9 Dec 2008 13:16:20 +0000 (13:16 +0000)
ChangeLog
src/hildon-pannable-area.c
src/hildon-pannable-area.h

index 4d1bb1e..2c7a3f6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-12-09  Alejandro G. Castro         <alex@igalia.com>
+
+       * src/hildon-pannable_area.h:
+       * src/hildon-pannable_area.c:
+       (hildon_pannable_area_class_init),
+       (hildon_pannable_area_set_property),
+       (hildon_pannable_area_get_property),
+       (hildon_pannable_area_size_request),
+       (hildon_pannable_area_get_size_request_policy),
+       (hildon_pannable_area_set_size_request_policy): Added new API
+       allowing applications to control the request policy. Now they can
+       choose to use the minimum (HILDON_MOVEMENT_MINIMUM) size or the
+       children allocation (HILDON_MOVEMENT_CHILDREN).
+
 2008-12-09  Alberto Garcia  <agarcia@igalia.com>
 
        * src/hildon-gtk.h
index a21d481..98e65dc 100644 (file)
@@ -98,6 +98,7 @@ struct _HildonPannableAreaPrivate {
   gboolean initial_effect;
   gboolean first_drag;
 
+  gboolean size_request_policy;
   gboolean hscroll_visible;
   gboolean vscroll_visible;
   GdkRectangle hscroll_rect;
@@ -134,7 +135,9 @@ enum {
   PROP_VOVERSHOOT_MAX,
   PROP_HOVERSHOOT_MAX,
   PROP_SCROLL_TIME,
-  PROP_INITIAL_HINT
+  PROP_INITIAL_HINT,
+  PROP_SIZE_REQUEST_POLICY,
+  PROP_LAST
 };
 
 static void hildon_pannable_area_class_init (HildonPannableAreaClass * klass);
@@ -383,6 +386,16 @@ hildon_pannable_area_class_init (HildonPannableAreaClass * klass)
                                                         G_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT));
 
+  g_object_class_install_property (object_class,
+                                   PROP_SIZE_REQUEST_POLICY,
+                                  g_param_spec_enum ("size-request-policy",
+                                                      "Size Requisition policy",
+                                                      "Controls the size request policy of the widget",
+                                                      HILDON_TYPE_SIZE_REQUEST_POLICY,
+                                                      HILDON_SIZE_REQUEST_MINIMUM,
+                                                      G_PARAM_READWRITE|
+                                                      G_PARAM_CONSTRUCT));
+
   gtk_widget_class_install_style_property (widget_class,
                                           g_param_spec_uint
                                           ("indicator-width",
@@ -519,6 +532,9 @@ hildon_pannable_area_get_property (GObject * object,
   case PROP_INITIAL_HINT:
     g_value_set_boolean (value, priv->initial_hint);
     break;
+  case PROP_SIZE_REQUEST_POLICY:
+    g_value_set_enum (value, priv->size_request_policy);
+    break;
 
   default:
     G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -594,6 +610,10 @@ hildon_pannable_area_set_property (GObject * object,
   case PROP_INITIAL_HINT:
     priv->initial_hint = g_value_get_boolean (value);
     break;
+  case PROP_SIZE_REQUEST_POLICY:
+    hildon_pannable_area_set_size_request_policy (HILDON_PANNABLE_AREA (object),
+                                                  g_value_get_enum (value));
+    break;
 
   default:
     G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -709,13 +729,27 @@ hildon_pannable_area_size_request (GtkWidget * widget,
   if (priv->hscrollbar_policy == GTK_POLICY_NEVER) {
     requisition->width = child_requisition.width;
   } else {
-    requisition->width = priv->area_width;
+    switch (priv->size_request_policy) {
+      case HILDON_SIZE_REQUEST_CHILDREN:
+        requisition->width = child_requisition.width;
+        break;
+      case HILDON_SIZE_REQUEST_MINIMUM:
+      default:
+        requisition->width = priv->area_width;
+      }
   }
 
   if (priv->vscrollbar_policy == GTK_POLICY_NEVER) {
     requisition->height = child_requisition.height;
   } else {
-    requisition->height = priv->area_width;
+    switch (priv->size_request_policy) {
+      case HILDON_SIZE_REQUEST_CHILDREN:
+        requisition->height = child_requisition.height;
+        break;
+      case HILDON_SIZE_REQUEST_MINIMUM:
+      default:
+        requisition->height = priv->area_width;
+      }
   }
 
   requisition->width += 2 * GTK_CONTAINER (widget)->border_width;
@@ -2483,3 +2517,66 @@ hildon_pannable_get_child_widget_at (HildonPannableArea *area,
 
   return child_widget;
 }
+
+/**
+ * hildon_pannable_area_get_size_request_policy:
+ * @area: A #HildonPannableArea.
+ *
+ * This function returns the current size request policy of the
+ * widget. That policy controls the way the size_request is done in
+ * the pannable area. Check
+ * hildon_pannable_area_set_size_request_policy() for a more detailed
+ * explanation.
+ *
+ * returns: the policy is currently being used in the widget
+ * #HildonSizeRequestPolicy.
+ **/
+HildonSizeRequestPolicy
+hildon_pannable_area_get_size_request_policy (HildonPannableArea *area)
+{
+  HildonPannableAreaPrivate *priv;
+
+  g_return_val_if_fail (HILDON_IS_PANNABLE_AREA (area), FALSE);
+
+  priv = area->priv;
+
+  return priv->size_request_policy;
+}
+
+/**
+ * hildon_pannable_area_set_size_request_policy:
+ * @area: A #HildonPannableArea.
+ * @size_request_policy: One of the allowed policies
+ * #HildonSizeRequestPolicy
+ *
+ * This function sets the pannable area size request policy. That
+ * policy controls the way the size_request is done in the pannable
+ * area. Pannable can use the size request of its children
+ * (#HILDON_SIZE_REQUEST_CHILDREN) or the minimum size required for
+ * the area itself (#HILDON_SIZE_REQUEST_MINIMUM), the latter is the
+ * default. Recall this size depends on the scrolling policy you are
+ * requesting to the pannable area, if you set #GTK_POLICY_NEVER this
+ * parameter will not have any effect with
+ * #HILDON_SIZE_REQUEST_MINIMUM set.
+ *
+ **/
+void
+hildon_pannable_area_set_size_request_policy (HildonPannableArea *area,
+                                              HildonSizeRequestPolicy size_request_policy)
+{
+  HildonPannableAreaPrivate *priv;
+
+  g_return_if_fail (HILDON_IS_PANNABLE_AREA (area));
+
+  priv = area->priv;
+
+  if (priv->size_request_policy == size_request_policy)
+    return;
+
+  priv->size_request_policy = size_request_policy;
+
+  gtk_widget_queue_resize (GTK_WIDGET (area));
+
+  g_object_notify (G_OBJECT (area), "size-request-policy");
+}
+
index 224cc0d..43fef9d 100644 (file)
@@ -97,6 +97,20 @@ typedef enum {
 } HildonMovementDirection;
 
 /**
+ * HildonSizeRequestPolicy:
+ * @HILDON_SIZE_REQUEST_MINIMUM: The minimum size the widget could use
+ * to paint itself
+ * @HILDON_SIZE_REQUEST_CHILDREN: The minimum size of the children of
+ * the widget
+ *
+ * Used to control the size request policy of the widget
+ */
+typedef enum {
+  HILDON_SIZE_REQUEST_MINIMUM,
+  HILDON_SIZE_REQUEST_CHILDREN
+} HildonSizeRequestPolicy;
+
+/**
  * HildonPannableArea:
  *
  * HildonPannableArea has no publicly accessible fields
@@ -143,6 +157,9 @@ void hildon_pannable_area_jump_to_child         (HildonPannableArea *area,
                                                  GtkWidget *child);
 GtkWidget* hildon_pannable_get_child_widget_at  (HildonPannableArea *area,
                                                  gdouble x, gdouble y);
+HildonSizeRequestPolicy hildon_pannable_area_get_size_request_policy (HildonPannableArea *area);
+void hildon_pannable_area_set_size_request_policy (HildonPannableArea *area,
+                                                   HildonSizeRequestPolicy size_from_child);
 
 G_END_DECLS