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.

Référence

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.

Figure IX.1 TreeView - ListStore

Référence

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.

Figure IX.2 TreeView - TreeStore

Référence

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

Les modèles Gtk::TreeStore peuvent avoir des éléments enfants. Pour les ajouter, servez-vous des fonctions membres append(), prepend() ou insert(), ainsi :

Gtk::TreeModel::iterator iter_child =
    m_refListStore->append(row.children());

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

IX.I.VII. Colonnes « cachées »

Vous pouvez associer des données supplémentaires à chaque ligne. Pour ce faire, ajoutez-les en tant que colonne du modèle, mais sans les placer dans la vue.