diff options
author | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-08-20 13:43:36 +0200 |
---|---|---|
committer | Jiri Moskovcak <jmoskovc@redhat.com> | 2009-08-20 13:43:36 +0200 |
commit | c46c6ba2e91b4c4bad95f8fc89fdd09e45fa0f36 (patch) | |
tree | daa3bff51e38b819534617f7aa91374e2d1d8a72 /src/Gui | |
parent | 864f765404ee9f91b4699af850aac64aca9eca8d (diff) | |
download | abrt-c46c6ba2e91b4c4bad95f8fc89fdd09e45fa0f36.tar.gz abrt-c46c6ba2e91b4c4bad95f8fc89fdd09e45fa0f36.tar.xz abrt-c46c6ba2e91b4c4bad95f8fc89fdd09e45fa0f36.zip |
GUI: added clickable link to "after report" status window
Diffstat (limited to 'src/Gui')
-rw-r--r-- | src/Gui/CCDBusBackend.py | 4 | ||||
-rw-r--r-- | src/Gui/CCMainWindow.py | 16 | ||||
-rw-r--r-- | src/Gui/CC_gui_functions.py | 79 | ||||
-rw-r--r-- | src/Gui/dialogs.GtkBuilder | 72 |
4 files changed, 155 insertions, 16 deletions
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py index 663616fa..9696d38d 100644 --- a/src/Gui/CCDBusBackend.py +++ b/src/Gui/CCDBusBackend.py @@ -55,7 +55,7 @@ class DBusManager(gobject.GObject): # signal emited when new analyze is complete gobject.signal_new ("analyze-complete", self, gobject.SIGNAL_RUN_FIRST,gobject.TYPE_NONE,(gobject.TYPE_PYOBJECT,)) # signal emited when smth fails - gobject.signal_new ("error", self, gobject.SIGNAL_RUN_FIRST,gobject.TYPE_NONE,(gobject.TYPE_PYOBJECT,)) + gobject.signal_new ("abrt-error", self, gobject.SIGNAL_RUN_FIRST,gobject.TYPE_NONE,(gobject.TYPE_PYOBJECT,)) gobject.signal_new ("warning", self, gobject.SIGNAL_RUN_FIRST,gobject.TYPE_NONE,(gobject.TYPE_PYOBJECT,)) # signal emited to update gui with current status gobject.signal_new ("update", self, gobject.SIGNAL_RUN_FIRST,gobject.TYPE_NONE,(gobject.TYPE_PYOBJECT,)) @@ -77,7 +77,7 @@ class DBusManager(gobject.GObject): print "disconnect" def error_handler_cb(self,arg): - self.emit("error",arg) + self.emit("abrt-error",arg) def warning_handler_cb(self,arg): self.emit("warning",arg) diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py index a98149ff..0600ca0d 100644 --- a/src/Gui/CCMainWindow.py +++ b/src/Gui/CCMainWindow.py @@ -111,7 +111,7 @@ class MainWindow(): # connect handlers for daemon signals self.ccdaemon.connect("crash", self.on_data_changed_cb, None) self.ccdaemon.connect("analyze-complete", self.on_analyze_complete_cb, self.pBarWindow) - self.ccdaemon.connect("error", self.error_cb) + self.ccdaemon.connect("abrt-error", self.error_cb) #self.ccdaemon.connect("warning", self.warning_cb) self.ccdaemon.connect("update", self.update_cb) self.ccdaemon.connect("show", self.show_cb) @@ -239,19 +239,7 @@ class MainWindow(): except: pass self.pBarWindow.hide() - STATUS = 0 - MESSAGE = 1 - message = "" - for plugin, res in result.iteritems(): - if "http" in result[plugin][1]: - if gtk.gtk_version[1] >= 17: - message += "<b>%s</b>: <a href=\"%s\">%s</a>\n" % (plugin, result[plugin][1], result[plugin][1]) - else: - message += "<b>%s</b>: <span foreground='blue' underline='low'>%s</span>\n" % (plugin, result[plugin][1]) - else: - message += "<b>%s</b>: %s\n" % (plugin, result[plugin][1]) - - gui_info_dialog("<b>Report done!</b>\n%s" % message, self.window) + gui_report_dialog(result, self.window) self.hydrate() def on_analyze_complete_cb(self, daemon, report, pBarWindow): diff --git a/src/Gui/CC_gui_functions.py b/src/Gui/CC_gui_functions.py index 03c664c8..889fb60d 100644 --- a/src/Gui/CC_gui_functions.py +++ b/src/Gui/CC_gui_functions.py @@ -1,10 +1,84 @@ # -*- coding: utf-8 -*- import gtk +import subprocess +# url markup is supported from gtk 2.18 so we need to use libsexy +if gtk.gtk_version[1] <= 17: + from sexy import UrlLabel as Label +else: + from gtk import Label try: # we don't want to add dependency to rpm, but if we have it, we can use it import rpm except: rpm = None + +def on_url_clicked(label, url): + import gnomevfs + file_mimetype = gnomevfs.get_mime_type(url) + default_app = gnomevfs.mime_get_default_application(file_mimetype) + if default_app: + #print "Default Application:", default_app[2] + subprocess.Popen([default_app[2], url]) + +def gui_report_dialog ( report_status_dict, parent_dialog, + message_type=gtk.MESSAGE_INFO, + widget=None, page=0, broken_widget=None ): + builder = gtk.Builder() + builder.add_from_file("dialogs.GtkBuilder") + dialog = builder.get_object("ReportDialog") + + + main_hbox = builder.get_object("main_hbox") + + STATUS = 0 + MESSAGE = 1 + message = "" + status_vbox = gtk.VBox() + for plugin, res in report_status_dict.iteritems(): + status_hbox = gtk.HBox() + plugin_label = Label("<b>%s</b>: " % plugin) + plugin_label.set_justify(gtk.JUSTIFY_RIGHT) + status_label = Label() + status_label.set_selectable(True) + status_hbox.pack_start(plugin_label, expand=False) + status_hbox.pack_start(status_label, expand=False) + # 0 means not succesfull + if report_status_dict[plugin][0] == '0': + status_label.set_markup("<span foreground='red'>%s</span>" % report_status_dict[plugin][1]) + elif report_status_dict[plugin][0] == '1': + if "http" in report_status_dict[plugin][1] or report_status_dict[plugin][1][0] == '/': + #message += "<b>%s</b>: <a href=\"%s\">%s</a>\n" % (plugin, report_status_dict[plugin][1], report_status_dict[plugin][1]) + status_label.set_markup("<a href=\"%s\">%s</a>" % (report_status_dict[plugin][1], report_status_dict[plugin][1])) + status_label.connect("url-activated", on_url_clicked) + #else: + #message += "<b>%s</b>: <span foreground='blue' underline='low'>%s</span>\n" % (plugin, report_status_dict[plugin][1]) + else: + #message += "<b>%s</b>: %s\n" % (plugin, report_status_dict[plugin][1]) + status_label.set_text("%s" % report_status_dict[plugin][1]) + status_vbox.pack_start(status_hbox, expand=False) + main_hbox.pack_start(status_vbox) + + if widget != None: + if isinstance (widget, gtk.CList): + widget.select_row (page, 0) + elif isinstance (widget, gtk.Notebook): + widget.set_current_page (page) + if broken_widget != None: + broken_widget.grab_focus () + if isinstance (broken_widget, gtk.Entry): + broken_widget.select_region (0, -1) + + if parent_dialog: + dialog.set_position (gtk.WIN_POS_CENTER_ON_PARENT) + dialog.set_transient_for(parent_dialog) + else: + dialog.set_position (gtk.WIN_POS_CENTER) + + main_hbox.show_all() + ret = dialog.run() + dialog.destroy() + return ret + def gui_info_dialog ( message, parent_dialog, message_type=gtk.MESSAGE_INFO, widget=None, page=0, broken_widget=None ): @@ -121,3 +195,8 @@ def get_icon_for_package(theme,package): return gtk.gdk.pixbuf_new_from_file_at_size(icon_filename,22,22) else: return None + +if __name__ == "__main__": + window = gtk.Window() + gui_report_dialog("<b>Bugzilla</b>: <span foreground='red'>CReporterBugzilla::Report(): CReporterBugzilla::Login(): RPC response indicates failure. The username or password you entered is not valid.</span>\n<b>Logger</b>: Report was stored into: /var/log/abrt-logger", window) + gtk.main() diff --git a/src/Gui/dialogs.GtkBuilder b/src/Gui/dialogs.GtkBuilder new file mode 100644 index 00000000..e6910891 --- /dev/null +++ b/src/Gui/dialogs.GtkBuilder @@ -0,0 +1,72 @@ +<?xml version="1.0"?> +<interface> + <requires lib="gtk+" version="2.16"/> + <!-- interface-naming-policy project-wide --> + <object class="GtkDialog" id="ReportDialog"> + <property name="border_width">5</property> + <property name="title" translatable="yes">Report done</property> + <property name="modal">True</property> + <property name="window_position">center-on-parent</property> + <property name="destroy_with_parent">True</property> + <property name="type_hint">normal</property> + <property name="has_separator">False</property> + <child internal-child="vbox"> + <object class="GtkVBox" id="dialog-vbox2"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <property name="spacing">2</property> + <child> + <object class="GtkHBox" id="main_hbox"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-dialog-info</property> + <property name="icon-size">6</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child internal-child="action_area"> + <object class="GtkHButtonBox" id="dialog-action_area2"> + <property name="visible">True</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="button1"> + <property name="label" translatable="yes">gtk-ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="0">button1</action-widget> + </action-widgets> + </object> +</interface> |