Fixes for #130370, based on a patch by Michael Meeks:

Tue Jan 20 22:11:31 2004  Matthias Clasen  <maclas@gmx.de>

	Fixes for #130370, based on a patch by Michael Meeks:

	* gtk/gtkmenu.c (gtk_menu_do_remove): New auxiliary function to
	adjust cell positions and recalculate row and column counts after
	removing an item.

	* gtk/gtkmenu.c (gtk_menu_remove): Call gtk_menu_do_remove.

	* gtk/gtkmenu.c (gtk_menu_do_insert): Don't leave empty rows when
	appending items.

	* gtk/gtkmenu.c (gtk_menu_attach): Don't call gtk_menu_shell_append,
	to avoid an unintended recursion.
This commit is contained in:
Matthias Clasen 2004-01-20 21:11:30 +00:00 committed by Matthias Clasen
parent 1c28c446fc
commit d7bfabebdb
6 changed files with 138 additions and 21 deletions

View File

@ -1,3 +1,19 @@
Tue Jan 20 22:11:31 2004 Matthias Clasen <maclas@gmx.de>
Fixes for #130370, based on a patch by Michael Meeks:
* gtk/gtkmenu.c (gtk_menu_do_remove): New auxiliary function to
adjust cell positions and recalculate row and column counts after
removing an item.
* gtk/gtkmenu.c (gtk_menu_remove): Call gtk_menu_do_remove.
* gtk/gtkmenu.c (gtk_menu_do_insert): Don't leave empty rows when
appending items.
* gtk/gtkmenu.c (gtk_menu_attach): Don't call gtk_menu_shell_append,
to avoid an unintended recursion.
2004-01-19 Federico Mena Quintero <federico@ximian.com> 2004-01-19 Federico Mena Quintero <federico@ximian.com>
Fix #131418. Fix #131418.

View File

@ -1,3 +1,19 @@
Tue Jan 20 22:11:31 2004 Matthias Clasen <maclas@gmx.de>
Fixes for #130370, based on a patch by Michael Meeks:
* gtk/gtkmenu.c (gtk_menu_do_remove): New auxiliary function to
adjust cell positions and recalculate row and column counts after
removing an item.
* gtk/gtkmenu.c (gtk_menu_remove): Call gtk_menu_do_remove.
* gtk/gtkmenu.c (gtk_menu_do_insert): Don't leave empty rows when
appending items.
* gtk/gtkmenu.c (gtk_menu_attach): Don't call gtk_menu_shell_append,
to avoid an unintended recursion.
2004-01-19 Federico Mena Quintero <federico@ximian.com> 2004-01-19 Federico Mena Quintero <federico@ximian.com>
Fix #131418. Fix #131418.

View File

@ -1,3 +1,19 @@
Tue Jan 20 22:11:31 2004 Matthias Clasen <maclas@gmx.de>
Fixes for #130370, based on a patch by Michael Meeks:
* gtk/gtkmenu.c (gtk_menu_do_remove): New auxiliary function to
adjust cell positions and recalculate row and column counts after
removing an item.
* gtk/gtkmenu.c (gtk_menu_remove): Call gtk_menu_do_remove.
* gtk/gtkmenu.c (gtk_menu_do_insert): Don't leave empty rows when
appending items.
* gtk/gtkmenu.c (gtk_menu_attach): Don't call gtk_menu_shell_append,
to avoid an unintended recursion.
2004-01-19 Federico Mena Quintero <federico@ximian.com> 2004-01-19 Federico Mena Quintero <federico@ximian.com>
Fix #131418. Fix #131418.

View File

