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