23
23
from gettext import gettext as _
25
from checkbox.test import ALL_STATUS, TestResult
26
from checkbox.user_interface import UserInterface
24
from string import Template
26
from checkbox.lib.iterator import NEXT
28
from checkbox.job import Job, UNINITIATED
29
from checkbox.user_interface import (UserInterface,
30
YES_ANSWER, NO_ANSWER, SKIP_ANSWER,
31
ANSWER_TO_STATUS, STATUS_TO_ANSWER)
28
33
# Import to register HyperTextView type with gtk
29
34
from checkbox_gtk.hyper_text_view import HyperTextView
38
YES_ANSWER: "radio_button_yes",
39
NO_ANSWER: "radio_button_no",
40
SKIP_ANSWER: "radio_button_skip"}
42
BUTTON_TO_STATUS = dict((b, ANSWER_TO_STATUS[a])
43
for a, b in ANSWER_TO_BUTTON.items())
45
STATUS_TO_BUTTON = dict((s, ANSWER_TO_BUTTON[a])
46
for s, a in STATUS_TO_ANSWER.items())
32
49
# HACK: Setting and unsetting previous and next buttons to workaround
33
50
# for gnome bug #56070.
34
51
class GTKHack(object):
194
228
gtk.main_iteration()
197
def show_intro(self, title, text):
231
def show_text(self, text, previous=None, next=None):
199
self._set_sensitive("button_previous", False)
233
previous_state = self._set_button("button_previous", previous)
234
next_state = self._set_button("button_next", next)
200
236
self._notebook.set_current_page(0)
202
intro = "\n\n".join([title, text])
203
self._set_hyper_text_view("hyper_text_view_intro_text", intro)
207
self._set_sensitive("button_previous", True)
210
def show_category(self, title, text, category=None):
212
self._notebook.set_current_page(1)
214
self._set_hyper_text_view("hyper_text_view_category", text)
216
self._set_active("radio_button_%s" % category)
220
return self._get_radio_button({
221
"radio_button_desktop": "desktop",
222
"radio_button_laptop": "laptop",
223
"radio_button_server": "server"})
238
self._set_hyper_text_view("hyper_text_view_text", text)
243
self._set_button("button_previous", previous_state)
244
self._set_button("button_next", next_state)
247
def show_entry(self, text, value, previous=None, next=None):
249
previous_state = self._set_button("button_previous", previous)
250
next_state = self._set_button("button_next", next)
252
self._notebook.set_current_page(3)
254
if value is not None:
255
self._set_text("entry", value)
257
self._set_hyper_text_view("hyper_text_view_entry", text)
262
self._set_button("button_previous", previous_state)
263
self._set_button("button_next", next_state)
265
return self._get_text("entry")
268
def show_check(self, text, options=[], default=[]):
270
self._notebook.set_current_page(1)
274
vbox = self._get_widget("vbox_options")
275
for option in options:
276
label = "_%s" % option.capitalize()
277
radio_button = gtk.CheckButton(label)
279
option_table[option] = radio_button
280
vbox.pack_start(radio_button, False, False, 0)
281
if option in default:
282
radio_button.set_active(True)
284
self._set_hyper_text_view("hyper_text_view_options", text)
290
for option, check_button in option_table.items():
291
if check_button.get_active():
292
results.append(option)
293
vbox.remove(check_button)
298
def show_radio(self, text, options=[], default=None):
300
self._notebook.set_current_page(1)
305
vbox = self._get_widget("vbox_options")
306
for option in options:
307
label = "_%s" % option.capitalize()
308
radio_button = gtk.RadioButton(option_group, label)
310
option_table[option] = radio_button
311
vbox.pack_start(radio_button, False, False, 0)
312
if option_group is None:
313
option_group = radio_button
314
if option == default:
315
radio_button.set_active(True)
317
self._set_hyper_text_view("hyper_text_view_options", text)
323
for option, radio_button in option_table.items():
324
if radio_button.get_active():
326
vbox.remove(radio_button)
225
330
def _run_test(self, test):
226
331
self._set_sensitive("button_test", False)
228
message = _("Running test %s...") % test.name
229
result = self.show_wait(message, test.command)
333
message = _("Running test %s...") % test["name"]
334
job = Job(test["command"], test.get("environ"), test.get("timeout"))
335
self.show_wait(message, job.execute)
231
description = self.do_function(test.description, result)
337
description = Template(test["description"]).substitute({
338
"output": job.data.strip()})
232
339
self._set_hyper_text_view("hyper_text_view_test", description)
341
self._set_active(STATUS_TO_BUTTON[job.status])
342
self._set_label("button_test", _("_Test Again"))
234
343
self._set_sensitive("button_test", True)
235
self._set_label("button_test", _("_Test Again"))
238
def show_test(self, test, result=None):
346
def show_test(self, test):
239
347
self._set_sensitive("button_test", False)
240
348
self._notebook.set_current_page(2)
242
350
# Set test description
243
description = self.do_function(test.description, result)
244
self._set_hyper_text_view("hyper_text_view_test", description)
351
if re.search(r"\$output", test["description"]):
354
self._set_hyper_text_view("hyper_text_view_test",
247
if str(test.command):
358
if "command" in test:
248
359
self._set_sensitive("button_test", True)
250
360
button_test = self._get_widget("button_test")
251
361
if self._handler_id:
252
362
button_test.disconnect(self._handler_id)
253
363
self._handler_id = button_test.connect("clicked",
254
364
lambda w, t=test: self._run_test(t))
257
answers = ["yes", "no", "skip"]
259
self._set_text_view("text_view_comment", result.data)
260
answer = dict(zip(ALL_STATUS, answers))[result.status]
261
self._set_active("radio_button_%s" % answer)
263
self._set_text_view("text_view_comment")
264
self._set_active("radio_button_skip")
366
self._set_text_view("text_view_comment", test.get("data", ""))
367
self._set_active(STATUS_TO_BUTTON[test.get("status", UNINITIATED)])
266
369
self._run_dialog()
269
372
self._set_hyper_text_view("hyper_text_view_test")
270
373
self._set_label("button_test", _("_Test"))
272
radio_buttons = ["radio_button_%s" % a for a in answers]
273
status = self._get_radio_button(dict(zip(radio_buttons, ALL_STATUS)))
274
data = self._get_text_view("text_view_comment")
275
return TestResult(test, status, data)
278
def show_exchange(self, authentication, message=None):
279
self._notebook.set_current_page(3)
281
if authentication is not None:
282
self._set_text("entry_authentication", authentication)
284
if message is not None:
285
self._set_hyper_text_view("hyper_text_view_exchange", message)
289
authentication = self._get_text("entry_authentication")
291
return authentication
294
def show_final(self, message=None):
295
self._set_label("button_next", _("_Finish"))
296
self._notebook.set_current_page(4)
298
if message is not None:
299
self._set_hyper_text_view("hyper_text_view_final", message)
303
self._set_label("button_next", _("Ne_xt"))
305
def show_error(self, title, text):
375
test["data"] = self._get_text_view("text_view_comment")
376
test["status"] = self._get_radio_button(BUTTON_TO_STATUS)
378
def show_error(self, text):
306
379
message_dialog = gtk.MessageDialog(parent=self._dialog,
307
380
type=gtk.MESSAGE_ERROR,
308
buttons=gtk.BUTTONS_CLOSE,
381
buttons=gtk.BUTTONS_NONE,
309
382
message_format=text)
310
383
message_dialog.set_modal(True)
311
message_dialog.set_title(title)
384
message_dialog.set_title(_("Error"))
385
message_dialog.set_default_response(1)
386
message_dialog.add_buttons(gtk.STOCK_CLOSE, NEXT)
312
387
self._run_dialog(message_dialog)
313
388
message_dialog.hide()