Η επιλογή

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

Glib::RefPtr<Gtk::TreeSelection> refTreeSelection =
    m_TreeView.get_selection();

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

9.4.2. Οι επιλεγμένες γραμμές

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

TreeModel::iterator iter = refTreeSelection->get_selected();
if(iter) //Αν κάτι έχει επιλεγεί
{
  TreeModel::Row row = *iter;
  //Do something with the row.
}

Για πολλαπλή επιλογή, χρειάζεται να ορίσετε μια επανάκληση και να της δώσετε selected_foreach(), selected_foreach_path(), ή selected_foreach_iter(), ως εξής:

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;
  //Do something with the row.
}

9.4.3. Το "αλλαγμένο" σήμα

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

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

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

9.4.5. Αλλαγή της επιλογής

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

Gtk::TreeModel::Row row = m_refModel->children()[5]; //The fifth row.
if(row)
  refTreeSelection->select(row);

ή

Gtk::TreeModel::iterator iter = m_refModel->children().begin()
if(iter)
  refTreeSelection->select(iter);