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.

Reference

X.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 X.1 TreeView - ListStore

Reference

X.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 X.2 TreeView - TreeStore

Reference

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

As a TreeModelColumnRecord describes structure, not data, it can be shared among multiple models, and this is preferable for efficiency. However, the instance (such as m_Columns here) should usually not be static, because it often needs to be instantiated after glibmm has been initialized. The best solution is to make it a lazily instantiated singleton, so that it will be constructed on-demand, whenever the first model accesses it.

X.I.IV. Ajout de lignes

Ajoutez des lignes au modèle avec les fonctions membres append(), prepend() ou insert().

auto iter = m_refListStore->append();

Vous pouvez déréférencer l'itérateur pour obtenir la ligne :

auto row = *iter;

X.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 :

auto iter_child =
    m_refTreeStore->append(row.children());

X.I.V. Définition des valeurs

You can use the operator[] overload to set the data for a particular column in the row, specifying the TreeModelColumn used to create the model.

row[m_Columns.m_col_text] = "textedonné";

X.I.VI. Obtention des valeurs

You can use the operator[] overload to get the data in a particular column in a row, specifying the TreeModelColumn used to create the model.

auto strText = row[m_Columns.m_col_text];
auto 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];

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