3 # vim: sw=4 ts=4 expandtab ai
4 # pylint: disable-msg=C0301
6 from gtkmvc import Controller
10 from heapq import nlargest
12 from views.debsearch import DebsearchView
15 class DebsearchCtrl(Controller):
16 """Controller of the Debian packages search plugin"""
18 def __init__(self, model):
19 Controller.__init__(self, model)
21 def register_view(self, view):
22 Controller.register_view(self, view)
24 # connects the signals:
25 self.view['start_btn'].connect('released', self.start_btn_released_cb)
26 self.view['stop_btn'].connect('clicked', self.on_stop_btn_clicked)
27 self.view['qty_spin'].connect("value_changed", self.on_qty_spin_value_changed)
29 # sets initial values for the view
30 self.view.set_quantity_value(self.model.quantity)
32 # -----------------------------------------------------
34 # -----------------------------------------------------
39 cache = apt_pkg.GetCache()
40 for pkg in cache.Packages:
41 # pkg is from a list of packages, sorted by name.
42 self.view['statusbar'].push(self.view['context_id'], pkg.Name) ### FIXME
43 if pkg.CurrentState == apt_pkg.CurStateInstalled:
44 pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
45 yield pkgsize, pkg.Name
47 def size_convert(self, size):
48 """Return string with package size in b or Kb or Mb or Gb or Tb."""
50 for i, unit in enumerate(['%d b', '%.1f Kb', '%.2f Mb', '%.3f Gb', '%.4f Tb']):
51 if size < 1024**(i+1):
52 return unit % (size/1024.**i)
55 # -----------------------------------------------------
57 # -----------------------------------------------------
59 def on_qty_spin_value_changed(self, sb):
60 """Get packages qty from SpinButton."""
61 self.model.quantity = sb.get_value_as_int()
63 def start_btn_released_cb(self, btn):
64 """Start package search. Button "Go" activate callback."""
66 self.view['start_btn'].set_sensitive(False)
67 self.view['stop_btn'].set_sensitive(True)
70 self.view['liststore'].clear()
73 self.view['treeview'].columns_autosize()
75 # Get biggest packages
76 for psize, packg in nlargest(self.model.quantity, self.debgetter()):
77 # Fill treemodel: package name, size as string, byte size
78 self.view['liststore'].append([packg, self.size_convert(psize), psize])
80 self.view['start_btn'].set_sensitive(True)
81 self.view['stop_btn'].set_sensitive(False)
83 def on_stop_btn_clicked(self, btn):
84 """Stop search. "Stop" button clicked callback."""
86 self.model.stopit = True
88 # -----------------------------------------------------
89 # observable properties
90 # -----------------------------------------------------
92 def property_quantity_value_change(self, model, old, new):
94 #self.view.set_quantity_value(new)
96 def property_stopit_value_change(self, model, old, new):
97 self.view.set_stopit_value(new)