Adding bug/todo
[watersofshiloah] / src / banners.py
1 import sys
2 import logging
3
4 import gtk
5
6 import util.misc as misc_utils
7
8
9 _moduleLogger = logging.getLogger(__name__)
10
11
12 class GenericBanner(object):
13
14         def __init__(self):
15                 self._indicator = gtk.Image()
16
17                 self._label = gtk.Label()
18
19                 self._layout = gtk.HBox()
20                 self._layout.pack_start(self._indicator, False, False)
21                 self._layout.pack_start(self._label, False, True)
22
23         @property
24         def toplevel(self):
25                 return self._layout
26
27         def show(self, icon, message):
28                 assert not self._label.get_text(), self._label.get_text()
29                 if isinstance(icon, gtk.gdk.PixbufAnimation):
30                         self._indicator.set_from_animation(icon)
31                 elif isinstance(icon, gtk.gdk.Pixbuf):
32                         self._indicator.set_from_pixbuf(icon)
33                 else:
34                         self._indicator.set_from_stock(icon)
35                 self._label.set_text(message)
36                 self.toplevel.show()
37
38         def hide(self):
39                 assert self._label.get_text(), self._label.get_text()
40                 self._label.set_text("")
41                 self.toplevel.hide()
42
43
44 class StackingBanner(object):
45
46         ICON_SIZE = 32
47
48         def __init__(self):
49                 self._indicator = gtk.Image()
50
51                 self._message = gtk.Label()
52
53                 self._closeImage = gtk.Image()
54                 self._closeImage.set_from_stock("gtk-close", self.ICON_SIZE)
55
56                 self._layout = gtk.HBox()
57                 self._layout.pack_start(self._indicator, False, False)
58                 self._layout.pack_start(self._message, True, True)
59                 self._layout.pack_start(self._closeImage, False, False)
60
61                 self._events = gtk.EventBox()
62                 self._events.add(self._layout)
63                 self._events.connect("button_release_event", self._on_close)
64
65                 self._messages = []
66
67         @property
68         def toplevel(self):
69                 return self._events
70
71         def push_message(self, message, icon=""):
72                 self._messages.append((message, icon))
73                 if 1 == len(self._messages):
74                         self._update_message()
75
76         def push_exception(self):
77                 userMessage = str(sys.exc_info()[1])
78                 self.push_message(userMessage, "gtk-dialog-error")
79                 _moduleLogger.exception(userMessage)
80
81         def pop_message(self):
82                 del self._messages[0]
83                 self._update_message()
84
85         def _update_message(self):
86                 if 0 == len(self._messages):
87                         self.toplevel.hide()
88                 else:
89                         message, icon = self._messages[0]
90                         self._message.set_text(message)
91                         if icon:
92                                 self._indicator.set_from_stock(icon)
93                                 self._indicator.show()
94                         else:
95                                 self._indicator.hide()
96                         self.toplevel.show()
97
98         @misc_utils.log_exception(_moduleLogger)
99         def _on_close(self, *args):
100                 self.pop_message()