Fixing sizing of
[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                 self._label.set_text("")
40                 self.toplevel.hide()
41
42
43 class StackingBanner(object):
44
45         ICON_SIZE = 32
46
47         def __init__(self):
48                 self._indicator = gtk.Image()
49
50                 self._message = gtk.Label()
51
52                 self._closeImage = gtk.Image()
53                 self._closeImage.set_from_stock("gtk-close", self.ICON_SIZE)
54
55                 self._layout = gtk.HBox()
56                 self._layout.pack_start(self._indicator, False, False)
57                 self._layout.pack_start(self._message, True, True)
58                 self._layout.pack_start(self._closeImage, False, False)
59
60                 self._events = gtk.EventBox()
61                 self._events.add(self._layout)
62                 self._events.connect("button_release_event", self._on_close)
63
64                 self._messages = []
65
66         @property
67         def toplevel(self):
68                 return self._events
69
70         def push_message(self, message, icon=""):
71                 self._messages.append((message, icon))
72                 if 1 == len(self._messages):
73                         self._update_message()
74
75         def push_exception(self):
76                 userMessage = str(sys.exc_info()[1])
77                 self.push_message(userMessage, "gtk-dialog-error")
78                 _moduleLogger.exception(userMessage)
79
80         def pop_message(self):
81                 del self._messages[0]
82                 self._update_message()
83
84         def _update_message(self):
85                 if 0 == len(self._messages):
86                         self.toplevel.hide()
87                 else:
88                         message, icon = self._messages[0]
89                         self._message.set_text(message)
90                         if icon:
91                                 self._indicator.set_from_stock(icon)
92                                 self._indicator.show()
93                         else:
94                                 self._indicator.hide()
95                         self.toplevel.show()
96
97         @misc_utils.log_exception(_moduleLogger)
98         def _on_close(self, *args):
99                 self.pop_message()