update trezor plugin waiting dialog

update waiting dialog so that ok/cancel doesn't need to be used on the
GUI, only on the trezor device
This commit is contained in:
Michael Wozniak 2014-08-02 23:18:02 -04:00
parent 14f00609aa
commit 6206da00e0
1 changed files with 44 additions and 5 deletions

View File

@ -1,7 +1,8 @@
from PyQt4.Qt import QMessageBox, QDialog, QVBoxLayout, QLabel
from PyQt4.Qt import QMessageBox, QDialog, QVBoxLayout, QLabel, QThread, SIGNAL, QObject
from binascii import unhexlify
from struct import pack
from sys import stderr
from time import sleep
from electrum_gui.qt.password_dialog import make_password_dialog, run_password_dialog
from electrum_gui.qt.util import ok_cancel_buttons
@ -27,6 +28,8 @@ def log(msg):
stderr.write("%s\n" % msg)
stderr.flush()
gl_emitter = QObject()
window_open = False
class Plugin(BasePlugin):
@ -174,6 +177,7 @@ class TrezorWallet(NewWallet):
inputs = self.tx_inputs(tx)
outputs = self.tx_outputs(tx)
signed_tx = self.get_client().sign_tx('Bitcoin', inputs, outputs)[1]
gl_emitter.emit(SIGNAL('trezor_done'))
values = [i['value'] for i in tx.inputs]
raw = signed_tx.encode('hex')
tx.update(raw)
@ -280,10 +284,16 @@ class TrezorQtGuiMixin(object):
super(TrezorQtGuiMixin, self).__init__(*args, **kwargs)
def callback_ButtonRequest(self, msg):
i = QMessageBox.question(None, _('Trezor'), _("Please check request on Trezor's screen"), _('OK'), _('Cancel'))
if i == 0:
return proto.ButtonAck()
return proto.Cancel()
if window_open:
gl_emitter.emit(SIGNAL('trezor_done'))
if msg.code == 3:
message = "Confirm transaction outputs on Trezor device to continue"
elif msg.code == 8:
message = "Confirm transaction fee on Trezor device to continue"
else:
message = "Check Trezor device to continue"
twd.start(message)
return proto.ButtonAck()
def callback_PinMatrixRequest(self, msg):
if msg.type == 1:
@ -339,6 +349,32 @@ class TrezorQtGuiMixin(object):
if not d.exec_(): return
return str(matrix.get_value())
class TrezorWaitingDialog(QThread):
def __init__(self):
QThread.__init__(self)
def start(self, message):
self.done = False
self.d = QDialog()
self.d.setModal(True)
self.d.setWindowTitle('Please Check Trezor Device')
l = QLabel(message)
vbox = QVBoxLayout(self.d)
vbox.addWidget(l)
self.d.show()
window_open = True
self.d.connect(gl_emitter, SIGNAL('trezor_done'), self.stop)
def run(self):
while not self.done:
sleep(0.1)
def stop(self):
self.d.hide()
window_open = False
self.done = True
if TREZOR:
class QtGuiTrezorClient(ProtocolMixin, TrezorQtGuiMixin, BaseClient):
def call_raw(self, msg):
@ -349,3 +385,6 @@ if TREZOR:
raise
return resp
twd = TrezorWaitingDialog()