1from gi.repository import Gtk, GObject
2
3
4class Accordion(Gtk.TreeView):
5    def __init__(self, model):
6        GObject.GObject.__init__(self, model)
7
8        self.set_headers_visible(False)
9        self.set_property("show-expanders", False)
10        self.set_property("level-indentation", 10)
11
12        renderer = Gtk.CellRendererText()
13        column = Gtk.TreeViewColumn('Column', renderer)
14
15        def top_level(column, cell, store, iter):
16            cell.set_property("text", store[iter][0])
17            if store.iter_depth(iter) == 0:
18                cell.set_property('foreground', "black")
19                cell.set_property('background', "gray")
20            else:
21                cell.set_property('foreground', "black")
22                cell.set_property('background', "white")
23
24        column.set_cell_data_func(renderer, top_level)
25
26        self.append_column(column)
27
28        selection = self.get_selection()
29        selection.set_mode(Gtk.SelectionMode.SINGLE)
30        selection.connect('changed', self.on_selection_changed)
31        self.current = None
32
33    def on_selection_changed(self, selection, data=None):
34        model, iter = selection.get_selected()
35
36        if model.iter_depth(iter) == 0 and iter != self.current:
37            self.collapse_all()
38            self.expand_row(model.get_path(iter), True)
39            self.current = iter
40
41        selected_item = model.get_value(iter, 0)
42        print(selected_item)
43
44
45if __name__ == "__main__":
46    window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
47    window.set_title("Accordion example")
48    window.set_size_request(200, 200)
49    window.connect("delete_event", Gtk.main_quit)
50
51    treestore = Gtk.TreeStore(str)
52    for parent in range(4):
53        piter = treestore.append(None, ['parent %i' % parent])
54        for child in range(3):
55            treestore.append(piter,
56                             ['child %i of parent %i' % (child, parent)])
57    accordion = Accordion(treestore)
58    window.add(accordion)
59    window.show_all()
60    Gtk.main()
61