New port numbers
[electrum-nvc.git] / plugins / virtualkeyboard.py
1 from PyQt4.QtGui import *
2 from electrum_nvc import BasePlugin
3 from electrum_nvc.i18n import _
4
5 class Plugin(BasePlugin):
6
7
8     def fullname(self):
9         return 'Virtual Keyboard'
10
11     def description(self):
12         return '%s\n%s' % (_("Add an optional virtual keyboard to the password dialog."), _("Warning: do not use this if it makes you pick a weaker password."))
13
14     def init(self):
15         self.vkb = None
16         self.vkb_index = 0
17
18
19     def password_dialog(self, pw, grid, pos):
20         vkb_button = QPushButton(_("+"))
21         vkb_button.setFixedWidth(20)
22         vkb_button.clicked.connect(lambda: self.toggle_vkb(grid, pw))
23         grid.addWidget(vkb_button, pos, 2)
24         self.kb_pos = 2
25
26
27     def toggle_vkb(self, grid, pw):
28         if self.vkb: grid.removeItem(self.vkb)
29         self.vkb = self.virtual_keyboard(self.vkb_index, pw)
30         grid.addLayout(self.vkb, self.kb_pos, 0, 1, 3)
31         self.vkb_index += 1
32
33
34     def virtual_keyboard(self, i, pw):
35         import random
36         i = i%3
37         if i == 0:
38             chars = 'abcdefghijklmnopqrstuvwxyz '
39         elif i == 1:
40             chars = 'ABCDEFGHIJKLMNOPQRTSUVWXYZ '
41         elif i == 2:
42             chars = '1234567890!?.,;:/%&()[]{}+-'
43             
44         n = len(chars)
45         s = []
46         for i in xrange(n):
47             while True:
48                 k = random.randint(0,n-1)
49                 if k not in s:
50                     s.append(k)
51                     break
52
53         def add_target(t):
54             return lambda: pw.setText(str( pw.text() ) + t)
55             
56         vbox = QVBoxLayout()
57         grid = QGridLayout()
58         grid.setSpacing(2)
59         for i in range(n):
60             l_button = QPushButton(chars[s[i]])
61             l_button.setFixedWidth(25)
62             l_button.setFixedHeight(25)
63             l_button.clicked.connect(add_target(chars[s[i]]) )
64             grid.addWidget(l_button, i/6, i%6)
65
66         vbox.addLayout(grid)
67
68         return vbox
69