~ubuntu-branches/ubuntu/maverick/awn-extras-applets/maverick

« back to all changes in this revision

Viewing changes to applets/maintained/feeds/feeds.py

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne
  • Date: 2010-08-29 14:29:52 UTC
  • mto: This revision was merged to the branch mainline in revision 21.
  • Revision ID: james.westby@ubuntu.com-20100829142952-rhvuetyms9bv5uu7
Tags: upstream-0.4.0+bzr1372
ImportĀ upstreamĀ versionĀ 0.4.0+bzr1372

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
import gtk
31
31
import pango
32
32
import gobject
 
33
import gettext
33
34
 
34
35
from desktopagnostic.config import GROUP_DEFAULT
35
36
import awn
81
82
    keyring = None
82
83
    dragged_toggle = None
83
84
    prefs_dialog = None
 
85
    show_only_new_check = None
84
86
    urls = []
85
87
    written_urls = []
86
88
    num_notify_while_updating = 0
372
374
            for i, entry in enumerate(feed.entries[:5]):
373
375
                image = gtk.Image()
374
376
 
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)
381
 
                button.show()
 
384
                button.show_all()
382
385
 
383
386
                if entry['new'] == True:
384
387
                    classes.boldify(button, True)
400
403
        if self.prefs_dialog:
401
404
            self.prefs_dialog.update_liststore()
402
405
 
 
406
        self.show_only_new(feed.url)
 
407
 
403
408
    def all_feeds_updated(self):
404
409
        self.set_tooltip_text(_("Feeds Applet"))
405
410
        self.loading_feeds.hide()
415
420
 
416
421
        self.do_favicons()
417
422
 
 
423
        self.show_only_new()
 
424
 
418
425
    def do_favicons(self, override=False):
419
426
        for icon in [self.error_icon, self.favicon1, self.favicon2, self.favicon3]:
420
427
            icon.props.active = False
447
454
 
448
455
        msg = ''
449
456
        only_greader = True
 
457
        num_messages = 0
450
458
        if self.num_notify_while_updating != 0:
451
459
            for url, feed in self.feeds.items():
452
460
                if not isinstance(feed, classes.GoogleReader):
457
465
                for entry in feed.entries:
458
466
                    if entry['notify'] == True:
459
467
                        notify_entries.append(entry)
 
468
                        num_messages += 1
 
469
 
 
470
                if len(notify_entries) == 0:
 
471
                    continue
460
472
 
461
473
                if feed.num_notify == 1:
462
474
                    msg += "%s\n  <a href=\"%s\">%s</a>\n" % (shortify(feed.title),
477
489
 
478
490
                feed.num_notify = 0
479
491
 
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)
485
 
            notification.show()
 
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)
 
499
                notification.show()
486
500
 
487
501
    #Set up initial widgets, frame for each feed
488
502
    def setup_dialog(self):
593
607
        toggle.url = url
594
608
        toggle.web = button
595
609
        toggle.position = i
596
 
        toggle.label = None
 
610
        toggle.placeholder = None
597
611
        toggle.size_group = None
598
612
 
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)
635
649
 
636
650
            toggle.hide()
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)
643
 
            toggle.label.show()
 
655
            toggle.size_group.add_widget(toggle.placeholder)
 
656
            toggle.parent.pack_start(toggle.placeholder)
 
657
            toggle.placeholder.show()
644
658
 
645
659
            self.dragged_toggle = toggle
646
660
 
650
664
 
651
665
    #When the toggle dragging is done
652
666
    def toggle_drag_end(self, toggle, context):
653
 
        if toggle.label:
654
 
            toggle.label.destroy()
 
667
        if toggle.placeholder:
 
668
            toggle.placeholder.destroy()
655
669
        if toggle.size_group:
656
670
            del toggle.size_group
657
671
        toggle.show()
783
797
        if open_toggle is None:
784
798
            return False
785
799
 
 
800
        show_only_new = self.client.get_value(GROUP_DEFAULT, 'show_only_new')
 
801
 
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)
 
804
            if show_only_new:
 
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)
 
808
                        break
 
809
 
 
810
                    else:
 
811
                        toggle_index -= 1
 
812
 
 
813
            else:
 
814
                if toggle_index != 0:
 
815
                    self.toggles[toggle_index - 1].set_active(True)
790
816
 
791
817
        else:
792
 
            if open_toggle != self.toggles[-1]:
793
 
                self.toggles[toggle_index + 1].set_active(True)
 
818
            if show_only_new:
 
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)
 
822
                        break
 
823
 
 
824
                    else:
 
825
                        toggle_index += 1
 
826
 
 
827
            else:
 
828
                if open_toggle != self.toggles[-1]:
 
829
                    self.toggles[toggle_index + 1].set_active(True)
794
830
 
795
831
        return False
796
832
 
816
852
                if feed.num_new == 0:
817
853
                    classes.deboldify(self.feed_labels[feed.url])
818
854
 
 
855
                    self.show_only_new(feed.url)
 
856
 
819
857
        self.open_url(None, feed.entries[i]['url'])
820
858
 
821
859
        feed.item_clicked(i)
822
860
 
 
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())
 
864
 
823
865
        if feed.num_new == 0:
824
866
            self.do_favicons()
825
867
 
970
1012
                self.dialog.hide()
971
1013
 
972
1014
            else:
973
 
                self.dialog.show_all()
 
1015
                self.dialog.show()
974
1016
 
975
1017
        elif event.button == 2:
976
1018
            if len(self.urls) > 0:
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)
1000
1043
 
 
1044
            if self.client.get_value(GROUP_DEFAULT, 'show_only_new'):
 
1045
                self.show_only_new_check.set_active(True)
 
1046
 
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)
1005
1052
 
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)
1013
1057
 
1014
1058
        self.menu.show_all()
1015
1059
        self.menu.popup(None, None, None, event.button, event.time)
1016
1060
 
 
1061
    def toggle_show_only_new(self, item):
 
1062
        self.client.set_value(GROUP_DEFAULT, "show_only_new", item.get_active())
 
1063
 
 
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())
 
1067
 
 
1068
            else:
 
1069
                self.show_only_new()
 
1070
 
 
1071
        else:
 
1072
            self.show_only_new()
 
1073
 
 
1074
    def show_only_new(self, url=None):
 
1075
        if self.client.get_value(GROUP_DEFAULT, "show_only_new"):
 
1076
            if url is not None:
 
1077
                if self.feeds[url].num_new == 0:
 
1078
                    self.feed_toggles[url].parent.parent.hide()
 
1079
 
 
1080
                else:
 
1081
                    self.feed_toggles[url].parent.parent.show()
 
1082
 
 
1083
            else:
 
1084
                for url, widget in self.feed_toggles.items():
 
1085
                    if self.feeds[url].num_new == 0:
 
1086
                        widget.parent.parent.hide()
 
1087
 
 
1088
                    else:
 
1089
                        widget.parent.parent.show()
 
1090
 
 
1091
        else:
 
1092
            for widget in self.feed_toggles.values():
 
1093
                widget.parent.parent.show()
 
1094
 
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))
1081
1159
 
1082
 
        if len(urls) == 0:
1083
 
            message = _("Do you want to add this feed?")
1084
 
 
1085
 
        else:
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)
1087
1162
 
1088
1163
        dialog.get_content_area().pack_start(gtk.Label(message))
1089
1164
 
1210
1285
                    return data
1211
1286
 
1212
1287
        @async_method
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):
1214
1289
            try:
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)
1217
1294
 
1218
1295
                if opener is None: