| 1 | '''atom_window.py - a window to display atom entries from pubsub. For now greatly simplified, |
|---|
| 2 | supports only simple feeds like the one from pubsub.com. ''' |
|---|
| 3 | |
|---|
| 4 | import gtk |
|---|
| 5 | import gtk.gdk |
|---|
| 6 | |
|---|
| 7 | import gtkgui_helpers |
|---|
| 8 | from common import helpers |
|---|
| 9 | |
|---|
| 10 | class AtomWindow: |
|---|
| 11 | window = None |
|---|
| 12 | entries = [] |
|---|
| 13 | |
|---|
| 14 | @classmethod # python2.4 decorator |
|---|
| 15 | def newAtomEntry(cls, entry): |
|---|
| 16 | ''' Queue new entry, open window if there's no one opened. ''' |
|---|
| 17 | cls.entries.append(entry) |
|---|
| 18 | |
|---|
| 19 | if cls.window is None: |
|---|
| 20 | cls.window = AtomWindow() |
|---|
| 21 | else: |
|---|
| 22 | cls.window.updateCounter() |
|---|
| 23 | |
|---|
| 24 | def __init__(self): |
|---|
| 25 | ''' Create new window... only if we have anything to show. ''' |
|---|
| 26 | assert len(self.__class__.entries)>0 |
|---|
| 27 | |
|---|
| 28 | self.entry = None # the entry actually displayed |
|---|
| 29 | |
|---|
| 30 | self.xml = gtkgui_helpers.get_glade('atom_entry_window.glade') |
|---|
| 31 | self.window = self.xml.get_widget('atom_entry_window') |
|---|
| 32 | for name in ('new_entry_label', 'feed_title_label', 'feed_title_eventbox', |
|---|
| 33 | 'feed_tagline_label', 'entry_title_label', 'entry_title_eventbox', |
|---|
| 34 | 'last_modified_label', 'close_button', 'next_button'): |
|---|
| 35 | self.__dict__[name] = self.xml.get_widget(name) |
|---|
| 36 | |
|---|
| 37 | self.displayNextEntry() |
|---|
| 38 | |
|---|
| 39 | self.xml.signal_autoconnect(self) |
|---|
| 40 | self.window.show_all() |
|---|
| 41 | |
|---|
| 42 | self.entry_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) |
|---|
| 43 | self.feed_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) |
|---|
| 44 | |
|---|
| 45 | def displayNextEntry(self): |
|---|
| 46 | ''' Get next entry from the queue and display it in the window. ''' |
|---|
| 47 | assert len(self.__class__.entries)>0 |
|---|
| 48 | |
|---|
| 49 | newentry = self.__class__.entries.pop(0) |
|---|
| 50 | |
|---|
| 51 | # fill the fields |
|---|
| 52 | if newentry.feed_link is not None: |
|---|
| 53 | self.feed_title_label.set_markup( |
|---|
| 54 | u'<span foreground="blue" underline="single">%s</span>' % \ |
|---|
| 55 | gtkgui_helpers.escape_for_pango_markup(newentry.feed_title)) |
|---|
| 56 | else: |
|---|
| 57 | self.feed_title_label.set_markup( |
|---|
| 58 | gtkgui_helpers.escape_for_pango_markup(newentry.feed_title)) |
|---|
| 59 | |
|---|
| 60 | self.feed_tagline_label.set_markup( |
|---|
| 61 | u'<small>%s</small>' % \ |
|---|
| 62 | gtkgui_helpers.escape_for_pango_markup(newentry.feed_tagline)) |
|---|
| 63 | |
|---|
| 64 | if newentry.uri is not None: |
|---|
| 65 | self.entry_title_label.set_markup( |
|---|
| 66 | u'<span foreground="blue" underline="single">%s</span>' % \ |
|---|
| 67 | gtkgui_helpers.escape_for_pango_markup(newentry.title)) |
|---|
| 68 | else: |
|---|
| 69 | self.entry_title_label.set_markup( |
|---|
| 70 | gtkgui_helpers.escape_for_pango_markup(newentry.title)) |
|---|
| 71 | |
|---|
| 72 | self.last_modified_label.set_text(newentry.updated) |
|---|
| 73 | |
|---|
| 74 | # update the counters |
|---|
| 75 | self.updateCounter() |
|---|
| 76 | |
|---|
| 77 | self.entry = newentry |
|---|
| 78 | |
|---|
| 79 | def updateCounter(self): |
|---|
| 80 | ''' We display number of events on the top of window, sometimes it needs to be |
|---|
| 81 | changed...''' |
|---|
| 82 | count = len(self.__class__.entries) |
|---|
| 83 | # TODO: translate |
|---|
| 84 | if count>0: |
|---|
| 85 | self.new_entry_label.set_text( \ |
|---|
| 86 | 'You have received new entries (and %(count)d not displayed):' % \ |
|---|
| 87 | {'count': count}) |
|---|
| 88 | self.next_button.set_sensitive(True) |
|---|
| 89 | else: |
|---|
| 90 | self.new_entry_label.set_text('You have received new entry:') |
|---|
| 91 | self.next_button.set_sensitive(False) |
|---|
| 92 | |
|---|
| 93 | def on_close_button_clicked(self, widget): |
|---|
| 94 | self.window.destroy() |
|---|
| 95 | |
|---|
| 96 | def on_next_button_clicked(self, widget): |
|---|
| 97 | self.displayNextEntry() |
|---|
| 98 | |
|---|
| 99 | def on_entry_title_button_press_event(self, widget, event): |
|---|
| 100 | # TODO: make it using special gtk2.10 widget |
|---|
| 101 | if event.button == 1: # left click |
|---|
| 102 | uri = self.entry.uri |
|---|
| 103 | if uri is not None: |
|---|
| 104 | helpers.launch_browser_mailer('url', uri) |
|---|
| 105 | return True |
|---|
| 106 | |
|---|
| 107 | def on_feed_title_button_press_event(self, widget, event): |
|---|
| 108 | # TODO: make it using special gtk2.10 widget |
|---|
| 109 | if event.button == 1: # left click |
|---|
| 110 | uri = self.entry.feed_uri |
|---|
| 111 | if uri is not None: |
|---|
| 112 | helpers.launch_browser_mailer('url', uri) |
|---|
| 113 | return True |
|---|