[gtk+/native-layout-incubator] Add a GtkExtendedLayout implementation for GtkFrame



commit 538ec4efbbb605a1360cb2ec5abf0ac0c17774de
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Apr 26 18:07:42 2010 -0400

    Add a GtkExtendedLayout implementation for GtkFrame

 gtk/gtkframe.c |  156 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 116 insertions(+), 40 deletions(-)
---
diff --git a/gtk/gtkframe.c b/gtk/gtkframe.c
index ce01435..1d8b92e 100644
--- a/gtk/gtkframe.c
+++ b/gtk/gtkframe.c
@@ -31,6 +31,7 @@
 #include "gtkprivate.h"
 #include "gtkintl.h"
 #include "gtkbuildable.h"
+#include "gtkextendedlayout.h"
 #include "gtkalias.h"
 
 #define LABEL_PAD 1
@@ -81,9 +82,19 @@ static void gtk_frame_buildable_add_child           (GtkBuildable *buildable,
 						     GObject      *child,
 						     const gchar  *type);
 
+static void gtk_frame_extended_layout_init (GtkExtendedLayoutIface *iface);
+static void gtk_frame_get_desired_width    (GtkExtendedLayout      *layout,
+                                            gint                   *minimum_size,
+                                            gint                   *natural_size);
+static void gtk_frame_get_desired_height   (GtkExtendedLayout      *layout,
+                                            gint                   *minimum_size,
+                                            gint                   *natural_size);
+
 G_DEFINE_TYPE_WITH_CODE (GtkFrame, gtk_frame, GTK_TYPE_BIN,
 			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
-						gtk_frame_buildable_init))
+						gtk_frame_buildable_init)
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_EXTENDED_LAYOUT,
+                                                gtk_frame_extended_layout_init))
 
 static void
 gtk_frame_class_init (GtkFrameClass *class)
@@ -150,7 +161,6 @@ gtk_frame_class_init (GtkFrameClass *class)
                                                         GTK_PARAM_READWRITE));
   
   widget_class->expose_event = gtk_frame_expose;
-  widget_class->size_request = gtk_frame_size_request;
   widget_class->size_allocate = gtk_frame_size_allocate;
 
   container_class->remove = gtk_frame_remove;
@@ -602,42 +612,6 @@ gtk_frame_expose (GtkWidget      *widget,
 }
 
 static void
