From ecf0a5854de72186cab3d07b59993227f56a9212 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Thu, 10 Oct 2024 20:11:35 +0000 Subject: [PATCH] hw plugins: adapt trezor_qt_pinmatrix.py to qt6 This fixes the pinmatrix dialog (used by trezor one, keepkey, safet), which was previously segfaulting. follow-up https://github.com/spesmilo/electrum/pull/9189 --- .../plugins/hw_wallet/trezor_qt_pinmatrix.py | 103 ++++-------------- electrum/plugins/keepkey/qt.py | 7 +- electrum/plugins/safe_t/qt.py | 7 +- electrum/plugins/trezor/qt.py | 2 +- 4 files changed, 30 insertions(+), 89 deletions(-) diff --git a/electrum/plugins/hw_wallet/trezor_qt_pinmatrix.py b/electrum/plugins/hw_wallet/trezor_qt_pinmatrix.py index fdde22d2f..3458c38f3 100644 --- a/electrum/plugins/hw_wallet/trezor_qt_pinmatrix.py +++ b/electrum/plugins/hw_wallet/trezor_qt_pinmatrix.py @@ -17,37 +17,21 @@ # If not, see . import math -import sys from typing import Any -try: - from PyQt5.QtCore import QT_VERSION_STR, QRegExp, Qt - from PyQt5.QtGui import QRegExpValidator - from PyQt5.QtWidgets import ( - QApplication, - QGridLayout, - QHBoxLayout, - QLabel, - QLineEdit, - QPushButton, - QSizePolicy, - QVBoxLayout, - QWidget, - ) -except Exception: - from PyQt4.QtCore import QT_VERSION_STR, SIGNAL, QObject, QRegExp, Qt # noqa: I - from PyQt4.QtGui import ( # noqa: I - QApplication, - QGridLayout, - QHBoxLayout, - QLabel, - QLineEdit, - QPushButton, - QRegExpValidator, - QSizePolicy, - QVBoxLayout, - QWidget, - ) +from PyQt6.QtCore import QRegularExpression, Qt +from PyQt6.QtGui import QRegularExpressionValidator +from PyQt6.QtWidgets import ( + QGridLayout, + QHBoxLayout, + QLabel, + QLineEdit, + QPushButton, + QSizePolicy, + QVBoxLayout, + QWidget, +) + class PinButton(QPushButton): @@ -56,12 +40,7 @@ class PinButton(QPushButton): self.password = password self.encoded_value = encoded_value - if QT_VERSION_STR >= "5": - self.clicked.connect(self._pressed) - elif QT_VERSION_STR >= "4": - QObject.connect(self, SIGNAL("clicked()"), self._pressed) - else: - raise RuntimeError("Unsupported Qt version") + self.clicked.connect(self._pressed) def _pressed(self) -> None: self.password.setText(self.password.text() + str(self.encoded_value)) @@ -81,21 +60,14 @@ class PinMatrixWidget(QWidget): super(PinMatrixWidget, self).__init__(parent) self.password = QLineEdit() - self.password.setValidator(QRegExpValidator(QRegExp("[1-9]+"), None)) - self.password.setEchoMode(QLineEdit.Password) - - if QT_VERSION_STR >= "5": - self.password.textChanged.connect(self._password_changed) - elif QT_VERSION_STR >= "4": - QObject.connect( - self.password, SIGNAL("textChanged(QString)"), self._password_changed - ) - else: - raise RuntimeError("Unsupported Qt version") + self.password.setValidator(QRegularExpressionValidator(QRegularExpression("[1-9]+"), None)) + self.password.setEchoMode(QLineEdit.EchoMode.Password) + + self.password.textChanged.connect(self._password_changed) self.strength = QLabel() self.strength.setMinimumWidth(75) - self.strength.setAlignment(Qt.AlignCenter) + self.strength.setAlignment(Qt.AlignmentFlag.AlignCenter) self._set_strength(0) grid = QGridLayout() @@ -103,8 +75,8 @@ class PinMatrixWidget(QWidget): for y in range(3)[::-1]: for x in range(3): button = PinButton(self.password, x + y * 3 + 1) - button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - button.setFocusPolicy(Qt.NoFocus) + button.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + button.setFocusPolicy(Qt.FocusPolicy.NoFocus) grid.addWidget(button, 3 - y, x) hbox = QHBoxLayout() @@ -141,36 +113,3 @@ class PinMatrixWidget(QWidget): def get_value(self) -> str: return self.password.text() - - -if __name__ == "__main__": - """ - Demo application showing PinMatrix widget in action - """ - app = QApplication(sys.argv) - - matrix = PinMatrixWidget() - - def clicked() -> None: - print("PinMatrix value is", matrix.get_value()) - print("Possible button combinations:", matrix.get_strength()) - sys.exit() - - ok = QPushButton("OK") - if QT_VERSION_STR >= "5": - ok.clicked.connect(clicked) - elif QT_VERSION_STR >= "4": - QObject.connect(ok, SIGNAL("clicked()"), clicked) - else: - raise RuntimeError("Unsupported Qt version") - - vbox = QVBoxLayout() - vbox.addWidget(matrix) - vbox.addWidget(ok) - - w = QWidget() - w.setLayout(vbox) - w.move(100, 100) - w.show() - - app.exec_() diff --git a/electrum/plugins/keepkey/qt.py b/electrum/plugins/keepkey/qt.py index e162ee138..5ef9aa79b 100644 --- a/electrum/plugins/keepkey/qt.py +++ b/electrum/plugins/keepkey/qt.py @@ -15,8 +15,10 @@ from electrum.i18n import _ from electrum.plugin import hook from electrum.logging import Logger -from ..hw_wallet.qt import QtHandlerBase, QtPluginBase -from ..hw_wallet.plugin import only_hook_if_libraries_available +from electrum.plugins.hw_wallet.qt import QtHandlerBase, QtPluginBase +from electrum.plugins.hw_wallet.trezor_qt_pinmatrix import PinMatrixWidget +from electrum.plugins.hw_wallet.plugin import only_hook_if_libraries_available + from .keepkey import KeepKeyPlugin, TIM_NEW, TIM_RECOVER, TIM_MNEMONIC, TIM_PRIVKEY from electrum.gui.qt.wizard.wallet import WCScriptAndDerivation, WCHWUnlock, WCHWXPub, WalletWizardComponent @@ -318,7 +320,6 @@ class Plugin(KeepKeyPlugin, QtPlugin): @classmethod def pin_matrix_widget_class(self): - from keepkeylib.qt.pinmatrix import PinMatrixWidget return PinMatrixWidget @hook diff --git a/electrum/plugins/safe_t/qt.py b/electrum/plugins/safe_t/qt.py index 34860da7d..dcba42f2d 100644 --- a/electrum/plugins/safe_t/qt.py +++ b/electrum/plugins/safe_t/qt.py @@ -15,8 +15,10 @@ from electrum.i18n import _ from electrum.plugin import hook from electrum.logging import Logger -from ..hw_wallet.qt import QtHandlerBase, QtPluginBase -from ..hw_wallet.plugin import only_hook_if_libraries_available +from electrum.plugins.hw_wallet.qt import QtHandlerBase, QtPluginBase +from electrum.plugins.hw_wallet.trezor_qt_pinmatrix import PinMatrixWidget +from electrum.plugins.hw_wallet.plugin import only_hook_if_libraries_available + from .safe_t import SafeTPlugin, TIM_NEW, TIM_RECOVER, TIM_MNEMONIC, TIM_PRIVKEY from electrum.gui.qt.wizard.wallet import WCScriptAndDerivation, WCHWUnlock, WCHWXPub, WalletWizardComponent @@ -194,7 +196,6 @@ class Plugin(SafeTPlugin, QtPlugin): @classmethod def pin_matrix_widget_class(self): - from safetlib.qt.pinmatrix import PinMatrixWidget return PinMatrixWidget @hook diff --git a/electrum/plugins/trezor/qt.py b/electrum/plugins/trezor/qt.py index 9dba1f5c5..cdd983ab9 100644 --- a/electrum/plugins/trezor/qt.py +++ b/electrum/plugins/trezor/qt.py @@ -14,6 +14,7 @@ from electrum.plugin import hook from electrum.keystore import ScriptTypeNotSupported from electrum.plugins.hw_wallet.qt import QtHandlerBase, QtPluginBase +from electrum.plugins.hw_wallet.trezor_qt_pinmatrix import PinMatrixWidget from electrum.plugins.hw_wallet.plugin import only_hook_if_libraries_available, OutdatedHwFirmwareException from electrum.gui.qt.util import (WindowModalDialog, WWLabel, Buttons, CancelButton, @@ -462,7 +463,6 @@ class Plugin(TrezorPlugin, QtPlugin): @classmethod def pin_matrix_widget_class(self): - from trezorlib.qt.pinmatrix import PinMatrixWidget return PinMatrixWidget @hook