diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Gui/CCDBusBackend.py | 6 | ||||
-rw-r--r-- | src/Gui/CCDump.py | 16 | ||||
-rw-r--r-- | src/Gui/CCMainWindow.py | 15 | ||||
-rw-r--r-- | src/Gui/CReporterAssistant.py | 401 | ||||
-rw-r--r-- | src/Gui/Makefile.am | 3 | ||||
-rw-r--r-- | src/Gui/progress_window.glade | 1 |
6 files changed, 361 insertions, 81 deletions
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py index 1122f05f..75ebdd54 100644 --- a/src/Gui/CCDBusBackend.py +++ b/src/Gui/CCDBusBackend.py @@ -166,9 +166,9 @@ class DBusManager(gobject.GObject): def jobdone_cb(self): log1("Our job for crash_id %s is done", self.job_crash_id) - dump = self.daemon().CreateReport(self.job_crash_id) - if dump: - self.emit("analyze-complete", dump) + report = self.daemon().CreateReport(self.job_crash_id) + if report: + self.emit("analyze-complete", report) else: # FIXME: BUG: BarWindow remains. (how2reproduce: delete "component" in a dump dir and try to report it) self.emit("abrt-error", _("Daemon didn't return valid report info\nDebuginfo is missing?")) diff --git a/src/Gui/CCDump.py b/src/Gui/CCDump.py index 913e40ac..23535bf9 100644 --- a/src/Gui/CCDump.py +++ b/src/Gui/CCDump.py @@ -62,6 +62,9 @@ class Dump(): else: self.__dict__[name] = value + def __str__(self): + return "Dump instance" + def getUUID(self): return self.UUID @@ -129,3 +132,16 @@ class Dump(): def get_kernel(self): return self.kernel + + def get_backtrace(self): + try: + return self.backtrace + except KeyError: + return None + + def get_rating(self): + try: + return self.rating + except KeyError: + return None + diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py index 16314bb7..658fdcaa 100644 --- a/src/Gui/CCMainWindow.py +++ b/src/Gui/CCMainWindow.py @@ -22,6 +22,7 @@ from CC_gui_functions import * from CCDumpList import getDumpList from CCDump import * # FILENAME_xxx, CD_xxx from CCReporterDialog import ReporterDialog, ReporterSelector +from CReporterAssistant import ReporterAssistant from PluginsSettingsDialog import PluginsSettingsDialog from SettingsDialog import SettingsDialog from PluginList import getPluginInfoList @@ -371,8 +372,11 @@ class MainWindow(): return dump = dumpsListStore.get_value(dumpsListStore.get_iter(path[0]), dumpsListStore.get_n_columns()-1) - rs = ReporterSelector(dump, self.ccdaemon, parent=self.window) - rs.show() + # Do we want to let user decide which UI they want to use? + #rs = ReporterSelector(dump, self.ccdaemon, parent=self.window) + #rs.show() + assistant = ReporterAssistant(dump, self.ccdaemon, parent=self.window) + assistant.hydrate() def delete_event_cb(self, widget, event, data=None): gtk.main_quit() @@ -437,8 +441,11 @@ if __name__ == "__main__": gui_error_message(_("No such crash in database, probably wrong crashid." "\ncrashid=%s" % crashid)) sys.exit() - rs = ReporterSelector(crashdump, daemon, parent=None) - rs.show() + assistant = ReporterAssistant(crashdump, daemon, parent=None) + assistant.hydrate() + # Do we want to let the users to decide which UI to use? +# rs = ReporterSelector(crashdump, daemon, parent=None) +# rs.show() else: cc = MainWindow(daemon) cc.hydrate() diff --git a/src/Gui/CReporterAssistant.py b/src/Gui/CReporterAssistant.py index e457ef24..e036dd73 100644 --- a/src/Gui/CReporterAssistant.py +++ b/src/Gui/CReporterAssistant.py @@ -2,6 +2,7 @@ import gtk from PluginList import getPluginInfoList from abrt_utils import _, log, log1, log2, get_verbose_level, g_verbose, warn from CCDump import * # FILENAME_xxx, CD_xxx +from PluginSettingsUI import PluginSettingsUI import sys import gobject from CC_gui_functions import * @@ -12,18 +13,21 @@ PAGE_BACKTRACE_APPROVAL = 1 PAGE_EXTRA_INFO = 2 PAGE_CONFIRM = 3 PAGE_REPORT_DONE = 4 +NO_PROBLEMS_DETECTED = -50 HOW_TO_HINT_TEXT = "1.\n2.\n3.\n" +COMMENT_HINT_TEXT = _("Brief description how to reproduce this or what you did...") class ReporterAssistant(): - def __init__(self, dump, daemon, log=None, parent=None): - self.report = None + def __init__(self, report, daemon, log=None, parent=None): self.connected_signals = [] self.plugins_cb = [] self.daemon = daemon self.updates = "" self.pdict = {} - self.dump = dump + self.report = report self.parent = parent + self.show_hint_comment = False + self.selected_reporters = [] """ create the assistant """ self.assistant = gtk.Assistant() self.assistant.set_icon_name("abrt") @@ -35,22 +39,25 @@ class ReporterAssistant(): if parent: self.assistant.set_position(gtk.WIN_POS_CENTER_ON_PARENT) self.assistant.set_transient_for(parent) + else: + # if we don't have parent we want to quit the mainloop on close + self.assistant.set_position(gtk.WIN_POS_CENTER) ### progress bar window self.builder = gtk.Builder() builderfile = "%s/progress_window.glade" % sys.path[0] self.builder.add_from_file(builderfile) self.pBarWindow = self.builder.get_object("pBarWindow") - print self.pBarWindow if self.pBarWindow: self.connect_signal(self.pBarWindow, "delete_event", self.sw_delete_event_cb) if parent: + self.pBarWindow.set_position(gtk.WIN_POS_CENTER_ON_PARENT) self.pBarWindow.set_transient_for(parent) - #else: - # self.pBarWindow.set_transient_for(self.window) + else: + self.pBarWindow.set_position(gtk.WIN_POS_CENTER) self.pBar = self.builder.get_object("pBar") else: - print "oops" + log1("Couldn't create the progressbar window") self.connect_signal(daemon, "analyze-complete", self.on_analyze_complete_cb, self.pBarWindow) self.connect_signal(daemon, "report-done", self.on_report_done_cb) @@ -61,20 +68,48 @@ class ReporterAssistant(): self.pBar.pulse() return True + def on_show_bt_clicked(self, button): + viewer = gtk.Window() + viewer.set_icon_name("abrt") + viewer.set_default_size(600,500) + viewer.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + viewer.set_transient_for(self.assistant) + hbox = gtk.HBox() + viewer.add(hbox) + bt_tev = gtk.TextView() + backtrace_scroll_w = gtk.ScrolledWindow() + backtrace_scroll_w.add(bt_tev) + backtrace_scroll_w.set_policy(gtk.POLICY_AUTOMATIC, + gtk.POLICY_AUTOMATIC) + bt_tev.set_buffer(self.backtrace_buff) + hbox.pack_start(backtrace_scroll_w) + viewer.show_all() + def on_report_done_cb(self, daemon, result): - try: - gobject.source_remove(self.timer) - except: - pass - self.pBarWindow.hide() - gui_report_dialog(result, self.parent) + self.hide_progress() + STATUS = 0 + MESSAGE = 1 + # 0 means not succesfull + #if report_status_dict[plugin][STATUS] == '0': + # this first one is actually a fallback to set at least + # a raw text in case when set_markup() fails + for plugin, res in result.iteritems(): + self.bug_reports.set_text(result[plugin][MESSAGE]) + self.bug_reports.set_markup("<span foreground='red'>%s</span>" % markup_escape_text(result[plugin][MESSAGE])) + # if the report was not succesful then this won't pass so this runs only + # if report succeds and gets overwriten by the status message + if result[plugin][STATUS] == '1': + self.bug_reports.set_markup(tag_urls_in_text(result[plugin][MESSAGE])) + + #if len(result[plugin][1]) > MAX_WIDTH: + # self.bug_reports.set_tooltip_text(result[plugin][1]) + #gui_report_dialog(result, self.parent) def cleanup_and_exit(self): - if not self.parent.get_property("visible"): - self.disconnect_signals() - # if the reporter selector doesn't have a parent - if not self.parent.get_transient_for(): - gtk.main_quit() + self.disconnect_signals() + self.assistant.destroy() + if not self.parent: + gtk.main_quit() def update_cb(self, daemon, message): self.updates += message @@ -113,43 +148,228 @@ class ReporterAssistant(): obj.disconnect(signal_id) def on_cancel_clicked(self, assistant, user_data=None): - self.disconnect_signals() - self.assistant.destroy() + self.cleanup_and_exit() def on_close_clicked(self, assistant, user_data=None): - self.disconnect_signals() - self.assistant.destroy() + self.cleanup_and_exit() def on_apply_clicked(self, assistant, user_data=None): - self.dehydrate() + self.send_report(self.result) + + def hide_progress(self): + try: + gobject.source_remove(self.timer) + except: + pass + self.pBarWindow.hide() + + def on_config_plugin_clicked(self, button, parent, plugin, image): + ui = PluginSettingsUI(plugin, parent=parent) + ui.hydrate() + response = ui.run() + if response == gtk.RESPONSE_APPLY: + ui.dehydrate() + if plugin.Settings.check(): + try: + plugin.save_settings_on_client_side() + except Exception, e: + gui_error_message(_("Can't save plugin settings:\n %s" % e)) + box = image.get_parent() + im = gtk.Image() + im.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_MENU) + box.remove(image) + box.pack_start(im, expand = False, fill = False) + im.show() + image.destroy() + button.set_sensitive(False) + elif response == gtk.RESPONSE_CANCEL: + log1("cancel") + ui.destroy() + + def check_settings(self, reporters): + wrong_conf_plugs = [] + for reporter in reporters: + if reporter.Settings.check() == False: + wrong_conf_plugs.append(reporter) + + if wrong_conf_plugs: + gladefile = "%s%ssettings_wizard.glade" % (sys.path[0],"/") + builder = gtk.Builder() + builder.add_from_file(gladefile) + dialog = builder.get_object("WrongSettings") + vbWrongSettings = builder.get_object("vbWrongSettings") + for plugin in wrong_conf_plugs: + hbox = gtk.HBox() + hbox.set_spacing(6) + image = gtk.Image() + image.set_from_stock(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU) + button = gtk.Button(_("Configure %s options" % plugin.getName())) + button.connect("clicked", self.on_config_plugin_clicked, dialog, plugin, image) + hbox.pack_start(button) + hbox.pack_start(image, expand = False, fill = False) + vbWrongSettings.pack_start(hbox) + vbWrongSettings.show_all() + dialog.set_transient_for(self.assistant) + dialog.set_modal(True) + response = dialog.run() + dialog.destroy() + if response == gtk.RESPONSE_YES: + return True + else: + # user cancelled reporting + return False + + else: + return NO_PROBLEMS_DETECTED + def warn_user(self, warnings): + # FIXME: show in lError + #self.lErrors = self.builder.get_object("lErrors") + warning_lbl = None + for warning in warnings: + if warning_lbl: + warning_lbl += "\n* %s" % warning + else: + warning_lbl = "* %s" % warning + # fallback + self.lbl_errors.set_label(warning_lbl) + self.lbl_errors.set_markup(warning_lbl) + self.errors_hbox.show_all() + #fErrors.show_all() + + def hide_warning(self): + self.errors_hbox.hide() + + def allow_send(self, send_toggle): + self.hide_warning() + #bSend = self.builder.get_object("bSend") + SendBacktrace = send_toggle.get_active() + send = True + error_msgs = [] + try: + rating = int(self.report.get_rating()) + except Exception, ex: + rating = None + # active buttons acording to required fields + # if an backtrace has rating use it + if not SendBacktrace: + send = False + error_msgs.append(_("You must check backtrace for sensitive data")) + error_msgs.append(_("You must agree with sending the backtrace")) + # we have both SendBacktrace and rating + if rating != None: + try: + package = self.result[FILENAME_PACKAGE][CD_CONTENT] + # if we don't have package for some reason + except: + package = None + # not usable report + if int(self.result[FILENAME_RATING][CD_CONTENT]) < 3: + if package: + error_msgs.append(_("Reporting disabled because the backtrace is unusable.\nPlease try to install debuginfo manually using command: <b>debuginfo-install %s</b> \nthen use Refresh button to regenerate the backtrace." % package[0:package.rfind('-',0,package.rfind('-'))])) + else: + error_msgs.append(_("The backtrace is unusable, you can't report this!")) + send = False + # probably usable 3 + elif int(self.result[FILENAME_RATING][CD_CONTENT]) < 4: + error_msgs.append(_("The backtrace is incomplete, please make sure you provide good steps to reproduce.")) + + if error_msgs: + self.warn_user(error_msgs) + #bSend.set_sensitive(send) + self.assistant.set_page_complete(self.pdict_get_page(PAGE_BACKTRACE_APPROVAL), send) + #self.assistant.set_page_complete(page, togglebutton.get_active()) + #if not send: + # bSend.set_tooltip_text(_("Reporting disabled, please fix the problems shown above.")) + #else: + # bSend.set_tooltip_text(_("Sends the report using selected plugin.")) def on_page_prepare(self, assistant, page): + # this is where dehydrate happens + if page == self.pdict_get_page(PAGE_EXTRA_INFO): + # howto + buff = gtk.TextBuffer() + try: + buff.set_text(self.result[FILENAME_REPRODUCE][CD_CONTENT]) + except KeyError: + buff.set_text(HOW_TO_HINT_TEXT) + self.howto_tev.set_buffer(buff) + + # comment + buff = gtk.TextBuffer() + try: + buff.set_text(self.result[FILENAME_COMMENT][CD_CONTENT]) + except KeyError: + buff.set_text(COMMENT_HINT_TEXT) + self.show_hint_comment = True + self.comment_tev.set_buffer(buff) if page == self.pdict_get_page(PAGE_CONFIRM): - #backtrace_buff = self.backtrace_tev.get_buffer() - #backtrace_text = backtrace_buff.get_text(backtrace_buff.get_start_iter(), backtrace_buff.get_end_iter()) + # howto howto_buff = self.howto_tev.get_buffer() howto_text = howto_buff.get_text(howto_buff.get_start_iter(), howto_buff.get_end_iter()) - self.steps.set_text(howto_text) + + if howto_text != HOW_TO_HINT_TEXT: + # user has changed the steps to reproduce + self.steps.set_text(howto_text) + self.result[FILENAME_REPRODUCE] = [CD_TXT, 'y', howto_text] + else: + self.steps.set_text(_("You didn't provide any steps to reproduce.")) + #comment comment_buff = self.comment_tev.get_buffer() comment_text = comment_buff.get_text(comment_buff.get_start_iter(), comment_buff.get_end_iter()) - self.comments.set_text(comment_text) - #elif page == self.pdict_get_page(PAGE_BACKTRACE_APPROVAL): - # self.backtrace_buff.set_text(self.report[FILENAME_BACKTRACE][CD_CONTENT]) + if not self.show_hint_comment: + self.comments.set_text(comment_text) + self.result[FILENAME_COMMENT] = [CD_TXT, 'y', comment_text] + else: + self.comments.set_text(_("You didn't provide any comments.")) + # backtrace + backtrace_text = self.backtrace_buff.get_text(self.backtrace_buff.get_start_iter(), self.backtrace_buff.get_end_iter()) + self.result[FILENAME_BACKTRACE] = [CD_TXT, 'y', backtrace_text] + + if page == self.pdict_get_page(PAGE_BACKTRACE_APPROVAL): + self.allow_send(self.backtrace_cb) + + def send_report(self, report): + try: + self.pBarWindow.show_all() + self.timer = gobject.timeout_add(100, self.progress_update_cb) + pluginlist = getPluginInfoList(self.daemon) + reporters_settings = pluginlist.getReporterPluginsSettings() + log2("Report(report, reporters, settings):") + log2(" result:%s", str(report)) + # Careful, this will print reporters_settings["Password"] too + log2(" settings:%s", str(reporters_settings)) + self.daemon.Report(report, self.selected_reporters, reporters_settings) + log2("Report() returned") + #self.hydrate() + except Exception, ex: + self.hide_progress() + gui_error_message(_("Reporting failed!\n%s" % ex)) - def on_plugin_toggled(self, togglebutton, plugins, page): + def on_plugin_toggled(self, plugin, plugins, reporter, page): complete = False - for plugin in plugins: - if plugin.get_active() is True: - complete = True - break + if plugin.get_active(): + log1("Plugin >>%s<< activated" % reporter) + self.selected_reporters.append(reporter) + check_result = self.check_settings([reporter]) + if check_result == NO_PROBLEMS_DETECTED: + pass + elif check_result: + page_n = self.assistant.get_current_page() + self.assistant.set_page_complete(page, True) + self.assistant.set_current_page(page_n+1) + else: + self.selected_reporters.remove(reporter) + log1("Plugin >>%s<< de-activated" % reporter) + if self.selected_reporters: + complete = True + log1("Selected reporters: %s" % [str(x) for x in self.selected_reporters]) self.assistant.set_page_complete(page, complete) def on_bt_toggled(self, togglebutton, page): - self.assistant.set_page_complete(page, togglebutton.get_active()) + self.allow_send(togglebutton) def pdict_add_page(self, page, name): # FIXME try, except?? - print "adding %s" % name if name not in self.pdict: self.pdict[name] = page else: @@ -160,7 +380,7 @@ class ReporterAssistant(): try: return self.pdict[name] except Exception, e: - print e + log2(e) return None def prepare_page_1(self): @@ -185,7 +405,7 @@ class ReporterAssistant(): "you'd rather not share\n\n" "Select where you would like to report the " "bug, and press 'Forward' to continue.") - % self.dump.getPackageName()) + % self.report.getPackageName()) page.pack_start(lbl_default_info, expand=True, fill=True) vbox_plugins = gtk.VBox() page.pack_start(vbox_plugins) @@ -198,17 +418,28 @@ class ReporterAssistant(): self.reporters = [] AnalyzerActionsAndReporters = self.settings["AnalyzerActionsAndReporters"] try: - reporters = AnalyzerActionsAndReporters[self.dump.getAnalyzerName()] + reporters = None + try: + reporters = AnalyzerActionsAndReporters[self.report.getAnalyzerName()+":"+self.report.getPackageName()] + log1("Found per-package reporters, " + "using it instead of the common reporter") + except KeyError: + pass + # the package specific reporter has higher priority, + # so don't overwrite it if it's set + if not reporters: + reporters = AnalyzerActionsAndReporters[self.report.getAnalyzerName()] for reporter_name in reporters.split(','): reporter = pluginlist.getReporterByName(reporter_name) if reporter: self.reporters.append(reporter) except KeyError: # Analyzer has no associated reporters. + # but we don't care, maybe user just want to read the backtrace?? pass for reporter in self.reporters: cb = gtk.CheckButton(str(reporter)) - cb.connect("toggled", self.on_plugin_toggled, plugins_cb, page) + cb.connect("toggled", self.on_plugin_toggled, plugins_cb, reporter, page) plugins_cb.append(cb) vbox_plugins.pack_start(cb, fill=True, expand=False) self.assistant.insert_page(page, PAGE_REPORTER_SELECTOR) @@ -217,6 +448,18 @@ class ReporterAssistant(): self.assistant.set_page_title(page, _("Send a bug report")) page.show_all() + def on_bt_copy(self, button, bt_text_view): + buff = bt_text_view.get_buffer() + bt_text = buff.get_text(buff.get_start_iter(), buff.get_end_iter()) + clipboard = gtk.clipboard_get() + clipboard.set_text(bt_text) + + def on_comment_focus_cb(self, widget, event): + if self.show_hint_comment: + # clear "hint" text by supplying a fresh, empty TextBuffer + widget.set_buffer(gtk.TextBuffer()) + self.show_hint_comment = True + def prepare_page_2(self): page = gtk.VBox(spacing=10) page.set_border_width(10) @@ -249,24 +492,39 @@ class ReporterAssistant(): hbox_bt.pack_start(vbox_bt) backtrace_alignment = gtk.Alignment() hbox_bt.pack_start(backtrace_alignment, expand=False, padding=10) + # bad backtrace, reporting disabled vbox_bt.pack_start(backtrace_scroll_w) + # warnings about wrong bt + self.errors_hbox = gtk.HBox() + self.warning_image = gtk.Image() + self.warning_image.set_from_stock(gtk.STOCK_DIALOG_WARNING,gtk.ICON_SIZE_DIALOG) + self.lbl_errors = gtk.Label() + self.lbl_errors.set_line_wrap(True) + #self.lbl_errors.set_alignment(0.0, 0.0) + self.lbl_errors.set_justify(gtk.JUSTIFY_FILL) + self.lbl_errors.set_size_request(600, -1) + self.errors_hbox.pack_start(self.warning_image, False, False) + self.errors_hbox.pack_start(self.lbl_errors) + ### + vbox_bt.pack_start(self.errors_hbox, False, False) hbox_buttons = gtk.HBox(homogeneous=True) button_alignment = gtk.Alignment() b_refresh = gtk.Button(_("Refresh")) b_refresh.connect("clicked", self.hydrate, 1) b_copy = gtk.Button(_("Copy")) + b_copy.connect("clicked", self.on_bt_copy, self.backtrace_tev) hbox_buttons.pack_start(button_alignment) hbox_buttons.pack_start(b_refresh, expand=False, fill=True) hbox_buttons.pack_start(b_copy, expand=False, fill=True) vbox_bt.pack_start(hbox_buttons, expand=False, fill=False) - backtrace_cb = gtk.CheckButton(_("I agree with submitting the backtrace")) - backtrace_cb.connect("toggled", self.on_bt_toggled, page) + self.backtrace_cb = gtk.CheckButton(_("I agree with submitting the backtrace")) + self.backtrace_cb.connect("toggled", self.on_bt_toggled, page) self.assistant.insert_page(page, PAGE_BACKTRACE_APPROVAL) self.pdict_add_page(page, PAGE_BACKTRACE_APPROVAL) self.assistant.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT) self.assistant.set_page_title(page, _("Approve backtrace")) page.pack_start(hbox_bt) - page.pack_start(backtrace_cb, expand=False, fill=False) + page.pack_start(self.backtrace_cb, expand=False, fill=False) page.show_all() def prepare_page_3(self): @@ -292,6 +550,7 @@ class ReporterAssistant(): howto_lbl.set_alignment(0.0, 0.0) howto_lbl.set_justify(gtk.JUSTIFY_FILL) self.howto_tev = gtk.TextView() + self.howto_tev.set_accepts_tab(False) howto_buff = gtk.TextBuffer() howto_buff.set_text(HOW_TO_HINT_TEXT) self.howto_tev.set_buffer(howto_buff) @@ -308,6 +567,8 @@ class ReporterAssistant(): comment_lbl.set_alignment(0.0, 0.0) comment_lbl.set_justify(gtk.JUSTIFY_FILL) self.comment_tev = gtk.TextView() + self.comment_tev.set_accepts_tab(False) + self.comment_tev.connect("focus-in-event", self.on_comment_focus_cb) comment_scroll_w = gtk.ScrolledWindow() comment_scroll_w.add(self.comment_tev) comment_scroll_w.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) @@ -381,15 +642,15 @@ class ReporterAssistant(): summary_table_left = gtk.Table(rows=4, columns=2) summary_table_right = gtk.Table(rows=4, columns=2) # left table - add_info_to_table(summary_table_left, _("Component"), "%s" % self.dump.get_component()) - add_info_to_table(summary_table_left, _("Package"), "%s" % self.dump.getPackageName()) - add_info_to_table(summary_table_left, _("Executable"), "%s" % self.dump.getExecutable()) - add_info_to_table(summary_table_left, _("Cmdline"), "%s" % self.dump.get_cmdline()) + add_info_to_table(summary_table_left, _("Component"), "%s" % self.report.get_component()) + add_info_to_table(summary_table_left, _("Package"), "%s" % self.report.getPackageName()) + add_info_to_table(summary_table_left, _("Executable"), "%s" % self.report.getExecutable()) + add_info_to_table(summary_table_left, _("Cmdline"), "%s" % self.report.get_cmdline()) #right table - add_info_to_table(summary_table_right, _("Architecture"), "%s" % self.dump.get_arch()) - add_info_to_table(summary_table_right, _("Kernel"), "%s" % self.dump.get_kernel()) - add_info_to_table(summary_table_right, _("Release"),"%s" % self.dump.get_release()) - add_info_to_table(summary_table_right, _("Reason"), "%s" % self.dump.get_reason()) + add_info_to_table(summary_table_right, _("Architecture"), "%s" % self.report.get_arch()) + add_info_to_table(summary_table_right, _("Kernel"), "%s" % self.report.get_kernel()) + add_info_to_table(summary_table_right, _("Release"),"%s" % self.report.get_release()) + add_info_to_table(summary_table_right, _("Reason"), "%s" % self.report.get_reason()) summary_hbox = gtk.HBox(spacing=5, homogeneous=True) left_table_vbox = gtk.VBox() @@ -404,6 +665,7 @@ class ReporterAssistant(): backtrace_lbl.set_alignment(0.0, 0.5) backtrace_lbl.set_justify(gtk.JUSTIFY_LEFT) backtrace_show_btn = gtk.Button(_("Click to view ...")) + backtrace_show_btn.connect("clicked", self.on_show_bt_clicked) backtrace_hbox = gtk.HBox(homogeneous=True) hb = gtk.HBox() hb.pack_start(backtrace_lbl) @@ -435,7 +697,7 @@ class ReporterAssistant(): comments_lbl.set_markup(_("<b>Comments:</b>")) comments_lbl.set_alignment(0.0, 0.0) comments_lbl.set_justify(gtk.JUSTIFY_LEFT) - self.comments = gtk.Label(_("This bug really sucks!")) + self.comments = gtk.Label(_("No comment provided!")) comments_hbox = gtk.HBox(spacing=10) comments_hbox.pack_start(comments_lbl) comments_hbox.pack_start(self.comments) @@ -468,38 +730,36 @@ class ReporterAssistant(): bug_reports_lbl.set_alignment(0.0, 0.0) bug_reports_lbl.set_justify(gtk.JUSTIFY_LEFT) bug_reports_lbl.set_markup(_("<b>Bug reports:</b>")) - bug_reports = gtk.Label() - bug_reports.set_alignment(0.0, 0.0) - bug_reports.set_justify(gtk.JUSTIFY_LEFT) - bug_reports.set_markup( - "<a href=\"https://bugzilla.redhat.com/show_bug.cgi?id=578425\">" - "https://bugzilla.redhat.com/show_bug.cgi?id=578425</a>") - bug_reports_vbox = gtk.VBox(spacing=5) - bug_reports_vbox.pack_start(bug_reports_lbl) - bug_reports_vbox.pack_start(bug_reports) + self.bug_reports = gtk.Label() + self.bug_reports.set_alignment(0.0, 0.0) + self.bug_reports.set_justify(gtk.JUSTIFY_LEFT) + self.bug_reports.set_markup(_("Not reported")) + self.bug_reports_vbox = gtk.VBox(spacing=5) + self.bug_reports_vbox.pack_start(bug_reports_lbl) + self.bug_reports_vbox.pack_start(self.bug_reports) page.pack_start(report_done_lbl, expand=False) - page.pack_start(bug_reports_vbox, expand=False) + page.pack_start(self.bug_reports_vbox, expand=False) page.show_all() def __del__(self): print "wizard: about to be deleted" - def on_analyze_complete_cb(self, daemon, report, pBarWindow): + def on_analyze_complete_cb(self, daemon, result, pBarWindow): try: gobject.source_remove(self.timer) except: pass self.pBarWindow.hide() - if not report: + if not result: gui_error_message(_("Unable to get report!\nDebuginfo is missing?")) return - self.report = report + self.result = result # set the backtrace text - self.backtrace_buff.set_text(self.report[FILENAME_BACKTRACE][CD_CONTENT]) + self.backtrace_buff.set_text(self.result[FILENAME_BACKTRACE][CD_CONTENT]) + self.allow_send(self.backtrace_cb) self.show() def hydrate(self, button=None, force=0): - print "force: %i:" % force if not force: self.prepare_page_1() self.prepare_page_2() @@ -512,11 +772,11 @@ class ReporterAssistant(): self.pBarWindow.show_all() self.timer = gobject.timeout_add(100, self.progress_update_cb) - # show the report window with selected dump + # show the report window with selected report # when getReport is done it emits "analyze-complete" and on_analyze_complete_cb is called # FIXME: does it make sense to change it to use callback rather then signal emitting? try: - self.daemon.start_job("%s:%s" % (self.dump.getUID(), self.dump.getUUID()), force) + self.daemon.start_job("%s:%s" % (self.report.getUID(), self.report.getUUID()), force) except Exception, ex: # FIXME #3 dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply # do this async and wait for yum to end with debuginfoinstal @@ -526,9 +786,6 @@ class ReporterAssistant(): gui_error_message(_("Error getting the report: %s" % ex)) return - def dehydrate(self): - print "dehydrate" - def show(self): self.assistant.show() diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am index 54fc5fde..1588b1f0 100644 --- a/src/Gui/Makefile.am +++ b/src/Gui/Makefile.am @@ -8,7 +8,8 @@ PYTHON_FILES = CCDBusBackend.py CCDumpList.py CCDump.py CC_gui_functions.py \ SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \ PluginsSettingsDialog.py ConfBackend.py CReporterAssistant.py -GLADE_FILES = ccgui.glade report.glade settings.glade dialogs.glade settings_wizard.glade +GLADE_FILES = ccgui.glade report.glade settings.glade dialogs.glade \ + settings_wizard.glade progress_window.glade EXTRA_DIST = $(PYTHON_FILES) $(GLADE_FILES) abrt-gui abrt.desktop diff --git a/src/Gui/progress_window.glade b/src/Gui/progress_window.glade index ae761300..67345378 100644 --- a/src/Gui/progress_window.glade +++ b/src/Gui/progress_window.glade @@ -6,7 +6,6 @@ <property name="width_request">500</property> <property name="border_width">12</property> <property name="title" translatable="yes">Please wait..</property> - <property name="resizable">False</property> <property name="modal">True</property> <property name="window_position">center-on-parent</property> <property name="icon_name">abrt</property> |