6 import util.misc as misc_utils
9 _moduleLogger = logging.getLogger(__name__)
12 class GenericBanner(object):
15 self._indicator = gtk.Image()
17 self._label = gtk.Label()
19 self._layout = gtk.HBox()
20 self._layout.pack_start(self._indicator, False, False)
21 self._layout.pack_start(self._label, False, True)
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)
34 self._indicator.set_from_stock(icon)
35 self._label.set_text(message)
39 assert self._label.get_text(), self._label.get_text()
40 self._label.set_text("")
44 class StackingBanner(object):
49 self._indicator = gtk.Image()
51 self._message = gtk.Label()
53 self._closeImage = gtk.Image()
54 self._closeImage.set_from_stock("gtk-close", self.ICON_SIZE)
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)
61 self._events = gtk.EventBox()
62 self._events.add(self._layout)
63 self._events.connect("button_release_event", self._on_close)
71 def push_message(self, message, icon=""):
72 self._messages.append((message, icon))
73 if 1 == len(self._messages):
74 self._update_message()
76 def push_exception(self):
77 userMessage = str(sys.exc_info()[1])
78 self.push_message(userMessage, "gtk-dialog-error")
79 _moduleLogger.exception(userMessage)
81 def pop_message(self):
83 self._update_message()
85 def _update_message(self):
86 if 0 == len(self._messages):
89 message, icon = self._messages[0]
90 self._message.set_text(message)
92 self._indicator.set_from_stock(icon)
93 self._indicator.show()
95 self._indicator.hide()
98 @misc_utils.log_exception(_moduleLogger)
99 def _on_close(self, *args):