[Debtags-commits] [svn] r1864 - python
Enrico Zini
enrico at costa.debian.org
Sun Aug 27 21:00:38 UTC 2006
Author: enrico
Date: Sun Aug 27 21:00:35 2006
New Revision: 1864
Modified:
python/ (props changed)
python/wxssearch
Log:
r3201 at viaza: enrico | 2006-08-27 18:46:38 +0100
Allow to add wanted and unwanted tags
Modified: python/wxssearch
==============================================================================
--- python/wxssearch (original)
+++ python/wxssearch Sun Aug 27 21:00:35 2006
@@ -45,10 +45,55 @@
self.unwanted = set()
self.ignored = set()
self.interesting = []
+ self.discriminant = []
self.fullcoll = fullcoll
self.subcoll = fullcoll
+ def tagMatch(self, pkg):
+ tags = self.fullcoll.tagsOfPackage(pkg)
+ if len(self.wanted) > 0 and not self.wanted.issubset(tags):
+ return False
+ if len(self.unwanted) > 0 and len(tags.intersection(self.unwanted)) > 0:
+ return False
+ return True
+
+ def refilter(self):
+ # Regenerate subcoll
+ self.subcoll = self.fullcoll.filterPackages(self.tagMatch)
+
+ # Compute the most interesting tags by discriminance
+ self.discriminant = sorted(self.subcoll.iterTags(), \
+ lambda a, b: cmp(self.subcoll.discriminance(a), self.subcoll.discriminance(b)))
+
+ # Notify the change
+ e = Model.ModelEvent(Model.wxEVT_CHANGED)
+ self.ProcessEvent(e)
+
+ def addWanted(self, tag):
+ self.wanted.add(tag)
+ if tag in self.unwanted: self.unwanted.remove(tag)
+ if tag in self.ignored: self.ignored.remove(tag)
+ self.refilter()
+
+ def addUnwanted(self, tag):
+ self.unwanted.add(tag)
+ if tag in self.wanted: self.wanted.remove(tag)
+ if tag in self.ignored: self.ignored.remove(tag)
+ self.refilter()
+
+ def addUnwanted(self, tag):
+ self.ignored.add(tag)
+ if tag in self.wanted: self.wanted.remove(tag)
+ if tag in self.unwanted: self.unwanted.remove(tag)
+ self.refilter()
+
+ def removeTagFromFilter(self, tag):
+ if tag in self.wanted: self.wanted.remove(tag)
+ if tag in self.unwanted: self.unwanted.remove(tag)
+ if tag in self.ignored: self.ignored.remove(tag)
+ self.refilter()
+
def setQuery(self, query):
print "SetQuery", query
input = subprocess.Popen("apt-cache search " + query, shell=True, stdout = subprocess.PIPE, close_fds = True)
@@ -72,22 +117,99 @@
self.ProcessEvent(e)
class TagList(wx.ListCtrl):
+ ACTION_ADD_WANTED = wx.NewId()
+ ACTION_ADD_UNWANTED = wx.NewId()
+
def __init__(self, parent, model):
- wx.ListCtrl.__init__(self, parent, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES)
+ wx.ListCtrl.__init__(self, parent, style=wx.LC_REPORT|wx.LC_VIRTUAL)
self.model = model
self.model.Bind(Model.EVT_CHANGED, self.modelChanged)
+ self.intAttr = wx.ListItemAttr()
+ self.intAttr.SetBackgroundColour("light green")
+ self.discAttr = wx.ListItemAttr()
+ self.discAttr.SetBackgroundColour("light blue")
+
self.InsertColumn(0, "Available tags")
+ self.SetColumnWidth(0, wx.LIST_AUTOSIZE)
+
+ self.Bind(wx.EVT_LEFT_DOWN, self.onClicked)
+
+ def onClicked(self, event):
+ x, y = event.GetX(), event.GetY()
+ item, flags = self.HitTest((x, y))
+ if flags & wx.LIST_HITTEST_ONITEM:
+ self.clickedItem = item
+ else:
+ self.clickedItem = None
+
+ event.Skip()
+
+ menu = wx.Menu()
+ menu.Append(TagList.ACTION_ADD_WANTED, "I want this tag")
+ menu.Append(TagList.ACTION_ADD_UNWANTED, "I do not want this tag")
+ self.PopupMenu(menu)
+ menu.Destroy()
+
+ def getClickedItem(self):
+ return self.OnGetItemText(self.clickedItem, 0)
+
def OnGetItemText(self, row, col):
- if row < 7:
+ icount = max(7, len(self.model.interesting))
+ if row < icount:
return self.model.interesting[row]
else:
- return None
+ row = row - icount
+ dcount = max(7, len(self.model.discriminant))
+ if row < icount + dcount:
+ return self.model.discriminant
+ else:
+ return None
+
+ def OnGetItemAttr(self, row):
+ icount = max(7, len(self.model.interesting))
+ if row < icount:
+ return self.intAttr
+ else:
+ row = row - icount
+ dcount = max(7, len(self.model.discriminant))
+ if row < dcount:
+ return self.discAttr
+ else:
+ return None
def modelChanged(self, event):
print "size", len(self.model.interesting)
- self.SetItemCount(max(7, len(self.model.interesting)))
+ self.SetItemCount(max(7, len(self.model.interesting)) + max(7, len(self.model.discriminant)))
+ event.Skip()
+
+class Results(wx.ListCtrl):
+ def __init__(self, parent, model):
+ wx.ListCtrl.__init__(self, parent, style=wx.LC_REPORT|wx.LC_VIRTUAL)
+ self.model = model
+ self.model.Bind(Model.EVT_CHANGED, self.modelChanged)
+
+ self.packages = []
+
+ self.InsertColumn(0, "Name")
+ self.InsertColumn(1, "Description")
+
+ self.SetColumnWidth(0, wx.LIST_AUTOSIZE)
+ self.SetColumnWidth(1, wx.LIST_AUTOSIZE)
+
+ def modelChanged(self, event):
+ self.packages = sorted(self.model.subcoll.iterPackages())
+ self.packages.sort()
+ self.SetItemCount(len(self.packages))
+ event.Skip()
+
+ def OnGetItemText(self, row, col):
+ if col == 0:
+ return self.packages[row]
+ else:
+ aptpkg = self.model.aptCache[self.packages[row]]
+ return aptpkg.rawDescription.split("\n")[0]
class SearchWindow(wx.Frame):
@@ -97,18 +219,50 @@
self.model = model
- self.query = wx.TextCtrl(self)
+ queryPanel = wx.Panel(self)
+ self.query = wx.TextCtrl(queryPanel)
self.query.Bind(wx.EVT_TEXT, self.queryChanged)
-
- self.tagList = TagList(self, model)
+ self.tagList = TagList(queryPanel, model)
+ self.tagList.Bind(wx.EVT_MENU, self.wantedEvent)
box = wx.BoxSizer(wx.VERTICAL)
box.Add(self.query, 0, wx.EXPAND)
box.Add(self.tagList, 3, wx.EXPAND)
+ queryPanel.SetSizerAndFit(box)
+
+ self.results = Results(self, model)
+
+ box = wx.BoxSizer(wx.HORIZONTAL)
+ box.Add(queryPanel, 1, wx.EXPAND)
+ box.Add(self.results, 3, wx.EXPAND)
self.SetSizerAndFit(box)
+ #box = wx.BoxSizer(wx.VERTICAL)
+ #box.Add(self.query, 0, wx.EXPAND)
+ #box.Add(self.tagList, 3, wx.EXPAND)
+ #self.SetSizerAndFit(box)
+
+ #gbs = wx.GridBagSizer()
+ #gbs.Add(self.query, (0, 0), (1, 1))
+ #gbs.Add(self.tagList, (1, 0), (1, 1), flag=wx.EXPAND)
+ #gbs.Add(self.results, (0, 1), (2, 1), flag=wx.EXPAND)
+ #gbs.AddGrowableCol(0)
+ #gbs.AddGrowableCol(1)
+ #gbs.AddGrowableRow(1)
+ #self.SetSizerAndFit(gbs)
+
self.timedUpdater = None
+ def wantedEvent(self, event):
+ if event.GetId() == TagList.ACTION_ADD_WANTED:
+ item = self.tagList.getClickedItem()
+ self.model.addWanted(item)
+ elif event.GetId() == TagList.ACTION_ADD_UNWANTED:
+ item = self.tagList.getClickedItem()
+ self.model.addUnwanted(item)
+ else:
+ print "Unknown event", event.GetId()
+
def queryReallyChanged(self):
self.model.setQuery(self.query.GetValue())
@@ -167,18 +321,6 @@
self.computeInteresting(query)
- def tagMatch(self, pkg):
- tags = self.fullcoll.tagsOfPackage(pkg)
- if len(self.wanted) > 0 and not self.wanted.issubset(tags):
- return False
- if len(self.unwanted) > 0 and len(tags.intersection(self.unwanted)) > 0:
- return False
- return True
-
- def refilter(self):
- # Regenerate subcoll
- self.subcoll = self.fullcoll.filterPackages(self.tagMatch)
-
def showSet(self, tags, type):
for tag in tags:
self.tagsInMenu.append(tag)
More information about the Debtags-commits
mailing list