[glade/multiple-toplevels] * gladeui/glade-design-layout.c: o implemented get_preferred_width_for_height() and get_prefer



commit 38d12938b286e3326827c2b2ce719acb7a555b97
Author: Juan Pablo Ugarte <jp synctv com>
Date:   Mon Jan 31 18:22:24 2011 -0300

      * gladeui/glade-design-layout.c:
        o implemented get_preferred_width_for_height() and get_preferred_width_for_height()
          to fix allocation problem
        o check if toplevel has a child selected before selecting it itself on button press
        o dont draw selection if widget has no allocation
    
      * gladeui/glade-design-view.c:
        o delegate scrolling to size-allocate if toplevel layout has no allocation
          Fixes scrolling while creating a new widget from the palette.
        o also add widgets on visibility change

 gladeui/glade-design-layout.c |   55 +++++++++++++++++---
 gladeui/glade-design-view.c   |  111 +++++++++++++++++++++++++----------------
 2 files changed, 114 insertions(+), 52 deletions(-)
---
diff --git a/gladeui/glade-design-layout.c b/gladeui/glade-design-layout.c
index 4dc30ef..93d5483 100644
--- a/gladeui/glade-design-layout.c
+++ b/gladeui/glade-design-layout.c
@@ -241,6 +241,19 @@ glade_design_layout_find_inside_container (GtkWidget                *widget,
 }
 
 static gboolean
