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:
parent
5bfef8c80a
commit
17f99f663f
@ -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
|
||||||
|
@ -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
|
||||||
|
136
gtk/gtkgrid.c
136
gtk/gtkgrid.c
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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 ();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user