simplified dialog for new file name
[electrum-nvc.git] / gui / qt / util.py
index 11ddf6f..c021e8b 100644 (file)
@@ -3,28 +3,44 @@ from PyQt4.QtGui import *
 from PyQt4.QtCore import *
 import os.path
 import time
-
+import traceback
+import sys
 import threading
 
-class WaitingDialog(QDialog):
-    def __init__(self, parent, message):
-        QDialog.__init__(self, parent)
-        self.setWindowTitle('Please wait')
+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)
+        vbox = QVBoxLayout(self.d)
         vbox.addWidget(l)
-        self.show()
+        self.run_task = run_task
+        self.on_complete = on_complete
+        self.d.connect(self.d, SIGNAL('done'), self.close)
+        self.d.show()
 
-    def start(self, run_thread, on_complete=None):
-        def my_thread():
-            self.result = run_thread()
-            self.emit(SIGNAL('done'))
-            self.accept()
+    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 on_complete:
-            self.connect(self, SIGNAL('done'), lambda: on_complete(*self.result))
-        
-        threading.Thread(target=my_thread).start()
+        if self.on_complete:
+            if type(self.result) is tuple:
+                self.on_complete(*self.result)
+            else:
+                self.on_complete(self.result)
 
 
 
@@ -52,10 +68,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')
 
 
 
@@ -84,7 +110,24 @@ def ok_cancel_buttons(dialog, ok_label=_("OK") ):
     hbox, b = ok_cancel_buttons2(dialog, ok_label)
     return hbox
 
+def line_dialog(parent, title, label, ok_label, default=None):
+    dialog = QDialog(parent)
+    dialog.setMinimumWidth(500)
+    dialog.setWindowTitle(title)
+    dialog.setModal(1)
+    l = QVBoxLayout()
+    dialog.setLayout(l)
+    l.addWidget(QLabel(label))
+    txt = QLineEdit()
+    if default:
+        txt.setText(default)
+    l.addWidget(txt)
+    l.addLayout(ok_cancel_buttons(dialog, ok_label))
+    if dialog.exec_():
+        return unicode(txt.text())
+
 def text_dialog(parent, title, label, ok_label, default=None):
+    from qrtextedit import QRTextEdit
     dialog = QDialog(parent)
     dialog.setMinimumWidth(500)
     dialog.setWindowTitle(title)
@@ -92,7 +135,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)
@@ -186,5 +229,6 @@ class MyTreeWidget(QTreeWidget):
 
 if __name__ == "__main__":
     app = QApplication([])
-    WaitingDialog(None, 'testing ...').start(lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
+    t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
+    t.start()
     app.exec_()