print traceback in waiting dialog
[electrum-nvc.git] / gui / qt / util.py
index 616ba2f..94a0898 100644 (file)
@@ -3,6 +3,42 @@ from PyQt4.QtGui import *
 from PyQt4.QtCore import *
 import os.path
 import time
+import traceback
+import sys
+import threading
+
+class WaitingDialog(QThread):
+    def __init__(self, parent, message, run_task, on_complete=None):
+        QThread.__init__(self)
+        self.parent = parent
+        self.d = QDialog(parent)
+        self.d.setWindowTitle('Please wait')
+        l = QLabel(message)
+        vbox = QVBoxLayout(self.d)
+        vbox.addWidget(l)
+        self.run_task = run_task
+        self.on_complete = on_complete
+        self.d.connect(self.d, SIGNAL('done'), self.close)
+        self.d.show()
+
+    def run(self):
+        self.error = None
+        try:
+            self.result = self.run_task()
+        except Exception as e:
+            traceback.print_exc(file=sys.stdout)
+            self.error = str(e)
+        self.d.emit(SIGNAL('done'))
+
+    def close(self):
+        self.d.accept()
+        if self.error:
+            QMessageBox.warning(self.parent, _('Error'), self.error, _('OK'))
+            return
+
+        if self.on_complete:
+            self.on_complete(*self.result)
+
 
 
 class Timer(QThread):
@@ -29,10 +65,20 @@ class EnterButton(QPushButton):
 class HelpButton(QPushButton):
     def __init__(self, text):
         QPushButton.__init__(self, '?')
+        self.help_text = text
         self.setFocusPolicy(Qt.NoFocus)
         self.setFixedWidth(20)
-        self.clicked.connect(lambda: QMessageBox.information(self, 'Help', text, 'OK') )
+        self.alt = None
+        self.clicked.connect(self.onclick)
 
+    def set_alt(self, func):
+        self.alt = func
+
+    def onclick(self):
+        if self.alt:
+            apply(self.alt)
+        else:
+            QMessageBox.information(self, 'Help', self.help_text, 'OK')
 
 
 
@@ -62,6 +108,7 @@ def ok_cancel_buttons(dialog, ok_label=_("OK") ):
     return hbox
 
 def text_dialog(parent, title, label, ok_label, default=None):
+    from qrtextedit import QRTextEdit
     dialog = QDialog(parent)
     dialog.setMinimumWidth(500)
     dialog.setWindowTitle(title)
@@ -69,7 +116,7 @@ def text_dialog(parent, title, label, ok_label, default=None):
     l = QVBoxLayout()
     dialog.setLayout(l)
     l.addWidget(QLabel(label))
-    txt = QTextEdit()
+    txt = QRTextEdit()
     if default:
         txt.setText(default)
     l.addWidget(txt)
@@ -158,3 +205,11 @@ class MyTreeWidget(QTreeWidget):
                 break
         self.emit(SIGNAL('customContextMenuRequested(const QPoint&)'), QPoint(50, i*5 + j - 1))
 
+
+
+
+if __name__ == "__main__":
+    app = QApplication([])
+    t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
+    t.start()
+    app.exec_()