diff options
Diffstat (limited to 'portato')
-rw-r--r-- | portato/gui/gtk/windows.py | 18 | ||||
-rw-r--r-- | portato/gui/gui_helper.py | 74 |
2 files changed, 57 insertions, 35 deletions
diff --git a/portato/gui/gtk/windows.py b/portato/gui/gtk/windows.py index 7ec6157..8c8ffe0 100644 --- a/portato/gui/gtk/windows.py +++ b/portato/gui/gtk/windows.py @@ -984,10 +984,7 @@ class MainWindow (Window): def fill_cat_store (self, store): - if self.showAll: - cats = system.list_categories() - else: - cats = self.db.get_installed_categories() + cats = self.db.get_categories(installed = not self.showAll) for p in cats: store.append([p]) @@ -1001,7 +998,7 @@ class MainWindow (Window): @param name: name of the selected catetegory @type name: string""" - store = gtk.ListStore(gtk.gdk.Pixbuf, str) + store = gtk.ListStore(gtk.gdk.Pixbuf, str, str) self.fill_pkg_store(store,name) # build view @@ -1034,14 +1031,14 @@ class MainWindow (Window): @rtype: gtk.ListStore""" if name: - for pkg, is_inst in self.db.get_cat(name, self.sortPkgListByName): + for cat, pkg, is_inst in self.db.get_cat(name, self.sortPkgListByName): if is_inst: icon = self.instPixbuf elif not self.showAll: continue # ignore not installed packages else: icon = None - store.append([icon, pkg]) + store.append([icon, pkg, cat]) return store def load_session(self): @@ -1153,7 +1150,8 @@ class MainWindow (Window): store, it = sel.get_selected() if it: package = store.get_value(it, 1) - self.show_package(self.selCatName+"/"+package, self.queue) + cat = store.get_value(it, 2) + self.show_package(cat+"/"+package, self.queue) return True def cb_pkg_list_header_clicked(self, col): @@ -1344,9 +1342,7 @@ class MainWindow (Window): def cb_reload_clicked (self, action): """Reloads the portage settings and the database.""" system.reload_settings() - del self.db - self.db = Database() - self.db.populate() + self.db.reload() @Window.watch_cursor def cb_search_clicked (self, entry): diff --git a/portato/gui/gui_helper.py b/portato/gui/gui_helper.py index e590a69..1e465a7 100644 --- a/portato/gui/gui_helper.py +++ b/portato/gui/gui_helper.py @@ -122,10 +122,18 @@ class Config (ConfigParser): class Database: """An internal database which holds a simple dictionary cat -> [package_list].""" + ALL = _("ALL") + def __init__ (self): """Constructor.""" - self._db = {} - self.inst_cats = set() + self.__initialize() + + def __initialize (self): + self._db = {self.ALL:[]} + self.inst_cats = set([self.ALL]) + + def __sort_key (self, x): + return x[1].lower() def populate (self, category = None): """Populates the database. @@ -143,61 +151,79 @@ class Database: cat, pkg = p.split("/") if not cat in self._db: self._db[cat] = [] inst = p in installed - self._db[cat].append((pkg, inst)) + t = (cat, pkg, inst) + self._db[cat].append(t) + self._db[self.ALL].append(t) if inst: self.inst_cats.add(cat) for key in self._db: # sort alphabetically - self._db[key].sort(cmp=cmp, key=lambda x: x[0].lower()) + self._db[key].sort(key = self.__sort_key) - def get_cat (self, cat, byName = True): + def get_cat (self, cat = None, byName = True): """Returns the packages in the category. - @param cat: category to return the packages from + @param cat: category to return the packages from; if None it defaults to "ALL" @type cat: string @param byName: selects whether to return the list sorted by name or by installation @type byName: boolean - @return: list of tuples: (name, is_installed) or [] - @rtype: (string, boolean)[] + @return: an iterator over a list of tuples: (category, name, is_installed) or [] + @rtype: (string, string, boolean)<iterator> """ + + if not cat: + cat = self.ALL try: if byName: - return self._db[cat] + for pkg in self._db[cat]: + yield pkg else: - inst = [] ninst = [] - for p, i in self._db[cat]: - if i: - inst.append((p,i)) + for pkg in self._db[cat]: + if pkg[2]: + yield pkg else: - ninst.append((p,i)) + ninst.append(pkg) - return inst+ninst + for pkg in ninst: + yield pkg except KeyError: # cat is in category list - but not in portage info(_("Catched KeyError => %s seems not to be an available category. Have you played with rsync-excludes?"), cat) - return [] - - def get_installed_categories (self): - """Returns all categories which have installed packages in them. + def get_categories (self, installed = False): + """Returns all categories. + + @param installed: Only return these with at least one installed package. + @type installed: boolean @returns: the list of categories - @rtype: string[] + @rtype: string<iterator> """ - return list(self.inst_cats) + if installed: + c = self.inst_cats + else: + c = self._db.iterkeys() + + for cat in c: + yield cat - def reload (self, cat): + def reload (self, cat = None): """Reloads the given category. @param cat: category @type cat: string """ - del self._db[cat] - self.populate(cat+"/") + if cat: + del self._db[cat] + self.inst_cats.remove(cat) + self.populate(cat+"/") + else: + self.__initialize() + self.populate() class EmergeQueue: """This class manages the emerge queue.""" |