[gtk+] gtkbin: Complete more of a base implementation for GtkBin subclasses



commit 3563d11fc6f6191cfd6c4cbaa47e554b5c66dfa0
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Nov 8 18:21:01 2012 -0500

    gtkbin: Complete more of a base implementation for GtkBin subclasses
    
    Implement get_preferred_width, get_preferred_height, and size_allocate.
    This allows GtkBin subclasses to be quick and easy, without the
    author doing the subclassing to have to do much work.

 gtk/gtkbin.c |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 59 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkbin.c b/gtk/gtkbin.c
index e39ef02..cd80286 100644
--- a/gtk/gtkbin.c
+++ b/gtk/gtkbin.c
@@ -56,7 +56,12 @@ static void gtk_bin_forall      (GtkContainer   *container,
 				 gpointer        callback_data);
 static GType gtk_bin_child_type (GtkContainer   *container);
 
-
+static void               gtk_bin_get_preferred_width             (GtkWidget           *widget,
+                                                                   gint                *minimum_width,
+                                                                   gint                *natural_width);
+static void               gtk_bin_get_preferred_height            (GtkWidget           *widget,
+                                                                   gint                *minimum_height,
+                                                                   gint                *natural_height);
 static void               gtk_bin_get_preferred_width_for_height  (GtkWidget           *widget,
                                                                    gint                 height,
                                                                    gint                *minimum_width,
@@ -65,6 +70,8 @@ static void               gtk_bin_get_preferred_height_for_width  (GtkWidget
                                                                    gint                 width,
                                                                    gint                *minimum_height,
                                                                    gint                *natural_height);
+static void               gtk_bin_size_allocate                   (GtkWidget           *widget,
+                                                                   GtkAllocation       *allocation);
 
 G_DEFINE_ABSTRACT_TYPE (GtkBin, gtk_bin, GTK_TYPE_CONTAINER)
 
@@ -74,8 +81,11 @@ gtk_bin_class_init (GtkBinClass *class)
   GtkWidgetClass *widget_class = (GtkWidgetClass*) class;
   GtkContainerClass *container_class = (GtkContainerClass*) class;
 
+  widget_class->get_preferred_width = gtk_bin_get_preferred_width;
+  widget_class->get_preferred_height = gtk_bin_get_preferred_height;
   widget_class->get_preferred_width_for_height = gtk_bin_get_preferred_width_for_height;
   widget_class->get_preferred_height_for_width = gtk_bin_get_preferred_height_for_width;
+  widget_class->size_allocate = gtk_bin_size_allocate;
 
   container_class->add = gtk_bin_add;
   container_class->remove = gtk_bin_remove;
@@ -209,6 +219,42 @@ get_child_padding_delta (GtkBin *bin,
   *delta_v = vmin - child_vmin;
 }
 
+static void
+gtk_bin_get_preferred_width (GtkWidget *widget,
+                             gint      *minimum_width,
+                             gint      *natural_width)
+{
+  GtkBin *bin = GTK_BIN (widget);
+  GtkBinPrivate *priv = bin->priv;
+
+  if (priv->child)
+    {
+      gint child_min, child_nat;
+      gtk_widget_get_preferred_width (priv->child,
+                                      &child_min, &child_nat);
+      *minimum_width = child_min;
+      *natural_width = child_nat;
+    }
+}
+
+static void
+gtk_bin_get_preferred_height (GtkWidget *widget,
+                              gint      *minimum_height,
+                              gint      *natural_height)
+{
+  GtkBin *bin = GTK_BIN (widget);
+  GtkBinPrivate *priv = bin->priv;
+
+  if (priv->child)
+    {
+      gint child_min, child_nat;
+      gtk_widget_get_preferred_height (priv->child,
+                                       &child_min, &child_nat);
+      *minimum_height = child_min;
+      *natural_height = child_nat;
+    }
+}
+
 static void 
 gtk_bin_get_preferred_width_for_height (GtkWidget *widget,
                                         gint       height,
@@ -265,6 +311,18 @@ gtk_bin_get_preferred_height_for_width  (GtkWidget *widget,
     GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, minimum_height, natural_height);
 }
 
+static void
+gtk_bin_size_allocate (GtkWidget     *widget,
+                       GtkAllocation *allocation)
+{
+  GtkBin *bin = GTK_BIN (widget);
+  GtkBinPrivate *priv = bin->priv;
+
+  gtk_widget_set_allocation (widget, allocation);
+
+  if (priv->child)
+    gtk_widget_size_allocate (priv->child, allocation);
+}
 
 /**
  * gtk_bin_get_child:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]