summaryrefslogtreecommitdiffstats
path: root/src/Gui
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2009-08-20 13:43:36 +0200
committerJiri Moskovcak <jmoskovc@redhat.com>2009-08-20 13:43:36 +0200
commitc46c6ba2e91b4c4bad95f8fc89fdd09e45fa0f36 (patch)
treedaa3bff51e38b819534617f7aa91374e2d1d8a72 /src/Gui
parent864f765404ee9f91b4699af850aac64aca9eca8d (diff)
downloadabrt-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.py4
-rw-r--r--src/Gui/CCMainWindow.py16
-rw-r--r--src/Gui/CC_gui_functions.py79
-rw-r--r--src/Gui/dialogs.GtkBuilder72
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>