root/branches/gajim_0.11/src/atom_window.py

Revision 7475, 3.4 kB (checked in by asterix, 22 months ago)

merge ad_hoc branch. so we now have ad hoc commands and pubsub (atom). A great thanks to Tomasz Melcer (liorithiel) and Google Summer Of Code. fixes #189

Line 
1'''atom_window.py - a window to display atom entries from pubsub. For now greatly simplified,
2supports only simple feeds like the one from pubsub.com. '''
3
4import gtk
5import gtk.gdk
6
7import gtkgui_helpers
8from common import helpers
9
10class 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
Note: See TracBrowser for help on using the browser.