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):
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')
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)
l = QVBoxLayout()
dialog.setLayout(l)
l.addWidget(QLabel(label))
- txt = QTextEdit()
+ txt = QRTextEdit()
if default:
txt.setText(default)
l.addWidget(txt)
return unicode(txt.toPlainText())
+
+def address_field(addresses):
+ hbox = QHBoxLayout()
+ address_e = QLineEdit()
+ if addresses:
+ address_e.setText(addresses[0])
+ def func():
+ i = addresses.index(str(address_e.text())) + 1
+ i = i % len(addresses)
+ address_e.setText(addresses[i])
+ button = QPushButton(_('Address'))
+ button.clicked.connect(func)
+ hbox.addWidget(button)
+ 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
+
+
+
class MyTreeWidget(QTreeWidget):
def __init__(self, parent):
QTreeWidget.__init__(self, parent)
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_()