2
# Copyright (c) 2008 Canonical
4
# Written by Marc Tardif <marc@interunion.ca>
6
# This file is part of Checkbox.
8
# Checkbox is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# Checkbox is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
25
from gettext import gettext as _
27
from checkbox.test import ALL_STATUS, TestResult
28
from checkbox.user_interface import UserInterface
31
# HACK: Setting and unsetting previous and next buttons to workaround
32
# for gnome bug #56070.
33
class GTKHack(object):
34
def __init__(self, function):
35
self._function = function
37
def __get__(self, instance, cls=None):
38
self._instance = instance
41
def __call__(self, *args, **kwargs):
42
self._instance._set_sensitive("button_previous", False)
43
self._instance._set_sensitive("button_next", False)
44
self._instance._set_sensitive("button_previous", True)
45
self._instance._set_sensitive("button_next", True)
46
return self._function(self._instance, *args, **kwargs)
49
class GTKInterface(UserInterface):
51
def __init__(self, config):
52
super(GTKInterface, self).__init__(config)
55
gtk.window_set_default_icon_name("checkbox")
56
gtk.glade.textdomain(self.gettext_domain)
57
self.widgets = gtk.glade.XML(posixpath.join(config.gtk_path,
58
"checkbox-gtk.glade"))
59
self.widgets.signal_autoconnect(self)
61
self._dialog = self._get_widget("dialog_checkbox")
62
self._dialog.set_title(config.title)
64
self._notebook = self._get_widget("notebook_checkbox")
65
self._handler_id = None
67
def _get_widget(self, widget):
68
return self.widgets.get_widget(widget)
70
def _get_radiobutton(self, map):
71
for radiobutton, value in map.items():
72
if self._get_widget(radiobutton).get_active():
74
raise Exception, "Failed to map radiobutton."
76
def _get_text(self, name):
77
widget = self._get_widget(name)
78
return widget.get_text()
80
def _get_textview(self, name):
81
widget = self._get_widget(name)
82
buffer = widget.get_buffer()
83
text = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter())
86
def _set_label(self, name, label=""):
87
widget = self._get_widget(name)
88
widget.set_label(label)
90
def _set_markup(self, name, markup=""):
91
widget = self._get_widget(name)
92
widget.set_markup(markup)
94
def _set_text(self, name, text=""):
95
widget = self._get_widget(name)
98
def _set_textview(self, name, text=""):
99
buffer = gtk.TextBuffer()
100
buffer.set_text(text)
101
widget = self._get_widget(name)
102
widget.set_buffer(buffer)
104
def _set_active(self, name, value=True):
105
widget = self._get_widget(name)
106
widget.set_active(bool(value))
108
def _set_show(self, name, value=True):
109
widget = self._get_widget(name)
115
def _set_sensitive(self, name, value=True):
116
# Hack to workaround Gnome bug #56070
117
self._set_show(name, False)
118
self._set_show(name, True)
120
widget = self._get_widget(name)
121
widget.set_sensitive(bool(value))
123
def _run_dialog(self):
124
self.direction = self._dialog.run()
125
while gtk.events_pending():
126
gtk.main_iteration(False)
128
def do_function(self, function, *args, **kwargs):
129
self._set_sensitive("button_previous", False)
130
self._set_sensitive("button_next", False)
132
result = super(GTKInterface, self).do_function(function,
135
self._set_sensitive("button_previous", True)
136
self._set_sensitive("button_next", True)
140
def show_wait(self, message, function, *args, **kwargs):
141
self._set_text("label_wait", message)
142
self._notebook.set_current_page(3)
145
return self.do_function(function, *args, **kwargs)
147
def show_pulse(self):
148
self._get_widget("progressbar_wait").pulse()
149
self._get_widget("progressbar_test").pulse()
150
while gtk.events_pending():
151
gtk.main_iteration(False)
154
def show_intro(self, title, text):
156
self._set_sensitive("button_previous", False)
157
self._notebook.set_current_page(0)
159
markup = "<b>%s</b>" % title
160
self._set_markup("label_intro_title", markup)
161
self._set_text("label_intro_text", text)
165
self._set_sensitive("button_previous", True)
168
def show_category(self, title, text, category=None):
170
self._notebook.set_current_page(1)
172
self._set_text("label_category", text)
174
self._set_active("radiobutton_%s" % category)
178
return self._get_radiobutton({
179
"radiobutton_desktop": "desktop",
180
"radiobutton_laptop": "laptop",
181
"radiobutton_server": "server"})
183
def _run_test(self, test):
184
self._set_text("label_test", _("Running test %s...") % test.name)
185
self._set_show("progressbar_test")
188
result = self.do_function(test.command)
190
self._set_show("progressbar_test", False)
191
self._set_label("button_test", _("_Test Again"))
192
return self.show_test(test, result)
195
def show_test(self, test, result=None):
196
self._set_show("button_test", False)
197
self._notebook.set_current_page(2)
199
# Set test description
200
description = self.do_function(test.description, result)
201
self._set_label("label_test", description)
204
if str(test.command):
205
self._set_show("button_test", True)
207
button_test = self._get_widget("button_test")
209
button_test.disconnect(self._handler_id)
210
self._handler_id = button_test.connect("clicked",
211
lambda w, t=test: self._run_test(t))
214
answers = ["yes", "no", "skip"]
216
self._set_textview("textview_comment", result.data)
217
answer = dict(zip(ALL_STATUS, answers))[result.status]
218
self._set_active("radiobutton_%s" % answer)
220
self._set_textview("textview_comment", "")
221
self._set_active("radiobutton_skip")
226
self._set_label("label_test")
227
self._set_label("button_test", _("_Test"))
229
radiobuttons = ["radiobutton_%s" % a for a in answers]
230
status = self._get_radiobutton(dict(zip(radiobuttons, ALL_STATUS)))
231
data = self._get_textview("textview_comment")
232
return TestResult(test, status, data)
235
def show_exchange(self, authentication, reports=[], message=None,
237
self._notebook.set_current_page(4)
239
if authentication is not None:
240
self._set_text("entry_authentication", authentication)
242
all_reports = ["distribution", "devices", "processors",
244
for report in all_reports:
245
self._set_show("label_%s" % report, report in reports)
247
if message is not None:
248
self._set_markup("label_exchange", message)
250
if error is not None:
251
self.show_error(_("Exchange"), error)
255
authentication = self._get_text("entry_authentication")
257
return authentication
260
def show_final(self, message=None):
261
self._set_label("button_next", _("_Finish"))
262
self._notebook.set_current_page(5)
264
if message is not None:
265
self._set_markup("label_final", message)
269
self._set_label("button_next", _("Ne_xt"))
271
def show_error(self, title, text):
272
md = gtk.MessageDialog(type=gtk.MESSAGE_ERROR,
273
buttons=gtk.BUTTONS_CLOSE, message_format=text)
277
while gtk.events_pending():
278
gtk.main_iteration(False)
280
def on_dialog_checkbox_delete(self, widget, event=None):