[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