~gmb/gwibber/use-dates-for-indexes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#
# Custom GUI Tree Widgets
#

import gtk, inspect

class Obj:
  def __init__(self, **args):
    self.__dict__.update(args)

class Store(gtk.ListStore):
  def __init__(self):
    gtk.ListStore.__init__(self, object)

  def get_obj(self, iter):
    return self[iter][0]

class Style:
  def __init__(self, cols):
    self.columns = cols
    self.column_types = [str] * len(self.columns)
    
  def generate_column_data(self, model, iter, column, tree):
    i = tree.filter.convert_iter_to_child_iter(iter)
    o = tree.filter.get_model().get_obj(i)

    c = self.columns[column]

    if len(c) <= 1: return getattr(o, c[0])
    elif inspect.isfunction(c[1]): return c[1](o)

  def custom_handler(self, col, cell, model, iter, data):
    fns, tree = data
    i = tree.filter.convert_iter_to_child_iter(iter)
    o = tree.filter.get_model().get_obj(i)

    for k, f in fns.items(): cell.set_property(k, f(o))
    
  def make_columns(self, tree):
    for ci, c in enumerate(self.columns):
      
      if len(c) > 2: name = c[2]
      else: name = c[0].replace("_", " ").title()

      if len(c) > 1 and isinstance(c[1], tuple):
        col = gtk.TreeViewColumn(name, c[1][0])
        col.set_cell_data_func(c[1][0], self.custom_handler, [c[1][1], tree])
      else:
        col = gtk.TreeViewColumn(name, gtk.CellRendererText(), text=ci)
        renderer = gtk.CellRendererText()

      col.set_reorderable(True)
      col.set_resizable(True)
      tree.append_column(col)

class Filter:
  def filter(self, model, iter):
    o = model.get_obj(iter)
    return True

class View(gtk.TreeView):
  def __init__(self, style, store, filter):
    gtk.TreeView.__init__(self, store)
    self.tree_store = store
    self.tree_style = style
    self.tree_filter = filter

    self.filter = self.tree_store.filter_new()
    self.filter.set_visible_func(self.tree_filter.filter)
    self.filter.set_modify_func(self.tree_style.column_types,
        self.tree_style.generate_column_data, self)

    self.set_model(self.filter)
    self.tree_style.make_columns(self)

  def get_selected(self):
    model, iter = self.get_selection().get_selected()
    if not iter: return None
    i = self.filter.convert_iter_to_child_iter(iter)
    return self.filter.get_model().get_obj(i)

  def __iadd__(self, item):
    if isinstance(item, dict): item = Obj(**item)
    self.tree_store.append([item])
    return self

def generate(cols):
  return View(Style(cols), Store(), Filter())