Mercurial > pidgin
comparison finch/libgnt/pygnt/example/rss/gntrss-ui.py @ 18681:ef15236a0866
A proof-of-conecpt RSS reader using pygnt.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 28 Jul 2007 11:30:54 +0000 |
parents | |
children | 254823d66aa5 |
comparison
equal
deleted
inserted
replaced
18680:fd01bac27b79 | 18681:ef15236a0866 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 # A very simple and stupid RSS reader | |
4 # | |
5 # Uses the Universal Feed Parser | |
6 # | |
7 | |
8 import gntrss | |
9 import gnt | |
10 import gobject | |
11 import sys | |
12 | |
13 __version__ = "0.0.1alpha" | |
14 __author__ = "Sadrul Habib Chowdhury (sadrul@pidgin.im)" | |
15 __copyright__ = "Copyright 2007, Sadrul Habib Chowdhury" | |
16 __license__ = "GPL" # see full license statement below | |
17 | |
18 gnt.gnt_init() | |
19 | |
20 class RssTree(gnt.Tree): | |
21 __gsignals__ = { | |
22 'active_changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_OBJECT,)), | |
23 'key_pressed' : 'override' | |
24 } | |
25 | |
26 def __init__(self): | |
27 self.active = None | |
28 gnt.Tree.__init__(self) | |
29 | |
30 def set_active(self, active): | |
31 if self.active == active: | |
32 return | |
33 if self.active: | |
34 self.set_row_flags(self.active, gnt.TEXT_FLAG_NORMAL) | |
35 old = self.active | |
36 self.active = active | |
37 self.set_row_flags(self.active, gnt.TEXT_FLAG_UNDERLINE) | |
38 self.emit('active_changed', old) | |
39 | |
40 def do_key_pressed(self, text): | |
41 if text == '\r': | |
42 now = self.get_selection_data() | |
43 self.set_active(now) | |
44 return True | |
45 return False | |
46 | |
47 gobject.type_register(RssTree) | |
48 | |
49 win = gnt.Box(homo = False, vert = True) | |
50 win.set_toplevel(True) | |
51 win.set_title("GntRss") | |
52 win.set_pad(0) | |
53 | |
54 # | |
55 # [[[ Generic feed/item callbacks | |
56 # | |
57 def feed_item_added(feed, item): | |
58 add_feed_item(item) | |
59 | |
60 def add_feed(feed): | |
61 if not feed.get_data('gntrss-connected'): | |
62 feed.connect('added', feed_item_added) | |
63 feed.connect('notify', update_feed_title) | |
64 feed.set_data('gntrss-connected', True) | |
65 feeds.add_row_after(feed, [feed.title, str(feed.unread)], None, None) | |
66 | |
67 def remove_item(item, feed): | |
68 items.remove(item) | |
69 | |
70 def update_feed_item(item, property): | |
71 if property.name == 'unread': | |
72 if feeds.active != item.parent: | |
73 return | |
74 if item.unread: | |
75 item.parent.unread = item.parent.unread + 1 | |
76 items.set_row_flags(item, gnt.TEXT_FLAG_BOLD) | |
77 else: | |
78 item.parent.unread = item.parent.unread - 1 | |
79 items.set_row_flags(item, gnt.TEXT_FLAG_NORMAL) | |
80 item.parent.notify('unread') | |
81 | |
82 def add_feed_item(item): | |
83 currentfeed = feeds.active | |
84 if item.parent != currentfeed: | |
85 return | |
86 items.add_row_after(item, [str(item.title)], None, None) | |
87 if item.unread: | |
88 items.set_row_flags(item, gnt.TEXT_FLAG_BOLD) | |
89 if not item.get_data('gntrss-connected'): | |
90 item.set_data('gntrss-connected', True) | |
91 item.connect('notify', update_feed_item) | |
92 item.connect('delete', remove_item) | |
93 | |
94 # | |
95 # ]]] Generic feed/item callbacks | |
96 # | |
97 | |
98 | |
99 #### | |
100 # [[[ The list of feeds | |
101 ### | |
102 | |
103 # | |
104 # The active row in the feed-list has changed. Update the feed-item table. | |
105 def feed_active_changed(tree, old): | |
106 items.remove_all() | |
107 if not tree.active: | |
108 return | |
109 for item in tree.active.items: | |
110 add_feed_item(item) | |
111 | |
112 # | |
113 # Check for the action keys and decide how to deal with them. | |
114 def feed_key_pressed(tree, text): | |
115 if text == 'r': | |
116 feed = tree.get_selection_data() | |
117 tree.perform_action_key('j') | |
118 #tree.perform_action('move-down') | |
119 feed.refresh() | |
120 elif text == 'R': | |
121 feeds = tree.get_rows() | |
122 for feed in feeds: | |
123 feed.refresh() | |
124 else: | |
125 return False | |
126 return True | |
127 | |
128 feeds = RssTree() | |
129 feeds.set_property('columns', 2) | |
130 feeds.set_col_width(0, 20) | |
131 feeds.set_col_width(1, 4) | |
132 feeds.set_column_resizable(0, False) | |
133 feeds.set_column_resizable(1, False) | |
134 feeds.set_column_is_right_aligned(1, True) | |
135 feeds.set_show_separator(False) | |
136 | |
137 feeds.connect('active_changed', feed_active_changed) | |
138 feeds.connect('key_pressed', feed_key_pressed) | |
139 | |
140 #### | |
141 # ]]] The list of feeds | |
142 ### | |
143 | |
144 #### | |
145 # [[[ The list of items in the feed | |
146 #### | |
147 | |
148 # | |
149 # The active item in the feed-item list has changed. Update the | |
150 # summary content. | |
151 def item_active_changed(tree, old): | |
152 details.clear() | |
153 if not tree.active: | |
154 return | |
155 item = tree.active | |
156 details.append_text_with_flags(str(item.title) + "\n", gnt.TEXT_FLAG_BOLD) | |
157 details.append_text_with_flags(str(item.summary), gnt.TEXT_FLAG_NORMAL) | |
158 details.scroll(0) | |
159 if item.unread: | |
160 item.set_property('unread', False) | |
161 win.give_focus_to_child(browser) | |
162 | |
163 # | |
164 # Look for action keys in the feed-item list. | |
165 def item_key_pressed(tree, text): | |
166 current = tree.get_selection_data() | |
167 if text == 'M': # Mark all of the items 'read' | |
168 all = tree.get_rows() | |
169 for item in all: | |
170 item.unread = False | |
171 elif text == 'm': # Mark the current item 'read' | |
172 if current.unread: | |
173 current.set_property('unread', False) | |
174 elif text == 'U': # Mark the current item 'unread' | |
175 if not current.unread: | |
176 current.set_property('unread', True) | |
177 else: | |
178 return False | |
179 return True | |
180 | |
181 items = RssTree() | |
182 items.set_property('columns', 1) | |
183 items.set_col_width(0, 40) | |
184 items.connect('key_pressed', item_key_pressed) | |
185 items.connect('active_changed', item_active_changed) | |
186 | |
187 #### | |
188 # ]]] The list of items in the feed | |
189 #### | |
190 | |
191 # The container on the top | |
192 box = gnt.Box(homo = False, vert = False) | |
193 box.set_pad(0) | |
194 box.add_widget(feeds) | |
195 box.add_widget(items) | |
196 | |
197 win.add_widget(box) | |
198 | |
199 win.add_widget(gnt.Line(vertical = False)) | |
200 | |
201 # The textview to show the details of a feed | |
202 details = gnt.TextView() | |
203 | |
204 win.add_widget(details) | |
205 | |
206 browser = gnt.Button("Open in Browser") | |
207 win.add_widget(browser) | |
208 details.attach_scroll_widget(browser) | |
209 | |
210 win.show() | |
211 | |
212 def update_feed_title(feed, property): | |
213 if property.name == 'title': | |
214 feeds.change_text(feed, 0, feed.title) | |
215 elif property.name == 'unread': | |
216 feeds.change_text(feed, 1, str(feed.unread)) | |
217 | |
218 # populate everything | |
219 for feed in gntrss.feeds: | |
220 add_feed(feed) | |
221 | |
222 gnt.gnt_main() | |
223 | |
224 gnt.gnt_quit() | |
225 |