-gtk_frame_size_request (GtkWidget      *widget,
-			GtkRequisition *requisition)
-{
-  GtkFrame *frame = GTK_FRAME (widget);
-  GtkBin *bin = GTK_BIN (widget);
-  GtkRequisition child_requisition;
-  
-  if (frame->label_widget && gtk_widget_get_visible (frame->label_widget))
-    {
-      gtk_widget_size_request (frame->label_widget, &child_requisition);
-
-      requisition->width = child_requisition.width + 2 * LABEL_PAD + 2 * LABEL_SIDE_PAD;
-      requisition->height =
-	MAX (0, child_requisition.height - widget->style->ythickness);
-    }
-  else
-    {
-      requisition->width = 0;
-      requisition->height = 0;
-    }
-  
-  if (bin->child && gtk_widget_get_visible (bin->child))
-    {
-      gtk_widget_size_request (bin->child, &child_requisition);
-
-      requisition->width = MAX (requisition->width, child_requisition.width);
-      requisition->height += child_requisition.height;
-    }
-
-  requisition->width += (GTK_CONTAINER (widget)->border_width +
-			 GTK_WIDGET (widget)->style->xthickness) * 2;
-  requisition->height += (GTK_CONTAINER (widget)->border_width +
-			  GTK_WIDGET (widget)->style->ythickness) * 2;
-}
-
-static void
 gtk_frame_size_allocate (GtkWidget     *widget,
 			 GtkAllocation *allocation)
 {
@@ -652,11 +626,15 @@ gtk_frame_size_allocate (GtkWidget     *widget,
   /* If the child allocation changed, that means that the frame is drawn
    * in a new place, so we must redraw the entire widget.
    */
-  if (gtk_widget_get_mapped (widget) &&
+  if (gtk_widget_get_mapped (widget)
+#if 0
+      &&
       (new_allocation.x != frame->child_allocation.x ||
        new_allocation.y != frame->child_allocation.y ||
        new_allocation.width != frame->child_allocation.width ||
-       new_allocation.height != frame->child_allocation.height))
+       new_allocation.height != frame->child_allocation.height)
+#endif
+     )
     gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
   
   if (bin->child && gtk_widget_get_visible (bin->child))
@@ -728,5 +706,103 @@ gtk_frame_real_compute_child_allocation (GtkFrame      *frame,
   child_allocation->y += allocation->y;
 }
 
+static void
+gtk_frame_get_desired_size (GtkExtendedLayout *layout,
+                            GtkOrientation     orientation,
+                            gint              *minimum_size,
+                            gint              *natural_size)
+{
+  GtkWidget *widget = GTK_WIDGET (layout);
+  GtkFrame *frame = GTK_FRAME (widget);
+  GtkBin *bin = GTK_BIN (widget);
+  gint child_min, child_nat;
+  gint minimum, natural;
+
+  if (frame->label_widget && gtk_widget_get_visible (frame->label_widget))
+    {
+      if (orientation == GTK_ORIENTATION_HORIZONTAL)
+        {
+          gtk_extended_layout_get_desired_width (GTK_EXTENDED_LAYOUT (frame->label_widget),
+                                                 &child_min, &child_nat);
+          minimum = child_min + 2 * LABEL_PAD + 2 * LABEL_SIDE_PAD;
+          natural = child_nat + 2 * LABEL_PAD + 2 * LABEL_SIDE_PAD;
+        }
+      else
+        {
+          gtk_extended_layout_get_desired_height (GTK_EXTENDED_LAYOUT (frame->label_widget),
+                                                  &child_min, &child_nat);
+          minimum = MAX (0, child_min - widget->style->ythickness);
+          natural = MAX (0, child_nat - widget->style->ythickness);
+        }
+    }
+  else
+    {
+      minimum = 0;
+      natural = 0;
+    }
+
+  if (bin->child && gtk_widget_get_visible (bin->child))
+    {
+      if (orientation == GTK_ORIENTATION_HORIZONTAL)
+        {
+          gtk_extended_layout_get_desired_width (GTK_EXTENDED_LAYOUT (bin->child),
+                                                 &child_min, &child_nat);
+          minimum = MAX (minimum, child_min);
+          natural = MAX (natural, child_nat);
+        }
+      else
+        {
+          gtk_extended_layout_get_desired_height (GTK_EXTENDED_LAYOUT (bin->child),
+                                                  &child_min, &child_nat);
+          minimum += child_min;
+          natural += child_nat;
+        }
+    }
+
+  if (orientation == GTK_ORIENTATION_HORIZONTAL)
+    {
+      minimum += (GTK_CONTAINER (widget)->border_width +
+                  GTK_WIDGET (widget)->style->xthickness) * 2;
+      natural += (GTK_CONTAINER (widget)->border_width +
+                  GTK_WIDGET (widget)->style->xthickness) * 2;
+    }
+  else
+    {
+      minimum += (GTK_CONTAINER (widget)->border_width +
+                  GTK_WIDGET (widget)->style->ythickness) * 2;
+      natural += (GTK_CONTAINER (widget)->border_width +
+                  GTK_WIDGET (widget)->style->ythickness) * 2;
+    }
+
+ if (minimum_size)
+    *minimum_size = minimum;
+
+  if (natural_size)
+    *natural_size = natural;
+}
+
+static void
+gtk_frame_get_desired_width (GtkExtendedLayout *layout,
+                             gint              *minimum_size,
+                             gint              *natural_size)
+{
+  gtk_frame_get_desired_size (layout, GTK_ORIENTATION_HORIZONTAL, minimum_size, natural_size);
+}
+
+static void
+gtk_frame_get_desired_height (GtkExtendedLayout *layout,
+                              gint              *minimum_size,
+                              gint              *natural_size)
+{
+  gtk_frame_get_desired_size (layout, GTK_ORIENTATION_VERTICAL, minimum_size, natural_size);
+}
+
+static void
+gtk_frame_extended_layout_init (GtkExtendedLayoutIface *iface)
+{
+  iface->get_desired_width = gtk_frame_get_desired_width;
+  iface->get_desired_height = gtk_frame_get_desired_height;
+}
+
 #define __GTK_FRAME_C__
 #include "gtkaliasdef.c"



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