3 Provides a container for handling the feeds
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
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. """
28 class FeedList(list, Event
.SignalEmitter
):
29 def __init__(self
, init_seq
= []):
30 Event
.SignalEmitter
.__init
__(self
)
31 self
.initialize_slots(Event
.FeedsChangedSignal
,
32 Event
.FeedDeletedSignal
,
33 Event
.FeedCreatedSignal
,
34 Event
.AllItemsReadSignal
,
36 Event
.ItemsAddedSignal
,
37 Event
.FeedPolledSignal
,
38 Event
.FeedStatusChangedSignal
,
39 Event
.FeedErrorStatusChangedSignal
,
40 Event
.FeedsImportedSignal
,
41 Event
.FeedDetailChangedSignal
)
45 def _load(feeds
, parent
):
47 if isinstance(df
, list):
48 #fc = straw.FeedCategory()
50 #self.append(parent, fc)
53 f
= Feed
.Feed
.create_empty_feed()
55 self
.append(parent
, f
)
57 feeds
= Config
.get_instance().feeds
61 self
.emit_signal(Event
.FeedsChangedSignal(self
))
63 def _forward_signal(self
, signal
):
64 self
.emit_signal(signal
)
66 def connect_signals(self
, ob
):
67 #ob.signal_connect(Event.FeedsChangedSignal,
68 # self.feeds_changed, True)
69 ob
.signal_connect(Event
.FeedDetailChangedSignal
,
70 self
.feed_detail_changed
, True)
72 # these signals are forwarded so that listeners who just want to
73 # listen for a specific event regardless of what feed it came from can
74 # just connect to this feedlist instead of connecting to the
76 ob
.signal_connect(Event
.AllItemsReadSignal
, self
._forward
_signal
)
77 ob
.signal_connect(Event
.ItemReadSignal
, self
._forward
_signal
)
78 ob
.signal_connect(Event
.ItemsAddedSignal
, self
._forward
_signal
)
79 ob
.signal_connect(Event
.FeedPolledSignal
, self
._forward
_signal
)
80 ob
.signal_connect(Event
.FeedStatusChangedSignal
, self
._forward
_signal
)
81 ob
.signal_connect(Event
.FeedErrorStatusChangedSignal
, self
._forward
_signal
)
83 def __setitem__(self
, key
, value
):
84 list.__setitem
__(self
, key
, value
)
85 self
.connect_signals(value
)
86 self
.save_feeds_and_notify(True)
88 def extend(self
, parent
, values
, from_sub
=False):
89 list.extend(self
, values
)
92 self
.connect_signals(f
)
93 self
.save_feeds_and_notify(
94 True, signal
=Event
.FeedsImportedSignal(self
, values
, parent
, from_sub
))
96 def append(self
, parent
, value
):
97 list.append(self
, value
)
99 self
.connect_signals(value
)
100 self
.save_feeds_and_notify(
101 True, signal
=Event
.FeedCreatedSignal(self
, value
, parent
))
103 def insert(self
, index
, parent
, value
):
104 list.insert(self
, index
, value
)
105 value
.parent
= parent
106 self
.connect_signals(value
)
107 self
.save_feeds_and_notify(
108 True, signal
=Event
.FeedCreatedSignal(self
, value
, parent
, index
))
110 def index(self
, feed
):
111 return list.index(self
, feed
)
113 def reorder(self
, move
, delta
):
119 if move
[0] == 0 and delta
< 0 or move
[-1] == (len(self
) - 1) and delta
> 0:
122 k
[m
+ delta
], k
[m
] = k
[m
], k
[m
+ delta
]
123 for i
in range(len(k
)):
124 list.__setitem
__(self
, i
, k
[i
])
125 self
.save_feeds_and_notify(True)
127 def __delitem__(self
, value
):
129 list.__delitem
__(self
, value
)
130 feed
.delete_all_items()
131 self
.save_feeds_and_notify(
132 True, signal
=Event
.FeedDeletedSignal(self
, feed
))
134 def save_feeds_and_notify(self
, notify
, signal
=None):
135 if not self
._loading
:
136 config
= Config
.get_instance()
137 config
.feeds
= [f
.dump() for f
in self
]
140 signal
= Event
.FeedsChangedSignal(self
)
141 self
.emit_signal(signal
)
144 def feeds_changed(self
, signal
, notify
):
145 self
.save_feeds_and_notify(notify
, signal
)
147 def feed_detail_changed(self
, signal
, notify
):
148 self
.save_feeds_and_notify(notify
, signal
)
150 def _sort_dsu(self
, seq
):
151 aux_list
= [(x
.title
, x
) for x
in seq
]
152 aux_list
.sort(lambda a
,b
:locale
.strcoll(a
[0],b
[0]))
153 return [x
[1] for x
in aux_list
]
155 def sort(self
, indices
= None):
156 if not indices
or len(indices
) == 1:
157 self
[:] = self
._sort
_dsu
(self
)
159 items
= self
._sort
_dsu
(indices
)
160 for i
,x
in enumerate(items
):
161 list.__setitem
__(self
, indices
[i
], items
[i
])
162 self
.save_feeds_and_notify(True)
170 def get_feed_with_id(self
, id):
171 for f
in self
.flatten_list():
176 def flatten_list(self
, ob
=None):
181 if isinstance(o
, list):
182 l
= l
+ self
.flatten_list(o
)
187 feedlist_instance
= None
190 global feedlist_instance
191 if feedlist_instance
is None:
192 feedlist_instance
= FeedList()
193 return feedlist_instance