You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
6.3 KiB
234 lines
6.3 KiB
from electrum.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): |
|
def run(self): |
|
while True: |
|
self.emit(SIGNAL('timersignal')) |
|
time.sleep(0.5) |
|
|
|
|
|
class EnterButton(QPushButton): |
|
def __init__(self, text, func): |
|
QPushButton.__init__(self, text) |
|
self.func = func |
|
self.clicked.connect(func) |
|
|
|
def keyPressEvent(self, e): |
|
if e.key() == Qt.Key_Return: |
|
apply(self.func,()) |
|
|
|
|
|
|
|
|
|
|
|
class HelpButton(QPushButton): |
|
def __init__(self, text): |
|
QPushButton.__init__(self, '?') |
|
self.help_text = text |
|
self.setFocusPolicy(Qt.NoFocus) |
|
self.setFixedWidth(20) |
|
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') |
|
|
|
|
|
|
|
def close_button(dialog, label=None): |
|
hbox = QHBoxLayout() |
|
hbox.addStretch(1) |
|
b = QPushButton(label or _("Close")) |
|
hbox.addWidget(b) |
|
b.clicked.connect(dialog.close) |
|
b.setDefault(True) |
|
return hbox |
|
|
|
def ok_cancel_buttons2(dialog, ok_label=None, cancel_label=None): |
|
hbox = QHBoxLayout() |
|
hbox.addStretch(1) |
|
b = QPushButton(cancel_label or _('Cancel')) |
|
hbox.addWidget(b) |
|
b.clicked.connect(dialog.reject) |
|
b = QPushButton(ok_label or _("OK")) |
|
hbox.addWidget(b) |
|
b.clicked.connect(dialog.accept) |
|
b.setDefault(True) |
|
return hbox, b |
|
|
|
def ok_cancel_buttons(dialog, ok_label=None, cancel_label=None): |
|
hbox, b = ok_cancel_buttons2(dialog, ok_label, cancel_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) |
|
dialog.setModal(1) |
|
l = QVBoxLayout() |
|
dialog.setLayout(l) |
|
l.addWidget(QLabel(label)) |
|
txt = QRTextEdit() |
|
if default: |
|
txt.setText(default) |
|
l.addWidget(txt) |
|
l.addLayout(ok_cancel_buttons(dialog, ok_label)) |
|
if dialog.exec_(): |
|
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) |
|
self.setContextMenuPolicy(Qt.CustomContextMenu) |
|
self.itemActivated.connect(self.on_activated) |
|
|
|
def on_activated(self, item): |
|
if not item: return |
|
for i in range(0,self.viewport().height()/5): |
|
if self.itemAt(QPoint(0,i*5)) == item: |
|
break |
|
else: |
|
return |
|
for j in range(0,30): |
|
if self.itemAt(QPoint(0,i*5 + j)) != item: |
|
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_()
|
|
|