Výběr

Když potřebujete vědět, které řádky uživatel označil, získejte z TreeView objekt Gtk::TreeView::Selection, takto:

auto refTreeSelection = m_TreeView.get_selection();

10.4.1. Jednoduchý nebo vícenásobný výběr

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

10.4.2. Vybrané řádky

Pro označení jednoho řádku stačí zavolat get_selected(), takto:

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.
}

10.4.3. Signál "changed"

Když chcete reagovat na uživatelovo kliknutí na řádek nebo rozsah řádků, připojte nějak takto signál:

refTreeSelection->signal_changed().connect(
    sigc::mem_fun(*this, &Example_IconTheme::on_selection_changed)
);

10.4.4. Jak zabárnit výběru řádku

Někdy může být zapotřebí, aby uživatel nemohl vybrat všechny položky v seznamu nebo stromu. Například v gtk-demo může vybírat jednotlivé ukázky, aby si prohlédl zdrojový kód, ale na výběr nereagují kategorie ukázek.

K řízení, které řádky mohou být vybrány, použijte metodu set_select_function() poskytující zpětné volání sigc::slot. Například:

m_refTreeSelection->set_select_function( sigc::mem_fun(*this,
    &DemoWindow::select_function) );

a pak

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
}

10.4.5. Změna výběru

Pro změnu výběru určete Gtk::TreeModel::iterator nebo Gtk::TreeModel::Row, takto:

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

nebo

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