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

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