forked from timdiels/zeroinstall
-
Notifications
You must be signed in to change notification settings - Fork 1
/
impl_list.py
100 lines (85 loc) · 2.77 KB
/
impl_list.py
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
90
91
92
93
94
95
96
97
98
99
import gtk, gobject
from zeroinstall.injector import model, writer
from gui import policy, pretty_size
def popup_menu(bev, values, fn):
menu = gtk.Menu()
for value in values:
if value is None:
item = gtk.SeparatorMenuItem()
else:
item = gtk.MenuItem(str(value).capitalize())
item.connect('activate', lambda item, v=value: fn(v))
item.show()
menu.append(item)
menu.popup(None, None, None, bev.button, bev.time)
# Columns
ITEM = 0
ARCH = 1
STABILITY = 2
VERSION = 3
CACHED = 4
ID = 5
UNUSABLE = 6
class ImplementationList(gtk.ScrolledWindow):
tree_view = None
model = None
def __init__(self, interface):
gtk.ScrolledWindow.__init__(self, None, None)
self.set_shadow_type(gtk.SHADOW_IN)
self.model = gtk.ListStore(object, str, str, str,
gobject.TYPE_BOOLEAN, str, gobject.TYPE_BOOLEAN)
self.tree_view = gtk.TreeView(self.model)
text = gtk.CellRendererText()
text_strike = gtk.CellRendererText()
toggle = gtk.CellRendererToggle()
stability = gtk.TreeViewColumn('Stability', text, text = STABILITY)
for column in (gtk.TreeViewColumn('Version', text, text = VERSION),
stability,
gtk.TreeViewColumn('C', toggle, active = CACHED),
gtk.TreeViewColumn('Arch', text, text = ARCH),
gtk.TreeViewColumn('ID', text_strike, text = ID,
strikethrough = UNUSABLE)):
self.tree_view.append_column(column)
self.add(self.tree_view)
def button_press(tree_view, bev):
if bev.button not in (1, 3):
return False
pos = tree_view.get_path_at_pos(int(bev.x), int(bev.y))
if not pos:
return False
path, col, x, y = pos
if col == stability:
impl = self.model[path][ITEM]
upstream = impl.upstream_stability or model.testing
choices = model.stability_levels.values()
choices.sort()
choices.reverse()
def set(new):
if isinstance(new, model.Stability):
impl.user_stability = new
else:
impl.user_stability = None
writer.save_interface(interface)
policy.recalculate()
popup_menu(bev, ['Unset (%s)' % upstream, None] + choices,
set)
self.tree_view.connect('button-press-event', button_press)
def get_selection(self):
return self.tree_view.get_selection()
def set_items(self, items):
self.model.clear()
for item in items:
new = self.model.append()
self.model[new][ITEM] = item
self.model[new][VERSION] = item.get_version()
self.model[new][CACHED] = policy.get_cached(item)
if item.user_stability:
self.model[new][STABILITY] = str(item.user_stability).upper()
else:
self.model[new][STABILITY] = item.upstream_stability or \
model.testing
self.model[new][ARCH] = item.arch or 'any'
self.model[new][ID] = item.id
self.model[new][UNUSABLE] = policy.is_unusable(item)
def clear(self):
self.model.clear()