diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-08-08 12:06:59 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-08-08 13:13:48 +0200 |
commit | 17f99f663f178edf06b20bebd00bc3fd56ae006a (patch) | |
tree | 160242a67c4d5e19259fc0ca34df6036c04dec8d | |
parent | 5bfef8c80a62fe4130602f0017f10880aa18e574 (diff) | |
download | gtk+-17f99f663f178edf06b20bebd00bc3fd56ae006a.tar.gz |
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
-rw-r--r-- | docs/reference/gtk/gtk3-sections.txt | 3 | ||||
-rw-r--r-- | gtk/gtk.symbols | 3 | ||||
-rw-r--r-- | gtk/gtkgrid.c | 136 | ||||
-rw-r--r-- | gtk/gtkgrid.h | 7 | ||||
-rw-r--r-- | tests/testgrid.c | 74 |
5 files changed, 223 insertions, 0 deletions
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 0167abb005..7992f8faed 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -6914,6 +6914,9 @@ GtkGrid gtk_grid_new gtk_grid_attach 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_get_row_homogeneous gtk_grid_set_row_spacing diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index a2447f7976..4325f2f12f 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -1090,6 +1090,9 @@ gtk_grid_get_column_spacing gtk_grid_get_row_homogeneous gtk_grid_get_row_spacing gtk_grid_get_type +gtk_grid_insert_column +gtk_grid_insert_next_to +gtk_grid_insert_row gtk_grid_new gtk_grid_set_column_homogeneous gtk_grid_set_column_spacing diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c index 88fe59de3a..20ec688294 100644 --- a/gtk/gtkgrid.c +++ b/gtk/gtkgrid.c @@ -1480,6 +1480,142 @@ gtk_grid_attach_next_to (GtkGrid *grid, } /** + * 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: * @grid: a #GtkGrid * @homogeneous: %TRUE to make rows homogeneous diff --git a/gtk/gtkgrid.h b/gtk/gtkgrid.h index 530ef0be25..99f9e4e300 100644 --- a/gtk/gtkgrid.h +++ b/gtk/gtkgrid.h @@ -79,6 +79,13 @@ void gtk_grid_attach_next_to (GtkGrid *grid, GtkPositionType side, gint width, 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, gboolean homogeneous); gboolean gtk_grid_get_row_homogeneous (GtkGrid *grid); diff --git a/tests/testgrid.c b/tests/testgrid.c index f9e85bb99c..cb79b359f7 100644 --- a/tests/testgrid.c +++ b/tests/testgrid.c @@ -247,6 +247,79 @@ scrolling (void) 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 main (int argc, char *argv[]) { @@ -260,6 +333,7 @@ main (int argc, char *argv[]) box_comparison (); empty_line (); scrolling (); + insert (); gtk_main (); |