GtkGrid: Add a way to insert rows or columns

This is useful functionality that makes it easier to insert
things in the middle of an already populated grid.

Bug 653817
This commit is contained in:
Matthias Clasen 2011-08-08 12:06:59 +02:00
parent 5bfef8c80a
commit 17f99f663f
5 changed files with 223 additions and 0 deletions

View File

@ -6914,6 +6914,9 @@ GtkGrid
gtk_grid_new gtk_grid_new
gtk_grid_attach gtk_grid_attach
gtk_grid_attach_next_to gtk_grid_attach_next_to
gtk_grid_insert_row
gtk_grid_insert_column
gtk_grid_insert_next_to
gtk_grid_set_row_homogeneous gtk_grid_set_row_homogeneous
gtk_grid_get_row_homogeneous gtk_grid_get_row_homogeneous
gtk_grid_set_row_spacing gtk_grid_set_row_spacing

View File

@ -1090,6 +1090,9 @@ gtk_grid_get_column_spacing
gtk_grid_get_row_homogeneous gtk_grid_get_row_homogeneous
gtk_grid_get_row_spacing gtk_grid_get_row_spacing
gtk_grid_get_type gtk_grid_get_type
gtk_grid_insert_column
gtk_grid_insert_next_to
gtk_grid_insert_row
gtk_grid_new gtk_grid_new
gtk_grid_set_column_homogeneous gtk_grid_set_column_homogeneous
gtk_grid_set_column_spacing gtk_grid_set_column_spacing

View File

