GNOME Peercast Player

GtkTreeModelFilter を使ってインクリメンタルサーチ的なフィルタを実装してみました。
Glade でGtkTreeModelFilter を定義していますが、サンプル等が見つけられなかったので、我流になっているかもしれません。

Glade での準備

  • GtkTreeView のモデルにGtkTreeModelFilter を指定
  • GtkTreeModelFilter の子モデルにGtkListStore を指定
  • GtkSearchEntry のchangedシグナルをハンドラとして登録

フィルタの準備

  • GtkTreeModelFilter を取得し、フィルタ関数filter_funcを登録します。
    liststore_filter = builder.get_object("liststore1_filter")
    liststore_filter.set_visible_func(self.filter_func)
  • 検索文字列がモデルの0列、6列の内容に含まれる場合に表示対象とするフィルタ関数を定義します。
    def filter_func(self, model, iter, keyword):
    self.keyword = self.searchentry.get_text()
    if self.keyword == "":
    return True
    else:
    return self.keyword.lower() in model[iter][0].lower() or self.keyword.lower() in model[iter][6].lower()

シグナルハンドラの処理

  • 検索文字列が更新されたらrefilter()を実行します。
    def on_searchentry_changed(self, liststore):
    self.filter.refilter()