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
- 10.4.2. Vybrané řádky
- 10.4.3. Signál "changed"
- 10.4.4. Jak zabárnit výběru řádku
- 10.4.5. Změna výběru
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 }