Η επιλογή

Για να βρείτε ποιες γραμμές έχει επιλέξει ο χρήστης, πάρτε το αντικείμενο Gtk::TreeView::Selection από την TreeView, ως εξής:

auto refTreeSelection = m_TreeView.get_selection();

10.4.1. Μεμονωμένη ή πολλαπλή επιλογή

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. Οι επιλεγμένες γραμμές

Για μεμονωμένη επιλογή, μπορείτε να καλέσετε απλά την get_selected(), ως εξής:

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. Το "αλλαγμένο" σήμα

Για απάντηση στο πάτημα του χρήστη σε μια γραμμή ή περιοχή γραμμών, συνδεθείτε με το σήμα ως εξής:

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

10.4.4. Αποτρέποντας την επιλογή γραμμής

Μπορεί ο χρήστης να μην πρέπει να μπορεί να επιλέξει κάθε στοιχείο στη λίστα ή δένδρο σας. Για παράδειγμα, στο gtk-demo, μπορείτε να επιλέξετε μια παρουσίαση για να δείτε τον πηγαίο κώδικα, αλλά δεν έχει νόημα να επιλέξετε μια κατηγορία παρουσίασης.

Για τον έλεγχο των γραμμών που μπορούν να επιλεγούν, χρησιμοποιήστε τη μέθοδο set_select_function(), δίνοντας μια επανάκληση sigc::slot. Για παράδειγμα:

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

και έπειτα

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. Αλλαγή της επιλογής

Για να αλλάξετε την επιλογή, ορίστε έναν Gtk::TreeModel::iterator ή Gtk::TreeModel::Row, ως εξής:

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

ή

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