summaryrefslogtreecommitdiff
path: root/portato
diff options
context:
space:
mode:
authorNecoro <>2007-10-15 18:19:31 +0000
committerNecoro <>2007-10-15 18:19:31 +0000
commitfe2547bc8e7698846aa1894760f499a49b36adc9 (patch)
treef3c5a2cc9112e568109cb846d1b4b71d71bf828a /portato
parent2acc7113972491b83a15ce8829a442d712794803 (diff)
downloadportato-fe2547bc8e7698846aa1894760f499a49b36adc9.tar.gz
portato-fe2547bc8e7698846aa1894760f499a49b36adc9.tar.bz2
portato-fe2547bc8e7698846aa1894760f499a49b36adc9.zip
added "Save As..." functionality for exception dialog
Diffstat (limited to 'portato')
-rw-r--r--portato/gui/gtk/dialogs.py13
-rw-r--r--portato/gui/gtk/exception_handling.py26
2 files changed, 34 insertions, 5 deletions
diff --git a/portato/gui/gtk/dialogs.py b/portato/gui/gtk/dialogs.py
index 2520add..9da8cbd 100644
--- a/portato/gui/gtk/dialogs.py
+++ b/portato/gui/gtk/dialogs.py
@@ -71,3 +71,16 @@ def remove_queue_dialog ():
ret = askMB.run()
askMB.destroy()
return ret
+
+def file_chooser_dialog (title, parent):
+ fc = gtk.FileChooserDialog(title = title, parent = parent, action = gtk.FILE_CHOOSER_ACTION_SAVE, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
+ fc.set_do_overwrite_confirmation(True)
+ ret = fc.run()
+
+ if ret == gtk.RESPONSE_ACCEPT:
+ ret = fc.get_filename()
+ else:
+ ret = None
+
+ fc.destroy()
+ return ret
diff --git a/portato/gui/gtk/exception_handling.py b/portato/gui/gtk/exception_handling.py
index 3d89560..673dd7e 100644
--- a/portato/gui/gtk/exception_handling.py
+++ b/portato/gui/gtk/exception_handling.py
@@ -11,7 +11,7 @@
#
# Written by René 'Necoro' Neumann
-from __future__ import absolute_import
+from __future__ import absolute_import, with_statement
import gtk, pango, gobject
import sys, traceback
@@ -20,7 +20,8 @@ from threading import Thread
from gettext import lgettext as _
from StringIO import StringIO
-from ...helper import error
+from ...helper import debug, error
+from .dialogs import file_chooser_dialog, io_ex_dialog
class GtkThread (Thread):
def run(self):
@@ -47,6 +48,7 @@ class UncaughtExceptionDialog(gtk.MessageDialog):
self.format_secondary_text(_("It probably isn't fatal, but should be reported to the developers nonetheless."))
self.add_button(_("Show Details"), 1)
+ self.add_button(gtk.STOCK_SAVE_AS, 2)
self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
# Details
@@ -66,10 +68,10 @@ class UncaughtExceptionDialog(gtk.MessageDialog):
self.vbox.add(self.tbFrame)
textbuffer = self.textview.get_buffer()
- text = get_trace(type, value, tb)
+ self.text = get_trace(type, value, tb)
if thread:
- text = _("Exception in thread \"%(thread)s\":\n%(trace)s") % {"thread": thread, "trace": text}
- textbuffer.set_text(text)
+ self.text = _("Exception in thread \"%(thread)s\":\n%(trace)s") % {"thread": thread, "trace": text}
+ textbuffer.set_text(self.text)
self.textview.set_size_request(gtk.gdk.screen_width()/2, gtk.gdk.screen_height()/3)
self.details = self.tbFrame
@@ -82,6 +84,20 @@ class UncaughtExceptionDialog(gtk.MessageDialog):
if resp == 1:
self.details.show_all()
self.set_response_sensitive(1, False)
+ elif resp == 2:
+ debug("Want to save")
+ file = file_chooser_dialog(_("Save traceback..."), self)
+ if file:
+ debug("Save to %s", file)
+
+ try:
+ with open(file, "w") as f:
+ f.writelines(self.text)
+ except IOError, e:
+ io_ex_dialog(e)
+
+ else:
+ debug("Nothing to save")
else:
break
self.destroy()