ListStore
A list-like data structure that can be used with the class@Gtk.TreeView.
The GtkListStore
object is a list model for use with a GtkTreeView
widget. It implements the GtkTreeModel
interface, and consequentialy, can use all of the methods available there. It also implements the GtkTreeSortable
interface so it can be sorted by the view. Finally, it also implements the tree iface.TreeDragSource.html and iface.TreeDragDest.html interfaces.
The GtkListStore
can accept most GType
s as a column type, though it can’t accept all custom types. Internally, it will keep a copy of data passed in (such as a string or a boxed pointer). Columns that accept GObject
s are handled a little differently. The GtkListStore
will keep a reference to the object instead of copying the value. As a result, if the object is modified, it is up to the application writer to call method@Gtk.TreeModel.row_changed to emit the signal@Gtk.TreeModel::row_changed signal. This most commonly affects lists with class@Gdk.Textures stored.
An example for creating a simple list store:
enum {
COLUMN_STRING,
COLUMN_INT,
COLUMN_BOOLEAN,
N_COLUMNS
};
{
GtkListStore *list_store;
GtkTreePath *path;
GtkTreeIter iter;
int i;
list_store = gtk_list_store_new (N_COLUMNS,
G_TYPE_STRING,
G_TYPE_INT,
G_TYPE_BOOLEAN);
for (i = 0; i < 10; i++)
{
char *some_data;
some_data = get_some_data (i);
// Add a new row to the model
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
COLUMN_STRING, some_data,
COLUMN_INT, i,
COLUMN_BOOLEAN, FALSE,
-1);
// As the store will keep a copy of the string internally,
// we free some_data.
g_free (some_data);
}
// Modify a particular row
path = gtk_tree_path_new_from_string ("4");
gtk_tree_model_get_iter (GTK_TREE_MODEL (list_store),
&iter,
path);
gtk_tree_path_free (path);
gtk_list_store_set (list_store, &iter,
COLUMN_BOOLEAN, TRUE,
-1);
}
GtkListStore
is deprecated since GTK 4.10, and should not be used in newly written code. You should use class@Gio.ListStore instead, and the various list models provided by GTK.
Performance Considerations
Internally, the GtkListStore
was originally implemented with a linked list with a tail pointer. As a result, it was fast at data insertion and deletion, and not fast at random data access. The GtkListStore
sets the GTK_TREE_MODEL_ITERS_PERSIST
flag, which means that GtkTreeIter
s can be cached while the row exists. Thus, if access to a particular row is needed often and your code is expected to run on older versions of GTK, it is worth keeping the iter around.
Atomic Operations
It is important to note that only the methods gtk_list_store_insert_with_values() and gtk_list_store_insert_with_valuesv() are atomic, in the sense that the row is being appended to the store and the values filled in in a single operation with regard to GtkTreeModel
signaling. In contrast, using e.g. gtk_list_store_append() and then gtk_list_store_set() will first create a row, which triggers the GtkTreeModel::row-inserted
signal on GtkListStore
. The row, however, is still empty, and any signal handler connecting to GtkTreeModel::row-inserted
on this particular store should be prepared for the situation that the row might be empty. This is especially important if you are wrapping the GtkListStore
inside a GtkTreeModel
Filter and are using a GtkTreeModel
FilterVisibleFunc. Using any of the non-atomic operations to append rows to the GtkListStore
will cause the GtkTreeModel
FilterVisibleFunc to be visited with an empty row first; the function must be prepared for that.
GtkListStore as GtkBuildable
The GtkListStore implementation of the iface@Gtk.Buildable interface allows to specify the model columns with a <columns>
element that may contain multiple <column>
elements, each specifying one model column. The “type” attribute specifies the data type for the column.
Additionally, it is possible to specify content for the list store in the UI definition, with the <data>
element. It can contain multiple <row>
elements, each specifying to content for one row of the list model. Inside a <row>
, the <col>
elements specify the content for individual cells.
Note that it is probably more common to define your models in the code, and one might consider it a layering violation to specify the content of a list store in a UI definition, data, not presentation, and common wisdom is to separate the two, as far as possible.
An example of a UI Definition fragment for a list store:
<object class="GtkListStore">
<columns>
<column type="gchararray"/>
<column type="gchararray"/>
<column type="gint"/>
</columns>
<data>
<row>
<col id="0">John</col>
<col id="1">Doe</col>
<col id="2">25</col>
</row>
<row>
<col id="0">Johan</col>
<col id="1">Dahlin</col>
<col id="2">50</col>
</row>
</data>
</object>
Skipped during bindings generation
parameter
columns
: Array parameter of type gint is not supportedparameter
new_order
: Array parameter of type gint is not supportedparameter
types
: Array parameter of type GType is not supportedparameter
columns
: Array parameter of type gint is not supportedparameter
types
: Array parameter of type GType is not supported
Constructors
Properties
Functions
This signal is emitted when a row in the model has changed.
This signal is emitted when a row has been deleted.
This signal is emitted when a row has gotten the first child row or lost its last child row.
This signal is emitted when a new row has been inserted in the model.
The ::sort-column-changed signal is emitted when the sort column or sort order of @sortable is changed. The signal is emitted before the contents of @sortable are resorted.
Asks the GtkTreeDragSource
to delete the row at @path, because it was moved somewhere else via drag-and-drop. Returns false if the deletion fails because @path no longer exists, or for some model-specific reason. Should robustly handle a @path no longer found in the model!
Asks the GtkTreeDragSource
to return a GdkContentProvider
representing the row at @path. Should robustly handle a @path no longer found in the model!
Asks the GtkTreeDragDest
to insert a row before the path @dest, deriving the contents of the row from @value. If @dest is outside the tree so that inserting before it is impossible, false will be returned. Also, false may be returned if the new row is not created for some model-specific reason. Should robustly handle a @dest no longer found in the model!
Calls @func on each node in model in a depth-first fashion.
Gets the ID of the @buildable object.
Returns the type of the column.
Returns a set of flags supported by this interface.
Initializes @iter with the first iterator in the tree (the one at the path "0").
Sets @iter to a valid iterator pointing to @path_string, if it exists.
Returns the number of columns supported by @tree_model.
Generates a string representation of the iter.
Returns true if the model has a default sort function. This is used primarily by GtkTreeViewColumns in order to determine if a model can go back to the default state, or not.
Creates a new row at @position. @iter will be changed to point to this new row. If @position is -1 or is larger than the number of rows on the list, then the new row will be appended to the list. The row will be empty after this function is called. To fill in values, you need to call gtk_list_store_set() or gtk_list_store_set_value().
Inserts a new row after @sibling. If @sibling is null, then the row will be prepended to the beginning of the list. @iter will be changed to point to this new row. The row will be empty after this function is called. To fill in values, you need to call gtk_list_store_set() or gtk_list_store_set_value().
Inserts a new row before @sibling. If @sibling is null, then the row will be appended to the end of the list. @iter will be changed to point to this new row. The row will be empty after this function is called. To fill in values, you need to call gtk_list_store_set() or gtk_list_store_set_value().
Sets @iter to point to the first child of @parent.
Returns true if @iter has children, false otherwise.
Checks if the given iter is a valid iter for this GtkListStore
.
Returns the number of children that @iter has.
Sets @iter to be the child of @parent, using the given index.
Sets @iter to be the parent of @child.
Sets @iter to point to the previous node at the current level.
Moves @iter in @store to the position before @position. Note that this function only works with unsorted stores. If @position is null, @iter will be moved to the end of the list.
Emits the ::row-changed signal on @tree_model.
Emits the ::row-deleted signal on @tree_model.
Asks the GtkTreeDragSource
whether a particular row can be used as the source of a DND operation. If the source doesn’t implement this interface, the row is assumed draggable.
Determines whether a drop is possible before the given @dest_path, at the same depth as @dest_path. i.e., can we drop the data in
Emits the ::row-has-child-toggled signal on @tree_model.
Emits the ::row-inserted signal on @tree_model.
Sets the default comparison function used when sorting to be @sort_func. If the current sort column id of @sortable is %GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, then the model will sort using this function.
Sets the current sort column to be @sort_column_id. The @sortable will resort itself to reflect this change, after emitting a GtkTreeSortable::sort-column-changed
signal. @sort_column_id may either be a regular column id, or one of the following special values:
Sets the comparison function used when sorting to be @sort_func. If the current sort column id of @sortable is the same as @sort_column_id, then the model will sort using this function.
Emits a GtkTreeSortable::sort-column-changed
signal on @sortable.