どの行がユーザーに選択されたのかを見つけるには、Gtk::TreeView::SelectionオブジェクトをTreeViewから取得してください。このように:
Glib::RefPtr<Gtk::TreeSelection> refTreeSelection = m_TreeView.get_selection();
デフォルトでは選択できる行はただひとつだけです。しかし、モードを設定すれば複数のセレクションを許可できます。このように:
refTreeSelection->set_mode(Gtk::SELECTION_MULTIPLE);
単一セレクションでは、単にget_selected()を呼ぶだけです。このように:
TreeModel::iterator iter = refTreeSelection->get_selected();
if(iter) //If anything is selected
{
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.
}
単一行や複数の行の範囲において、ユーザーのクリック操作に反応するには、シグナルをこのように接続します:
refTreeSelection->signal_changed().connect( sigc::mem_fun(*this, &Example_StockBrowser::on_selection_changed) );
アプリケーションのリストや木構造で、ユーザーが全てのアイテムを選択できないほうがいい場合があります。例えば、Gtk+のデモではデモのひとつひとつを選択してソースコードを見ることができます。しかし、この場合デモのカテゴリを選択できることに意味はありません。
どの行が選択可能なのか管理するには、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
}
セレクションを変更するには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);