electrum-bitcoinprivate/gui/qt/util.py

214 lines
5.6 KiB
Python
Raw Normal View History

from electrum.i18n import _
from PyQt4.QtGui import *
from PyQt4.QtCore import *
2013-06-01 02:06:51 -07:00
import os.path
2013-08-29 07:07:55 -07:00
import time
import threading
class WaitingDialog(QThread):
def __init__(self, parent, message, run_task, on_complete=None):
QThread.__init__(self)
2014-05-25 20:40:04 -07:00
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
2014-05-25 20:40:04 -07:00
self.on_complete = on_complete
self.d.connect(self.d, SIGNAL('done'), self.close)
self.d.show()
def run(self):
2014-06-16 09:06:39 -07:00
self.error = None
try:
self.result = self.run_task()
except Exception as e:
self.error = str(e)
self.d.emit(SIGNAL('done'))
2014-05-25 20:40:04 -07:00
def close(self):
self.d.accept()
2014-06-16 09:06:39 -07:00
if self.error:
QMessageBox.warning(self.parent, _('Error'), self.error, _('OK'))
return
2014-05-25 20:40:04 -07:00
if self.on_complete:
self.on_complete(*self.result)
2013-08-29 07:07:55 -07:00
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,())
2014-03-28 09:05:34 -07:00
2013-08-29 07:07:55 -07:00
class HelpButton(QPushButton):
def __init__(self, text):
QPushButton.__init__(self, '?')
self.help_text = text
2013-08-29 07:07:55 -07:00
self.setFocusPolicy(Qt.NoFocus)
self.setFixedWidth(20)
2014-06-07 10:53:54 -07:00
self.alt = None
self.clicked.connect(self.onclick)
2014-06-07 10:53:54 -07:00
def set_alt(self, func):
self.alt = func
2013-08-29 07:07:55 -07:00
2014-06-07 10:53:54 -07:00
def onclick(self):
if self.alt:
apply(self.alt)
else:
QMessageBox.information(self, 'Help', self.help_text, 'OK')
2013-08-29 07:07:55 -07:00
2013-06-01 02:06:51 -07:00
2013-09-23 07:14:28 -07:00
def close_button(dialog, label=_("Close") ):
hbox = QHBoxLayout()
hbox.addStretch(1)
b = QPushButton(label)
hbox.addWidget(b)
b.clicked.connect(dialog.close)
b.setDefault(True)
return hbox
2014-04-19 11:23:27 -07:00
def ok_cancel_buttons2(dialog, ok_label=_("OK") ):
hbox = QHBoxLayout()
hbox.addStretch(1)
b = QPushButton(_("Cancel"))
hbox.addWidget(b)
b.clicked.connect(dialog.reject)
b = QPushButton(ok_label)
hbox.addWidget(b)
b.clicked.connect(dialog.accept)
b.setDefault(True)
2014-04-19 11:23:27 -07:00
return hbox, b
def ok_cancel_buttons(dialog, ok_label=_("OK") ):
hbox, b = ok_cancel_buttons2(dialog, ok_label)
return hbox
def text_dialog(parent, title, label, ok_label, default=None):
2014-06-14 03:17:44 -07:00
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))
2014-06-14 03:17:44 -07:00
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())
2014-05-05 00:58:29 -07:00
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
2014-05-05 02:31:04 -07:00
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
2014-05-05 00:58:29 -07:00
class MyTreeWidget(QTreeWidget):
def __init__(self, parent):
QTreeWidget.__init__(self, parent)
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.connect(self, SIGNAL('itemActivated(QTreeWidgetItem*, int)'), self.itemactivated)
def itemactivated(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))
2014-05-24 13:06:43 -07:00
if __name__ == "__main__":
app = QApplication([])
2014-05-25 20:40:04 -07:00
t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
t.start()
2014-05-24 13:06:43 -07:00
app.exec_()