@ -1479,6 +1479,142 @@ gtk_grid_attach_next_to (GtkGrid *grid,
grid_attach (grid, child, left, top, width, height); grid_attach (grid, child, left, top, width, height);
} }
/**
* gtk_grid_insert_row:
* @grid: a #GtkGrid
* @position: the position to insert the row at
*
* Inserts a row at the specified position.
*
* Children which are attached at or below this position
* are moved one row down. Children which span across this
* position are grown to span the new row.
*
* Since: 3.2
*/
void
gtk_grid_insert_row (GtkGrid *grid,
gint position)
{
GtkGridPrivate *priv = grid->priv;
GtkGridChild *child;
GList *list;
gint top, height;
g_return_if_fail (GTK_IS_GRID (grid));
for (list = priv->children; list; list = list->next)
{
child = list->data;
top = CHILD_TOP (child);
height = CHILD_HEIGHT (child);
if (top >= position)
{
CHILD_TOP (child) = top + 1;
gtk_container_child_notify (GTK_CONTAINER (grid), child->widget, "top-attach");
}
else if (top + height > position)
{
CHILD_HEIGHT (child) = height + 1;
gtk_container_child_notify (GTK_CONTAINER (grid), child->widget, "height");
}
}
}
/**
* gtk_grid_insert_column:
* @grid: a #GtkGrid
* @position: the position to insert the column at
*
* Inserts a column at the specified position.
*
* Children which are attached at or to the right of this position
* are moved one column to the right. Children which span across this
* position are grown to span the new column.
*
* Since: 3.2
*/
void
gtk_grid_insert_column (GtkGrid *grid,
gint position)
{
GtkGridPrivate *priv = grid->priv;
GtkGridChild *child;
GList *list;
gint left, width;
g_return_if_fail (GTK_IS_GRID (grid));
for (list = priv->children; list; list = list->next)
{
child = list->data;
left = CHILD_LEFT (child);
width = CHILD_WIDTH (child);
if (left >= position)
{
CHILD_LEFT (child) = left + 1;
gtk_container_child_notify (GTK_CONTAINER (grid), child->widget, "left-attach");
}
else if (left + width > position)
{
CHILD_WIDTH (child) = width + 1;
gtk_container_child_notify (GTK_CONTAINER (grid), child->widget, "width");
}
}
}
/**
* gtk_grid_insert_next_to:
* @grid: a #GtkGrid
* @sibling: the child of @grid that the new row or column will be
* placed next to
* @side: the side of @sibling that @child is positioned next to
*
* Inserts a row or column at the specified position.
*
* The new row or column is placed next to @sibling, on the side
* determined by @side. If @side is %GTK_POS_TOP or %GTK_POS_BOTTOM,
* a row is inserted. If @side is %GTK_POS_LEFT of %GTK_POS_RIGHT,
* a column is inserted.
*
* Since: 3.2
*/
void
gtk_grid_insert_next_to (GtkGrid *grid,
GtkWidget *sibling,
GtkPositionType side)
{
GtkGridChild *child;
g_return_if_fail (GTK_IS_GRID (grid));
g_return_if_fail (GTK_IS_WIDGET (sibling));
g_return_if_fail (gtk_widget_get_parent (sibling) == (GtkWidget*)grid);
child = find_grid_child (grid, sibling);
switch (side)
{
case GTK_POS_LEFT:
gtk_grid_insert_column (grid, CHILD_LEFT (child));
break;
case GTK_POS_RIGHT:
gtk_grid_insert_column (grid, CHILD_LEFT (child) + CHILD_WIDTH (child));
break;
case GTK_POS_TOP:
gtk_grid_insert_row (grid, CHILD_TOP (child));
break;
case GTK_POS_BOTTOM:
gtk_grid_insert_row (grid, CHILD_TOP (child) + CHILD_HEIGHT (child));
break;
default:
g_assert_not_reached ();
}
}
/** /**
* gtk_grid_set_row_homogeneous: * gtk_grid_set_row_homogeneous:
* @grid: a #GtkGrid * @grid: a #GtkGrid

View File

@ -79,6 +79,13 @@ void gtk_grid_attach_next_to (GtkGrid *grid,
GtkPositionType side, GtkPositionType side,
gint width, gint width,
gint height); gint height);
void gtk_grid_insert_row (GtkGrid *grid,
gint position);
void gtk_grid_insert_column (GtkGrid *grid,
gint position);
void gtk_grid_insert_next_to (GtkGrid *grid,
GtkWidget *sibling,
GtkPositionType side);
void gtk_grid_set_row_homogeneous (GtkGrid *grid, void gtk_grid_set_row_homogeneous (GtkGrid *grid,
gboolean homogeneous); gboolean homogeneous);
gboolean gtk_grid_get_row_homogeneous (GtkGrid *grid); gboolean gtk_grid_get_row_homogeneous (GtkGrid *grid);

View File

@ -247,6 +247,79 @@ scrolling (void)
gtk_widget_show_all (window); gtk_widget_show_all (window);
} }
static void
insert (void)
{
GtkWidget *window;
GtkWidget *g;
GtkWidget *grid;
GtkWidget *child;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Insertion");
g = gtk_grid_new ();
gtk_grid_set_row_spacing (GTK_GRID (g), 10);
gtk_grid_set_column_spacing (GTK_GRID (g), 10);
gtk_container_add (GTK_CONTAINER (window), g);
grid = gtk_grid_new ();
gtk_grid_attach (GTK_GRID (g), grid, 0, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 0)", "blue"), 0, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "blue"), 0, 1, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 0)", "green"), 1, 0, 1, 2);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(2, 0)", "yellow"), 2, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(2, 1)", "yellow"), 2, 1, 1, 1);
gtk_grid_insert_row (GTK_GRID (grid), 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "red"), 0, 1, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(2, 1)", "red"), 2, 1, 1, 1);
grid = gtk_grid_new ();
gtk_grid_attach (GTK_GRID (g), grid, 1, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 0)", "blue"), 0, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 0)", "blue"), 1, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "green"), 0, 1, 2, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 2)", "yellow"), 0, 2, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 2)", "yellow"), 1, 2, 1, 1);
gtk_grid_insert_column (GTK_GRID (grid), 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 0)", "red"), 1, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 2)", "red"), 1, 2, 1, 1);
grid = gtk_grid_new ();
gtk_grid_attach (GTK_GRID (g), grid, 0, 1, 1, 1);
child = test_widget ("(0, 0)", "blue");
gtk_grid_attach (GTK_GRID (grid), child, 0, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "blue"), 0, 1, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 0)", "green"), 1, 0, 1, 2);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(2, 0)", "yellow"), 2, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(2, 1)", "yellow"), 2, 1, 1, 1);
gtk_grid_insert_next_to (GTK_GRID (grid), child, GTK_POS_BOTTOM);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "red"), 0, 1, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(2, 1)", "red"), 2, 1, 1, 1);
grid = gtk_grid_new ();
gtk_grid_attach (GTK_GRID (g), grid, 1, 1, 1, 1);
child = test_widget ("(0, 0)", "blue");
gtk_grid_attach (GTK_GRID (grid), child, 0, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 0)", "blue"), 1, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 1)", "green"), 0, 1, 2, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(0, 2)", "yellow"), 0, 2, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 2)", "yellow"), 1, 2, 1, 1);
gtk_grid_insert_next_to (GTK_GRID (grid), child, GTK_POS_RIGHT);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 0)", "red"), 1, 0, 1, 1);
gtk_grid_attach (GTK_GRID (grid), test_widget ("(1, 2)", "red"), 1, 2, 1, 1);
gtk_widget_show_all (window);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -260,6 +333,7 @@ main (int argc, char *argv[])
box_comparison (); box_comparison ();
empty_line (); empty_line ();
scrolling (); scrolling ();
insert ();
gtk_main (); gtk_main ();