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