#!/usr/bin/env python

import pygtk ; pygtk.require('2.0')
import gtk, time

SHOW_ALL = 0
SHOW_CHOOSEN = 1

class App(gtk.Window):
    def __init__(self):
        self.criteria = SHOW_ALL
        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
        self.connect("delete-event", gtk.main_quit)
        self.set_default_size(300,300)
        vbox = gtk.VBox()
        self.add(vbox)

        self.liststore = gtk.ListStore('gboolean', str)
        self.liststore.append((False, "line 01"))
        self.liststore.append((True, "line 01"))
        self.liststore.append((False, "line 03"))
        self.modelfilter = self.liststore.filter_new()
        self.modelfilter.set_visible_func(self.visible_cb)
        self.modelsort = gtk.TreeModelSort(self.modelfilter)
        self.tv = gtk.TreeView(self.modelsort)
        self.tv.connect("row-activated", self.toggle_radio)
        self.tv.set_headers_visible(True)
        self.tv.set_rules_hint(True)
        cell = gtk.CellRendererToggle()
        cell.set_radio(True)
        c = gtk.TreeViewColumn("column 1", cell, active=0)
        c.set_clickable(True)
        c.set_resizable(False)
        c.set_sort_column_id(0)
        self.tv.append_column(c)
        cell = gtk.CellRendererText()
        c = gtk.TreeViewColumn("column 2", cell, text=1)
        c.set_resizable(True)
        c.set_sort_column_id(1)
        self.tv.append_column(c)
        scrolled = gtk.ScrolledWindow()
        scrolled.add(self.tv)
        vbox.pack_start(scrolled)
        check_button = gtk.CheckButton("show all")
        check_button.set_active(True)
        check_button.connect("clicked", self.filter)
        vbox.pack_start(check_button)

    def filter(self, toggle):
        if toggle.get_active():
            self.criteria = SHOW_ALL
        else:
            self.criteria = SHOW_CHOOSEN
        self.modelfilter.refilter()

    def toggle_radio(self, view, path, *args):
        path = self.modelsort.convert_path_to_child_path(path)
        path = self.modelfilter.convert_path_to_child_path(path)
        for row in self.liststore:
            row[0] = False
        self.liststore[path][0] = True

    def visible_cb(self, model, iter):
        if self.criteria == SHOW_ALL or model.get_value(iter, 0):
            return True
        else:
            return False

    def run(self):
        self.show_all()
        gtk.main()

App().run()
