Removing another page download from startup for GOogleVoice
[gc-dialer] / src / gtk_toolbox.py
1 #!/usr/bin/python
2
3
4 import gobject
5 import gtk
6
7
8 class LoginWindow(object):
9
10         def __init__(self, widgetTree):
11                 """
12                 @note Thread agnostic
13                 """
14                 self._dialog = widgetTree.get_widget("loginDialog")
15                 self._parentWindow = widgetTree.get_widget("mainWindow")
16                 self._serviceCombo = widgetTree.get_widget("serviceCombo")
17                 self._usernameEntry = widgetTree.get_widget("usernameentry")
18                 self._passwordEntry = widgetTree.get_widget("passwordentry")
19
20                 self._serviceList = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
21                 self._serviceCombo.set_model(self._serviceList)
22                 cell = gtk.CellRendererText()
23                 self._serviceCombo.pack_start(cell, True)
24                 self._serviceCombo.add_attribute(cell, 'text', 1)
25                 self._serviceCombo.set_active(0)
26
27                 callbackMapping = {
28                         "on_loginbutton_clicked": self._on_loginbutton_clicked,
29                         "on_loginclose_clicked": self._on_loginclose_clicked,
30                 }
31                 widgetTree.signal_autoconnect(callbackMapping)
32
33         def request_credentials(self, parentWindow = None):
34                 """
35                 @note UI Thread
36                 """
37                 if parentWindow is None:
38                         parentWindow = self._parentWindow
39
40                 self._serviceCombo.hide()
41                 self._serviceList.clear()
42
43                 try:
44                         self._dialog.set_transient_for(parentWindow)
45                         self._dialog.set_default_response(gtk.RESPONSE_OK)
46                         response = self._dialog.run()
47                         if response != gtk.RESPONSE_OK:
48                                 raise RuntimeError("Login Cancelled")
49
50                         username = self._usernameEntry.get_text()
51                         password = self._passwordEntry.get_text()
52                         self._passwordEntry.set_text("")
53                 finally:
54                         self._dialog.hide()
55
56                 return username, password
57
58         def request_credentials_from(self, services, parentWindow = None):
59                 """
60                 @note UI Thread
61                 """
62                 if parentWindow is None:
63                         parentWindow = self._parentWindow
64
65                 self._serviceList.clear()
66                 for serviceIdserviceName in services.iteritems():
67                         self._serviceList.append(serviceIdserviceName)
68                 self._serviceCombo.set_active(0)
69                 self._serviceCombo.show()
70
71                 try:
72                         self._dialog.set_transient_for(parentWindow)
73                         self._dialog.set_default_response(gtk.RESPONSE_OK)
74                         response = self._dialog.run()
75                         if response != gtk.RESPONSE_OK:
76                                 raise RuntimeError("Login Cancelled")
77
78                         username = self._usernameEntry.get_text()
79                         password = self._passwordEntry.get_text()
80                         self._passwordEntry.set_text("")
81                 finally:
82                         self._dialog.hide()
83
84                 itr = self._serviceCombo.get_active_iter()
85                 serviceId = int(self._serviceList.get_value(itr, 0))
86                 self._serviceList.clear()
87                 return serviceId, username, password
88
89         def _on_loginbutton_clicked(self, *args):
90                 self._dialog.response(gtk.RESPONSE_OK)
91
92         def _on_loginclose_clicked(self, *args):
93                 self._dialog.response(gtk.RESPONSE_CANCEL)
94
95
96 class ErrorDisplay(object):
97
98         def __init__(self, widgetTree):
99                 super(ErrorDisplay, self).__init__()
100                 self.__errorBox = widgetTree.get_widget("errorEventBox")
101                 self.__errorDescription = widgetTree.get_widget("errorDescription")
102                 self.__errorClose = widgetTree.get_widget("errorClose")
103                 self.__parentBox = self.__errorBox.get_parent()
104
105                 self.__errorBox.connect("button_release_event", self._on_close)
106
107                 self.__messages = []
108                 self.__parentBox.remove(self.__errorBox)
109
110         def push_message_with_lock(self, message):
111                 gtk.gdk.threads_enter()
112                 try:
113                         self.push_message(message)
114                 finally:
115                         gtk.gdk.threads_leave()
116
117         def push_message(self, message):
118                 if 0 < len(self.__messages):
119                         self.__messages.append(message)
120                 else:
121                         self.__show_message(message)
122
123         def pop_message(self):
124                 if 0 < len(self.__messages):
125                         self.__show_message(self.__messages[0])
126                         del self.__messages[0]
127                 else:
128                         self.__hide_message()
129
130         def _on_close(self, *args):
131                 self.pop_message()
132
133         def __show_message(self, message):
134                 self.__errorDescription.set_text(message)
135                 self.__parentBox.pack_start(self.__errorBox, False, False)
136                 self.__parentBox.reorder_child(self.__errorBox, 1)
137
138         def __hide_message(self):
139                 self.__errorDescription.set_text("")
140                 self.__parentBox.remove(self.__errorBox)
141
142
143 class MessageBox(gtk.MessageDialog):
144
145         def __init__(self, message):
146                 parent = None
147                 gtk.MessageDialog.__init__(
148                         self,
149                         parent,
150                         gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
151                         gtk.MESSAGE_ERROR,
152                         gtk.BUTTONS_OK,
153                         message,
154                 )
155                 self.set_default_response(gtk.RESPONSE_OK)
156                 self.connect('response', self._handle_clicked)
157
158         def _handle_clicked(self, *args):
159                 self.destroy()
160
161
162 class MessageBox2(gtk.MessageDialog):
163
164         def __init__(self, message):
165                 parent = None
166                 gtk.MessageDialog.__init__(
167                         self,
168                         parent,
169                         gtk.DIALOG_DESTROY_WITH_PARENT,
170                         gtk.MESSAGE_ERROR,
171                         gtk.BUTTONS_OK,
172                         message,
173                 )
174                 self.set_default_response(gtk.RESPONSE_OK)
175                 self.connect('response', self._handle_clicked)
176
177         def _handle_clicked(self, *args):
178                 self.destroy()