Seitenleiste

GtkIconView

Mit GtkIconView können Icons („kleine Bilder“) in einer Tabelle angezeigt werden.

Allgemeine Informationen

  • Basisklassen:
    GObject ⇒ GInitiallyUnowned ⇒ GtkObject ⇒ GtkWidget ⇒ GtkContainer
  • Von GtkAboutDialog abgeleitete Widgets: -
  • Anmerkungen: Implementiert GtkBuildable, GtkCellLayout.
  • Referenz: GtkIconView

Benutzung

Erstellung

Der (Default-)Konstruktor verlangt keine weiteren Argumente:

GtkWidget* icon_view = gtk_icon_view_new();

Icons hinzufügen

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);

Auswahlverhalten festlegen

void gtk_icon_view_set_selection_mode (GtkIconView *icon_view, GtkSelectionMode mode);

Die Enumeration GtkSelectionMode besitzt folgende Werte:

WertBeschreibung
GTK_SELECTION_NONEKein Element kann ausgewählt werden.
GTK_SELECTION_SINGLEEs kann entweder ein Element oder kein Element ausgewählt werden (Standard).
GTK_SELECTION_BROWSENur ein Element kann ausgewählt werden. Es kann nur deaktiviert werden, wenn ein anderes Element dafür aktiviert wird.
GTK_SELECTION_MULTIPLEEs können beliebig viele Elemente oder keines ausgewählt werden.

Auf Aktivierung eines Icons reagieren

Mit dem item-activate Signal können Aktivierungen von Icons im GtkIconView verarbeitet werden.

Das Signal wird ausgelöst, wenn:

  • der Benutzer auf ein Element im GtkIconView doppelt geklickt hat
  • der Benutzer bei einem markierten Element Enter oder Leertaste gedrückt hat
  • die Funktion gtk_icon_view_item_activated aufgerufen wurde

Die 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.