Initial novacoin support
[electrum-nvc.git] / gui / qt / util.py
index 275cfa5..c61c022 100644 (file)
@@ -1,8 +1,47 @@
-from electrum.i18n import _
+from electrum_nvc.i18n import _
 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:
+            if type(self.result) is tuple:
+                self.on_complete(*self.result)
+            else:
+                self.on_complete(self.result)
+
 
 
 class Timer(QThread):
@@ -29,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')
 
 
 
@@ -61,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)
@@ -69,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)
@@ -79,7 +145,6 @@ def text_dialog(parent, title, label, ok_label, default=None):
 
 
 
-
 def address_field(addresses):
     hbox = QHBoxLayout()
     address_e = QLineEdit()
@@ -95,7 +160,49 @@ def address_field(addresses):
     hbox.addWidget(address_e)
     return hbox, address_e
 
-    
+
+def filename_field(parent, config, defaultname, select_msg):
+
+    vbox = QVBoxLayout()
+    vbox.addWidget(QLabel(_("Format")))
+    gb = QGroupBox("format", parent)
+    b1 = QRadioButton(gb)
+    b1.setText(_("CSV"))
+    b1.setChecked(True)
+    b2 = QRadioButton(gb)
+    b2.setText(_("json"))
+    vbox.addWidget(b1)
+    vbox.addWidget(b2)
+        
+    hbox = QHBoxLayout()
+
+    directory = config.get('io_dir', unicode(os.path.expanduser('~')))
+    path = os.path.join( directory, defaultname )
+    filename_e = QLineEdit()
+    filename_e.setText(path)
+
+    def func():
+        text = unicode(filename_e.text())
+        _filter = "*.csv" if text.endswith(".csv") else "*.json" if text.endswith(".json") else None
+        p = unicode( QFileDialog.getSaveFileName(None, select_msg, text, _filter))
+        if p:
+            filename_e.setText(p)
+
+    button = QPushButton(_('File'))
+    button.clicked.connect(func)
+    hbox.addWidget(button)
+    hbox.addWidget(filename_e)
+    vbox.addLayout(hbox)
+
+    def set_csv(v):
+        text = unicode(filename_e.text())
+        text = text.replace(".json",".csv") if v else text.replace(".csv",".json")
+        filename_e.setText(text)
+
+    b1.clicked.connect(lambda: set_csv(True))
+    b2.clicked.connect(lambda: set_csv(False))
+
+    return vbox, filename_e, b1
 
 
 
@@ -117,3 +224,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_()