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
Par défaut, vous ne pouvez sélectionner qu'une seule ligne, mais la sélection multiple est possible en activant le mode correspondant, comme ceci :
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_StockBrowser::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);