62fd14ef9c8405e9e3e8b7b4903256fc75cd8595
[findit] / src / pkgsearch.py
1 #!/usr/bin/python
2 # -*-coding: utf-8 -*-
3 # vim: sw=4 ts=4 expandtab ai
4
5 import gtk
6 import apt_pkg
7 from heapq import nlargest
8 from misc import size_hum_read
9
10 class Search_Pkg_Control(object):
11
12     def __init__(self, config, show_funct):
13         win_width = config.get('window_width')
14         win_height = config.get('window_height')
15         count = config.get('default_pkg_count')
16         self.show_func = show_funct
17         self.abstr = Search_Pkg_Abstraction()
18         self.present = Search_Pkg_Presentation(win_width, win_height, count, self.start_search)
19
20     def start_search(self, count, kill_func):
21         pkglist = []
22         for psize, packg in nlargest(count, self.abstr.pkggetter()):
23             pkglist.append([packg, size_hum_read(psize), psize])
24         kill_func()
25         self.show_func.show(pkglist, self.abstr.full())
26         self.show_func.run()
27
28     def run(self):
29         self.present.run()
30
31
32 class Search_Pkg_Abstraction(object):
33
34     def __init__(self):
35         apt_pkg.InitConfig()
36         apt_pkg.InitSystem()
37         self.cache = apt_pkg.GetCache()
38
39     def pkggetter(self):
40         self.fullsize = 0
41         for pkg in self.cache.Packages:
42             # pkg is from a list of packages, sorted by name.
43             if pkg.CurrentState == apt_pkg.CurStateInstalled:
44                 pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
45                 self.fullsize = self.fullsize + pkgsize
46                 yield pkgsize, pkg.Name
47
48     def full(self):
49         return self.fullsize
50
51
52 class Search_Pkg_Presentation(gtk.Window):
53
54     def __init__(self, win_width, win_height, count, st_func):
55         """Create MainWindow."""
56         # Создаем новое окно
57         gtk.Window.__init__(self)
58         self.set_default_size(win_width, win_height)
59         self.set_border_width(4)
60         self.connect('delete_event', gtk.main_quit)
61
62         label1 = gtk.Label('Files quantity')
63         # Окошко ввода количества файлов, мин значение=1 макс=65536 по умолчанию 10
64         adj = gtk.Adjustment(count, 1, 65536, 1, 5, 0)
65         self.file_cnt = gtk.SpinButton(adj, 0, 0)
66
67         hbox = gtk.HBox(False, 0)
68         hbox.pack_start(label1, False, False, 5)
69         hbox.pack_start(self.file_cnt, False, False, 0)
70
71         self.butt_start = gtk.Button('Go >')
72         self.butt_start.connect('released', self.start_srch, st_func)
73         
74         self.butt_prev = gtk.Button('< Previous')
75         #self.butt_prev.connect('released', self.show_prev, prev_window)
76         
77         hbox1 = gtk.HBox(False, 0)
78         hbox1.pack_start(self.butt_prev, False, False, 5)
79         hbox1.pack_start(self.butt_start, False, False, 5)
80
81         vbox = gtk.VBox(False, 0)
82         vbox.pack_start(hbox, False, False, 5)
83         vbox.pack_start(hbox1, False, False, 5)
84
85         self.add(vbox)
86
87     def kill_wind(self):
88         self.destroy()
89         gtk.main_quit()
90
91     def get_data(self):
92         return int( self.file_cnt.get_value() )
93
94     def run(self):
95         self.show_all()
96         gtk.main()
97
98     def start_srch(self, widget, start_func):
99         start_func(self.get_data(), self.kill_wind)