~jconti/recent-notifications/trunk

27 by Jason Conti
Refactored to move the class definitions out of applet.py.
1
"""
2
RecentNotificationsApplet.py
3
by Jason Conti
4
February 19, 2010
5
6
Applet for viewing recent notifications.
7
"""
8
9
import gtk
10
import os.path
11
12
from About import show_about
13
from MessageWindow import MessageWindow
14
from Notifications import Notifications
15
16
class RecentNotificationsApplet(object):
17
  """The main applet wrapper."""
18
  def __init__(self, applet, iid):
19
    self._applet = applet
20
21
    self._unread_messages = 0
22
23
    self._button = gtk.ToggleButton("No Unread Messages")
24
    self._button.connect("button_press_event", self.do_not_eat_button_press)
25
    self._button.connect("toggled", self.on_button_toggled)
26
    self._applet.add(self._button)
27
28
    self._applet.setup_menu("""
29
      <popup name="button3">
30
        <menuitem name="About" verb="About" _label="_About" pixtype="stock" pixname="gtk-about"/>
31
      </popup>
32
      """, [
33
      ("About", lambda a, b: self.on_show_about(a))
34
      ])
35
36
    self._window = MessageWindow()
37
38
    self._applet.connect("destroy", self.on_applet_destroyed)
39
    self._applet.show_all()
40
41
    self._notify = Notifications(os.path.expanduser("~/.cache/notify-osd.log"))
42
    self._notify.add_listener(self.on_messages_received)
43
    self._notify.start()
44
45
  def get_orient(self):
46
    return self._applet.get_orient()
47
48
  def get_origin(self):
49
    return self._button.get_window().get_origin()
50
51
  def get_screen(self):
52
    return self._button.get_window().get_screen()
53
54
  def get_size(self):
55
    return self._button.get_window().get_size()
56
57
  def update_unread_messages(self):
58
    if self._unread_messages == 0:
59
      label = "No Unread Messages"
60
    elif self._unread_messages == 1:
61
      label = "1 Unread Message"
62
    else:
63
      label = str(self._unread_messages) + " Unread Messages"
64
65
    self._button.set_label(label)
66
67
  # Callbacks
68
69
  def do_not_eat_button_press(self, widget, event):
70
    """Adapted from the GNOME clock applet."""
71
    if event.button != 1:
72
      widget.stop_emission("button_press_event")
73
74
    return False
75
76
  def on_applet_destroyed(self, *args):
77
    self._notify.stop()
78
79
  def on_button_toggled(self, button, *args):
80
    if button.get_active():
81
      self._window.show_all()
82
      self._window.align_with_applet(self)
83
    else:
84
      self._window.hide_all()
85
      self._unread_messages = 0
86
      self.update_unread_messages()
87
88
  def on_messages_received(self, messages):
89
    self._window.add_messages(messages)
90
    self._unread_messages += len(messages)
91
    self.update_unread_messages()
92
93
  def on_show_about(self, *args):
94
    show_about(self)
95