Le modèle
Chaque objet Gtk::TreeView possède un objet Gtk::TreeModel associé ; il contient les données à afficher par l'objet TreeView. Tout Gtk::TreeModel peut être utilisé par plus d'un Gtk::TreeView. Par exemple, il est possible d'afficher et modifier simultanément sous deux formes différentes les mêmes données sous-jacentes ; ou bien encore, les deux vues peuvent afficher des colonnes différentes à partir du même modèle de données, tout comme deux requêtes SQL (ou « vues ») sont susceptibles d'afficher des champs différents à partir d'une même base de données.
Même si vous pouvez théoriquement implémenter votre propre modèle, vous utiliserez normalement, soit la classe modèle ListStore, soit la classe modèle TreeStore.
- IX.I.I. Modèle listStore, pour des colonnes
- IX.I.II. Modèle treeStore, pour une hiérarchie
- IX.I.III. Modèle colonnes
- IX.I.IV. Ajout de lignes
- IX.I.V. Définition des valeurs
- IX.I.VI. Obtention des valeurs
- IX.I.VII. Colonnes « cachées »
IX.I.I. Modèle listStore, pour des colonnes
Un objet ListStore contient de simples colonnes de données et chaque colonne n'a pas d'enfant.
IX.I.II. Modèle treeStore, pour une hiérarchie
L'objet TreeStore contient des colonnes de données et chaque colonne peut avoir des colonnes enfants.
IX.I.III. Modèle colonnes
La classe TreeModelColumnRecord s'utilise pour enregistrer les colonnes et leurs types de données. Vous ajoutez des exemplaires de TreeModelColumn au ColumnRecord, puis utilisez ces TreeModelColumns pour obtenir ou placer les données dans les colonnes du modèle. Vous trouverez certainement commode de dériver un nouveau TreeModelColumnRecord incorporant vos exemplaires de TreeModelColumn en tant que données membres.
class ModelColumns : public Gtk::TreeModelColumnRecord { public: ModelColumns() { add(m_col_text); add(m_col_number); } Gtk::TreeModelColumn<Glib::ustring> m_col_text; Gtk::TreeModelColumn<int> m_col_number; }; ModelColumns m_Columns;
Vous précisez le ColumnRecord à la création du modèle, ainsi :
Glib::RefPtr<Gtk::ListStore> refListStore = Gtk::ListStore::create(m_Columns);
Notez que les exemplaires de colonnes (tels que m_Columns ici) ne sont habituellement pas qualifiés « static », étant donné qu'ils doivent être instanciés après que glibmm l'ait été lui-même.
IX.I.IV. Ajout de lignes
Ajoutez des lignes au modèle avec les fonctions membres append(), prepend() ou insert().
Gtk::TreeModel::iterator iter = m_refListStore->append();
Vous pouvez déréférencer l'itérateur pour obtenir la ligne :
Gtk::TreeModel::Row row = *iter;
- IX.I.IV.I. Ajout de colonnes enfants
IX.I.V. Définition des valeurs
Vous pouvez utiliser la surdéfinition de operator[] pour définir les données d'une colonne désignée dans la ligne en indiquant le TreeModelColumn utilisé pour créer le modèle.
row[m_Columns.m_col_text] = "textedonné";
IX.I.VI. Obtention des valeurs
Vous pouvez utiliser la surdéfinition de operator[] pour obtenir les données d'une colonne particulière dans une ligne, en précisant le TreeModelColumn qui a été utilisé pour créer le modèle.
Glib::ustring strText = row[m_Columns.m_col_text]; int number = row[m_Columns.m_col_number];
Le compilateur se plaint si vous utilisez un type inapproprié et génère, par exemple, l'erreur de compilation suivante :
//compiler error - no conversion from ustring to int. int number = row[m_Columns.m_col_text];