Tris
The standard tree models (TreeStore and ListStore) derive from TreeSortable, so they offer sorting functionality. For instance, call set_sort_column(), to sort the model by the specified column. Or supply a callback function to set_sort_func() to implement a more complicated sorting algorithm.
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); } } }