[gtk+] GtkGrid: Add a way to insert rows or columns
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkGrid: Add a way to insert rows or columns
- Date: Mon, 8 Aug 2011 11:15:47 +0000 (UTC)
commit 17f99f663f178edf06b20bebd00bc3fd56ae006a
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Aug 8 12:06:59 2011 +0200
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
docs/reference/gtk/gtk3-sections.txt | 3 +
gtk/gtk.symbols | 3 +
gtk/gtkgrid.c | 136 ++++++++++++++++++++++++++++++++++
gtk/gtkgrid.h | 7 ++
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 0167abb..7992f8f 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 a2447f7..4325f2f 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 88fe59d..20ec688 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 530ef0b..99f9e4e 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 f9e85bb..cb79b35 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 ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]