La sélection
Pour retrouver quelles sont les lignes sélectionnées par l'utilisateur, obtenez l'objet Gtk::TreeView::Selection du TreeView ainsi :
Glib::RefPtr<Gtk::TreeSelection> refTreeSelection = m_TreeView.get_selection();
- IX.IV.I. Sélection simple ou multiple
- IX.IV.II. Les lignes sélectionnées
- IX.IV.III. Le signal « changed »
- IX.IV.IV. Empêcher la sélection de lignes
- IX.IV.V. Modification de la sélection
IX.IV.I. Sélection simple ou multiple
By default, only single rows can be selected, but you can allow multiple selection by setting the mode, like so:
refTreeSelection->set_mode(Gtk::SELECTION_MULTIPLE);
IX.IV.II. Les lignes sélectionnées
Pour une simple sélection, appelez simplement la fonction membre get_selected(), comme suit :
TreeModel::iterator iter = refTreeSelection->get_selected(); if(iter) // si quelque chose est sélectionné { TreeModel::Row row = *iter; // Faire quelque chose avec la ligne. }
Pour une sélection multiple, vous aurez besoin de définir une fonction de rappel et de la fournir en paramètre à selected_foreach(), selected_foreach_path() ou selected_foreach_iter(), ainsi :
refTreeSelection->selected_foreach_iter( sigc::mem_fun(*this, &TheClass::selected_row_callback) ); void TheClass::selected_row_callback( const Gtk::TreeModel::iterator& iter) { TreeModel::Row row = *iter; // Faire quelque chose avec la ligne. }
IX.IV.III. Le signal « changed »
Pour répondre à l'utilisateur qui clique sur une ligne ou une plage de lignes, connectez le signal ainsi :
refTreeSelection->signal_changed().connect( sigc::mem_fun(*this, &Example_IconTheme::on_selection_changed) );
IX.IV.IV. Empêcher la sélection de lignes
Il est possible que l'utilisateur n'ait pas le droit de sélectionner tous les éléments d'une liste ou d'une arborescence. Ainsi, dans le programme gtk-demo, vous pouvez choisir un exemple pour voir le code source, mais choisir une catégorie d'exemples n'a pas de sens.
Pour contrôler quelles lignes peuvent être sélectionnées, utilisez la fonction membre set_select_function() et passez lui en paramètre un signal de rappel sigc::slot. Par exemple :
m_refTreeSelection->set_select_function( sigc::mem_fun(*this, &DemoWindow::select_function) );
puis
bool DemoWindow::select_function( const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool) { const Gtk::TreeModel::iterator iter = model->get_iter(path); // n'autoriser que la sélection des nœuds d'extrémité return iter->children().empty(); }
IX.IV.V. Modification de la sélection
Pour modifier la sélection, précisez un Gtk::TreeModel::iterator ou Gtk::TreeModel::Row, ainsi :
Gtk::TreeModel::Row row = m_refModel->children()[5]; // 5ième ligne. if(row) refTreeSelection->select(row);
ou
Gtk::TreeModel::iterator iter = m_refModel->children().begin() if(iter) refTreeSelection->select(iter);