ソート

標準のツリーモデル(TreeStoreListStore)はTreeSortableから派生しています。ですからどちらもソート機能を使うことができます。例えば、set_sort_column()を呼び出すことで指定した列でモデルをソートできます。あるいは、コールバック関数をset_sort_func()に与えてより複雑なソートアルゴリズムを実装してください。

TreeSortable Reference

列をクリックしてソートする

ユーザーがTreeViewの列ヘッダをクリックして中身をソートできるようにするには、Gtk::TreeViewModel::set_sort_column()を呼び出してください。引数としてヘッダがクリックされたときにソートしたいモデルの列を与えます。例えば:

Gtk::TreeView::Column* pColumn = treeview.get_column(0);
if(pColumn)
  pColumn->set_sort_column(m_columns.m_col_id);

同じモデルを無関係にソートした複数のビュー

ひとつの同じTreeModelをふたつのTreeViewウィジットで表示することは既にやりました。このような複数のビューのうちのひとつに、他のビューとは違うやりかたでモデルをソートさせたい場合、単なるGtk::TreeViewModel::set_sort_column()などではなく、TreeModelSortを使わなくてはいけません。TreeModelSortはモデルの一種で、もうひとつ別のモデルとしてソートしたバージョンのものを保持できます。例えば、TreeViewオブジェクトにソートしたバージョンのモデルを追加した場合、このようになります:

Glib::RefPtr<Gtk::TreeModelSort> sorted_model = Gtk::TreeModelSort::create(model);
sorted_model->set_sort_column(columns.m_col_name, Gtk::SORT_ASCENDING);
treeview.set_model(sorted_model);

ですが注意してください。TreeViewはソートしたモデルのイテレータを提供できます。モデルに変更を及ぼす場合は、このイテレータを背後にある子モデルのイテレータに変換しないといけません。例えば:

void ExampleWindow::on_button_delete()
{
  Glib::RefPtr<Gtk::TreeSelection> refTreeSelection= m_treeview.get_selection();
  if(refTreeSelection)
  {
    Gtk::TreeModel::iterator sorted_iter = m_refTreeSelection->get_selected();
    if(sorted_iter)
    {
      Gtk::TreeModel::iterator iter  = m_refModelSort->convert_iter_to_child_iter(sorted_iter);
      m_refModel->erase(iter);
    }
  }
}

TreeModelSort Reference