Tris

Les modèles standard d'arborescence (TreeStore et ListStore) dérivent de la classe TreeSortable ; ils offrent donc la possibilité de tri. Par exemple, faites appel à set_sort_column() pour trier le modèle sur la colonne donnée, ou bien définissez une fonction de rappel pour set_sort_func() pour implémenter un algorithme de tri plus complexe.

Référence de TreeSortable

IX.V.I. Tri en cliquant sur l'en-tête de colonne

Pour implémenter le tri par clic sur l'en-tête d'une colonne d'un objet TreeView afin d'ordonner son contenu, appelez Gtk::TreeViewModel::set_sort_column() en indiquant la colonne du modèle sur laquelle le tri est effectué quand l'en-tête est cliquée. Par exemple :

Gtk::TreeView::Column* pColumn = treeview.get_column(0);
if(pColumn)
  pColumn->set_sort_column(m_columns.m_col_id);

IX.V.II. Vues d'un même modèle triées de manière indépendante

Nous avons déjà vu que la classe TreeView vous permet d'afficher le même TreeModel dans deux éléments graphiques TreeView distincts. Si vous avez besoin qu'un des TreeView trie le modèle de manière différente de l'autre, vous devez utiliser un objet TreeModelSort au lieu d'utiliser uniquement Gtk::TreeViewModel::set_sort_column(), par exemple. TreeModelSort est un modèle contenant une version triée d'un autre modèle. Par exemple, vous pouvez ajouter une autre version triée d'un modèle à un objet TreeView ainsi :

Glib::RefPtr<Gtk::TreeModelSort> sorted_model =
    Gtk::TreeModelSort::create(model);
sorted_model->set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING);
treeview.set_model(sorted_model);

Notez, toutefois, que la vue arborescente fournit des itérateurs sur le modèle trié. Vous devez les convertir en itérateurs du modèle enfant sous-jacent pour effectuer des opérations sur ce modèle. Par exemple :

void ExampleWindow::on_button_delete()
{
  Glib::RefPtr<Gtk::TreeSelection> refTreeSelection =
      m_treeview.get_selection();
  if(refTreeSelection)
  {
    Gtk::TreeModel::iterator sorted_iter =
        m_refTreeSelection->get_selected();
    if(sorted_iter)
    {
      Gtk::TreeModel::iterator iter =
          m_refModelSort->convert_iter_to_child_iter(sorted_iter);
      m_refModel->erase(iter);
    }
  }
}

Référence de TreeModelSort