diff options
author | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2012-12-17 22:31:21 -0300 |
---|---|---|
committer | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2013-01-18 20:11:03 -0300 |
commit | 576092bb8d7d853c2789ce196e3e082433049728 (patch) | |
tree | edc83acc92989ab86a27279c8a5a8a104608cfe2 | |
parent | b01110c2fb6e6155c903e1c3f4d95ecc02a61123 (diff) | |
download | glade-576092bb8d7d853c2789ce196e3e082433049728.tar.gz |
Removed GladeFixed (DnD) support for GtkBox, GtkTable and GtkGrid.
Optimized glade_gtk_grid_refresh_placeholders() by passing the children list to
glade_gtk_grid_has_child() instead of getting it each time from the container.
-rw-r--r-- | plugins/gtk+/glade-gtk-grid.c | 417 | ||||
-rw-r--r-- | plugins/gtk+/glade-gtk-table.c | 453 | ||||
-rw-r--r-- | plugins/gtk+/glade-gtk.c | 224 | ||||
-rw-r--r-- | plugins/gtk+/gtk+.xml.in | 5 |
4 files changed, 30 insertions, 1069 deletions
diff --git a/plugins/gtk+/glade-gtk-grid.c b/plugins/gtk+/glade-gtk-grid.c index 87e38cce..05259bf5 100644 --- a/plugins/gtk+/glade-gtk-grid.c +++ b/plugins/gtk+/glade-gtk-grid.c @@ -55,9 +55,6 @@ typedef enum DIR_RIGHT } GladeGridDir; -static GladeGridChild grid_edit = { 0, }; -static GladeGridChild grid_cur_attach = { 0, }; - static void glade_gtk_grid_get_child_attachments (GtkWidget *grid, GtkWidget *child, @@ -71,354 +68,6 @@ glade_gtk_grid_get_child_attachments (GtkWidget *grid, NULL); } -/* Takes a point (x or y depending on 'row') relative to - * grid, and returns the row or column in which the point - * was found. - */ -static gint -glade_gtk_grid_get_row_col_from_point (GtkGrid * grid, - gboolean row, gint point) -{ - GladeGridAttachments attach; - GtkAllocation allocation; - GList *list, *children; - gint span, trans_point, size, base, end; - - children = gtk_container_get_children (GTK_CONTAINER (grid)); - - for (list = children; list; list = list->next) - { - GtkWidget *widget = list->data; - - glade_gtk_grid_get_child_attachments (GTK_WIDGET (grid), widget, &attach); - - if (row) - gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, 0, point, NULL, &trans_point); - else - gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, point, 0, &trans_point, NULL); - - gtk_widget_get_allocation (widget, &allocation); - - /* Find any widget in our row/column - */ - end = row ? allocation.height : allocation.width; - - if (trans_point >= 0 && - /* should be trans_point < end ... test FIXME ! */ - trans_point < end) - { - base = row ? attach.top_attach : attach.left_attach; - size = row ? allocation.height : allocation.width; - span = row ? attach.height : attach.width; - - return base + (trans_point * span / size); - } - } - - g_list_free (children); - - return -1; -} - - -static gboolean -glade_gtk_grid_point_crosses_threshold (GtkGrid *grid, - gboolean row, - gint num, - GladeGridDir dir, - gint point) -{ - GladeGridAttachments attach; - GtkAllocation allocation; - GList *list, *children; - gint span, trans_point, size, rowcol_size, base; - - children = gtk_container_get_children (GTK_CONTAINER (grid)); - - for (list = children; list; list = list->next) - { - GtkWidget *widget = list->data; - - glade_gtk_grid_get_child_attachments (GTK_WIDGET (grid), widget, &attach); - - /* Find any widget in our row/column - */ - if ((row && num >= attach.top_attach && num < attach.top_attach + attach.height) || - (!row && num >= attach.left_attach && num < attach.left_attach + attach.width)) - { - - if (row) - gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, 0, point, NULL, &trans_point); - else - gtk_widget_translate_coordinates (GTK_WIDGET (grid), widget, point, 0, &trans_point, NULL); - - span = row ? attach.height : attach.width; - gtk_widget_get_allocation (widget, &allocation); - size = row ? allocation.height : allocation.width; - - base = row ? attach.top_attach : attach.left_attach; - rowcol_size = size / span; - trans_point -= (num - base) * rowcol_size; - -#if 0 - g_print ("dir: %s, widget size: %d, rowcol size: %d, " - "requested rowcol: %d, widget base rowcol: %d, trim: %d, " - "widget point: %d, thresh: %d\n", - dir == DIR_UP ? "up" : dir == DIR_DOWN ? "down" : - dir == DIR_LEFT ? "left" : "right", - size, rowcol_size, num, base, (num - base) * rowcol_size, - trans_point, - dir == DIR_UP || dir == DIR_LEFT ? - (rowcol_size / 2) : (rowcol_size / 2)); -#endif - switch (dir) - { - case DIR_UP: - case DIR_LEFT: - return trans_point <= (rowcol_size / 2); - case DIR_DOWN: - case DIR_RIGHT: - return trans_point >= (rowcol_size / 2); - default: - break; - } - } - - } - - g_list_free (children); - - return FALSE; -} - -static gboolean -glade_gtk_grid_get_attachments (GladeFixed *fixed, - GtkGrid *grid, - GdkRectangle *rect, - GladeGridChild *configure) -{ - GladeWidget *widget = GLADE_WIDGET (fixed); - gint center_x, center_y, row, column; - guint n_columns, n_rows; - - center_x = rect->x + (rect->width / 2); - center_y = rect->y + (rect->height / 2); - - column = glade_gtk_grid_get_row_col_from_point (grid, FALSE, center_x); - row = glade_gtk_grid_get_row_col_from_point (grid, TRUE, center_y); - - /* its a start, now try to grow when the rect extents - * reach at least half way into the next row/column - */ - configure->left_attach = column; - configure->width = 1; - configure->top_attach = row; - configure->height = 1; - - glade_widget_property_get (widget, "n-columns", &n_columns); - glade_widget_property_get (widget, "n-rows", &n_rows); - - if (column >= 0 && row >= 0) - { - /* Check and expand left - */ - while (configure->left_attach > 0) - { - if (rect->x < fixed->child_x_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_LEFT (fixed->operation) == FALSE) - break; - - if (glade_gtk_grid_point_crosses_threshold - (grid, FALSE, configure->left_attach - 1, - DIR_LEFT, rect->x) == FALSE) - break; - - configure->left_attach--; - } - - /* Check and expand right - */ - while (configure->left_attach + configure->width < n_columns) - { - if (rect->x + rect->width > - fixed->child_x_origin + fixed->child_width_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_RIGHT (fixed->operation) == FALSE) - break; - - if (glade_gtk_grid_point_crosses_threshold - (grid, FALSE, configure->left_attach + configure->width, - DIR_RIGHT, rect->x + rect->width) == FALSE) - break; - - configure->width++; - } - - /* Check and expand top - */ - while (configure->top_attach > 0) - { - if (rect->y < fixed->child_y_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_TOP (fixed->operation) == FALSE) - break; - - if (glade_gtk_grid_point_crosses_threshold - (grid, TRUE, configure->top_attach - 1, - DIR_UP, rect->y) == FALSE) - break; - - configure->top_attach--; - } - - /* Check and expand bottom - */ - while (configure->top_attach + configure->height < n_rows) - { - if (rect->y + rect->height > - fixed->child_y_origin + fixed->child_height_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_BOTTOM (fixed->operation) == FALSE) - break; - - if (glade_gtk_grid_point_crosses_threshold - (grid, TRUE, configure->top_attach + configure->height, - DIR_DOWN, rect->y + rect->height) == FALSE) - break; - - configure->height++; - } - } - - return column >= 0 && row >= 0; -} - -static gboolean -glade_gtk_grid_configure_child (GladeFixed * fixed, - GladeWidget * child, - GdkRectangle * rect, GtkWidget * grid) -{ - GladeGridChild configure = { child, }; - - /* Sometimes we are unable to find a widget in the appropriate column, - * usually because a placeholder hasnt had its size allocation yet. - */ - if (glade_gtk_grid_get_attachments (fixed, GTK_GRID (grid), rect, &configure)) - { - if (memcmp (&configure, &grid_cur_attach, sizeof (GladeGridChild)) != 0) - { - - glade_property_push_superuser (); - glade_widget_pack_property_set (child, "left-attach", - configure.left_attach); - glade_widget_pack_property_set (child, "width", - configure.width); - glade_widget_pack_property_set (child, "top-attach", - configure.top_attach); - glade_widget_pack_property_set (child, "height", - configure.height); - glade_property_pop_superuser (); - - memcpy (&grid_cur_attach, &configure, sizeof (GladeGridChild)); - } - } - return TRUE; -} - - -static gboolean -glade_gtk_grid_configure_begin (GladeFixed * fixed, - GladeWidget * child, GtkWidget * grid) -{ - grid_edit.widget = child; - - glade_widget_pack_property_get (child, "left-attach", &grid_edit.left_attach); - glade_widget_pack_property_get (child, "width", &grid_edit.width); - glade_widget_pack_property_get (child, "top-attach", &grid_edit.top_attach); - glade_widget_pack_property_get (child, "height", &grid_edit.height); - - memcpy (&grid_cur_attach, &grid_edit, sizeof (GladeGridChild)); - - return TRUE; -} - -static gboolean -glade_gtk_grid_configure_end (GladeFixed * fixed, - GladeWidget * child, GtkWidget * grid) -{ - GladeGridChild new_child = { child, }; - - glade_widget_pack_property_get (child, "left-attach", &new_child.left_attach); - glade_widget_pack_property_get (child, "width", &new_child.width); - glade_widget_pack_property_get (child, "top-attach", &new_child.top_attach); - glade_widget_pack_property_get (child, "height", &new_child.height); - - /* Compare the meaningfull part of the current edit. */ - if (memcmp (&new_child, &grid_edit, sizeof (GladeGridChild)) != 0) - { - GValue left_attach_value = { 0, }; - GValue width_attach_value = { 0, }; - GValue top_attach_value = { 0, }; - GValue height_attach_value = { 0, }; - - GValue new_left_attach_value = { 0, }; - GValue new_width_attach_value = { 0, }; - GValue new_top_attach_value = { 0, }; - GValue new_height_attach_value = { 0, }; - - GladeProperty *left_attach_prop, *width_attach_prop, - *top_attach_prop, *height_attach_prop; - - left_attach_prop = glade_widget_get_pack_property (child, "left-attach"); - width_attach_prop = glade_widget_get_pack_property (child, "width"); - top_attach_prop = glade_widget_get_pack_property (child, "top-attach"); - height_attach_prop = glade_widget_get_pack_property (child, "height"); - - g_return_val_if_fail (GLADE_IS_PROPERTY (left_attach_prop), FALSE); - g_return_val_if_fail (GLADE_IS_PROPERTY (width_attach_prop), FALSE); - g_return_val_if_fail (GLADE_IS_PROPERTY (top_attach_prop), FALSE); - g_return_val_if_fail (GLADE_IS_PROPERTY (height_attach_prop), FALSE); - - glade_property_get_value (left_attach_prop, &new_left_attach_value); - glade_property_get_value (width_attach_prop, &new_width_attach_value); - glade_property_get_value (top_attach_prop, &new_top_attach_value); - glade_property_get_value (height_attach_prop, &new_height_attach_value); - - g_value_init (&left_attach_value, G_TYPE_INT); - g_value_init (&width_attach_value, G_TYPE_INT); - g_value_init (&top_attach_value, G_TYPE_INT); - g_value_init (&height_attach_value, G_TYPE_INT); - - g_value_set_int (&left_attach_value, grid_edit.left_attach); - g_value_set_int (&width_attach_value, grid_edit.width); - g_value_set_int (&top_attach_value, grid_edit.top_attach); - g_value_set_int (&height_attach_value, grid_edit.height); - - glade_command_push_group (_("Placing %s inside %s"), - glade_widget_get_name (child), - glade_widget_get_name (GLADE_WIDGET (fixed))); - glade_command_set_properties - (left_attach_prop, &left_attach_value, &new_left_attach_value, - width_attach_prop, &width_attach_value, &new_width_attach_value, - top_attach_prop, &top_attach_value, &new_top_attach_value, - height_attach_prop, &height_attach_value, &new_height_attach_value, - NULL); - glade_command_pop_group (); - - g_value_unset (&left_attach_value); - g_value_unset (&width_attach_value); - g_value_unset (&top_attach_value); - g_value_unset (&height_attach_value); - g_value_unset (&new_left_attach_value); - g_value_unset (&new_width_attach_value); - g_value_unset (&new_top_attach_value); - g_value_unset (&new_height_attach_value); - } - - return TRUE; -} - static void glade_gtk_grid_parse_finished (GladeProject *project, GObject *container) { @@ -456,15 +105,6 @@ glade_gtk_grid_post_create (GladeWidgetAdaptor * adaptor, { GladeWidget *gwidget = glade_widget_get_from_gobject (container); - g_signal_connect (G_OBJECT (gwidget), "configure-child", - G_CALLBACK (glade_gtk_grid_configure_child), container); - - g_signal_connect (G_OBJECT (gwidget), "configure-begin", - G_CALLBACK (glade_gtk_grid_configure_begin), container); - - g_signal_connect (G_OBJECT (gwidget), "configure-end", - G_CALLBACK (glade_gtk_grid_configure_end), container); - if (reason == GLADE_CREATE_LOAD) g_signal_connect (glade_widget_get_project (gwidget), "parse-finished", G_CALLBACK (glade_gtk_grid_parse_finished), @@ -472,13 +112,13 @@ glade_gtk_grid_post_create (GladeWidgetAdaptor * adaptor, } static gboolean -glade_gtk_grid_has_child (GtkGrid * grid, guint left_attach, - guint top_attach) +glade_gtk_grid_has_child (GtkGrid *grid, + GList *children, + guint left_attach, + guint top_attach) { - GList *list, *children; gboolean ret = FALSE; - - children = gtk_container_get_children (GTK_CONTAINER (grid)); + GList *list; for (list = children; list && list->data; list = list->next) { @@ -495,8 +135,6 @@ glade_gtk_grid_has_child (GtkGrid * grid, guint left_attach, } } - g_list_free (children); - return ret; } @@ -531,34 +169,38 @@ glade_gtk_grid_widget_exceeds_bounds (GtkGrid *grid, gint n_rows, gint n_cols) } static void -glade_gtk_grid_refresh_placeholders (GtkGrid * grid) +glade_gtk_grid_refresh_placeholders (GtkGrid *grid) { GladeWidget *widget; + GtkContainer *container; GList *list, *children; guint n_columns, n_rows; gint i, j; - widget = glade_widget_get_from_gobject (GTK_WIDGET (grid)); + widget = glade_widget_get_from_gobject (grid); glade_widget_property_get (widget, "n-columns", &n_columns); glade_widget_property_get (widget, "n-rows", &n_rows); - children = gtk_container_get_children (GTK_CONTAINER (grid)); + container = GTK_CONTAINER (grid); + children = gtk_container_get_children (container); for (list = children; list && list->data; list = list->next) { - if (GLADE_IS_PLACEHOLDER (list->data)) - gtk_container_remove (GTK_CONTAINER (grid), GTK_WIDGET (list->data)); + GtkWidget *child = list->data; + if (GLADE_IS_PLACEHOLDER (child)) + gtk_container_remove (container, child); } g_list_free (children); + children = gtk_container_get_children (container); + for (i = 0; i < n_columns; i++) for (j = 0; j < n_rows; j++) - if (glade_gtk_grid_has_child (grid, i, j) == FALSE) - { - gtk_grid_attach (grid, glade_placeholder_new (), - i, j, 1, 1); - } - gtk_container_check_resize (GTK_CONTAINER (grid)); + if (glade_gtk_grid_has_child (grid, children, i, j) == FALSE) + gtk_grid_attach (grid, glade_placeholder_new (), i, j, 1, 1); + + gtk_container_check_resize (container); + g_list_free (children); } static void @@ -609,20 +251,20 @@ glade_gtk_grid_remove_child (GladeWidgetAdaptor * adaptor, } void -glade_gtk_grid_replace_child (GladeWidgetAdaptor * adaptor, - GtkWidget * container, - GtkWidget * current, GtkWidget * new_widget) +glade_gtk_grid_replace_child (GladeWidgetAdaptor *adaptor, + GObject *container, + GObject *current, + GObject *new_widget) { g_return_if_fail (GTK_IS_GRID (container)); g_return_if_fail (GTK_IS_WIDGET (current)); g_return_if_fail (GTK_IS_WIDGET (new_widget)); /* Chain Up */ - GWA_GET_CLASS - (GTK_TYPE_CONTAINER)->replace_child (adaptor, - G_OBJECT (container), - G_OBJECT (current), - G_OBJECT (new_widget)); + GWA_GET_CLASS (GTK_TYPE_CONTAINER)->replace_child (adaptor, + container, + current, + new_widget); /* If we are replacing a GladeWidget, we must refresh placeholders * because the widget may have spanned multiple rows/columns, we must @@ -631,9 +273,8 @@ glade_gtk_grid_replace_child (GladeWidgetAdaptor * adaptor, * (since the remaining placeholder templates no longer exist, only the * first pasted widget would have proper packing properties). */ - if (glade_widget_get_from_gobject (new_widget) == NULL) + if (!GLADE_IS_PLACEHOLDER (new_widget)) glade_gtk_grid_refresh_placeholders (GTK_GRID (container)); - } static void diff --git a/plugins/gtk+/glade-gtk-table.c b/plugins/gtk+/glade-gtk-table.c index e61193b8..f93893c3 100644 --- a/plugins/gtk+/glade-gtk-table.c +++ b/plugins/gtk+/glade-gtk-table.c @@ -47,9 +47,6 @@ typedef enum DIR_RIGHT } GladeTableDir; -static GladeGtkTableChild table_edit = { 0, }; -static GladeGtkTableChild table_cur_attach = { 0, }; - static void glade_gtk_table_get_child_attachments (GtkWidget * table, GtkWidget * child, @@ -70,454 +67,6 @@ glade_gtk_table_get_child_attachments (GtkWidget * table, tchild->bottom_attach = bottom; } - -/* Takes a point (x or y depending on 'row') relative to - * table, and returns the row or column in which the point - * was found. - */ -static gint -glade_gtk_table_get_row_col_from_point (GtkTable * table, - gboolean row, gint point) -{ - GtkTableChild tchild; - GtkAllocation allocation; - GList *list, *children; - gint span, trans_point, size, base, end; - - children = gtk_container_get_children (GTK_CONTAINER (table)); - - for (list = children; list; list = list->next) - { - glade_gtk_table_get_child_attachments (GTK_WIDGET (table), - GTK_WIDGET (list->data), &tchild); - - if (row) - gtk_widget_translate_coordinates - (GTK_WIDGET (table), tchild.widget, 0, point, NULL, &trans_point); - else - gtk_widget_translate_coordinates - (GTK_WIDGET (table), tchild.widget, point, 0, &trans_point, NULL); - - gtk_widget_get_allocation (tchild.widget, &allocation); - /* Find any widget in our row/column - */ - end = row ? allocation.height : allocation.width; - - if (trans_point >= 0 && - /* should be trans_point < end ... test FIXME ! */ - trans_point < end) - { - base = row ? tchild.top_attach : tchild.left_attach; - size = row ? allocation.height : allocation.width; - span = row ? (tchild.bottom_attach - tchild.top_attach) : - (tchild.right_attach - tchild.left_attach); - - return base + (trans_point * span / size); - } - } - g_list_free (children); - - return -1; -} - - -static gboolean -glade_gtk_table_point_crosses_threshold (GtkTable * table, - gboolean row, - gint num, - GladeTableDir dir, gint point) -{ - - GtkTableChild tchild; - GtkAllocation allocation; - GList *list, *children; - gint span, trans_point, size, rowcol_size, base; - - children = gtk_container_get_children (GTK_CONTAINER (table)); - - for (list = children; list; list = list->next) - { - glade_gtk_table_get_child_attachments (GTK_WIDGET (table), - GTK_WIDGET (list->data), &tchild); - - /* Find any widget in our row/column - */ - if ((row && num >= tchild.top_attach && num < tchild.bottom_attach) || - (!row && num >= tchild.left_attach && num < tchild.right_attach)) - { - - if (row) - gtk_widget_translate_coordinates - (GTK_WIDGET (table), tchild.widget, - 0, point, NULL, &trans_point); - else - gtk_widget_translate_coordinates - (GTK_WIDGET (table), tchild.widget, - point, 0, &trans_point, NULL); - - span = row ? (tchild.bottom_attach - tchild.top_attach) : - (tchild.right_attach - tchild.left_attach); - gtk_widget_get_allocation (tchild.widget, &allocation); - size = row ? allocation.height : allocation.width; - - base = row ? tchild.top_attach : tchild.left_attach; - rowcol_size = size / span; - trans_point -= (num - base) * rowcol_size; - -#if 0 - g_print ("dir: %s, widget size: %d, rowcol size: %d, " - "requested rowcol: %d, widget base rowcol: %d, trim: %d, " - "widget point: %d, thresh: %d\n", - dir == DIR_UP ? "up" : dir == DIR_DOWN ? "down" : - dir == DIR_LEFT ? "left" : "right", - size, rowcol_size, num, base, (num - base) * rowcol_size, - trans_point, - dir == DIR_UP || dir == DIR_LEFT ? - (rowcol_size / 2) : (rowcol_size / 2)); -#endif - switch (dir) - { - case DIR_UP: - case DIR_LEFT: - return trans_point <= (rowcol_size / 2); - case DIR_DOWN: - case DIR_RIGHT: - return trans_point >= (rowcol_size / 2); - default: - break; - } - } - - } - - g_list_free (children); - - return FALSE; -} - -static gboolean -glade_gtk_table_get_attachments (GladeFixed * fixed, - GtkTable * table, - GdkRectangle * rect, - GladeGtkTableChild * configure) -{ - gint center_x, center_y, row, column; - guint n_columns, n_rows; - center_x = rect->x + (rect->width / 2); - center_y = rect->y + (rect->height / 2); - - column = glade_gtk_table_get_row_col_from_point (table, FALSE, center_x); - - row = glade_gtk_table_get_row_col_from_point (table, TRUE, center_y); - - /* its a start, now try to grow when the rect extents - * reach at least half way into the next row/column - */ - configure->left_attach = column; - configure->right_attach = column + 1; - configure->top_attach = row; - configure->bottom_attach = row + 1; - - if (column >= 0 && row >= 0) - { - - g_object_get (table, "n-columns", &n_columns, "n-rows", &n_rows, NULL); - - /* Check and expand left - */ - while (configure->left_attach > 0) - { - if (rect->x < fixed->child_x_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_LEFT (fixed->operation) == FALSE) - break; - - if (glade_gtk_table_point_crosses_threshold - (table, FALSE, configure->left_attach - 1, - DIR_LEFT, rect->x) == FALSE) - break; - - configure->left_attach--; - } - - /* Check and expand right - */ - while (configure->right_attach < n_columns) - { - if (rect->x + rect->width > - fixed->child_x_origin + fixed->child_width_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_RIGHT (fixed->operation) == FALSE) - break; - - if (glade_gtk_table_point_crosses_threshold - (table, FALSE, configure->right_attach, - DIR_RIGHT, rect->x + rect->width) == FALSE) - break; - - configure->right_attach++; - } - - /* Check and expand top - */ - while (configure->top_attach > 0) - { - if (rect->y < fixed->child_y_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_TOP (fixed->operation) == FALSE) - break; - - if (glade_gtk_table_point_crosses_threshold - (table, TRUE, configure->top_attach - 1, - DIR_UP, rect->y) == FALSE) - break; - - configure->top_attach--; - } - - /* Check and expand bottom - */ - while (configure->bottom_attach < n_rows) - { - if (rect->y + rect->height > - fixed->child_y_origin + fixed->child_height_origin && - fixed->operation != GLADE_CURSOR_DRAG && - GLADE_FIXED_CURSOR_BOTTOM (fixed->operation) == FALSE) - break; - - if (glade_gtk_table_point_crosses_threshold - (table, TRUE, configure->bottom_attach, - DIR_DOWN, rect->y + rect->height) == FALSE) - break; - - configure->bottom_attach++; - } - } - - /* Keep the same row/col span when performing a drag - */ - if (fixed->operation == GLADE_CURSOR_DRAG) - { - gint col_span = table_edit.right_attach - table_edit.left_attach; - gint row_span = table_edit.bottom_attach - table_edit.top_attach; - - if (rect->x < fixed->child_x_origin) - configure->right_attach = configure->left_attach + col_span; - else - configure->left_attach = configure->right_attach - col_span; - - if (rect->y < fixed->child_y_origin) - configure->bottom_attach = configure->top_attach + row_span; - else - configure->top_attach = configure->bottom_attach - row_span; - } - else if (fixed->operation == GLADE_CURSOR_RESIZE_RIGHT) - { - configure->left_attach = table_edit.left_attach; - configure->top_attach = table_edit.top_attach; - configure->bottom_attach = table_edit.bottom_attach; - } - else if (fixed->operation == GLADE_CURSOR_RESIZE_LEFT) - { - configure->right_attach = table_edit.right_attach; - configure->top_attach = table_edit.top_attach; - configure->bottom_attach = table_edit.bottom_attach; - } - else if (fixed->operation == GLADE_CURSOR_RESIZE_TOP) - { - configure->left_attach = table_edit.left_attach; - configure->right_attach = table_edit.right_attach; - configure->bottom_attach = table_edit.bottom_attach; - } - else if (fixed->operation == GLADE_CURSOR_RESIZE_BOTTOM) - { - configure->left_attach = table_edit.left_attach; - configure->right_attach = table_edit.right_attach; - configure->top_attach = table_edit.top_attach; - } - - return column >= 0 && row >= 0; -} - -static gboolean -glade_gtk_table_configure_child (GladeFixed * fixed, - GladeWidget * child, - GdkRectangle * rect, GtkWidget * table) -{ - GladeGtkTableChild configure = { child, }; - - /* Sometimes we are unable to find a widget in the appropriate column, - * usually because a placeholder hasnt had its size allocation yet. - */ - if (glade_gtk_table_get_attachments - (fixed, GTK_TABLE (table), rect, &configure)) - { - if (memcmp (&configure, &table_cur_attach, sizeof (GladeGtkTableChild)) != 0) - { - - glade_property_push_superuser (); - glade_widget_pack_property_set (child, "left-attach", - configure.left_attach); - glade_widget_pack_property_set (child, "right-attach", - configure.right_attach); - glade_widget_pack_property_set (child, "top-attach", - configure.top_attach); - glade_widget_pack_property_set (child, "bottom-attach", - configure.bottom_attach); - glade_property_pop_superuser (); - - memcpy (&table_cur_attach, &configure, sizeof (GladeGtkTableChild)); - } - } - return TRUE; -} - - -static gboolean -glade_gtk_table_configure_begin (GladeFixed * fixed, - GladeWidget * child, GtkWidget * table) -{ - - table_edit.widget = child; - - glade_widget_pack_property_get (child, "left-attach", - &table_edit.left_attach); - glade_widget_pack_property_get (child, "right-attach", - &table_edit.right_attach); - glade_widget_pack_property_get (child, "top-attach", &table_edit.top_attach); - glade_widget_pack_property_get (child, "bottom-attach", - &table_edit.bottom_attach); - - memcpy (&table_cur_attach, &table_edit, sizeof (GladeGtkTableChild)); - - return TRUE; -} - -static gboolean -glade_gtk_table_configure_end (GladeFixed * fixed, - GladeWidget * child, GtkWidget * table) -{ - GladeGtkTableChild new_child = { child, }; - - glade_widget_pack_property_get (child, "left-attach", &new_child.left_attach); - glade_widget_pack_property_get (child, "right-attach", - &new_child.right_attach); - glade_widget_pack_property_get (child, "top-attach", &new_child.top_attach); - glade_widget_pack_property_get (child, "bottom-attach", - &new_child.bottom_attach); - - /* Compare the meaningfull part of the current edit. */ - if (memcmp (&new_child, &table_edit, sizeof (GladeGtkTableChild)) != 0) - { - GValue left_attach_value = { 0, }; - GValue right_attach_value = { 0, }; - GValue top_attach_value = { 0, }; - GValue bottom_attach_value = { 0, }; - - GValue new_left_attach_value = { 0, }; - GValue new_right_attach_value = { 0, }; - GValue new_top_attach_value = { 0, }; - GValue new_bottom_attach_value = { 0, }; - - GladeProperty *left_attach_prop, *right_attach_prop, - *top_attach_prop, *bottom_attach_prop; - - left_attach_prop = glade_widget_get_pack_property (child, "left-attach"); - right_attach_prop = - glade_widget_get_pack_property (child, "right-attach"); - top_attach_prop = glade_widget_get_pack_property (child, "top-attach"); - bottom_attach_prop = - glade_widget_get_pack_property (child, "bottom-attach"); - - g_return_val_if_fail (GLADE_IS_PROPERTY (left_attach_prop), FALSE); - g_return_val_if_fail (GLADE_IS_PROPERTY (right_attach_prop), FALSE); - g_return_val_if_fail (GLADE_IS_PROPERTY (top_attach_prop), FALSE); - g_return_val_if_fail (GLADE_IS_PROPERTY (bottom_attach_prop), FALSE); - - glade_property_get_value (left_attach_prop, &new_left_attach_value); - glade_property_get_value (right_attach_prop, &new_right_attach_value); - glade_property_get_value (top_attach_prop, &new_top_attach_value); - glade_property_get_value (bottom_attach_prop, &new_bottom_attach_value); - - g_value_init (&left_attach_value, G_TYPE_UINT); - g_value_init (&right_attach_value, G_TYPE_UINT); - g_value_init (&top_attach_value, G_TYPE_UINT); - g_value_init (&bottom_attach_value, G_TYPE_UINT); - - g_value_set_uint (&left_attach_value, table_edit.left_attach); - g_value_set_uint (&right_attach_value, table_edit.right_attach); - g_value_set_uint (&top_attach_value, table_edit.top_attach); - g_value_set_uint (&bottom_attach_value, table_edit.bottom_attach); - - glade_command_push_group (_("Placing %s inside %s"), - glade_widget_get_name (child), - glade_widget_get_name (GLADE_WIDGET (fixed))); - glade_command_set_properties - (left_attach_prop, &left_attach_value, &new_left_attach_value, - right_attach_prop, &right_attach_value, &new_right_attach_value, - top_attach_prop, &top_attach_value, &new_top_attach_value, - bottom_attach_prop, &bottom_attach_value, &new_bottom_attach_value, - NULL); - glade_command_pop_group (); - - g_value_unset (&left_attach_value); - g_value_unset (&right_attach_value); - g_value_unset (&top_attach_value); - g_value_unset (&bottom_attach_value); - g_value_unset (&new_left_attach_value); - g_value_unset (&new_right_attach_value); - g_value_unset (&new_top_attach_value); - g_value_unset (&new_bottom_attach_value); - } - - return TRUE; -} - -void -glade_gtk_table_post_create (GladeWidgetAdaptor * adaptor, - GObject * container, GladeCreateReason reason) -{ - GladeWidget *gwidget = glade_widget_get_from_gobject (container); - - g_signal_connect (G_OBJECT (gwidget), "configure-child", - G_CALLBACK (glade_gtk_table_configure_child), container); - - g_signal_connect (G_OBJECT (gwidget), "configure-begin", - G_CALLBACK (glade_gtk_table_configure_begin), container); - - g_signal_connect (G_OBJECT (gwidget), "configure-end", - G_CALLBACK (glade_gtk_table_configure_end), container); -} - -static gboolean -glade_gtk_table_has_child (GtkTable * table, guint left_attach, - guint top_attach) -{ - GList *list, *children; - gboolean ret = FALSE; - - children = gtk_container_get_children (GTK_CONTAINER (table)); - - for (list = children; list && list->data; list = list->next) - { - GtkTableChild child; - - glade_gtk_table_get_child_attachments (GTK_WIDGET (table), - GTK_WIDGET (list->data), &child); - - if (left_attach >= child.left_attach && left_attach < child.right_attach - && top_attach >= child.top_attach && top_attach < child.bottom_attach) - { - ret = TRUE; - break; - } - } - - g_list_free (children); - - return ret; -} - static gboolean glade_gtk_table_widget_exceeds_bounds (GtkTable * table, gint n_rows, gint n_cols) @@ -697,7 +246,7 @@ glade_gtk_table_replace_child (GladeWidgetAdaptor * adaptor, * (since the remaining placeholder templates no longer exist, only the * first pasted widget would have proper packing properties). */ - if (glade_widget_get_from_gobject (new_widget) == NULL) + if (!GLADE_IS_PLACEHOLDER (new_widget)) glade_gtk_table_refresh_placeholders (GTK_TABLE (container)); } diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c index 510c592a..f095994a 100644 --- a/plugins/gtk+/glade-gtk.c +++ b/plugins/gtk+/glade-gtk.c @@ -1447,230 +1447,6 @@ glade_gtk_create_fixed_widget (GladeWidgetAdaptor * adaptor, first_property_name, var_args); } -typedef struct -{ - GtkWidget *widget; - gint position; -} GladeGtkBoxChild; - -static GList *glade_gtk_box_original_positions = NULL; - -static gboolean -glade_gtk_box_configure_child (GladeFixed * fixed, - GladeWidget * child, - GdkRectangle * rect, GtkWidget * box) -{ - GList *list, *children; - GtkWidget *bchild; - GtkAllocation allocation, bchild_allocation; - gint point, trans_point, span, - iter_span, position, old_position, offset, orig_offset; - gboolean found = FALSE; - - gtk_widget_get_allocation (GTK_WIDGET (glade_widget_get_object (child)), &allocation); - if (GTK_IS_HBOX (box) || GTK_IS_HBUTTON_BOX (box)) - { - point = fixed->mouse_x; - span = allocation.width; - offset = rect->x; - orig_offset = fixed->child_x_origin; - } - else - { - point = fixed->mouse_y; - span = allocation.height; - offset = rect->y; - orig_offset = fixed->child_y_origin; - } - - glade_widget_pack_property_get (child, "position", &old_position); - - children = gtk_container_get_children (GTK_CONTAINER (box)); - - for (list = children; list; list = list->next) - { - bchild = list->data; - - if (bchild == GTK_WIDGET (glade_widget_get_object (child))) - continue; - - /* Find the widget in the box where the center of - * this rectangle fits... and set the position to that - * position. - */ - - gtk_widget_get_allocation (GTK_WIDGET (bchild), &bchild_allocation); - if (GTK_IS_HBOX (box) || GTK_IS_HBUTTON_BOX (box)) - { - gtk_widget_translate_coordinates - (GTK_WIDGET (box), bchild, point, 0, &trans_point, NULL); - - iter_span = bchild_allocation.width; - } - else - { - gtk_widget_translate_coordinates - (GTK_WIDGET (box), bchild, 0, point, NULL, &trans_point); - iter_span = bchild_allocation.height; - } - -#if 0 - gtk_container_child_get (GTK_CONTAINER (box), - bchild, "position", &position, NULL); - g_print ("widget: %p pos %d, point %d, trans_point %d, iter_span %d\n", - bchild, position, point, trans_point, iter_span); -#endif - - if (iter_span <= span) - { - found = trans_point >= 0 && trans_point < iter_span; - } - else - { - if (offset > orig_offset) - found = trans_point >= iter_span - span && trans_point < iter_span; - else if (offset < orig_offset) - found = trans_point >= 0 && trans_point < span; - } - - if (found) - { - gtk_container_child_get (GTK_CONTAINER (box), - bchild, "position", &position, NULL); - -#if 0 - g_print ("setting position of %s from %d to %d, " - "(point %d iter_span %d)\n", - child->name, old_position, position, trans_point, iter_span); -#endif - - glade_widget_pack_property_set (child, "position", position); - - break; - } - - } - - g_list_free (children); - - return TRUE; -} - -static gboolean -glade_gtk_box_configure_begin (GladeFixed * fixed, - GladeWidget * child, GtkWidget * box) -{ - GList *list, *children; - GtkWidget *bchild; - - g_assert (glade_gtk_box_original_positions == NULL); - - children = gtk_container_get_children (GTK_CONTAINER (box)); - - for (list = children; list; list = list->next) - { - GladeGtkBoxChild *gbchild; - GladeWidget *gchild; - - bchild = list->data; - if ((gchild = glade_widget_get_from_gobject (bchild)) == NULL) - continue; - - gbchild = g_new0 (GladeGtkBoxChild, 1); - gbchild->widget = bchild; - glade_widget_pack_property_get (gchild, "position", &gbchild->position); - - glade_gtk_box_original_positions = - g_list_prepend (glade_gtk_box_original_positions, gbchild); - } - - g_list_free (children); - - return TRUE; -} - -static gboolean -glade_gtk_box_configure_end (GladeFixed * fixed, - GladeWidget * child, GtkWidget * box) -{ - GList *list, *l, *children; - GList *prop_list = NULL; - - children = gtk_container_get_children (GTK_CONTAINER (box)); - - for (list = children; list; list = list->next) - { - GtkWidget *bchild = list->data; - - for (l = glade_gtk_box_original_positions; l; l = l->next) - { - GladeGtkBoxChild *gbchild = l->data; - GladeWidget *gchild = glade_widget_get_from_gobject (gbchild->widget); - - - if (bchild == gbchild->widget) - { - GCSetPropData *prop_data = g_new0 (GCSetPropData, 1); - prop_data->property = - glade_widget_get_pack_property (gchild, "position"); - - prop_data->old_value = g_new0 (GValue, 1); - prop_data->new_value = g_new0 (GValue, 1); - - glade_property_get_value (prop_data->property, - prop_data->new_value); - - g_value_init (prop_data->old_value, G_TYPE_INT); - g_value_set_int (prop_data->old_value, gbchild->position); - - prop_list = g_list_prepend (prop_list, prop_data); - break; - } - } - } - - g_list_free (children); - - glade_command_push_group (_("Ordering children of %s"), - glade_widget_get_name (GLADE_WIDGET (fixed))); - glade_property_push_superuser (); - if (prop_list) - glade_command_set_properties_list (glade_widget_get_project (GLADE_WIDGET (fixed)), - prop_list); - glade_property_pop_superuser (); - glade_command_pop_group (); - - for (l = glade_gtk_box_original_positions; l; l = l->next) - g_free (l->data); - - glade_gtk_box_original_positions = - (g_list_free (glade_gtk_box_original_positions), NULL); - - - return TRUE; -} - -void -glade_gtk_box_post_create (GladeWidgetAdaptor * adaptor, - GObject * container, GladeCreateReason reason) -{ - GladeWidget *gwidget = glade_widget_get_from_gobject (container); - - /* Implement drag in GtkBox but not resize. - */ - g_object_set (gwidget, "can-resize", FALSE, NULL); - - g_signal_connect (G_OBJECT (gwidget), "configure-child", - G_CALLBACK (glade_gtk_box_configure_child), container); - - g_signal_connect (G_OBJECT (gwidget), "configure-begin", - G_CALLBACK (glade_gtk_box_configure_begin), container); - - g_signal_connect (G_OBJECT (gwidget), "configure-end", - G_CALLBACK (glade_gtk_box_configure_end), container); - -} - static gint sort_box_children (GtkWidget * widget_a, GtkWidget * widget_b) { diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in index ae21c5bc..f6d20cf1 100644 --- a/plugins/gtk+/gtk+.xml.in +++ b/plugins/gtk+/gtk+.xml.in @@ -321,8 +321,6 @@ embedded in another object</_tooltip> </glade-widget-class> <glade-widget-class name="GtkBox" generic-name="box" _title="Box"> - <create-widget-function>glade_gtk_create_fixed_widget</create-widget-function> - <post-create-function>glade_gtk_box_post_create</post-create-function> <get-children-function>glade_gtk_box_get_children</get-children-function> <set-property-function>glade_gtk_box_set_property</set-property-function> <get-property-function>glade_gtk_box_get_property</get-property-function> @@ -1431,8 +1429,6 @@ embedded in another object</_tooltip> </glade-widget-class> <glade-widget-class name="GtkTable" generic-name="table" _title="Table"> - <create-widget-function>glade_gtk_create_fixed_widget</create-widget-function> - <post-create-function>glade_gtk_table_post_create</post-create-function> <child-set-property-function>glade_gtk_table_set_child_property</child-set-property-function> <child-verify-function>glade_gtk_table_child_verify_property</child-verify-function> <get-children-function>glade_gtk_table_get_children</get-children-function> @@ -1476,7 +1472,6 @@ embedded in another object</_tooltip> </glade-widget-class> <glade-widget-class name="GtkGrid" generic-name="grid" _title="Grid"> - <create-widget-function>glade_gtk_create_fixed_widget</create-widget-function> <post-create-function>glade_gtk_grid_post_create</post-create-function> <child-set-property-function>glade_gtk_grid_set_child_property</child-set-property-function> <child-verify-function>glade_gtk_grid_child_verify_property</child-verify-function> |