[glade/multiple-toplevels] * gladeui/glade-design-view.c: o draw viewport bg using base colors from style o set Layou



commit 11df99d9281be19686bc7e340bbbfd9c53221406
Author: Juan Pablo Ugarte <jp synctv com>
Date:   Wed Jan 26 19:44:31 2011 -0300

      * gladeui/glade-design-view.c:
        o draw viewport bg using base colors from style
        o set Layout box border width and spacing
    
      * gladeui/glade-design-layout.c:
        o removed padding (now set on parent)
        o added PangoLayout to draw widget name
        o added space needed for widget name in glade_design_layout_get_preferred_height ()
        o glade_design_layout_size_allocate() allocate enough space for widget name
        o moved widget name to south east and used as resize grip
        o update widget name on GladeWidget::notify:name

 gladeui/glade-design-layout.c |  138 ++++++++++++++++++++++++++++++-----------
 gladeui/glade-design-view.c   |   20 +++++-
 2 files changed, 118 insertions(+), 40 deletions(-)
---
diff --git a/gladeui/glade-design-layout.c b/gladeui/glade-design-layout.c
index b4bcb08..257ff1f 100644
--- a/gladeui/glade-design-layout.c
+++ b/gladeui/glade-design-layout.c
@@ -37,7 +37,7 @@
 						 GladeDesignLayoutPrivate))
 
 #define OUTLINE_WIDTH     4
