[gtk+/wip/actor: 28/42] xxx: cssbox



commit 1c4a2a00a9a20a1a88d54a02948d7ced22b170ad
Author: Benjamin Otte <otte redhat com>
Date:   Sun Dec 16 16:47:53 2012 +0100

    xxx: cssbox

 gtk/actors/gtkcssbox.c |   68 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 64 insertions(+), 4 deletions(-)
---
diff --git a/gtk/actors/gtkcssbox.c b/gtk/actors/gtkcssbox.c
index 5d574fb..9308b27 100644
--- a/gtk/actors/gtkcssbox.c
+++ b/gtk/actors/gtkcssbox.c
@@ -26,6 +26,7 @@
 #include "gtkcsstypesprivate.h"
 #include "gtkdebug.h"
 #include "gtkintl.h"
+#include "gtklayoutmanagerprivate.h"
 #include "gtkprivate.h"
 #include "gtkstylecontext.h"
 #include "gtkstylecontextprivate.h"
@@ -240,7 +241,7 @@ gtk_css_box_real_map (GtkActor *self)
 static void
 gtk_css_box_real_unmap (GtkActor *self)
 {
-  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->map (self);
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->unmap (self);
   
   _gtk_style_context_update_animating (_gtk_css_actor_get_style_context (GTK_CSS_ACTOR (self)));
 }
@@ -331,17 +332,42 @@ gtk_css_box_get_edge (GtkCssBox  *self,
 }
 
 static void
+adjust_size_for_css (GtkCssBox      *self,
+                     GtkOrientation  orientation,
+                     gfloat         *min_size_p,
+                     gfloat         *nat_size_p)
+{
+  GtkStyleContext *context;
+  gfloat min_css, nat_css;
+
+  context = _gtk_css_actor_get_style_context (GTK_CSS_ACTOR (self));
+
+  min_css = _gtk_css_number_value_get (
+                _gtk_style_context_peek_property (context,
+                      orientation == GTK_ORIENTATION_HORIZONTAL ? GTK_CSS_PROPERTY_MIN_WIDTH
+                                                                : GTK_CSS_PROPERTY_MIN_HEIGHT), 0);
+  nat_css = _gtk_css_number_value_get (
+                _gtk_style_context_peek_property (context,
+                      orientation == GTK_ORIENTATION_HORIZONTAL ? GTK_CSS_PROPERTY_MAX_WIDTH 
+                                                                : GTK_CSS_PROPERTY_MAX_HEIGHT), 0);
+
+  *min_size_p = MAX (min_css, *min_size_p);
+  *nat_size_p = MIN (nat_css, *nat_size_p);
+  *nat_size_p = MAX (*min_size_p, *nat_size_p);
+}
+
+static void
 gtk_css_box_real_get_preferred_size (GtkActor       *self,
                                      GtkOrientation  orientation,
                                      gfloat          for_size,
                                      gfloat         *min_size_p,
-                                     gfloat         *natural_size_p)
+                                     gfloat         *nat_size_p)
 {
   GtkCssBox *box = GTK_CSS_BOX (self);
   float extra_size;
 
   *min_size_p = 0;
-  *natural_size_p = 0;
+  *nat_size_p = 0;
   if (for_size >= 0)
     {
       if (orientation == GTK_ORIENTATION_VERTICAL)
@@ -358,7 +384,40 @@ gtk_css_box_real_get_preferred_size (GtkActor       *self,
     extra_size = gtk_css_box_get_edge (box, GTK_CSS_TOP) + gtk_css_box_get_edge (box, GTK_CSS_BOTTOM);
 
   *min_size_p = MAX (0, *min_size_p + extra_size);
-  *natural_size_p = MAX (0, *natural_size_p + extra_size);
+  *nat_size_p = MAX (0, *nat_size_p + extra_size);
+
+  adjust_size_for_css (box, orientation, min_size_p, nat_size_p);
+}
+
+static void
+gtk_css_box_real_allocate (GtkActor *actor,
+                           gfloat    width,
+                           gfloat    height)
+{
+  GtkCssBox *self = GTK_CSS_BOX (actor);
+  GtkLayoutManager *layout_manager;
+
+  layout_manager = _gtk_actor_get_layout_manager (actor);
+
+  if (layout_manager)
+    {
+      cairo_matrix_t transform;
+      double top, left, bottom, right;
+
+      top = gtk_css_box_get_edge (self, GTK_CSS_TOP);
+      left = gtk_css_box_get_edge (self, GTK_CSS_LEFT);
+      bottom = gtk_css_box_get_edge (self, GTK_CSS_BOTTOM);
+      right = gtk_css_box_get_edge (self, GTK_CSS_RIGHT);
+
+      cairo_matrix_init_translate (&transform, left, top);
+
+      _gtk_layout_manager_allocate (layout_manager,
+                                    &transform,
+                                    width - left - right,
+                                    height - top - bottom);
+    }
+  
+  GTK_ACTOR_CLASS (_gtk_css_box_parent_class)->allocate (actor, width, height);
 }
 
 static void
@@ -399,6 +458,7 @@ _gtk_css_box_class_init (GtkCssBoxClass *klass)
   actor_class->draw = gtk_css_box_real_draw;
   actor_class->parent_set = gtk_css_box_real_parent_set;
   actor_class->get_preferred_size = gtk_css_box_real_get_preferred_size;
+  actor_class->allocate = gtk_css_box_real_allocate;
 
   /**
    * GtkCssBox:state:



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