Use freshness policy to auto-update.
[zeroinstall.git] / impl_list.py
blob3fcded7e6d253e86ef120e83a2f9aa75e6975b21
1 import gtk
2 import model
3 from gui import policy
4 import writer
6 def pretty_size(size):
7 if size is None:
8 return '?'
9 if size < 2048:
10 return '%d bytes' % size
11 size = float(size)
12 for unit in ('Kb', 'Mb', 'Gb', 'Tb'):
13 size /= 1024
14 if size < 2048:
15 break
16 return '%.1f %s' % (size, unit)
18 def popup_menu(bev, values, fn):
19 menu = gtk.Menu()
20 for value in values:
21 if value is None:
22 item = gtk.SeparatorMenuItem()
23 else:
24 item = gtk.MenuItem(str(value).capitalize())
25 item.connect('activate', lambda item, v=value: fn(v))
26 item.show()
27 menu.append(item)
28 menu.popup(None, None, None, bev.button, bev.time)
30 # Columns
31 ITEM = 0
32 ARCH = 1
33 STABILITY = 2
34 VERSION = 3
35 CACHED = 4
36 PATH = 5
37 SIZE = 6
38 UNUSABLE = 7
40 class ImplementationList(gtk.ScrolledWindow):
41 tree_view = None
42 model = None
44 def __init__(self, interface):
45 gtk.ScrolledWindow.__init__(self, None, None)
46 self.set_shadow_type(gtk.SHADOW_IN)
48 self.model = gtk.ListStore(object, str, str, str, bool, str, str, bool)
49 self.tree_view = gtk.TreeView(self.model)
51 text = gtk.CellRendererText()
52 text_strike = gtk.CellRendererText()
53 toggle = gtk.CellRendererToggle()
55 stability = gtk.TreeViewColumn('Stability', text, text = STABILITY)
57 for column in (gtk.TreeViewColumn('Version', text, text = VERSION),
58 stability,
59 gtk.TreeViewColumn('C', toggle, active = CACHED),
60 gtk.TreeViewColumn('Arch', text, text = ARCH),
61 gtk.TreeViewColumn('Size', text, text = SIZE),
62 gtk.TreeViewColumn('Location', text_strike, text = PATH,
63 strikethrough = UNUSABLE)):
64 self.tree_view.append_column(column)
66 self.add(self.tree_view)
68 def button_press(tree_view, bev):
69 if bev.button not in (1, 3):
70 return False
71 pos = tree_view.get_path_at_pos(int(bev.x), int(bev.y))
72 if not pos:
73 return False
74 path, col, x, y = pos
75 if col == stability:
76 impl = self.model[path][ITEM]
77 upstream = impl.upstream_stability or model.testing
78 choices = model.stability_levels.values()
79 choices.sort()
80 choices.reverse()
81 def set(new):
82 if isinstance(new, model.Stability):
83 impl.user_stability = new
84 else:
85 impl.user_stability = None
86 writer.save_interface(interface)
87 policy.recalculate()
88 popup_menu(bev, ['Unset (%s)' % upstream, None] + choices,
89 set)
90 self.tree_view.connect('button-press-event', button_press)
92 def get_selection(self):
93 return self.tree_view.get_selection()
95 def set_items(self, items):
96 self.model.clear()
97 for item in items:
98 new = self.model.append()
99 self.model[new][ITEM] = item
100 self.model[new][VERSION] = item.get_version()
101 self.model[new][CACHED] = item.get_cached()
102 if item.user_stability:
103 self.model[new][STABILITY] = str(item.user_stability).upper()
104 else:
105 self.model[new][STABILITY] = item.upstream_stability or \
106 model.testing
107 self.model[new][ARCH] = item.arch or 'any'
108 self.model[new][PATH] = item.path
109 self.model[new][SIZE] = pretty_size(item.size)
110 self.model[new][UNUSABLE] = policy.is_unusable(item)
112 def clear(self):
113 self.model.clear()