First try at starting on the UI
[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._label = gtk.Label()
16
17                 self._layout = gtk.VBox()
18                 self._layout.pack_start(self._label)
19
20         @property
21         def toplevel(self):
22                 return self._layout
23
24         def show(self, message):
25                 assert not self._label.get_text(), self._label.get_text()
26                 self._label.set_text(message)
27                 self.toplevel.show()
28
29         def hide(self):
30                 assert self._label.get_text(), self._label.get_text()
31                 self._label.set_text("")
32                 self.toplevel.hide()
33
34
35 class StackingBanner(object):
36
37         ICON_SIZE = 32
38
39         def __init__(self):
40                 self._indicator = gtk.Image()
41
42                 self._message = gtk.Label()
43
44                 self._closeImage = gtk.Image()
45                 self._closeImage.set_from_stock("gtk-close", self.ICON_SIZE)
46
47                 self._layout = gtk.HBox()
48                 self._layout.pack_start(self._indicator, False, False)
49                 self._layout.pack_start(self._message, True, True)
50                 self._layout.pack_start(self._closeImage, False, False)
51
52                 self._events = gtk.EventBox()
53                 self._events.add(self._layout)
54                 self._events.connect("button_release_event", self._on_close)
55
56                 self._messages = []
57
58         @property
59         def toplevel(self):
60                 return self._events
61
62         def push_message(self, message, icon=""):
63                 self._messages.append((message, icon))
64                 if 1 == len(self.__messages):
65                         self._update_message()
66
67         def push_exception(self):
68                 userMessage = str(sys.exc_info()[1])
69                 self.push_message(userMessage, "gtk-dialog-error")
70                 _moduleLogger.exception(userMessage)
71
72         def pop_message(self):
73                 del self.__messages[0]
74                 self._update_message()
75
76         def _update_message(self):
77                 if 0 == len(self.__messages):
78                         self.toplevel.hide()
79                 else:
80                         message, icon = self._message[0]
81                         self._message.set_text(message)
82                         if icon:
83                                 self._indicator.set_from_stock(icon)
84                                 self._indicator.show()
85                         else:
86                                 self._indicator.hide()
87                         self.toplevel.show()
88
89         @misc_utils.log_exception(_moduleLogger)
90         def _on_close(self, *args):
91                 self.pop_message()