+glade_project_is_toplevel_active (GladeProject *project, GtkWidget *toplevel)
+{
+  GList *l;
+
+  for (l = glade_project_selection_get (project); l; l = g_list_next (l))
+    {
+      if (gtk_widget_is_ancestor (l->data, toplevel)) return TRUE;
+    }
+
+  return FALSE;
+}
+
+static gboolean
 glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
 {
   GtkWidget *child;
@@ -273,7 +286,7 @@ glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
         {
           GladeProject *project = glade_widget_get_project (gchild);
 
-          if (project)
+          if (project && !glade_project_is_toplevel_active (project, child))
             {
               _glade_design_view_freeze (priv->view);
               glade_project_selection_set (project, G_OBJECT (gtk_bin_get_child (GTK_BIN (widget))), TRUE);
@@ -415,6 +428,24 @@ glade_design_layout_get_preferred_width (GtkWidget * widget,
 }
 
 static void
+glade_design_layout_get_preferred_width_for_height (GtkWidget       *widget,
+                                                    gint             height,
+                                                    gint            *minimum_width,
+                                                    gint            *natural_width)
+{
+  glade_design_layout_get_preferred_width (widget, minimum_width, natural_width);
+}
+
+static void
+glade_design_layout_get_preferred_height_for_width (GtkWidget       *widget,
+                                                    gint             width,
+                                                    gint            *minimum_height,
+                                                    gint            *natural_height)
+{
+  glade_design_layout_get_preferred_height (widget, minimum_height, natural_height);
+}
+
+static void
 glade_design_layout_size_allocate (GtkWidget * widget,
                                    GtkAllocation * allocation)
 {
@@ -637,6 +668,9 @@ draw_selection (cairo_t *cr, GtkWidget *parent, GtkWidget *widget,
   gint x, y;
 
   gtk_widget_get_allocation (widget, &alloc);
+
+  if (alloc.x < 0 || alloc.y < 0) return;
+  
   gtk_widget_translate_coordinates (widget, parent, offset, offset, &x, &y);
 
   cx = x + alloc.width/2;
@@ -683,7 +717,7 @@ glade_design_layout_draw (GtkWidget * widget, cairo_t * cr)
           const GdkColor *color = &gtk_widget_get_style (widget)->bg[GTK_STATE_SELECTED];
           gint border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
           GtkAllocation child_allocation;
-          gboolean selection = FALSE;
+          gboolean selected = FALSE;
           gfloat r, g, b;
           GList *l;
 
@@ -700,26 +734,29 @@ glade_design_layout_draw (GtkWidget * widget, cairo_t * cr)
           r = color->red/65535.;
           g = color->green/65535.;
           b = color->blue/65535.;
+          cairo_set_line_width (cr, OUTLINE_WIDTH/2);
           cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
           cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
           for (l = glade_project_selection_get (project); l; l = g_list_next (l))
             {
+              GtkWidget *selection = l->data;
+              
               /* Dont draw selection on toplevels */
-              if (child != l->data)
+              if (child != selection)
                 {
-                  if (gtk_widget_is_ancestor (l->data, child))
+                  if (gtk_widget_is_ancestor (selection, child))
                   {
-                    draw_selection (cr, child, l->data, priv->child_offset, r, g, b);
-                    selection = TRUE;
+                    draw_selection (cr, child, selection, priv->child_offset, r, g, b);
+                    selected = TRUE;
                   }
                 }
               else
-                selection = TRUE;
+                selected = TRUE;
             }
 
           /* draw frame */
           draw_frame (cr, priv, style,
-                      (selection) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL,
+                      (selected) ? GTK_STATE_SELECTED : GTK_STATE_NORMAL,
                       border_width + PADDING,
                       border_width + PADDING,
                       child_allocation.width + 2 * OUTLINE_WIDTH,
@@ -1027,6 +1064,8 @@ glade_design_layout_class_init (GladeDesignLayoutClass * klass)
   widget_class->draw = glade_design_layout_draw;
   widget_class->get_preferred_height = glade_design_layout_get_preferred_height;
   widget_class->get_preferred_width = glade_design_layout_get_preferred_width;
+  widget_class->get_preferred_width_for_height = glade_design_layout_get_preferred_width_for_height;
+  widget_class->get_preferred_height_for_width = glade_design_layout_get_preferred_height_for_width;
   widget_class->size_allocate = glade_design_layout_size_allocate;
 
   g_object_class_install_property (object_class, PROP_DESIGN_VIEW,
diff --git a/gladeui/glade-design-view.c b/gladeui/glade-design-view.c
index 7a8302e..1910b8f 100644
--- a/gladeui/glade-design-view.c
+++ b/gladeui/glade-design-view.c
@@ -93,12 +93,10 @@ glade_design_view_load_progress (GladeProject * project,
   gchar *path;
   gchar *str;
 
-  path =
-      glade_utils_replace_home_dir_with_tilde (glade_project_get_path
-                                               (project));
-  str =
-      g_strdup_printf (_("Loading %s: loaded %d of %d objects"), path, step,
-                       total);
+  path = glade_utils_replace_home_dir_with_tilde (glade_project_get_path (project));
+  str = g_strdup_printf (_("Loading %s: loaded %d of %d objects"),
+                         path, step, total);
+
   gtk_progress_bar_set_text (GTK_PROGRESS_BAR (view->priv->progress), str);
   g_free (str);
   g_free (path);
@@ -107,9 +105,39 @@ glade_design_view_load_progress (GladeProject * project,
                                  step * 1.0 / total);
 }
 
+static void
+glade_design_layout_scroll (GladeDesignView *view, gint x, gint y, gint w, gint h)
+{
+  gdouble vadj_val, hadj_val, vpage_end, hpage_end;
+  GtkAdjustment *vadj, *hadj;
+
+  vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (view->priv->scrolled_window));
+  hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (view->priv->scrolled_window));
+
+  vadj_val = gtk_adjustment_get_value (vadj);
+  hadj_val = gtk_adjustment_get_value (hadj);
+  vpage_end = gtk_adjustment_get_page_size (vadj) + vadj_val;
+  hpage_end = gtk_adjustment_get_page_size (hadj) + hadj_val;
+
+  /* TODO: we could set this value in increments in a timeout callback 
+   * to make it look like its scrolling instead of jumping.
+   */
+  if (y < vadj_val || y > vpage_end || (y + h) > vpage_end)
+    gtk_adjustment_set_value (vadj, y);
+
+  if (x < hadj_val || x > hpage_end || (x + w) > hpage_end)
+    gtk_adjustment_set_value (hadj, x);
+}
+
+static void 
+on_layout_size_allocate (GtkWidget *widget, GtkAllocation *alloc, GladeDesignView *view)
+{
+  glade_design_layout_scroll (view, alloc->x, alloc->y, alloc->width, alloc->height);
+  g_signal_handlers_disconnect_by_func (widget, on_layout_size_allocate, view);
+}
 
 static void
-glade_design_view_selection_changed (GladeProject * project, GladeDesignView * view)
+glade_design_view_selection_changed (GladeProject *project, GladeDesignView *view)
 {
   GladeWidget *gwidget, *gtoplevel;
   GList *selection;
@@ -129,30 +157,36 @@ glade_design_view_selection_changed (GladeProject * project, GladeDesignView * v
           (layout = gtk_widget_get_parent (GTK_WIDGET (toplevel))) &&
           GLADE_IS_DESIGN_LAYOUT (layout))
         {
-          gdouble vadj_val, hadj_val, vpage_end, hpage_end;
-          GtkAdjustment *vadj, *hadj;
           GtkAllocation alloc;
+          gtk_widget_get_allocation (layout, &alloc);
+          
+          if (alloc.x < 0)
+            g_signal_connect (layout, "size-allocate", G_CALLBACK (on_layout_size_allocate), view);
+          else
+            glade_design_layout_scroll (view, alloc.x, alloc.y, alloc.width, alloc.height);
+        }
+    }
+}
 
-          vadj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (view->priv->scrolled_window));
-          hadj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (view->priv->scrolled_window));
-
-          vadj_val = gtk_adjustment_get_value (vadj);
-          hadj_val = gtk_adjustment_get_value (hadj);
-          vpage_end = gtk_adjustment_get_page_size (vadj) + vadj_val;
-          hpage_end = gtk_adjustment_get_page_size (hadj) + hadj_val;
+static void
+glade_design_view_add_toplevel (GladeDesignView *view, GladeWidget *widget)
+{
+  GtkWidget *layout;
+  GObject *object;
 
-          gtk_widget_get_allocation (layout, &alloc);
+  if (glade_widget_get_parent (widget) ||
+      (object = glade_widget_get_object (widget)) == NULL ||
+      !GTK_IS_WIDGET (object) ||
+      gtk_widget_get_parent (GTK_WIDGET (object)))
+    return;
 
-          /* TODO: we could set this value in increments in a timeout callback 
-           * to make it look like its scrolling instead of jumping.
-           */
-          if (alloc.y < vadj_val || alloc.y > vpage_end || (alloc.y + alloc.height) > vpage_end)
-            gtk_adjustment_set_value (vadj, alloc.y);
+  /* Create a GladeDesignLayout and add the toplevel widget to the view */
+  layout = _glade_design_layout_new (view);
+  gtk_box_pack_start (GTK_BOX (view->priv->layout_box), layout, FALSE, TRUE, 0);
 
-          if (alloc.x < hadj_val || alloc.x > hpage_end || (alloc.x + alloc.width) > hpage_end)
-            gtk_adjustment_set_value (hadj, alloc.x);
-        }
-    }
+  gtk_container_add (GTK_CONTAINER (layout), GTK_WIDGET (object));
+  gtk_widget_show (GTK_WIDGET (object));
+  gtk_widget_show (layout);
 }
 
 static void
