diff options
author | Florian Festi <ffesti@redhat.com> | 2010-08-25 17:49:35 +0200 |
---|---|---|
committer | Florian Festi <ffesti@redhat.com> | 2010-08-25 17:49:35 +0200 |
commit | f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca (patch) | |
tree | e1b107526f701db0b4f2d9b94bdba059ebf12164 /gui.py | |
download | pkggui-f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca.tar.gz pkggui-f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca.tar.xz pkggui-f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca.zip |
Initial import
Diffstat (limited to 'gui.py')
-rwxr-xr-x | gui.py | 179 |
1 files changed, 179 insertions, 0 deletions
@@ -0,0 +1,179 @@ +#!/usr/bin/python + +import sys +from PyQt4 import QtGui, uic + +import sys +sys.path.insert(0,'/usr/share/yum-cli') +import yum +import yum.comps +from utils import YumUtilBase + +class Packages(YumUtilBase): + # XXX + NAME= 'appfinder' + VERSION = '1.0' + USAGE = 'appfinder [options] [package globs]' + + def __init__(self): + YumUtilBase.__init__(self, + self.NAME, + self.VERSION, + self.USAGE) + + +class SearchItem: + + def __init__(self, pattern, result, _type="search"): + self.pattern = pattern + self.result = result + self.type = _type + + def __str__(self): + return "<%s %s>(%s)" % (self.__class__.__name__, + self.type, self.pattern) + +class PackagesUI: + + def __init__(self): + self.packages = Packages() + + self.searchItems = { + "search" : [], + "tag" : [], + "group" : [] + } + + self.activeSearchItems = [] + self.result = set() + + self.mainwindow = m = uic.loadUi("packages.ui") + + # searchBox + self.searchBox = m.findChild(QtGui.QLineEdit, "searchBox") + self.searchBox.returnPressed.connect(self.search) + + # tagList + self.tagList = m.findChild(QtGui.QListView, "tagList") + self.tagModel = QtGui.QStandardItemModel() + self.tagList.setModel(self.tagModel) + self.tagList.activated.connect(self.tagActivated) + + # searchItems + self.searchItemLayout = m.findChild(QtGui.QHBoxLayout, "searchItemLayout") + m.findChild(QtGui.QPushButton, "pushButton").hide() + m.findChild(QtGui.QPushButton, "pushButton_2").hide() + self.searchItemLayout.addStretch(1) + + # resultList + self.resultList = m.findChild(QtGui.QListView, "resultList") + self.resultModel = QtGui.QStandardItemModel() + self.resultList.setModel(self.resultModel) + self.resultList.clicked.connect(self.packageSelected) + + # tags + self.tag2pkgs = {} + for name, tags in self.packages.pkgtags.search_tags('').iteritems(): + for tag in tags: + self.tag2pkgs.setdefault(tag, set()).add(name) + for tag, pkgs in self.tag2pkgs.iteritems(): + self.searchItems["tag"].append(SearchItem(tag, pkgs, "tag")) + + # groups + for group in self.packages.comps.groups: + print group, group.packages + self.searchItems["group"].append( + SearchItem(group.name, set(group.packages), "group")) + + + self.fillTags() + + self.mainwindow.show() + + def fillResults(self): + pass + + def _addActiveSearchItem(self, searchItem): + for s in self.activeSearchItems: + if s.pattern == searchItem.pattern: + return + + b = QtGui.QPushButton(searchItem.pattern) + b.clicked.connect(self.deleteSearchItem) + self.searchItemLayout.insertWidget(0, b) + self.activeSearchItems.append(searchItem) + self.refreshSearchResults() + + def search(self): + t = self.searchBox.text() + self.tagList.model().insertRow(0, QtGui.QStandardItem(t)) + item = SearchItem(t, set(), 'search') + self.searchItems["search"].append(item) + self._addActiveSearchItem(item) + + def tagActivated(self, index): + text = str(index.data().toString()) + for _type, items in self.searchItems.iteritems(): + for item in items: + if text.endswith(item.pattern): # XXX ugly hack + self._addActiveSearchItem(item) + return + + def deleteSearchItem(self, w): + b = self.mainwindow.sender() + b.hide() + pattern = b.text() + self.searchItemLayout.removeWidget(b) + b.destroy(True, True) # XXX enough? + + for nr, s in enumerate(self.activeSearchItems): + if s.pattern == pattern: + del self.activeSearchItems[nr] + self.refreshSearchResults() + + def refreshSearchResults(self): + if self.activeSearchItems: + result = self.activeSearchItems[0].result.copy() + for s in self.activeSearchItems: + result &= s.result + else: + result = set() + + self.result = result + result = list(result) + result.sort(reverse=True) + + self.resultList.model().clear() + for r in result: + self.resultList.model().insertRow(0, QtGui.QStandardItem(r)) + + self.fillTags() + + def fillTags(self): + self.tagList.model().clear() + + for _type in ("tag", "group", "search"): + if self.result: + items = [(len(item.result & self.result), item.pattern, len(item.result)) + for item in self.searchItems[_type]] + else: + items = [(len(item.result), item.pattern, len(item.result)) + for item in self.searchItems[_type]] + + items.sort() + + + for hits, pattern, allhits in items: + #if hits == 0: continue + self.tagList.model().insertRow(0, QtGui.QStandardItem( + "%i/%i %s" % (hits, allhits, pattern))) + + def packageSelected(self, index): + pass + +app = QtGui.QApplication(sys.argv) + +main = PackagesUI() + + +sys.exit(app.exec_()) |