-#define PADDING          12
+#define PADDING           2
 
 typedef enum
 {
@@ -57,6 +57,8 @@ struct _GladeDesignLayoutPrivate
   GdkRectangle east, south, south_east;
   GdkCursor *cursors[sizeof (Activity)];
 
+  PangoLayout *widget_name;
+
   /* state machine */
   Activity activity;            /* the current activity */
   gint current_width;
@@ -246,7 +248,6 @@ glade_design_layout_button_press_event (GtkWidget * widget, GdkEventButton * ev)
   x = ev->x;
   y = ev->y;
 
-
   if (ev->button == 1)
     {
       gtk_widget_get_allocation (child, &child_allocation);
@@ -297,6 +298,8 @@ glade_design_layout_get_preferred_height (GtkWidget * widget,
 
   if (child && gtk_widget_get_visible (child))
     {
+      gint height;
+
       gchild = glade_widget_get_from_gobject (child);
       g_assert (gchild);
 
@@ -306,8 +309,13 @@ glade_design_layout_get_preferred_height (GtkWidget * widget,
 
       child_height = MAX (child_height, *minimum);
 
-      *minimum = MAX (*minimum, 2 * PADDING + child_height + 2 * OUTLINE_WIDTH);
-      *natural = MAX (*natural, 2 * PADDING + child_height + 2 * OUTLINE_WIDTH);
+      if (priv->widget_name)
+        pango_layout_get_pixel_size (priv->widget_name, NULL, &height);
+      else
+        height = PADDING;
+      
+      *minimum = MAX (*minimum, PADDING + height + child_height + 3 * OUTLINE_WIDTH);
+      *natural = MAX (*natural, PADDING + height + child_height + 3 * OUTLINE_WIDTH);
     }
 
   *minimum += border_width * 2;
@@ -393,6 +401,14 @@ glade_design_layout_size_allocate (GtkWidget * widget,
       child_allocation.width = MAX (requisition.width, child_width);
       child_allocation.height = MAX (requisition.height, child_height);
 
+      if (priv->widget_name)
+        {
+          gint width;
+          pango_layout_get_pixel_size (priv->widget_name, &width, NULL);
+
+          child_allocation.width = MAX (width, child_allocation.width);
+        }
+      
       if (gtk_widget_get_realized (widget))
         gdk_window_move_resize (priv->offscreen_window,
                                 0, 0,
@@ -404,6 +420,41 @@ glade_design_layout_size_allocate (GtkWidget * widget,
 }
 
 static void
+update_south_east_rectangle (GladeDesignLayoutPrivate *priv, GtkAllocation *alloc)
+{
+  GdkRectangle *rect = &priv->south_east;
+  gint width, height;
+  
+  pango_layout_get_pixel_size (priv->widget_name, &width, &height);
+
+  rect->x = alloc->x + priv->child_offset + alloc->width - width - OUTLINE_WIDTH/2;
+  rect->y = alloc->y + priv->child_offset + alloc->height + OUTLINE_WIDTH/2;
+  rect->width = width + (OUTLINE_WIDTH*2);
+  rect->height = height + OUTLINE_WIDTH;
+
+  /* Update south rectangle width */
+  priv->south.width = rect->x - priv->south.x;
+}
+
+static void
+on_glade_widget_name_notify (GObject *gobject, GParamSpec *pspec, GladeDesignLayout *layout) 
+{
+  GladeDesignLayoutPrivate *priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (layout);
+  GtkWidget *child = gtk_bin_get_child (GTK_BIN (layout));
+  GtkAllocation alloc;
+
+  if (child == NULL) return;
+
+  pango_layout_set_text (priv->widget_name, glade_widget_get_name (GLADE_WIDGET (gobject)), -1);
+
+  gtk_widget_get_allocation (child, &alloc);
+
+  update_south_east_rectangle (priv, &alloc);
+
+  gtk_widget_queue_resize (GTK_WIDGET (layout));
+}
+
+static void
 on_child_size_allocate (GtkWidget *widget, GtkAllocation *allocation, GladeDesignLayout *layout) 
 {
   GladeDesignLayoutPrivate *priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (layout);
@@ -417,9 +468,7 @@ on_child_size_allocate (GtkWidget *widget, GtkAllocation *allocation, GladeDesig
   priv->south.y = allocation->height + priv->child_offset;
   priv->south.width = allocation->width;
 
-  priv->south_east.x = allocation->width;
-  priv->south_east.y = allocation->height;
-  priv->south_east.width = priv->south_east.height = priv->child_offset * 2;
+  update_south_east_rectangle (priv, allocation);
 }
 
 static void
@@ -427,6 +476,7 @@ glade_design_layout_add (GtkContainer * container, GtkWidget * widget)
 {
   GladeDesignLayoutPrivate *priv = GLADE_DESIGN_LAYOUT_GET_PRIVATE (container);
   GladeDesignLayout *layout = GLADE_DESIGN_LAYOUT (container);
+  GladeWidget *gchild;
 
   layout->priv->current_width = 0;
   layout->priv->current_height = 0;
@@ -440,14 +490,27 @@ glade_design_layout_add (GtkContainer * container, GtkWidget * widget)
                     G_CALLBACK (on_child_size_allocate),
                     GLADE_DESIGN_LAYOUT (container));
 
-  gtk_widget_queue_draw (GTK_WIDGET (container));
+  if ((gchild = glade_widget_get_from_gobject (G_OBJECT (widget))))
+    {
+      on_glade_widget_name_notify (G_OBJECT (gchild), NULL, layout);
+      g_signal_connect (gchild, "notify::name", G_CALLBACK (on_glade_widget_name_notify), layout);
+    }
+    
+  gtk_widget_queue_draw (GTK_WIDGET (container)); 
 }
 
 static void
 glade_design_layout_remove (GtkContainer * container, GtkWidget * widget)
 {
+  GladeWidget *gchild;
+
   g_signal_handlers_disconnect_by_func (widget, on_child_size_allocate,
                                         GLADE_DESIGN_LAYOUT (container));
+
+  if ((gchild = glade_widget_get_from_gobject (G_OBJECT (widget))))
+    g_signal_handlers_disconnect_by_func (gchild, on_glade_widget_name_notify,
+                                          GLADE_DESIGN_LAYOUT (container));
+
   GTK_CONTAINER_CLASS (glade_design_layout_parent_class)->remove (container, widget);
   gtk_widget_queue_draw (GTK_WIDGET (container));
 }
@@ -469,49 +532,46 @@ glade_design_layout_damage (GtkWidget *widget, GdkEventExpose *event)
 }
 
 static inline void
-draw_frame (GtkWidget * widget, cairo_t * cr, int x, int y, int w, int h)
+draw_frame (GladeDesignLayoutPrivate *priv, GtkStyle *style, cairo_t * cr, int x, int y, int w, int h)
 {
-  GladeWidget *gchild = glade_widget_get_from_gobject (G_OBJECT (widget));
-  GtkStyle *style = gtk_widget_get_style (widget);
-  const gchar *name;
+  GtkStateType state = (priv->selection) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL;
 
   cairo_save (cr);
 
   cairo_set_line_width (cr, OUTLINE_WIDTH);
+
   cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
   cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
 
-  gdk_cairo_set_source_color (cr, &style->bg[GTK_STATE_SELECTED]);
+  gdk_cairo_set_source_color (cr, &style->bg[state]);
 
   /* rectangle */
   cairo_rectangle (cr, x, y, w, h);
   cairo_stroke (cr);
 
-  if (gchild && (name = glade_widget_get_name (gchild)))
+  if (priv->widget_name)
     {
-      cairo_text_extents_t extents;
-
-      cairo_select_font_face (cr, "Sans",
-                              CAIRO_FONT_SLANT_NORMAL,
-                              CAIRO_FONT_WEIGHT_NORMAL);
-      cairo_set_font_size (cr, 14);
-        
-      cairo_text_extents (cr, name, &extents);
-      cairo_rectangle (cr, x+w, y, 
-                       extents.height + (OUTLINE_WIDTH*2),
-                       extents.width + (OUTLINE_WIDTH*2));
-      cairo_stroke (cr);
-      cairo_rectangle (cr, x+w, y, 
-                       extents.height + (OUTLINE_WIDTH*2),
-                       extents.width + (OUTLINE_WIDTH*2));
+      GdkRectangle *rect = &priv->south_east;
+      gint xx, yy;
+      
+      xx = rect->x + rect->width;
+      yy = rect->y + rect->height;
+
+      /* Draw tab */
+      cairo_move_to (cr, rect->x, rect->y);
+      cairo_line_to (cr, xx, rect->y);
+      cairo_line_to (cr, xx, yy-8);
+      cairo_curve_to (cr, xx, yy, xx, yy, xx-8, yy);
+      cairo_line_to (cr, rect->x+8, yy);
+      cairo_curve_to (cr, rect->x, yy, rect->x, yy, rect->x, yy-8);
+      cairo_close_path (cr);
       cairo_fill (cr);
 
-      gdk_cairo_set_source_color (cr, &style->text[GTK_STATE_SELECTED]);
-      cairo_move_to (cr, x+w+OUTLINE_WIDTH, y+OUTLINE_WIDTH);
-      cairo_rotate (cr, G_PI/2);
-      cairo_show_text (cr, name);
-
-      cairo_identity_matrix (cr);
+      /* Draw widget name */ 
+      gdk_cairo_set_source_color (cr, &style->text[state]);
+      cairo_move_to (cr, priv->south_east.x + OUTLINE_WIDTH,
+                     priv->south_east.y + OUTLINE_WIDTH);
+      pango_cairo_show_layout (cr, priv->widget_name);
     }
 
   cairo_restore (cr);
@@ -587,7 +647,7 @@ glade_design_layout_draw (GtkWidget * widget, cairo_t * cr)
           gtk_widget_get_allocation (child, &child_allocation);
 
           /* draw frame */
-          draw_frame (child, cr,
+          draw_frame (priv, style, cr,
                       border_width + PADDING,
                       border_width + PADDING,
                       child_allocation.width + 2 * OUTLINE_WIDTH,
@@ -785,6 +845,8 @@ glade_design_layout_realize (GtkWidget * widget)
   priv->cursors[ACTIVITY_RESIZE_HEIGHT] = gdk_cursor_new_for_display (display, GDK_BOTTOM_SIDE);
   priv->cursors[ACTIVITY_RESIZE_WIDTH] = gdk_cursor_new_for_display (display, GDK_RIGHT_SIDE);
   priv->cursors[ACTIVITY_RESIZE_WIDTH_AND_HEIGHT] = gdk_cursor_new_for_display (display, GDK_BOTTOM_RIGHT_CORNER);
+
+  priv->widget_name = pango_layout_new (gtk_widget_get_pango_context (widget));
 }
 
 static void
@@ -817,6 +879,8 @@ glade_design_layout_unrealize (GtkWidget * widget)
       priv->cursors[ACTIVITY_RESIZE_WIDTH_AND_HEIGHT] = NULL;
     }
 
+  if (priv->widget_name) g_object_unref (priv->widget_name);
+  
   GTK_WIDGET_CLASS (glade_design_layout_parent_class)->unrealize (widget);
 }
 
@@ -842,7 +906,7 @@ glade_design_layout_init (GladeDesignLayout * layout)
   /* setup static member of rectangles */
   priv->east.width = PADDING + OUTLINE_WIDTH;
   priv->south.height = PADDING + OUTLINE_WIDTH;
-    
+
   gtk_widget_set_has_window (GTK_WIDGET (layout), TRUE);
 }
 
diff --git a/gladeui/glade-design-view.c b/gladeui/glade-design-view.c
index d4137de..0891160 100644
--- a/gladeui/glade-design-view.c
+++ b/gladeui/glade-design-view.c
@@ -187,8 +187,8 @@ on_project_remove_widget (GladeProject *project, GladeWidget *widget, GladeDesig
   layout = gtk_widget_get_parent (GTK_WIDGET (object));
   if (layout)
     {
-        gtk_container_remove (GTK_CONTAINER (layout), GTK_WIDGET (object));
-        gtk_container_remove (GTK_CONTAINER (view->priv->layout_box), layout);
+      gtk_container_remove (GTK_CONTAINER (layout), GTK_WIDGET (object));
+      gtk_container_remove (GTK_CONTAINER (view->priv->layout_box), layout);
     }
 }
 
@@ -249,6 +249,17 @@ glade_design_view_get_property (GObject * object,
     }
 }
 
+static gboolean
+on_viewport_draw (GtkWidget * widget, cairo_t * cr)
+{
+  GtkStyle *style = gtk_widget_get_style (widget);
+
+  gdk_cairo_set_source_color (cr, &style->base[gtk_widget_get_state (widget)]);
+  cairo_paint (cr);
+
+  return TRUE;
+}
+
 static void
 glade_design_view_init (GladeDesignView * view)
 {
@@ -259,7 +270,8 @@ glade_design_view_init (GladeDesignView * view)
   gtk_widget_set_no_show_all (GTK_WIDGET (view), TRUE);
 
   view->priv->project = NULL;
-  view->priv->layout_box = gtk_vbox_new (FALSE, 0);
+  view->priv->layout_box = gtk_vbox_new (FALSE, 8);
+  gtk_container_set_border_width (GTK_CONTAINER (view->priv->layout_box), 8);
 
   view->priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW
@@ -270,6 +282,8 @@ glade_design_view_init (GladeDesignView * view)
                                        GTK_SHADOW_IN);
 
   viewport = gtk_viewport_new (NULL, NULL);
+  gtk_widget_set_app_paintable (viewport, TRUE);
+  g_signal_connect (viewport, "draw", G_CALLBACK (on_viewport_draw), NULL);
   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE);
   gtk_container_add (GTK_CONTAINER (viewport), view->priv->layout_box);
   gtk_container_add (GTK_CONTAINER (view->priv->scrolled_window), viewport);



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