pre gobject: 3-pane view, callgraph, feed navigation
[straw.git] / src / lib / QueueDict.py
blob693c688acbdd8e962f043f8e0151e4e51fa3a6fd
1 """ QueueDict.py
3 Sorted container of SummaryItems
4 """
5 __copyright__ = "Copyright (c) 2002-2005 Free Software Foundation, Inc."
6 __license__ = """GNU General Public License
8 This program is free software; you can redistribute it and/or modify it under the
9 terms of the GNU General Public License as published by the Free Software
10 Foundation; either version 2 of the License, or (at your option) any later
11 version.
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License along with
18 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 Place - Suite 330, Boston, MA 02111-1307, USA. """
21 from bisect import insort
23 class ItemQueue(dict):
24 def __init__(self):
25 dict.__init__(self)
26 self._reverse = 0
27 self._keys = list()
29 def __delitem__(self, key):
30 try:
31 self._keys.remove(key)
32 dict.__delitem__(self, key)
33 except KeyError:
34 raise "FeedQD: No Such Key %d" % key
36 def __iter__(self):
37 return self.iteritems()
39 def __contains__(self, item):
40 return item in self.itervalues()
42 def __setitem__(self, key, value):
43 self.append(value)
45 def _set_reverse(self, reverse):
46 self._reverse = reverse
48 def _get_reverse(self):
49 return self._reverse
51 sort_order = property(_get_reverse, _set_reverse)
53 def append(self, item):
54 if item.id not in self._keys:
55 insort(self._keys, item.id)
56 dict.__setitem__(self, item.id, item)
58 def replace(self, item):
59 self.append(item)
60 k = self.keys()
61 item = None
62 for iid in reversed(k):
63 item = self[iid]
64 if item.sticky:
65 continue
66 else:
67 del self[iid]
68 break
69 return item
71 def clear(self):
72 dict.clear(self)
73 del self._keys[:]
75 def keys(self):
76 if self._reverse:
77 return sorted(self._keys, reverse=True)
78 return self._keys
80 def values(self):
81 return map(self.get, self.keys())
83 def iteritems(self):
84 def sorteditems():
85 for k in self.keys():
86 yield (k, self[k])
87 return sorteditems()
89 def iterkeys(self):
90 def sortedkeys():
91 for k in self.keys():
92 yield k
93 return sortedkeys()
95 def itervalues(self):
96 def sortedvalues():
97 for k in self.keys():
98 yield self[k]
99 return sortedvalues()
101 def items(self):
102 return [item for item in self.iteritems()]
104 def index(self, key):
105 try:
106 idx = self.keys().index(key)
107 except (IndexError, ValueError):
108 idx = None
109 return idx