summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorKalev Lember <kalevlember@gmail.com>2013-08-07 12:36:03 +0200
committerKalev Lember <kalevlember@gmail.com>2013-08-08 11:00:26 +0200
commit43c68e118f88593f404d6eaa3d11ab821088b8c3 (patch)
tree248f85a4ec3a54c07eceef2bfc81197c5fd53677 /gtk
parente6cb3f37194df7c2f9b024481d52e6338f3e1a47 (diff)
downloadgtk+-43c68e118f88593f404d6eaa3d11ab821088b8c3.tar.gz
listbox: Implement gtk_list_box_insert()
... to make it possible to insert rows in the middle of the list without having to fiddle with the sort functions. One of the first users is going to be Glade. https://bugzilla.gnome.org/show_bug.cgi?id=705558
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtklistbox.c41
-rw-r--r--gtk/gtklistbox.h4
2 files changed, 37 insertions, 8 deletions
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 8777ffc4f7..79c4403545 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -1671,15 +1671,33 @@ gtk_list_box_row_visibility_changed (GtkListBox *list_box,
}
}
-static void
-gtk_list_box_add_row (GtkListBox *list_box,
- GtkWidget *child,
- gboolean prepend)
+/**
+ * gtk_list_box_insert:
+ * @list_box: a #GtkListBox.
+ * @child: the #GtkWidget to add
+ * @position: the position to insert @child in
+ *
+ * Insert the @child into the @list_box at @position. If a sort function is
+ * set, the widget will actually be inserted at the calculated position and
+ * this function has the same effect of gtk_container_add().
+ *
+ * If @position is -1, or larger than the total number of items in the
+ * @list_box, then the @child will be appended to the end.
+ *
+ * Since: 3.10
+ */
+void
+gtk_list_box_insert (GtkListBox *list_box,
+ GtkWidget *child,
+ gint position)
{
GtkListBoxPrivate *priv = gtk_list_box_get_instance_private (list_box);
GtkListBoxRow *row;
GSequenceIter* iter = NULL;
+ g_return_if_fail (list_box != NULL);
+ g_return_if_fail (child != NULL);
+
if (GTK_IS_LIST_BOX_ROW (child))
row = GTK_LIST_BOX_ROW (child);
else
@@ -1692,10 +1710,17 @@ gtk_list_box_add_row (GtkListBox *list_box,
if (priv->sort_func != NULL)
iter = g_sequence_insert_sorted (priv->children, row,
(GCompareDataFunc)do_sort, list_box);
- else if (prepend)
+ else if (position == 0)
iter = g_sequence_prepend (priv->children, row);
- else
+ else if (position == -1)
iter = g_sequence_append (priv->children, row);
+ else
+ {
+ GSequenceIter *current_iter;
+
+ current_iter = g_sequence_get_iter_at_pos (priv->children, position);
+ iter = g_sequence_insert_before (current_iter, row);
+ }
ROW_PRIV (row)->iter = iter;
gtk_widget_set_parent (GTK_WIDGET (row), GTK_WIDGET (list_box));
@@ -1716,7 +1741,7 @@ static void
gtk_list_box_real_add (GtkContainer *container,
GtkWidget *child)
{
- gtk_list_box_add_row (GTK_LIST_BOX (container), child, FALSE);
+ gtk_list_box_insert (GTK_LIST_BOX (container), child, -1);
}
static void
@@ -2069,7 +2094,7 @@ void
gtk_list_box_prepend (GtkListBox *list_box,
GtkWidget *child)
{
- gtk_list_box_add_row (list_box, child, TRUE);
+ gtk_list_box_insert (list_box, child, 0);
}
/**
diff --git a/gtk/gtklistbox.h b/gtk/gtklistbox.h
index d537d7db78..f0e569c265 100644
--- a/gtk/gtklistbox.h
+++ b/gtk/gtklistbox.h
@@ -164,6 +164,10 @@ GDK_AVAILABLE_IN_3_10
void gtk_list_box_prepend (GtkListBox *list_box,
GtkWidget *child);
GDK_AVAILABLE_IN_3_10
+void gtk_list_box_insert (GtkListBox *list_box,
+ GtkWidget *child,
+ gint position);
+GDK_AVAILABLE_IN_3_10
GtkListBoxRow* gtk_list_box_get_selected_row (GtkListBox *list_box);
GDK_AVAILABLE_IN_3_10
GtkListBoxRow* gtk_list_box_get_row_at_index (GtkListBox *list_box,