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.
67 lines
1.9 KiB
67 lines
1.9 KiB
import random |
|
|
|
from PyQt5.QtWidgets import (QVBoxLayout, QGridLayout, QPushButton) |
|
from PyQt5.QtGui import QFontMetrics |
|
|
|
from electrum.plugin import BasePlugin, hook |
|
from electrum.i18n import _ |
|
|
|
|
|
class Plugin(BasePlugin): |
|
vkb = None |
|
vkb_index = 0 |
|
|
|
@hook |
|
def password_dialog(self, pw, grid, pos): |
|
vkb_button = QPushButton("+") |
|
font_height = QFontMetrics(vkb_button.font()).height() |
|
vkb_button.setFixedWidth(round(1.7 * font_height)) |
|
vkb_button.clicked.connect(lambda: self.toggle_vkb(grid, pw)) |
|
grid.addWidget(vkb_button, pos, 2) |
|
self.kb_pos = 2 |
|
self.vkb = None |
|
|
|
def toggle_vkb(self, grid, pw): |
|
if self.vkb: |
|
grid.removeItem(self.vkb) |
|
self.vkb = self.virtual_keyboard(self.vkb_index, pw) |
|
grid.addLayout(self.vkb, self.kb_pos, 0, 1, 3) |
|
self.vkb_index += 1 |
|
|
|
def virtual_keyboard(self, i, pw): |
|
i = i % 3 |
|
if i == 0: |
|
chars = 'abcdefghijklmnopqrstuvwxyz ' |
|
elif i == 1: |
|
chars = 'ABCDEFGHIJKLMNOPQRTSUVWXYZ ' |
|
elif i == 2: |
|
chars = '1234567890!?.,;:/%&()[]{}+-' |
|
|
|
n = len(chars) |
|
s = [] |
|
for i in range(n): |
|
while True: |
|
k = random.randint(0, n - 1) |
|
if k not in s: |
|
s.append(k) |
|
break |
|
|
|
def add_target(t): |
|
return lambda: pw.setText(str(pw.text()) + t) |
|
|
|
font_height = QFontMetrics(QPushButton().font()).height() |
|
btn_size = max(25, round(1.7 * font_height)) |
|
|
|
vbox = QVBoxLayout() |
|
grid = QGridLayout() |
|
grid.setSpacing(2) |
|
for i in range(n): |
|
l_button = QPushButton(chars[s[i]]) |
|
l_button.setFixedWidth(btn_size) |
|
l_button.setFixedHeight(btn_size) |
|
l_button.clicked.connect(add_target(chars[s[i]])) |
|
grid.addWidget(l_button, i // 6, i % 6) |
|
|
|
vbox.addLayout(grid) |
|
|
|
return vbox
|
|
|