[glade/multiple-toplevels] * gladeui/glade-design-layout.c: o implemented get_preferred_width_for_height() and get_prefer
- From: Juan Pablo Ugarte <jpu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glade/multiple-toplevels] * gladeui/glade-design-layout.c: o implemented get_preferred_width_for_height() and get_prefer
- Date: Mon, 31 Jan 2011 21:33:55 +0000 (UTC)
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 = >k_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]