@ -1,3 +1,19 @@
Tue Jan 20 22:11:31 2004 Matthias Clasen <maclas@gmx.de>
Fixes for #130370, based on a patch by Michael Meeks:
* gtk/gtkmenu.c (gtk_menu_do_remove): New auxiliary function to
adjust cell positions and recalculate row and column counts after
removing an item.
* gtk/gtkmenu.c (gtk_menu_remove): Call gtk_menu_do_remove.
* gtk/gtkmenu.c (gtk_menu_do_insert): Don't leave empty rows when
appending items.
* gtk/gtkmenu.c (gtk_menu_attach): Don't call gtk_menu_shell_append,
to avoid an unintended recursion.
2004-01-19 Federico Mena Quintero <federico@ximian.com> 2004-01-19 Federico Mena Quintero <federico@ximian.com>
Fix #131418. Fix #131418.

View File

@ -1,3 +1,19 @@
Tue Jan 20 22:11:31 2004 Matthias Clasen <maclas@gmx.de>
Fixes for #130370, based on a patch by Michael Meeks:
* gtk/gtkmenu.c (gtk_menu_do_remove): New auxiliary function to
adjust cell positions and recalculate row and column counts after
removing an item.
* gtk/gtkmenu.c (gtk_menu_remove): Call gtk_menu_do_remove.
* gtk/gtkmenu.c (gtk_menu_do_insert): Don't leave empty rows when
appending items.
* gtk/gtkmenu.c (gtk_menu_attach): Don't call gtk_menu_shell_append,
to avoid an unintended recursion.
2004-01-19 Federico Mena Quintero <federico@ximian.com> 2004-01-19 Federico Mena Quintero <federico@ximian.com>
Fix #131418. Fix #131418.

View File

