https://github.com/phastmike/vala-liststore-object-example
A simple treeview example
https://github.com/phastmike/vala-liststore-object-example
example gobject treeview vala
Last synced: 30 days ago
JSON representation
A simple treeview example
- Host: GitHub
- URL: https://github.com/phastmike/vala-liststore-object-example
- Owner: phastmike
- Created: 2018-01-28T15:28:30.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2020-07-04T21:02:23.000Z (over 5 years ago)
- Last Synced: 2025-11-11T01:31:47.271Z (5 months ago)
- Topics: example, gobject, treeview, vala
- Language: Vala
- Homepage:
- Size: 2.93 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# A simple liststore example
The goal behind this example was to show the use of a Treeview with Objects in the model and how to avoid data replication by using the ListStore (could be a treestore) as the only container of references to the data objects.
As using objects is vague and generic we must map the object fields and/or properties to the treeview columns.
## The Model (ListStore)
The model is prepared to contain Objects of type SomeObject:
```Vala
Gtk.ListStore list_store = new Gtk.ListStore (1, typeof (SomeObject));
```
And we add a few example instances of SomeObjects:
```Vala
list_store.append (out iter);
list_store.set (iter, 0, new SomeObject.with_name ("Joe"));
list_store.append (out iter);
list_store.set (iter, 0, new SomeObject.with_name ("Jane"));
list_store.append (out iter);
list_store.set (iter, 0, new SomeObject.with_name ("Ada"));
list_store.append (out iter);
list_store.set (iter, 0, new SomeObject.with_name ("Jarvis"));
```
## Changes to objects in the model
To change an object, we should retrieve it from the model, do some changes and set the object to the model. To exemplify, we added a toggle button that will change the name of the object, at row 3, from Ada to Megatron and vice versa:
```Vala
Gtk.ToggleButton button = new Gtk.ToggleButton.with_label ("Change obj at row 3");
button.toggled.connect (() => {
Gtk.TreeIter niter;
SomeObject obj;
list_store.get_iter_from_string (out niter, "2");
list_store.@get (niter, 0, out obj);
if (button.active) {
obj.name = "Megatron";
} else {
obj.name = "Ada";
}
list_store.@set (niter, 0, obj);
});
```
## Map data between the model and the view
To map data from the object we'll use *data_functions* which allow us to "bind" or adapt these fields into the cell renderers:
```Vala
Gtk.CellRendererText cell = new Gtk.CellRendererText ();
view.insert_column_with_data_func (-1, "Name", cell, (column, cell, model, iter) => {
SomeObject obj;
model.@get (iter, 0, out obj);
(cell as Gtk.CellRendererText).text = obj.name;
});
```