2a2a5f86bbe61c11776fdcd35ffb00fa4f7fcb7f
[findit] / src / mvc / controllers / debsearch.py
1 #!/usr/bin/env python
2 # -*-coding: utf-8 -*-
3 # vim: sw=4 ts=4 expandtab ai
4 # pylint: disable-msg=C0301
5
6 from gtkmvc import Controller
7 import gtk
8
9 import apt_pkg
10 from heapq import nlargest
11
12 from views.debsearch import DebsearchView
13
14
15 class DebsearchCtrl(Controller):
16     """Controller of the Debian packages search plugin"""
17
18     def __init__(self, model):
19         Controller.__init__(self, model)
20
21     def register_view(self, view):
22         Controller.register_view(self, view)
23
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)
28
29         # sets initial values for the view
30         self.view.set_quantity_value(self.model.quantity)
31
32     # -----------------------------------------------------
33     #                  user callbacks
34     # -----------------------------------------------------
35
36     def debgetter(self):
37         apt_pkg.InitConfig()
38         apt_pkg.InitSystem()
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
46
47     def size_convert(self, size):
48         """Return string with package size in b or Kb or Mb or Gb or Tb."""
49
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)
53         return '>1024 Tb'
54
55     # -----------------------------------------------------
56     #                    gtk signals
57     # -----------------------------------------------------
58
59     def on_qty_spin_value_changed(self, sb):
60         """Get packages qty from SpinButton."""
61         self.model.quantity = sb.get_value_as_int()
62
63     def start_btn_released_cb(self, btn):
64         """Start package search. Button "Go" activate callback."""         
65
66         self.view['start_btn'].set_sensitive(False)
67         self.view['stop_btn'].set_sensitive(True)
68
69         # Clear list
70         self.view['liststore'].clear()
71
72         # Align columns
73         self.view['treeview'].columns_autosize()
74
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])
79
80         self.view['start_btn'].set_sensitive(True)
81         self.view['stop_btn'].set_sensitive(False)
82
83     def on_stop_btn_clicked(self, btn):
84         """Stop search. "Stop" button clicked callback."""
85         print 'Stop clicked'
86         self.model.stopit = True
87
88     # -----------------------------------------------------
89     #                observable properties
90     # -----------------------------------------------------
91
92     def property_quantity_value_change(self, model, old, new):
93         pass
94         #self.view.set_quantity_value(new)
95
96     def property_stopit_value_change(self, model, old, new):
97         self.view.set_stopit_value(new)