@ -597,22 +597,20 @@ gtk_menu_set_child_property (GtkContainer *container,
break; break;
case CHILD_PROP_RIGHT_ATTACH: case CHILD_PROP_RIGHT_ATTACH:
ai->right_attach = g_value_get_uint (value); ai->right_attach = g_value_get_uint (value);
priv->columns = MAX (priv->columns, ai->right_attach);
break; break;
case CHILD_PROP_TOP_ATTACH: case CHILD_PROP_TOP_ATTACH:
ai->top_attach = g_value_get_uint (value); ai->top_attach = g_value_get_uint (value);
break; break;
case CHILD_PROP_BOTTOM_ATTACH: case CHILD_PROP_BOTTOM_ATTACH:
ai->bottom_attach = g_value_get_uint (value); ai->bottom_attach = g_value_get_uint (value);
priv->rows = MAX (priv->rows, ai->bottom_attach);
break; break;
default: default:
GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
return; return;
} }
priv->columns = MAX (priv->columns, ai->right_attach);
priv->rows = MAX (priv->rows, ai->bottom_attach);
gtk_widget_queue_resize (GTK_WIDGET (menu)); gtk_widget_queue_resize (GTK_WIDGET (menu));
} }
@ -935,6 +933,41 @@ gtk_menu_detach (GtkMenu *menu)
g_object_unref (menu); g_object_unref (menu);
} }
static void
gtk_menu_do_remove (GtkMenuShell *menu_shell,
GtkWidget *child)
{
AttachInfo *ai;
GList *children;
GtkMenuPrivate *priv;
gint delta;
ai = get_attach_info (G_OBJECT (child));
priv = gtk_menu_get_private (GTK_MENU (menu_shell));
delta = ai->bottom_attach - ai->top_attach;
/* recalculate these, assuming the child has already been removed */
priv->rows = 0;
priv->columns = 0;
for (children = menu_shell->children; children; children = children->next)
{
AttachInfo *child_ai = get_attach_info (children->data);
/* Do not move items in table menus */
if (priv->columns == 1 && child_ai->bottom_attach > ai->bottom_attach)
gtk_container_child_set (GTK_CONTAINER (menu_shell), children->data,
"top_attach", child_ai->top_attach - delta,
"bottom_attach", child_ai->bottom_attach - delta,
NULL);
else
{
priv->columns = MAX (priv->columns, child_ai->right_attach);
priv->rows = MAX (priv->rows, child_ai->bottom_attach);
}
}
}
static void static void
gtk_menu_remove (GtkContainer *container, gtk_menu_remove (GtkContainer *container,
GtkWidget *widget) GtkWidget *widget)
@ -957,6 +990,7 @@ gtk_menu_remove (GtkContainer *container,
g_object_set_data (G_OBJECT (widget), ATTACH_INFO_KEY, NULL); g_object_set_data (G_OBJECT (widget), ATTACH_INFO_KEY, NULL);
GTK_CONTAINER_CLASS (parent_class)->remove (container, widget); GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
gtk_menu_do_remove (GTK_MENU_SHELL (container), widget);
} }
@ -971,39 +1005,34 @@ gtk_menu_do_insert (GtkMenuShell *menu_shell,
GtkWidget *child, GtkWidget *child,
gint position) gint position)
{ {
gint i;
GList *children; GList *children;
GtkMenuPrivate *priv; GtkMenuPrivate *priv;
priv = gtk_menu_get_private (GTK_MENU (menu_shell)); priv = gtk_menu_get_private (GTK_MENU (menu_shell));
if (position < 0) if (position < 0 || position >= priv->rows)
{ {
/* attach after the last row */ /* attach after the last row */
i = g_list_length (menu_shell->children) - 1;
gtk_menu_attach (GTK_MENU (menu_shell), child, gtk_menu_attach (GTK_MENU (menu_shell), child,
0, priv->columns ? priv->columns : 1, 0, priv->columns ? priv->columns : 1,
i, i + 1); priv->rows, priv->rows + 1);
return; return;
} }
/* we need to make space for this new item; move all items with /* We need to make space for this new item; move all items with
* top >= position one down * top >= position one down.
* Note that this does not prevent overlaps when the menu contains
* vertically spanning items.
*/ */
for (children = menu_shell->children; children; children = children->next) for (children = menu_shell->children; children; children = children->next)
{ {
guint top, bottom; AttachInfo *child_ai = get_attach_info (children->data);
gtk_container_child_get (GTK_CONTAINER (menu_shell), children->data, if (child_ai->top_attach >= position)
"top_attach", &top,
"bottom_attach", &bottom,
NULL);
if (top >= position)
gtk_container_child_set (GTK_CONTAINER (menu_shell), children->data, gtk_container_child_set (GTK_CONTAINER (menu_shell), children->data,
"top_attach", top + 1, "top_attach", child_ai->top_attach + 1,
"bottom_attach", bottom + 1, "bottom_attach", child_ai->bottom_attach + 1,
NULL); NULL);
} }
@ -3671,6 +3700,8 @@ gtk_menu_set_screen (GtkMenu *menu,
* rightmost, uppermost and lower column and row numbers of the table. * rightmost, uppermost and lower column and row numbers of the table.
* (Columns and rows are indexed from zero). * (Columns and rows are indexed from zero).
* *
* Note that this function is not related to gtk_menu_detach().
*
* Since: 2.4 * Since: 2.4
**/ **/
void void
@ -3683,12 +3714,18 @@ gtk_menu_attach (GtkMenu *menu,
{ {
g_return_if_fail (GTK_IS_MENU (menu)); g_return_if_fail (GTK_IS_MENU (menu));
g_return_if_fail (GTK_IS_MENU_ITEM (child)); g_return_if_fail (GTK_IS_MENU_ITEM (child));
g_return_if_fail (child->parent == NULL ||
child->parent == GTK_WIDGET (menu));
g_return_if_fail (left_attach < right_attach); g_return_if_fail (left_attach < right_attach);
g_return_if_fail (top_attach < bottom_attach); g_return_if_fail (top_attach < bottom_attach);
if (!child->parent) if (!child->parent)
gtk_menu_shell_append (GTK_MENU_SHELL (menu), child); {
GTK_MENU_SHELL (menu)->children =
g_list_append (GTK_MENU_SHELL (menu)->children, child);
gtk_widget_set_parent (child, GTK_WIDGET (menu));
}
gtk_container_child_set (GTK_CONTAINER (menu), child, gtk_container_child_set (GTK_CONTAINER (menu), child,
"left_attach", left_attach, "left_attach", left_attach,