diff options
Diffstat (limited to 'src/Gui/CCReporterDialog.py')
-rw-r--r-- | src/Gui/CCReporterDialog.py | 226 |
1 files changed, 109 insertions, 117 deletions
diff --git a/src/Gui/CCReporterDialog.py b/src/Gui/CCReporterDialog.py index ab6ad0fa..47cf9089 100644 --- a/src/Gui/CCReporterDialog.py +++ b/src/Gui/CCReporterDialog.py @@ -36,10 +36,11 @@ class ReporterDialog(): self.report = report #Set the Glade file # FIXME add to path - self.gladefile = "%s%sreport.glade" % (sys.path[0],"/") - self.wTree = gtk.glade.XML(self.gladefile) + builderfile = "%s%sreport.glade" % (sys.path[0],"/") + self.builder = gtk.Builder() + self.builder.add_from_file(builderfile) #Get the Main Window, and connect the "destroy" event - self.window = self.wTree.get_widget("reporter_dialog") + self.window = self.builder.get_object("reporter_dialog") self.window.set_default_size(640, 480) self.window.connect("response", self.on_response, daemon) if parent: @@ -47,60 +48,89 @@ class ReporterDialog(): self.window.set_modal(True) # comment textview - self.tvComment = self.wTree.get_widget("tvComment") + self.tvComment = self.builder.get_object("tvComment") self.tvComment.connect("focus-in-event", self.on_comment_focus_cb) self.comment_changed = False # "how to reproduce" textview - self.tevHowToReproduce = self.wTree.get_widget("tevHowToReproduce") + self.tevHowToReproduce = self.builder.get_object("tevHowToReproduce") self.how_to_changed = False - self.tvReport = self.wTree.get_widget("tvReport") - - self.reportListStore = gtk.ListStore(str, str, bool, bool, bool) - # set filter - #self.modelfilter = self.reportListStore.filter_new() - #self.modelfilter.set_visible_func(self.filter_reports, None) - self.tvReport.set_model(self.reportListStore) - renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Item', renderer, text=0) - self.tvReport.append_column(column) - - renderer = CellRenderers.MultilineCellRenderer() - renderer.props.editable = True - renderer.props.wrap_mode = pango.WRAP_WORD - renderer.props.wrap_width = 800 - - #renderer.props.wrap_mode = pango.WRAP_WORD - #renderer.props.wrap_width = 600 - column = gtk.TreeViewColumn('Value', renderer, text=1, editable=2) - self.tvReport.append_column(column) - renderer.connect('edited',self.column_edited,self.reportListStore) - # toggle - toggle_renderer = gtk.CellRendererToggle() - toggle_renderer.set_property('activatable', True) - toggle_renderer.connect( 'toggled', self.on_send_toggled, self.reportListStore ) - column = gtk.TreeViewColumn('Send', toggle_renderer) - column.add_attribute(toggle_renderer, "active", 3) - column.add_attribute(toggle_renderer, "visible", 4) - self.tvReport.insert_column(column,0) - # connect the signals - self.tvReport.connect_after("size-allocate", self.on_window_resize) - # start with the warning hidden, so it's not visible when there is no rating - self.wTree.get_widget("ebErrors").hide() - self.wTree.get_widget("bLog").connect("clicked", self.show_log_cb, log) + self.builder.get_object("ebErrors").hide() + self.builder.get_object("bLog").connect("clicked", self.show_log_cb, log) + self.builder.get_object("cbSendBacktrace").connect("toggled", self.on_send_backtrace_toggled) + self.allow_send() self.hydrate() - + + def check_backtrace(self): + print "checking backtrace" + + def warn_user(self, warnings): + # FIXME: show in lError + ebErrors = self.builder.get_object("ebErrors") + 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 + lErrors.set_label(warning_lbl) + ebErrors.show_all() + + def hide_warning(self): + ebErrors = self.builder.get_object("ebErrors") + lErrors = self.builder.get_object("lErrors") + ebErrors.hide() + + def allow_send(self): + self.hide_warning() + bSend = self.builder.get_object("bSend") + SendBacktrace = self.builder.get_object("cbSendBacktrace").get_active() + send = True + error_msgs = [] + try: + rating = self.report["rating"] + except: + 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 agree with submitting the backtrace.")) + # we have both SendBacktrace and rating + elif rating: + try: + package = self.report["package"][CD_CONTENT] + # if we don't have package for some reason + except: + package = None + # not usable report + if int(self.report["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!")) + # probably usable 3 + elif int(self.report["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) + + def on_send_backtrace_toggled(self, toggle_button): + self.allow_send() + def show_log_cb(self, widget, log): show_log(log, parent=self.window) # this callback is called when user press Cancel or Report button in Report dialog def on_response(self, dialog, response_id, daemon): # the button has been pressed (probably) - # print "response_id", response_id if response_id == gtk.RESPONSE_APPLY: if not (self.check_settings(daemon) and self.check_report()): dialog.stop_emission("response") - self.wTree.get_widget("bSend").stop_emission("clicked") + self.builder.get_object("bSend").stop_emission("clicked") if response_id == SHOW_LOG: # prevent dialog from quitting the run() dialog.stop_emission("response") @@ -113,16 +143,6 @@ class ReporterDialog(): widget.set_buffer(gtk.TextBuffer()) self.comment_changed = True - def on_window_resize(self, treeview, allocation): - # multine support - pass - #print allocation - - def column_edited(self, cell, path, new_text, model): - # 1 means the second cell - model[path][1] = new_text - return - def on_config_plugin_clicked(self, button, plugin, image): ui = PluginSettingsUI(plugin, parent=self.window) ui.hydrate() @@ -154,7 +174,6 @@ class ReporterDialog(): if reporter.Settings.check() == False: wrong_conf_plugs.append(reporter) - #gui_error_message(_("%s is not properly set!\nPlease check the settings and try to report again." % reporter)) if wrong_conf_plugs: gladefile = "%s%ssettings_wizard.glade" % (sys.path[0],"/") builder = gtk.Builder() @@ -187,8 +206,13 @@ class ReporterDialog(): def hydrate(self): self.editable = [] - self.reportListStore.clear() for item in self.report: + if item == "backtrace": + buff = gtk.TextBuffer() + tvBacktrace = self.builder.get_object("tvBacktrace") + buff.set_text(self.report[item][CD_CONTENT]) + tvBacktrace.set_buffer(buff) + continue if item == "Comment": buff = gtk.TextBuffer() comment = _("Brief description how to reproduce this or what you did...") @@ -217,60 +241,36 @@ class ReporterDialog(): self.tevHowToReproduce.set_buffer(buff) continue - # if an backtrace has rating use it - if item == "rating": - try: - package = self.report["package"][CD_CONTENT] - # if we don't have package for some reason - except: - package = None - ebErrors = self.wTree.get_widget("ebErrors") - fReproducer = self.wTree.get_widget("fReproducer") - fComments = self.wTree.get_widget("fComments") - lErrors = self.wTree.get_widget("lErrors") - bSend = self.wTree.get_widget("bSend") - # not usable report - if int(self.report[item][CD_CONTENT]) < 3: - ebErrors.show() - fReproducer.hide() - fComments.hide() - if package: - lErrors.set_markup( - _("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: - lErrors.set_markup(_("The backtrace is unusable, you can't report this!")) - bSend.set_sensitive(False) - # probably usable 3 - elif int(self.report[item][CD_CONTENT]) < 4: - ebErrors.show() - lErrors.set_markup(_("The backtrace is incomplete, please make sure you provide good steps to reproduce.")) - bSend.set_sensitive(True) - else: - ebErrors.hide() - fReproducer.show() - fComments.show() - bSend.set_sensitive(True) if self.report[item][CD_TYPE] != CD_SYS: # item name 0| value 1| editable? 2| toggled? 3| visible?(attachment)4 - if self.report[item][CD_EDITABLE] == 'y': - self.editable.append(item) - self.row_dict[item] = self.reportListStore.append([item, self.report[item][CD_CONTENT], - item in self.editable, True, - self.report[item][CD_TYPE] in [CD_ATT,CD_BIN]]) + # FIXME: handle editable fields + if self.report[item][CD_TYPE] in [CD_ATT,CD_BIN]: + self.builder.get_object("fAttachment").show() + vbAttachments = self.builder.get_object("vbAttachments") + toggle = gtk.CheckButton(self.report[item][CD_CONTENT]) + vbAttachments.pack_start(toggle) + # bind item to checkbox + toggle.item = item + toggle.show() + continue + item_label = self.builder.get_object("l%s" % item) + if item_label: + item_label.set_text(self.report[item][CD_CONTENT]) + else: + # no widget to show this item + # probably some new item need to adjust the GUI! + # FIXME: add some window+button to show all the info + # in raw form (smth like the old report dialog) + pass def dehydrate(self): - attributes = ["item", "content", "editable", "send", "attachment"] - for row in self.reportListStore: - rowe = dict(zip(attributes, row)) - if not rowe["editable"] and not rowe["attachment"]: - self.report[rowe["item"]][CD_CONTENT] = rowe["content"] - elif rowe["editable"] and not rowe["attachment"]: - self.report[rowe["item"]][CD_CONTENT] = rowe["content"] - elif (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]: - self.report[rowe["item"]][CD_CONTENT] = rowe["content"] - else: - del self.report[rowe["item"]] + # handle attachments + vbAttachments = self.builder.get_object("vbAttachments") + for attachment in vbAttachments.get_children(): + #print "%s file %s" % (["not sending","sending"][attachment.get_active()], attachment.get_label()) + del self.report[attachment.item] + # handle comment if self.comment_changed: buff = self.tvComment.get_buffer() @@ -283,22 +283,14 @@ class ReporterDialog(): self.report["How to reproduce"] = [CD_TXT, 'y', buff.get_text(buff.get_start_iter(),buff.get_end_iter())] else: del self.report["How to reproduce"] + #handle backtrace + tev_backtrace = self.builder.get_object("tvBacktrace") + buff = tev_backtrace.get_buffer() + self.report["backtrace"] = [CD_TXT, 'y', buff.get_text(buff.get_start_iter(),buff.get_end_iter())] def check_report(self): - # FIXME: what to do if user press "Not to send BT and then press cancel" - # it uncheck the backtrace and let him to edit it, and then user might - # not noticed, that he is not sending the BT, so should we warn user about this - # or check the BT automatically? - attributes = ["item", "content", "editable", "send", "attachment"] - for row in self.reportListStore: - rowe = dict(zip(attributes, row)) - if (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]: - result = gui_question_dialog(_("<b>WARNING</b>, you're about to send data which might contain sensitive information.\n" - "Do you really want to send <b>%s</b>?\n" % rowe["item"]), self.window) - if result == gtk.RESPONSE_NO: - row[attributes.index("send")] = False - if result in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT): - return False + # FIXME: check the report for passwords and some other potentially + # sensitive info self.dehydrate() return True |