[gtk+] Add an accessor for grid children



commit f64647077f1d7ebf63a497c2f87862ef37aeb570
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Aug 28 21:20:53 2011 -0400

    Add an accessor for grid children
    
    This addresses concerns in bug 634136.

 docs/reference/gtk/gtk3-sections.txt |    1 +
 gtk/gtk.symbols                      |    1 +
 gtk/gtkgrid.c                        |   36 ++++++++++++++++++++++++++++++++++
 gtk/gtkgrid.h                        |    3 ++
 tests/testgrid.c                     |   35 +++++++++++++++++++++-----------
 5 files changed, 64 insertions(+), 12 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 2cc0722..aca18e9 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -6988,6 +6988,7 @@ GtkGrid
 gtk_grid_new
 gtk_grid_attach
 gtk_grid_attach_next_to
+gtk_grid_get_child_at
 gtk_grid_insert_row
 gtk_grid_insert_column
 gtk_grid_insert_next_to
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 9a42c01..8fe844a 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -1114,6 +1114,7 @@ gtk_grab_get_current
 gtk_grab_remove
 gtk_grid_attach
 gtk_grid_attach_next_to
+gtk_grid_get_child_at
 gtk_grid_get_column_homogeneous
 gtk_grid_get_column_spacing
 gtk_grid_get_row_homogeneous
diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c
index 20ec688..cfb21f4 100644
--- a/gtk/gtkgrid.c
+++ b/gtk/gtkgrid.c
@@ -1480,6 +1480,42 @@ gtk_grid_attach_next_to (GtkGrid         *grid,
 }
 
 /**
+ * gtk_grid_get_child_at:
+ * @grid: a #GtkGrid
+ * @left: the left edge of the cell
+ * @top: the top edge of the cell
+ *
+ * Gets the child of @grid whose area covers the grid
+ * cell whose upper left corner is at @left, @top.
+ *
+ * Returns: the child at the given position, or %NULL
+ *
+ * Since: 3.2
+ */
+GtkWidget *
+gtk_grid_get_child_at (GtkGrid *grid,
+                       gint     left,
+                       gint     top)
+{
+  GtkGridPrivate *priv = grid->priv;
+  GtkGridChild *child;
+  GList *list;
+
+  for (list = priv->children; list; list = list->next)
+    {
+      child = list->data;
+
+      if (CHILD_LEFT (child) <= left &&
+          CHILD_LEFT (child) + CHILD_WIDTH (child) > left &&
+          CHILD_TOP (child) <= top &&
+          CHILD_TOP (child) + CHILD_HEIGHT (child) > top)
+        return child->widget;
+    }
+
+  return NULL;
+}
+
+/**
  * gtk_grid_insert_row:
  * @grid: a #GtkGrid
  * @position: the position to insert the row at
diff --git a/gtk/gtkgrid.h b/gtk/gtkgrid.h
index 99f9e4e..491ba22 100644
--- a/gtk/gtkgrid.h
+++ b/gtk/gtkgrid.h
@@ -79,6 +79,9 @@ void       gtk_grid_attach_next_to         (GtkGrid         *grid,
                                             GtkPositionType  side,
                                             gint             width,
                                             gint             height);
+GtkWidget *gtk_grid_get_child_at           (GtkGrid         *grid,
+                                            gint             left,
+                                            gint             top);
 void       gtk_grid_insert_row             (GtkGrid         *grid,
                                             gint             position);
 void       gtk_grid_insert_column          (GtkGrid         *grid,
diff --git a/tests/testgrid.c b/tests/testgrid.c
index cb79b35..c756158 100644
--- a/tests/testgrid.c
+++ b/tests/testgrid.c
@@ -40,7 +40,7 @@ simple_grid (void)
 {
   GtkWidget *window;
   GtkWidget *grid;
-  GtkWidget *child;
+  GtkWidget *test1, *test2, *test3, *test4, *test5, *test6;
 
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (window), "Orientation");
@@ -50,17 +50,28 @@ simple_grid (void)
 
   gtk_grid_set_column_spacing (GTK_GRID (grid), 5);
   gtk_grid_set_row_spacing (GTK_GRID (grid), 5);
-  gtk_container_add (GTK_CONTAINER (grid), test_widget ("1", "red"));
-  gtk_container_add (GTK_CONTAINER (grid), test_widget ("2", "green"));
-  gtk_container_add (GTK_CONTAINER (grid), test_widget ("3", "blue"));
-  child = test_widget ("4", "green");
-  gtk_grid_attach (GTK_GRID (grid), child, 0, 1, 1, 1);
-  gtk_widget_set_vexpand (child, TRUE);
-  gtk_grid_attach_next_to (GTK_GRID (grid), test_widget ("5", "blue"), child, GTK_POS_RIGHT, 2, 1);
-  child = test_widget ("6", "yellow");
-  gtk_grid_attach (GTK_GRID (grid), child, -1, 0, 1, 2);
-  gtk_widget_set_hexpand (child, TRUE);
-
+  test1 = test_widget ("1", "red");
+  gtk_container_add (GTK_CONTAINER (grid), test1);
+  test2 = test_widget ("2", "green");
+  gtk_container_add (GTK_CONTAINER (grid), test2);
+  test3 = test_widget ("3", "blue");
+  gtk_container_add (GTK_CONTAINER (grid), test3);
+  test4 = test_widget ("4", "green");
+  gtk_grid_attach (GTK_GRID (grid), test4, 0, 1, 1, 1);
+  gtk_widget_set_vexpand (test4, TRUE);
+  test5 = test_widget ("5", "blue");
+  gtk_grid_attach_next_to (GTK_GRID (grid), test5, test4, GTK_POS_RIGHT, 2, 1);
+  test6 = test_widget ("6", "yellow");
+  gtk_grid_attach (GTK_GRID (grid), test6, -1, 0, 1, 2);
+  gtk_widget_set_hexpand (test6, TRUE);
+
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 0, -1) == NULL);
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 0, 0) == test1);
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 1, 0) == test2);
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), 0, 1) == test4);
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), -1, 0) == test6);
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), -1, 1) == test6);
+  g_assert (gtk_grid_get_child_at (GTK_GRID (grid), -1, 2) == NULL);
   gtk_widget_show_all (window);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]