payment request: show status with help button
[electrum-nvc.git] / gui / qt / util.py
1 from electrum.i18n import _
2 from PyQt4.QtGui import *
3 from PyQt4.QtCore import *
4 import os.path
5 import time
6
7 import threading
8
9 class WaitingDialog(QThread):
10     def __init__(self, parent, message, run_task, on_complete=None):
11         QThread.__init__(self)
12         self.parent = parent
13         self.d = QDialog(parent)
14         self.d.setWindowTitle('Please wait')
15         l = QLabel(message)
16         vbox = QVBoxLayout(self.d)
17         vbox.addWidget(l)
18         self.run_task = run_task
19         self.on_complete = on_complete
20         self.d.connect(self.d, SIGNAL('done'), self.close)
21         self.d.show()
22
23     def run(self):
24         self.result = self.run_task()
25         self.d.emit(SIGNAL('done'))
26
27     def close(self):
28         self.d.accept()
29         if self.on_complete:
30             self.on_complete(*self.result)
31
32
33
34 class Timer(QThread):
35     def run(self):
36         while True:
37             self.emit(SIGNAL('timersignal'))
38             time.sleep(0.5)
39
40
41 class EnterButton(QPushButton):
42     def __init__(self, text, func):
43         QPushButton.__init__(self, text)
44         self.func = func
45         self.clicked.connect(func)
46
47     def keyPressEvent(self, e):
48         if e.key() == Qt.Key_Return:
49             apply(self.func,())
50
51
52
53
54
55 class HelpButton(QPushButton):
56     def __init__(self, text):
57         QPushButton.__init__(self, '?')
58         self.help_text = text
59         self.alt_text = None
60         self.setFocusPolicy(Qt.NoFocus)
61         self.setFixedWidth(20)
62         self.clicked.connect(lambda: QMessageBox.information(self, 'Help', self.get_text(), 'OK') )
63
64     def get_text(self):
65         return self.alt_text if self.alt_text else self.help_text
66
67     def set_alt(self, t):
68         self.alt_text = t
69
70
71
72
73 def close_button(dialog, label=_("Close") ):
74     hbox = QHBoxLayout()
75     hbox.addStretch(1)
76     b = QPushButton(label)
77     hbox.addWidget(b)
78     b.clicked.connect(dialog.close)
79     b.setDefault(True)
80     return hbox
81
82 def ok_cancel_buttons2(dialog, ok_label=_("OK") ):
83     hbox = QHBoxLayout()
84     hbox.addStretch(1)
85     b = QPushButton(_("Cancel"))
86     hbox.addWidget(b)
87     b.clicked.connect(dialog.reject)
88     b = QPushButton(ok_label)
89     hbox.addWidget(b)
90     b.clicked.connect(dialog.accept)
91     b.setDefault(True)
92     return hbox, b
93
94 def ok_cancel_buttons(dialog, ok_label=_("OK") ):
95     hbox, b = ok_cancel_buttons2(dialog, ok_label)
96     return hbox
97
98 def text_dialog(parent, title, label, ok_label, default=None):
99     dialog = QDialog(parent)
100     dialog.setMinimumWidth(500)
101     dialog.setWindowTitle(title)
102     dialog.setModal(1)
103     l = QVBoxLayout()
104     dialog.setLayout(l)
105     l.addWidget(QLabel(label))
106     txt = QTextEdit()
107     if default:
108         txt.setText(default)
109     l.addWidget(txt)
110     l.addLayout(ok_cancel_buttons(dialog, ok_label))
111     if dialog.exec_():
112         return unicode(txt.toPlainText())
113
114
115
116 def address_field(addresses):
117     hbox = QHBoxLayout()
118     address_e = QLineEdit()
119     if addresses:
120         address_e.setText(addresses[0])
121     def func():
122         i = addresses.index(str(address_e.text())) + 1
123         i = i % len(addresses)
124         address_e.setText(addresses[i])
125     button = QPushButton(_('Address'))
126     button.clicked.connect(func)
127     hbox.addWidget(button)
128     hbox.addWidget(address_e)
129     return hbox, address_e
130
131
132 def filename_field(parent, config, defaultname, select_msg):
133
134     vbox = QVBoxLayout()
135     vbox.addWidget(QLabel(_("Format")))
136     gb = QGroupBox("format", parent)
137     b1 = QRadioButton(gb)
138     b1.setText(_("CSV"))
139     b1.setChecked(True)
140     b2 = QRadioButton(gb)
141     b2.setText(_("json"))
142     vbox.addWidget(b1)
143     vbox.addWidget(b2)
144         
145     hbox = QHBoxLayout()
146
147     directory = config.get('io_dir', unicode(os.path.expanduser('~')))
148     path = os.path.join( directory, defaultname )
149     filename_e = QLineEdit()
150     filename_e.setText(path)
151
152     def func():
153         text = unicode(filename_e.text())
154         _filter = "*.csv" if text.endswith(".csv") else "*.json" if text.endswith(".json") else None
155         p = unicode( QFileDialog.getSaveFileName(None, select_msg, text, _filter))
156         if p:
157             filename_e.setText(p)
158
159     button = QPushButton(_('File'))
160     button.clicked.connect(func)
161     hbox.addWidget(button)
162     hbox.addWidget(filename_e)
163     vbox.addLayout(hbox)
164
165     def set_csv(v):
166         text = unicode(filename_e.text())
167         text = text.replace(".json",".csv") if v else text.replace(".csv",".json")
168         filename_e.setText(text)
169
170     b1.clicked.connect(lambda: set_csv(True))
171     b2.clicked.connect(lambda: set_csv(False))
172
173     return vbox, filename_e, b1
174
175
176
177 class MyTreeWidget(QTreeWidget):
178     def __init__(self, parent):
179         QTreeWidget.__init__(self, parent)
180         self.setContextMenuPolicy(Qt.CustomContextMenu)
181         self.connect(self, SIGNAL('itemActivated(QTreeWidgetItem*, int)'), self.itemactivated)
182
183     def itemactivated(self, item):
184         if not item: return
185         for i in range(0,self.viewport().height()/5):
186             if self.itemAt(QPoint(0,i*5)) == item:
187                 break
188         else:
189             return
190         for j in range(0,30):
191             if self.itemAt(QPoint(0,i*5 + j)) != item:
192                 break
193         self.emit(SIGNAL('customContextMenuRequested(const QPoint&)'), QPoint(50, i*5 + j - 1))
194
195
196
197
198 if __name__ == "__main__":
199     app = QApplication([])
200     t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
201     t.start()
202     app.exec_()