372
374
for i, entry in enumerate(feed.entries[:5]):
373
375
image = gtk.Image()
375
button = gtk.Button(shortify(entry['title']))
377
button = gtk.Button('')
378
button.child.set_text(classes.safify(shortify(entry['title'])))
379
button.child.set_use_underline(False)
376
380
button.set_relief(gtk.RELIEF_NONE)
377
381
if len(entry['title']) > 25:
378
382
button.set_tooltip_text(entry['title'])
379
383
button.connect('clicked', self.feed_item_clicked, (feed, i))
380
button.set_use_underline(False)
383
386
if entry['new'] == True:
384
387
classes.boldify(button, True)
457
465
for entry in feed.entries:
458
466
if entry['notify'] == True:
459
467
notify_entries.append(entry)
470
if len(notify_entries) == 0:
461
473
if feed.num_notify == 1:
462
474
msg += "%s\n <a href=\"%s\">%s</a>\n" % (shortify(feed.title),
478
490
feed.num_notify = 0
480
pynotify.init(_("Feeds Applet"))
481
notification = pynotify.Notification(_("%s New Item%s - Feeds Applet") % \
482
(self.num_notify_while_updating, ['', 's'][self.num_notify_while_updating != 1]),
483
msg, [icon_path, greader_path][only_greader])
484
notification.set_timeout(5000)
492
if num_messages != 0:
493
pynotify.init(_("Feeds Applet"))
494
s = gettext.ngettext("%s New Item - Feeds Applet", "%s New Items - Feeds Applet",
495
self.num_notify_while_updating) % self.num_notify_while_updating
496
notification = pynotify.Notification(s, msg,
497
[icon_path, greader_path][only_greader])
498
notification.set_timeout(5000)
487
501
#Set up initial widgets, frame for each feed
488
502
def setup_dialog(self):
594
608
toggle.web = button
595
609
toggle.position = i
610
toggle.placeholder = None
597
611
toggle.size_group = None
599
613
#Drag and Drop to reorder
600
#or drop an e.g. a web browser to go to that feeds' url
614
#or drop an e.g. a web browser to go to that feed's url
601
615
toggle.drag_source_set(gtk.gdk.BUTTON1_MASK, \
602
616
[("text/plain", 0, 0), ("STRING", 0, 0)], \
603
617
gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
637
651
toggle.web.hide()
638
toggle.label = gtk.Label(' ')
652
toggle.placeholder = classes.PlaceHolder()
639
653
toggle.size_group = gtk.SizeGroup(gtk.SIZE_GROUP_BOTH)
640
654
toggle.size_group.add_widget(other_toggle.parent)
641
toggle.size_group.add_widget(toggle.label)
642
toggle.parent.pack_start(toggle.label)
655
toggle.size_group.add_widget(toggle.placeholder)
656
toggle.parent.pack_start(toggle.placeholder)
657
toggle.placeholder.show()
645
659
self.dragged_toggle = toggle
783
797
if open_toggle is None:
800
show_only_new = self.client.get_value(GROUP_DEFAULT, 'show_only_new')
786
802
toggle_index = self.toggles.index(open_toggle)
787
803
if event.direction in (gtk.gdk.SCROLL_UP, gtk.gdk.SCROLL_LEFT):
788
if toggle_index != 0:
789
self.toggles[toggle_index - 1].set_active(True)
805
while toggle_index != 0:
806
if self.feeds[self.urls[toggle_index - 1]].num_new != 0:
807
self.toggles[toggle_index - 1].set_active(True)
814
if toggle_index != 0:
815
self.toggles[toggle_index - 1].set_active(True)
792
if open_toggle != self.toggles[-1]:
793
self.toggles[toggle_index + 1].set_active(True)
819
while toggle_index + 1 != len(self.toggles):
820
if self.feeds[self.urls[toggle_index + 1]].num_new != 0:
821
self.toggles[toggle_index + 1].set_active(True)
828
if open_toggle != self.toggles[-1]:
829
self.toggles[toggle_index + 1].set_active(True)
816
852
if feed.num_new == 0:
817
853
classes.deboldify(self.feed_labels[feed.url])
855
self.show_only_new(feed.url)
819
857
self.open_url(None, feed.entries[i]['url'])
821
859
feed.item_clicked(i)
861
if isinstance(feed, classes.StandardNew):
862
if feed.entries[i].basic() in feed.last_new:
863
feed.last_new.remove(feed.entries[i].basic())
823
865
if feed.num_new == 0:
824
866
self.do_favicons()
990
1032
#Create the items
991
1033
add_feed = awn.image_menu_item_new_with_label(_("Add Feed"))
992
1034
update = gtk.ImageMenuItem(gtk.STOCK_REFRESH)
1035
self.show_only_new_check = gtk.CheckMenuItem(_("Show Only _New Feeds"))
993
1036
sep = gtk.SeparatorMenuItem()
994
1037
prefs_item = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
995
1038
about = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
998
1041
add_icon = gtk.image_new_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_MENU)
999
1042
add_feed.set_image(add_icon)
1044
if self.client.get_value(GROUP_DEFAULT, 'show_only_new'):
1045
self.show_only_new_check.set_active(True)
1001
1047
add_feed.connect('activate', self.add_feed_dialog)
1002
1048
update.connect('activate', self.update_feeds)
1049
self.show_only_new_check.connect('toggled', self.toggle_show_only_new)
1003
1050
prefs_item.connect('activate', self.open_prefs)
1004
1051
about.connect('activate', self.show_about)
1006
1053
#Create the menu
1007
1054
self.menu = self.create_default_menu()
1008
self.menu.append(add_feed)
1009
self.menu.append(update)
1010
self.menu.append(sep)
1011
self.menu.append(prefs_item)
1012
self.menu.append(about)
1055
for item in (add_feed, update, self.show_only_new_check, sep, prefs_item, about):
1056
self.menu.append(item)
1014
1058
self.menu.show_all()
1015
1059
self.menu.popup(None, None, None, event.button, event.time)
1061
def toggle_show_only_new(self, item):
1062
self.client.set_value(GROUP_DEFAULT, "show_only_new", item.get_active())
1064
if self.prefs_dialog:
1065
if self.prefs_dialog.show_only_new_check is not None:
1066
self.prefs_dialog.show_only_new_check.set_active(item.get_active())
1069
self.show_only_new()
1072
self.show_only_new()
1074
def show_only_new(self, url=None):
1075
if self.client.get_value(GROUP_DEFAULT, "show_only_new"):
1077
if self.feeds[url].num_new == 0:
1078
self.feed_toggles[url].parent.parent.hide()
1081
self.feed_toggles[url].parent.parent.show()
1084
for url, widget in self.feed_toggles.items():
1085
if self.feeds[url].num_new == 0:
1086
widget.parent.parent.hide()
1089
widget.parent.parent.show()
1092
for widget in self.feed_toggles.values():
1093
widget.parent.parent.show()
1017
1095
#Show the preferences window
1018
1096
def open_prefs(self, widget):
1019
1097
if not self.prefs_dialog:
1079
1157
dialog = gtk.Dialog(_("OPML Import"), None, gtk.DIALOG_NO_SEPARATOR, \
1080
1158
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
1083
message = _("Do you want to add this feed?")
1086
message = _("Do you want to add these %s feeds?") % len(urls)
1160
message = gettext.ngettext("Do you want to add %d feed?",
1161
"Do you want to add %d feeds?", len(urls)) % len(urls)
1088
1163
dialog.get_content_area().pack_start(gtk.Label(message))
1213
def post_data(self, uri, data=None, timeout=60, server_headers=False, opener=None):
1288
def post_data(self, uri, headers={}, data=None, timeout=60, server_headers=False, opener=None):
1215
1290
req = urllib2.Request(uri, data)
1291
for key, val in headers.items():
1292
req.add_header(key, val)
1216
1293
req.add_header('HTTP_USER_AGENT', user_agent)
1218
1295
if opener is None: