Mit GtkIconView
können Icons („kleine Bilder“) in einer Tabelle angezeigt werden.
GObject ⇒ GInitiallyUnowned ⇒ GtkObject ⇒ GtkWidget ⇒ GtkContainer
GtkAboutDialog
abgeleitete Widgets: - GtkBuildable
, GtkCellLayout
.Der (Default-)Konstruktor verlangt keine weiteren Argumente:
GtkWidget* icon_view = gtk_icon_view_new();
Um Icons in die Tabelle einzufügen, muss ein sogenanntes GtkTreeModel
erstellt werden. GtkTreeModel
ist allerdings nur ein Interface: Idealerweise benutzt man die Implementierung GtkListStore
:
GtkListStore *list_store; GdkPixbuf *pixbuf; /* Unser Icon */ GtkTreeIter iter; /* Zeigt auf ein bestimmtes Element im ListStore */
Dann sollte zunächst das Icon geladen werden:
pixbuf = gdk_pixbuf_new_from_file("<euer_icon>.png", NULL);
Als nächstes erstellen wir eine Instanz von GtkListStore
: Wir legen die Anzahl an Spalten fest (2), setzen den Typ der ersten Spalte auf G_TYPE_STRING
(schließlich soll unter dem Icon Text stehen) und den Typ der zweiten Spalte auf GDK_TYPE_PIXBUF
(das Icon als Pixbuf selbst):
list_store = gtk_list_store_new(2, G_TYPE_STRING, GDK_TYPE_PIXBUF);
Schließlich fügen wir Elemente in das GtkListStore
ein: Zunächst setzen wir den GtkTreeIter
auf das nächste Element in der Liste (dessen Inhalt NULL sein sollte) und legen mit gtk_list_store_set
den Inhalt der beiden Spalten fest.
In Spalte 0 (G_TYPE_STRING) fügen wir einen Text ein, in Spalte 1 (GDK_TYPE_PIXBUF) unser geladenes Icon. Die Funktion erwartet am Ende der Auflistung eine negative Zahl (-1):
gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, 0, "Icon", 1, pixbuf, -1);
Nun müssen wir GtkIconView
die Liste übergeben und den Index der Textspalte und den Index der Pixbuf-Spalte übergeben:
gtk_icon_view_set_model(GTK_ICON_VIEW(icon_view), GTK_TREE_MODEL(list_store)); gtk_icon_view_set_text_column(GTK_ICON_VIEW(icon_view), 0); gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(icon_view), 1);
void gtk_icon_view_set_selection_mode (GtkIconView *icon_view, GtkSelectionMode mode);
Die Enumeration GtkSelectionMode
besitzt folgende Werte:
Wert | Beschreibung |
---|---|
GTK_SELECTION_NONE | Kein Element kann ausgewählt werden. |
GTK_SELECTION_SINGLE | Es kann entweder ein Element oder kein Element ausgewählt werden (Standard). |
GTK_SELECTION_BROWSE | Nur ein Element kann ausgewählt werden. Es kann nur deaktiviert werden, wenn ein anderes Element dafür aktiviert wird. |
GTK_SELECTION_MULTIPLE | Es können beliebig viele Elemente oder keines ausgewählt werden. |
Mit dem item-activate
Signal können Aktivierungen von Icons im GtkIconView verarbeitet werden.
Das Signal wird ausgelöst, wenn:
gtk_icon_view_item_activated
aufgerufen wurdeDie Callback-Funktion erwartet drei Argumente:
void on_item_activated(GtkIconView *iconview, GtkTreePath *path, gpointer user_data)
Um zu erfahren, welches Element aktiviert wurde, interessiert uns path
.
gint index_of_element = gtk_tree_path_get_indices(path)[0];
gtk_tree_path_get_indices
liefert ein Array aus Integers, welches die Indizes aller Knoten im Baum enthält, die der Pfad von der Wurzel zum aktivierten Element enthält.
Da für ein GtkIconView üblicherweise GtkListStore als GtkTreeModel-Implementierung benutzt wird, muss nur auf den Index des Knoten auf der ersten Ebene zugreifen: Mehr Ebenen besitzt GtkListStore nicht!
Eine weitere Möglichkeit setzt voraus, dass der GtkListStore, der bei der Erstellung des GtkIconView benutzt wurde, als user_data übergeben wird.
GtkTreeIter iter; gtk_tree_model_get_iter(GTK_TREE_MODEL(user_data), &iter, path);
iter
zeigt jetzt auf das Element im GtkListStore, dass aktiviert wurde. Nun kann der Inhalt mit gtk_list_store_set
direkt verändert werden.