summaryrefslogtreecommitdiffstats
path: root/gui.py
diff options
context:
space:
mode:
authorFlorian Festi <ffesti@redhat.com>2010-08-25 17:49:35 +0200
committerFlorian Festi <ffesti@redhat.com>2010-08-25 17:49:35 +0200
commitf6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca (patch)
treee1b107526f701db0b4f2d9b94bdba059ebf12164 /gui.py
downloadpkggui-f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca.tar.gz
pkggui-f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca.tar.xz
pkggui-f6afdd31acf58d4ecf49d9b5ed726be0f7f6e5ca.zip
Initial import
Diffstat (limited to 'gui.py')
-rwxr-xr-xgui.py179
1 files changed, 179 insertions, 0 deletions
diff --git a/gui.py b/gui.py
new file mode 100755
index 0000000..f90d5d2
--- /dev/null
+++ b/gui.py
@@ -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_())