added deb search possibility (edit */application.py for switch between deb and file...
[findit] / src / mvc / controllers / debsearch.py
diff --git a/src/mvc/controllers/debsearch.py b/src/mvc/controllers/debsearch.py
new file mode 100755 (executable)
index 0000000..2a2a5f8
--- /dev/null
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+# -*-coding: utf-8 -*-
+# vim: sw=4 ts=4 expandtab ai
+# pylint: disable-msg=C0301
+
+from gtkmvc import Controller
+import gtk
+
+import apt_pkg
+from heapq import nlargest
+
+from views.debsearch import DebsearchView
+
+
+class DebsearchCtrl(Controller):
+    """Controller of the Debian packages search plugin"""
+
+    def __init__(self, model):
+        Controller.__init__(self, model)
+
+    def register_view(self, view):
+        Controller.register_view(self, view)
+
+        # connects the signals:
+        self.view['start_btn'].connect('released', self.start_btn_released_cb)
+        self.view['stop_btn'].connect('clicked', self.on_stop_btn_clicked)
+        self.view['qty_spin'].connect("value_changed", self.on_qty_spin_value_changed)
+
+        # sets initial values for the view
+        self.view.set_quantity_value(self.model.quantity)
+
+    # -----------------------------------------------------
+    #                  user callbacks
+    # -----------------------------------------------------
+
+    def debgetter(self):
+        apt_pkg.InitConfig()
+        apt_pkg.InitSystem()
+        cache = apt_pkg.GetCache()
+        for pkg in cache.Packages:
+            # pkg is from a list of packages, sorted by name.
+            self.view['statusbar'].push(self.view['context_id'], pkg.Name)  ### FIXME
+            if pkg.CurrentState == apt_pkg.CurStateInstalled:
+                pkgsize = [version.InstalledSize for version in pkg.VersionList][0]
+                yield pkgsize, pkg.Name
+
+    def size_convert(self, size):
+        """Return string with package size in b or Kb or Mb or Gb or Tb."""
+
+        for i, unit in enumerate(['%d b', '%.1f Kb', '%.2f Mb', '%.3f Gb', '%.4f Tb']):
+            if size < 1024**(i+1):
+                return unit % (size/1024.**i)
+        return '>1024 Tb'
+
+    # -----------------------------------------------------
+    #                    gtk signals
+    # -----------------------------------------------------
+
+    def on_qty_spin_value_changed(self, sb):
+        """Get packages qty from SpinButton."""
+        self.model.quantity = sb.get_value_as_int()
+
+    def start_btn_released_cb(self, btn):
+        """Start package search. Button "Go" activate callback."""         
+
+        self.view['start_btn'].set_sensitive(False)
+        self.view['stop_btn'].set_sensitive(True)
+
+        # Clear list
+        self.view['liststore'].clear()
+
+        # Align columns
+        self.view['treeview'].columns_autosize()
+
+        # Get biggest packages
+        for psize, packg in nlargest(self.model.quantity, self.debgetter()):
+            # Fill treemodel: package name, size as string, byte size
+            self.view['liststore'].append([packg, self.size_convert(psize), psize])
+
+        self.view['start_btn'].set_sensitive(True)
+        self.view['stop_btn'].set_sensitive(False)
+
+    def on_stop_btn_clicked(self, btn):
+        """Stop search. "Stop" button clicked callback."""
+        print 'Stop clicked'
+        self.model.stopit = True
+
+    # -----------------------------------------------------
+    #                observable properties
+    # -----------------------------------------------------
+
+    def property_quantity_value_change(self, model, old, new):
+        pass
+        #self.view.set_quantity_value(new)
+
+    def property_stopit_value_change(self, model, old, new):
+        self.view.set_stopit_value(new)