Struct gtk4::ListStore [−][src]
pub struct ListStore(_);
Expand description
A list-like data structure that can be used with the GtkTreeView
The ListStore
object is a list model for use with a TreeView
widget. It implements the TreeModel
interface, and consequentialy,
can use all of the methods available there. It also implements the
TreeSortable
interface so it can be sorted by the view.
Finally, it also implements the tree
[drag and drop][gtk4-GtkTreeView-drag-and-drop]
interfaces.
The ListStore
can accept most GObject types 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
ListStore
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 TreeModelExt::row_changed()
to emit the
TreeModel
::row_changed signal. This most commonly affects lists with
gdk::Texture
s stored.
An example for creating a simple list store:
⚠️ The following code is in C ⚠️
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);
}
Performance Considerations
Internally, the ListStore
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 ListStore
sets the
TreeModelFlags::ITERS_PERSIST
flag, which means that TreeIter
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 insert_with_values()
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 TreeModel
signaling.
In contrast, using e.g. append()
and then set()
will first create a row, which triggers the TreeModel
::row-inserted signal
on ListStore
. The row, however, is still empty, and any signal handler
connecting to TreeModel
::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 ListStore
inside a TreeModel
Filter and are
using a TreeModel
FilterVisibleFunc. Using any of the non-atomic operations
to append rows to the ListStore
will cause the
TreeModel
FilterVisibleFunc to be visited with an empty row first; the
function must be prepared for that.
GtkListStore as GtkBuildable
The GtkListStore implementation of the GtkBuildable 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:
⚠️ The following code is in C ⚠️
<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>
Implements
glib::ObjectExt
, BuildableExt
, TreeDragDestExt
, TreeDragSourceExt
, TreeModelExt
, TreeSortableExt
, TreeModelExtManual
, TreeSortableExtManual
Implementations
Appends a new row to self
. 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 set()
or set_value()
.
Returns
iter
An unset TreeIter
to set to the appended row
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
set()
or set_value()
.
position
position to insert the new row, or -1 for last
Returns
iter
An unset TreeIter
to set to the new row
Inserts a new row after sibling
. If sibling
is None
, 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 set()
or set_value()
.
sibling
A valid TreeIter
Returns
iter
An unset TreeIter
to set to the new row
Inserts a new row before sibling
. If sibling
is None
, 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 set()
or set_value()
.
sibling
A valid TreeIter
Returns
iter
An unset TreeIter
to set to the new row
Prepends a new row to self
. 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 set()
or set_value()
.
Returns
iter
An unset TreeIter
to set to the prepend row
Creates a new list store as with n_columns
columns each of the types passed
in. Note that only types derived from standard GObject fundamental types
are supported.
As an example, gtk_list_store_new (3, G_TYPE_INT, G_TYPE_STRING, GDK_TYPE_TEXTURE);
will create a new ListStore
with three columns, of type
int, string and gdk::Texture
, respectively.
Returns
a new ListStore
Creates a new row at position
. iter
will be changed to point to this new
row. If position
is -1, or larger than the number of rows in the list, then
the new row will be appended to the list. The row will be filled with the
values given to this function.
Calling
gtk_list_store_insert_with_values (list_store, iter, position...)
has the same effect as calling:
⚠️ The following code is in C ⚠️
static void
insert_value (GtkListStore *list_store,
GtkTreeIter *iter,
int position)
{
gtk_list_store_insert (list_store, iter, position);
gtk_list_store_set (list_store,
iter
// ...
);
}
with the difference that the former will only emit TreeModel
::row-inserted
once, while the latter will emit TreeModel
::row-inserted,
TreeModel
::row-changed and, if the list store is sorted,
TreeModel
::rows-reordered for every inserted value.
Since emitting the GtkTreeModel::rows-reordered
signal repeatedly can
affect the performance of the program, gtk_list_store_insert_with_values()
should generally be preferred when inserting rows in a sorted list store.
position
position to insert the new row, or -1 to append after existing rows
Returns
iter
An unset TreeIter
to set to the new row
Reorders self
to follow the order indicated by new_order
. Note that
this function only works with unsorted stores.
new_order
an array of integers mapping the new
position of each child to its old position before the re-ordering,
i.e. new_order``[newpos] = oldpos
. It must have
exactly as many items as the list store’s length.
Sets the value of one or more cells in the row referenced by iter
.
The variable argument list should contain integer column numbers,
each column number followed by the value to be set.
The list is terminated by a -1. For example, to set column 0 with type
G_TYPE_STRING
to “Foo”, you would write gtk_list_store_set (store, iter, 0, "Foo", -1)
.
The value will be referenced by the store if it is a G_TYPE_OBJECT
, and it
will be copied if it is a G_TYPE_STRING
or G_TYPE_BOXED
.
iter
row iterator
Trait Implementations
This method returns an ordering between self
and other
values if one exists. Read more
This method tests less than (for self
and other
) and is used by the <
operator. Read more
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
Returns the type identifier of Self
.
Auto Trait Implementations
impl RefUnwindSafe for ListStore
impl UnwindSafe for ListStore
Blanket Implementations
Mutably borrows from an owned value. Read more
Upcasts an object to a superclass or interface T
. Read more
Upcasts an object to a reference of its superclass or interface T
. Read more
Tries to downcast to a subclass or interface implementor T
. Read more
Tries to downcast to a reference of its subclass or interface implementor T
. Read more
Tries to cast to an object of type T
. This handles upcasting, downcasting
and casting between interface and interface implementors. All checks are performed at
runtime, while downcast
and upcast
will do many checks at compile-time already. Read more
Tries to cast to reference to an object of type T
. This handles upcasting, downcasting
and casting between interface and interface implementors. All checks are performed at
runtime, while downcast
and upcast
will do many checks at compile-time already. Read more
Casts to T
unconditionally. Read more
Casts to &T
unconditionally. Read more
Returns true
if the object is an instance of (can be cast to) T
.
pub fn set_property<'a, N, V>(
&self,
property_name: N,
value: V
) -> Result<(), BoolError> where
N: Into<&'a str>,
V: ToValue,
pub fn set_property_from_value<'a, N>(
&self,
property_name: N,
value: &Value
) -> Result<(), BoolError> where
N: Into<&'a str>,
pub fn set_properties_from_value(
&self,
property_values: &[(&str, Value)]
) -> Result<(), BoolError>
pub fn has_property<'a, N>(&self, property_name: N, type_: Option<Type>) -> bool where
N: Into<&'a str>,
pub fn find_property<'a, N>(&self, property_name: N) -> Option<ParamSpec> where
N: Into<&'a str>,
Safety Read more
Safety Read more
Safety Read more
Safety Read more
pub fn connect<'a, N, F>(
&self,
signal_name: N,
after: bool,
callback: F
) -> Result<SignalHandlerId, BoolError> where
N: Into<&'a str>,
F: 'static + Fn(&[Value]) -> Option<Value> + Send + Sync,
Same as connect
but takes a SignalId
instead of a signal name.
pub fn connect_local<'a, N, F>(
&self,
signal_name: N,
after: bool,
callback: F
) -> Result<SignalHandlerId, BoolError> where
N: Into<&'a str>,
F: 'static + Fn(&[Value]) -> Option<Value>,
Same as connect_local
but takes a SignalId
instead of a signal name.
pub unsafe fn connect_unsafe<'a, N, F>(
&self,
signal_name: N,
after: bool,
callback: F
) -> Result<SignalHandlerId, BoolError> where
N: Into<&'a str>,
F: Fn(&[Value]) -> Option<Value>,
Same as connect_unsafe
but takes a SignalId
instead of a signal name.
Emit signal by signal id.
Same as emit
but takes Value
for the arguments.
Emit signal by its name.
Same as emit_by_name
but takes Value
for the arguments.
Emit signal with details by signal id.
Same as emit_with_details
but takes Value
for the arguments.
pub fn connect_notify<F>(&self, name: Option<&str>, f: F) -> SignalHandlerId where
F: 'static + Fn(&T, &ParamSpec) + Send + Sync,
pub fn connect_notify_local<F>(
&self,
name: Option<&str>,
f: F
) -> SignalHandlerId where
F: 'static + Fn(&T, &ParamSpec),
pub unsafe fn connect_notify_unsafe<F>(
&self,
name: Option<&str>,
f: F
) -> SignalHandlerId where
F: Fn(&T, &ParamSpec),
pub fn bind_property<'a, O, N, M>(
&'a self,
source_property: N,
target: &'a O,
target_property: M
) -> BindingBuilder<'a> where
O: ObjectType,
N: Into<&'a str>,
M: Into<&'a str>,
Returns a SendValue
clone of self
.