e6c13a87469c16eadce02ad5e44038d22c7db091
[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.setFocusPolicy(Qt.NoFocus)
60         self.setFixedWidth(20)
61         self.alt = None
62         self.clicked.connect(self.onclick)
63
64     def set_alt(self, func):
65         self.alt = func
66
67     def onclick(self):
68         if self.alt:
69             apply(self.alt)
70         else:
71             QMessageBox.information(self, 'Help', self.help_text, 'OK')
72
73
74
75 def close_button(dialog, label=_("Close") ):
76     hbox = QHBoxLayout()
77     hbox.addStretch(1)
78     b = QPushButton(label)
79     hbox.addWidget(b)
80     b.clicked.connect(dialog.close)
81     b.setDefault(True)
82     return hbox
83
84 def ok_cancel_buttons2(dialog, ok_label=_("OK") ):
85     hbox = QHBoxLayout()
86     hbox.addStretch(1)
87     b = QPushButton(_("Cancel"))
88     hbox.addWidget(b)
89     b.clicked.connect(dialog.reject)
90     b = QPushButton(ok_label)
91     hbox.addWidget(b)
92     b.clicked.connect(dialog.accept)
93     b.setDefault(True)
94     return hbox, b
95
96 def ok_cancel_buttons(dialog, ok_label=_("OK") ):
97     hbox, b = ok_cancel_buttons2(dialog, ok_label)
98     return hbox
99
100 def text_dialog(parent, title, label, ok_label, default=None):
101     from qrtextedit import QRTextEdit
102     dialog = QDialog(parent)
103     dialog.setMinimumWidth(500)
104     dialog.setWindowTitle(title)
105     dialog.setModal(1)
106     l = QVBoxLayout()
107     dialog.setLayout(l)
108     l.addWidget(QLabel(label))
109     txt = QRTextEdit()
110     if default:
111         txt.setText(default)
112     l.addWidget(txt)
113     l.addLayout(ok_cancel_buttons(dialog, ok_label))
114     if dialog.exec_():
115         return unicode(txt.toPlainText())
116
117
118
119 def address_field(addresses):
120     hbox = QHBoxLayout()
121     address_e = QLineEdit()
122     if addresses:
123         address_e.setText(addresses[0])
124     def func():
125         i = addresses.index(str(address_e.text())) + 1
126         i = i % len(addresses)
127         address_e.setText(addresses[i])
128     button = QPushButton(_('Address'))
129     button.clicked.connect(func)
130     hbox.addWidget(button)
131     hbox.addWidget(address_e)
132     return hbox, address_e
133
134
135 def filename_field(parent, config, defaultname, select_msg):
136
137     vbox = QVBoxLayout()
138     vbox.addWidget(QLabel(_("Format")))
139     gb = QGroupBox("format", parent)
140     b1 = QRadioButton(gb)
141     b1.setText(_("CSV"))
142     b1.setChecked(True)
143     b2 = QRadioButton(gb)
144     b2.setText(_("json"))
145     vbox.addWidget(b1)
146     vbox.addWidget(b2)
147         
148     hbox = QHBoxLayout()
149
150     directory = config.get('io_dir', unicode(os.path.expanduser('~')))
151     path = os.path.join( directory, defaultname )
152     filename_e = QLineEdit()
153     filename_e.setText(path)
154
155     def func():
156         text = unicode(filename_e.text())
157         _filter = "*.csv" if text.endswith(".csv") else "*.json" if text.endswith(".json") else None
158         p = unicode( QFileDialog.getSaveFileName(None, select_msg, text, _filter))
159         if p:
160             filename_e.setText(p)
161
162     button = QPushButton(_('File'))
163     button.clicked.connect(func)
164     hbox.addWidget(button)
165     hbox.addWidget(filename_e)
166     vbox.addLayout(hbox)
167
168     def set_csv(v):
169         text = unicode(filename_e.text())
170         text = text.replace(".json",".csv") if v else text.replace(".csv",".json")
171         filename_e.setText(text)
172
173     b1.clicked.connect(lambda: set_csv(True))
174     b2.clicked.connect(lambda: set_csv(False))
175
176     return vbox, filename_e, b1
177
178
179
180 class MyTreeWidget(QTreeWidget):
181     def __init__(self, parent):
182         QTreeWidget.__init__(self, parent)
183         self.setContextMenuPolicy(Qt.CustomContextMenu)
184         self.connect(self, SIGNAL('itemActivated(QTreeWidgetItem*, int)'), self.itemactivated)
185
186     def itemactivated(self, item):
187         if not item: return
188         for i in range(0,self.viewport().height()/5):
189             if self.itemAt(QPoint(0,i*5)) == item:
190                 break
191         else:
192             return
193         for j in range(0,30):
194             if self.itemAt(QPoint(0,i*5 + j)) != item:
195                 break
196         self.emit(SIGNAL('customContextMenuRequested(const QPoint&)'), QPoint(50, i*5 + j - 1))
197
198
199
200
201 if __name__ == "__main__":
202     app = QApplication([])
203     t = WaitingDialog(None, 'testing ...', lambda: [time.sleep(1)], lambda x: QMessageBox.information(None, 'done', "done", _('OK')))
204     t.start()
205     app.exec_()