@@ -166,8 +200,8 @@ glade_design_view_remove_toplevel (GladeDesignView *view, GladeWidget *widget)
       !GTK_IS_WIDGET (object)) return;
   
   /* Remove toplevel widget from the view */
-  layout = gtk_widget_get_parent (GTK_WIDGET (object));
-  if (layout)
+  if ((layout = gtk_widget_get_parent (GTK_WIDGET (object))) &&
+      gtk_widget_is_ancestor (layout, GTK_WIDGET (view)))
     {
       gtk_container_remove (GTK_CONTAINER (layout), GTK_WIDGET (object));
       gtk_container_remove (GTK_CONTAINER (view->priv->layout_box), layout);
@@ -180,27 +214,16 @@ glade_design_view_widget_visibility_changed (GladeProject    *project,
                                              gboolean         visible,
                                              GladeDesignView *view)
 {
-  if (visible) return;
-  glade_design_view_remove_toplevel (view, widget);
+  if (visible)
+    glade_design_view_add_toplevel (view, widget);
+  else
+    glade_design_view_remove_toplevel (view, widget);
 }
 
 static void
 on_project_add_widget (GladeProject *project, GladeWidget *widget, GladeDesignView *view)
 {
-  GtkWidget *layout;
-  GObject *object;
-
-  if (glade_widget_get_parent (widget) ||
-      (object = glade_widget_get_object (widget)) == NULL ||
-      !GTK_IS_WIDGET (object)) return;
-
-  /* Create a GladeDesignLayout and add the toplevel widget to the view */
-  layout = _glade_design_layout_new (view);
-  gtk_box_pack_start (GTK_BOX (view->priv->layout_box), layout, FALSE, TRUE, 0);
-
-  gtk_container_add (GTK_CONTAINER (layout), GTK_WIDGET (object));
-  gtk_widget_show (GTK_WIDGET (object));
-  gtk_widget_show (layout);
+  glade_design_view_add_toplevel (view, widget);
 }
 
 static void



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