Neil Booth
9 years ago
3 changed files with 107 additions and 165 deletions
@ -0,0 +1,91 @@ |
|||||
|
from unicodedata import normalize |
||||
|
import threading |
||||
|
|
||||
|
from PyQt4.Qt import QVBoxLayout, QLabel, SIGNAL |
||||
|
import PyQt4.QtCore as QtCore |
||||
|
from electrum_gui.qt.main_window import ElectrumWindow |
||||
|
from electrum_gui.qt.installwizard import InstallWizard |
||||
|
from electrum_gui.qt.password_dialog import PasswordDialog |
||||
|
from electrum_gui.qt.util import * |
||||
|
|
||||
|
from electrum.i18n import _ |
||||
|
|
||||
|
class QtHandler: |
||||
|
'''An interface between the GUI (here, QT) and the device handling |
||||
|
logic for handling I/O. This is a generic implementation of the |
||||
|
Trezor protocol; derived classes can customize it.''' |
||||
|
|
||||
|
# Derived classes must provide: |
||||
|
# device a string, e.g. "Trezor" |
||||
|
# pin_matrix_widget_class |
||||
|
|
||||
|
def __init__(self, win): |
||||
|
win.connect(win, SIGNAL('message_done'), self.dialog_stop) |
||||
|
win.connect(win, SIGNAL('message_dialog'), self.message_dialog) |
||||
|
win.connect(win, SIGNAL('pin_dialog'), self.pin_dialog) |
||||
|
win.connect(win, SIGNAL('passphrase_dialog'), self.passphrase_dialog) |
||||
|
self.win = win |
||||
|
self.done = threading.Event() |
||||
|
self.dialog = None |
||||
|
|
||||
|
def stop(self): |
||||
|
self.win.emit(SIGNAL('message_done')) |
||||
|
|
||||
|
def show_message(self, msg): |
||||
|
self.win.emit(SIGNAL('message_dialog'), msg) |
||||
|
|
||||
|
def get_pin(self, msg): |
||||
|
self.done.clear() |
||||
|
self.win.emit(SIGNAL('pin_dialog'), msg) |
||||
|
self.done.wait() |
||||
|
return self.response |
||||
|
|
||||
|
def get_passphrase(self, msg): |
||||
|
self.done.clear() |
||||
|
self.win.emit(SIGNAL('passphrase_dialog'), msg) |
||||
|
self.done.wait() |
||||
|
return self.passphrase |
||||
|
|
||||
|
def pin_dialog(self, msg): |
||||
|
d = WindowModalDialog(self.win, _("Enter PIN")) |
||||
|
matrix = self.pin_matrix_widget_class() |
||||
|
vbox = QVBoxLayout() |
||||
|
vbox.addWidget(QLabel(msg)) |
||||
|
vbox.addWidget(matrix) |
||||
|
vbox.addLayout(Buttons(CancelButton(d), OkButton(d))) |
||||
|
d.setLayout(vbox) |
||||
|
if not d.exec_(): |
||||
|
self.response = None # FIXME: this is lost? |
||||
|
self.response = str(matrix.get_value()) |
||||
|
self.done.set() |
||||
|
|
||||
|
def passphrase_dialog(self, msg): |
||||
|
if type(self.win) is ElectrumWindow: |
||||
|
msg = _("Please enter your %s passphrase") % self.device |
||||
|
passphrase = self.win.password_dialog(msg) |
||||
|
else: |
||||
|
assert type(self.win) is InstallWizard |
||||
|
d = PasswordDialog(self.win, None, None, msg, False) |
||||
|
confirmed, p, passphrase = d.run() |
||||
|
|
||||
|
if passphrase is None: |
||||
|
self.win.show_critical(_("Passphrase request canceled")) |
||||
|
else: |
||||
|
passphrase = normalize('NFKD', unicode(passphrase)) |
||||
|
self.passphrase = passphrase |
||||
|
self.done.set() |
||||
|
|
||||
|
def message_dialog(self, msg): |
||||
|
# Called more than once during signing, to confirm output and fee |
||||
|
self.dialog_stop() |
||||
|
msg = _('Please check your %s Device') % self.device |
||||
|
self.dialog = WindowModalDialog(self.win, msg) |
||||
|
l = QLabel(msg) |
||||
|
vbox = QVBoxLayout(self.dialog) |
||||
|
vbox.addWidget(l) |
||||
|
self.dialog.show() |
||||
|
|
||||
|
def dialog_stop(self): |
||||
|
if self.dialog: |
||||
|
self.dialog.hide() |
||||
|
self.dialog = None |
Loading…
Reference in new issue