d56e57068019ce7fae0bfa13d5595799e2c25183
[findit] / src / debs / search.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         count = config.get('default_pkg_count')
14         self.show_func = show_funct
15         self.abstr = Search_Pkg_Abstraction()
16         self.present = Search_Pkg_Presentation(count, self.start_search)
17
18     def start_search(self, count, show_type):
19         pkglist = []
20         for psize, packg in nlargest(count, self.abstr.pkggetter()):
21             pkglist.append([packg, size_hum_read(psize), psize])
22         
23         if show_type is 'table_view':
24             from outtable import Out_Table_Control
25             out = Out_Table_Control()
26         #elif show_type is 'diag_view':
27         #    from outdiag import Out_Diag_Control
28         #    out = Out_Diag_Control(self.cfg)
29         out.show(pkglist, self.abstr.full())
30         self.show_func(None, out.get_ui())
31
32     def get_ui(self):
33         return self.present.get_ui()
34
35 class Search_Pkg_Abstraction(object):
36
37     def __init__(self):
38         apt_pkg.InitConfig()
39         apt_pkg.InitSystem()
40         self.cache = apt_pkg.GetCache()
41
42     def pkggetter(self):
43         self.fullsize = 0
44         for pkg in self.cache.Packages:
45             # pkg is from a list of packages, sorted by name.
46             if pkg.CurrentState == apt_pkg.CurStateInstalled:
47                 pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
48                 self.fullsize = self.fullsize + pkgsize
49                 yield pkgsize, pkg.Name
50
51     def full(self):
52         return self.fullsize
53
54
55 #==============================================================================
56
57 class Gtk_Presentation(object):
58
59     def __init__(self):
60         import gtk
61
62         # "Packages quantity" label
63         qty_label = gtk.Label('Files quantity')
64
65         # "Packages quantity" spin
66         qty_spin = gtk.SpinButton()
67         qty_spin.set_numeric(True)
68         qty_spin.set_range(0, 65536)
69         qty_spin.set_increments(1, 10)
70
71         # "Start" button
72         start_btn = gtk.Button('Start')
73         start_btn.connect('released', self.start_search)
74
75         # Output selection
76         outtable_rbtn = gtk.RadioButton(None, 'Table')
77         outdiagram_rbtn = gtk.RadioButton(outtable_rbtn, 'Diagram')
78         out1_rbtn = gtk.RadioButton(outtable_rbtn, 'Another 1')
79         out_rbtns = [outtable_rbtn, outdiagram_rbtn, out1_rbtn]
80
81         hbox = gtk.HBox(False, 4)
82         hbox.pack_start(qty_label, False, False, 0)
83         hbox.pack_start(qty_spin, False, False, 0)
84         hbox.pack_start(start_btn, False, False, 0)
85         for btn in reversed(out_rbtns):
86             hbox.pack_end(btn, False, False, 0)
87
88         statusbar = gtk.Statusbar()
89         context_id = statusbar.get_context_id('Selected package')
90         statusbar.push(context_id, 'test')
91
92         self.vbox = gtk.VBox(False, 4)
93         self.vbox.set_border_width(4)
94         self.vbox.pack_start(hbox, False, False, 0)
95         self.vbox.pack_end(statusbar, False, False, 0)
96
97         self.show_out_toplevel(None, 'outtable') ###
98         self.frame = gtk.Frame('Deb packages search')
99         self.frame.add(self.vbox)
100         self.frame.show_all()
101
102     #=== Functions ============================================================
103     def start_search(self, widget, start_func):
104         self.stopit = False
105         self.butt_stop.set_sensitive(True)
106         self.butt_start.set_sensitive(False)
107         start_func(self.get_data, self.get_stopit, self.currfilelbl, self.kill_wind)
108
109     def stop_search(self, widget):
110         self.stopit = True
111         self.butt_stop.set_sensitive(False)
112         self.butt_start.set_sensitive(True)
113
114     def get_stopit(self):
115         return self.stopit
116
117     #=== Toplevel widget for embedding to main window =========================
118     def get_toplevel(self):
119         return self.frame ###
120
121     #=== Output type selecting ================================================
122     def show_out_toplevel(self, btn, output):
123         print 'Entering <' + output + '> output mode...'
124         from files.outtable import Gtk_Presentation ###
125         toplevel = Gtk_Presentation().get_toplevel()
126         ###self.vbox.remove(self.vbox.get_children()[2])
127         #self.vbox.add(toplevel)
128         self.vbox.pack_start(toplevel)
129
130 #     def run(self):
131 #         self.show_all()
132 #         gtk.main()