[glade/multiple-toplevels] * gladeui/glade-design-view.c: o added a GtkVBox intead of a GladeDesignLayout to pack multipl
- From: Juan Pablo Ugarte <jpu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glade/multiple-toplevels] * gladeui/glade-design-view.c: o added a GtkVBox intead of a GladeDesignLayout to pack multipl
- Date: Wed, 26 Jan 2011 01:21:15 +0000 (UTC)
commit b7285e8ac57fc51b03293cf8d131d61375eaacf1
Author: Juan Pablo Ugarte <jp synctv com>
Date: Tue Jan 25 22:17:34 2011 -0300
* gladeui/glade-design-view.c:
o added a GtkVBox intead of a GladeDesignLayout to pack multiple layout/toplevels
o add/remove widgets from layout on GladeProject add-widget and remove-widget signals
* gladeui/glade-design-layout.c: draw widget name next to layout frame.
* gladeui/glade-widget.c: comented code in glade_widget_hide() that was crashing because
glade_design_view_get_layout() always returns NULL in this hack.
gladeui/glade-design-layout.c | 39 +++++++++++++++--
gladeui/glade-design-view.c | 98 ++++++++++++++++++++++++++++++++++++++---
gladeui/glade-widget.c | 2 +
3 files changed, 128 insertions(+), 11 deletions(-)
---
diff --git a/gladeui/glade-design-layout.c b/gladeui/glade-design-layout.c
index 71535e7..b4bcb08 100644
--- a/gladeui/glade-design-layout.c
+++ b/gladeui/glade-design-layout.c
@@ -471,18 +471,49 @@ 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)
{
+ GladeWidget *gchild = glade_widget_get_from_gobject (G_OBJECT (widget));
+ GtkStyle *style = gtk_widget_get_style (widget);
+ const gchar *name;
+
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,
- >k_widget_get_style (widget)->
- bg[GTK_STATE_SELECTED]);
+ gdk_cairo_set_source_color (cr, &style->bg[GTK_STATE_SELECTED]);
/* rectangle */
cairo_rectangle (cr, x, y, w, h);
cairo_stroke (cr);
+
+ if (gchild && (name = glade_widget_get_name (gchild)))
+ {
+ 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));
+ 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);
+ }
+
cairo_restore (cr);
}
@@ -556,7 +587,7 @@ glade_design_layout_draw (GtkWidget * widget, cairo_t * cr)
gtk_widget_get_allocation (child, &child_allocation);
/* draw frame */
- draw_frame (widget, cr,
+ draw_frame (child, cr,
border_width + PADDING,
border_width + PADDING,
child_allocation.width + 2 * OUTLINE_WIDTH,
diff --git a/gladeui/glade-design-view.c b/gladeui/glade-design-view.c
index 0f9d0df..d4137de 100644
--- a/gladeui/glade-design-view.c
+++ b/gladeui/glade-design-view.c
@@ -53,7 +53,7 @@ enum
struct _GladeDesignViewPrivate
{
- GtkWidget *layout;
+ GtkWidget *layout_box;
GladeProject *project;
@@ -105,11 +105,91 @@ glade_design_view_load_progress (GladeProject * project,
step * 1.0 / total);
}
+static void
+layout_box_foreach (GtkWidget *widget, gpointer data)
+{
+ if (GLADE_IS_DESIGN_LAYOUT (widget))
+ glade_design_layout_selection_set (GLADE_DESIGN_LAYOUT (widget), data);
+}
+
static void
glade_design_view_selection_changed (GladeProject * project, GladeDesignView * view)
{
- GladeDesignLayout *layout = glade_design_view_get_layout (view);
- glade_design_layout_selection_set (layout, glade_project_selection_get (project));
+ GList *selection = glade_project_selection_get (project);
+ GladeWidget *gwidget, *gtoplevel;
+
+ /* FIXME: this does not fell right, perhaps DesignLayout should support more than one child */
+ gtk_container_foreach (GTK_CONTAINER (view->priv->layout_box),
+ layout_box_foreach,
+ selection);
+
+ if (selection && g_list_next (selection) == NULL &&
+ GTK_IS_WIDGET (selection->data) &&
+ !GLADE_IS_PLACEHOLDER (selection->data) &&
+ (gwidget = glade_widget_get_from_gobject (G_OBJECT (selection->data))) &&
+ (gtoplevel = glade_widget_get_toplevel (gwidget)))
+ {
+ GObject *toplevel = glade_widget_get_object (gtoplevel);
+ GtkWidget *layout;
+
+ if (GTK_IS_WIDGET (toplevel) &&
+ (layout = gtk_widget_get_parent (GTK_WIDGET (toplevel))) &&
+ GLADE_IS_DESIGN_LAYOUT (layout))
+ {
+ GtkAdjustment *vadj, *hadj;
+ GtkAllocation alloc;
+
+ 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));
+
+ gtk_widget_get_allocation (layout, &alloc);
+/*
+ g_message ("%s %dx%d page=%lf upper=%lf, lower=%lf", __func__, alloc.x, alloc.y,
+ gtk_adjustment_get_page_size (vadj),
+ gtk_adjustment_get_upper (vadj),
+ gtk_adjustment_get_lower (vadj));
+*/
+ /* TODO: we could set this value in increments in a timeout callback to make it look like its scrolling instead of jumping */
+ gtk_adjustment_set_value (hadj, alloc.x);
+ gtk_adjustment_set_value (vadj, alloc.y);
+ }
+ }
+}
+
+static void
+on_project_add_widget (GladeProject *project, GladeWidget *widget, GladeDesignView * view)
+{
+ GtkWidget *layout;
+ GObject *object;
+
+ if (widget == NULL || glade_widget_get_parent (widget) ||
+ (object = glade_widget_get_object (widget)) == NULL ||
+ !GTK_IS_WIDGET (object)) return;
+
+ layout = glade_design_layout_new ();
+ gtk_box_pack_start (GTK_BOX (view->priv->layout_box), layout, FALSE, TRUE, 0);
+ gtk_widget_show (layout);
+
+ gtk_container_add (GTK_CONTAINER (layout), GTK_WIDGET (object));
+ gtk_widget_show_all (view->priv->layout_box);
+}
+
+static void
+on_project_remove_widget (GladeProject *project, GladeWidget *widget, GladeDesignView * view)
+{
+ GtkWidget *layout;
+ GObject *object;
+
+ if (widget == NULL || glade_widget_get_parent (widget) ||
+ (object = glade_widget_get_object (widget)) == NULL ||
+ !GTK_IS_WIDGET (object)) return;
+
+ 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);
+ }
}
static void
@@ -119,6 +199,10 @@ glade_design_view_set_project (GladeDesignView * view, GladeProject * project)
view->priv->project = project;
+ g_signal_connect (project, "add-widget",
+ G_CALLBACK (on_project_add_widget), view);
+ g_signal_connect (project, "remove-widget",
+ G_CALLBACK (on_project_remove_widget), view);
g_signal_connect (project, "parse-began",
G_CALLBACK (glade_design_view_parse_began), view);
g_signal_connect (project, "parse-finished",
@@ -175,7 +259,7 @@ glade_design_view_init (GladeDesignView * view)
gtk_widget_set_no_show_all (GTK_WIDGET (view), TRUE);
view->priv->project = NULL;
- view->priv->layout = glade_design_layout_new ();
+ view->priv->layout_box = gtk_vbox_new (FALSE, 0);
view->priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW
@@ -187,12 +271,12 @@ glade_design_view_init (GladeDesignView * view)
viewport = gtk_viewport_new (NULL, NULL);
gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE);
- gtk_container_add (GTK_CONTAINER (viewport), view->priv->layout);
+ gtk_container_add (GTK_CONTAINER (viewport), view->priv->layout_box);
gtk_container_add (GTK_CONTAINER (view->priv->scrolled_window), viewport);
gtk_widget_show (view->priv->scrolled_window);
gtk_widget_show (viewport);
- gtk_widget_show (view->priv->layout);
+ gtk_widget_show (view->priv->layout_box);
gtk_box_pack_start (GTK_BOX (view), view->priv->scrolled_window, TRUE, TRUE,
0);
@@ -289,5 +373,5 @@ glade_design_view_get_from_project (GladeProject * project)
GladeDesignLayout *
glade_design_view_get_layout (GladeDesignView * view)
{
- return GLADE_DESIGN_LAYOUT (view->priv->layout);
+ return NULL;
}
diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c
index bfef754..7260d22 100644
--- a/gladeui/glade-widget.c
+++ b/gladeui/glade-widget.c
@@ -2035,6 +2035,7 @@ glade_widget_hide (GladeWidget * widget)
if (project &&
(view = glade_design_view_get_from_project (project)) != NULL)
{
+/*
GtkWidget *child;
layout = GTK_WIDGET (glade_design_view_get_layout (view));
@@ -2042,6 +2043,7 @@ glade_widget_hide (GladeWidget * widget)
if (child == GTK_WIDGET (widget->priv->object))
gtk_container_remove (GTK_CONTAINER (layout), child);
+*/
}
}
widget->priv->visible = FALSE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]