La sélection

Pour retrouver quelles sont les lignes sélectionnées par l'utilisateur, obtenez l'objet Gtk::TreeView::Selection du TreeView ainsi :

auto refTreeSelection = m_TreeView.get_selection();

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

X.IV.II. Les lignes sélectionnées

Pour une simple sélection, appelez simplement la fonction membre get_selected(), comme suit :

auto iter = refTreeSelection->get_selected();
if(iter) //If anything is selected
{
  auto row = *iter;
  //Do something with the row.
}

For multiple-selection, you need to call get_selected_rows() or define a callback, and give it to selected_foreach(), selected_foreach_path(), or selected_foreach_iter(), like so:

refTreeSelection->selected_foreach_iter(
    sigc::mem_fun(*this, &TheClass::selected_row_callback) );

void TheClass::selected_row_callback(
    const Gtk::TreeModel::const_iterator& iter)
{
  auto row = *iter;
  //Do something with the row.
}

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

X.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 auto iter = model->get_iter(path);
  return iter->children().empty(); // only allow leaf nodes to be selected
}

X.IV.V. Modification de la sélection

Pour modifier la sélection, précisez un Gtk::TreeModel::iterator ou Gtk::TreeModel::Row, ainsi :

auto row = m_refModel->children()[5]; //The sixth row.
if(row)
  refTreeSelection->select(row.get_iter());

ou

auto iter = m_refModel->children().begin()
if(iter)
  refTreeSelection->select(iter);