tbetter input methods - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 96a3fdbbc4a3bf5f92577c499b2179d11aee8b78 DIR parent 3a604e41a871f653546c209a062a7a6224280ca4 HTML Author: thomasv <thomasv@gitorious> Date: Thu, 8 Nov 2012 10:53:37 +0100 better input methods Diffstat: M lib/gui_text.py | 99 ++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 36 deletions(-) --- DIR diff --git a/lib/gui_text.py b/lib/gui_text.py t@@ -4,6 +4,7 @@ _ = lambda x:x #from i18n import _ from util import format_satoshis, set_verbosity +import tty, sys class ElectrumGui: t@@ -167,9 +168,9 @@ class ElectrumGui: elif c == curses.KEY_DOWN: self.pos +=1 elif c == curses.KEY_UP: self.pos -= 1 elif c == 9: self.pos +=1 # tab - elif c in [27, ord('q')]: self.tab = -1 - elif c == ord('n'): self.network_dialog() - elif c == ord('s'): self.settings_dialog() + elif curses.unctrl(c) in ['^W', '^C', '^X', '^Q']: self.tab = -1 + elif curses.unctrl(c) in ['^N']: self.network_dialog() + elif curses.unctrl(c) == '^S': self.settings_dialog() else: return c if self.pos<0: self.pos=0 if self.pos>=self.maxpos: self.pos=self.maxpos - 1 t@@ -187,16 +188,30 @@ class ElectrumGui: if c == 10: out = self.run_popup('',["blah","foo"]) - + + def edit_str(self, target, c, is_num=False): + chars = '0123456789.' if is_num else '0123456789.:;,!?abcdefghigklmnoprstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + if curses.unctrl(c) in chars: + target += curses.unctrl(c) + elif c==263 and target: + target = target[:-1] + return target + + def run_send_tab(self, c): - if c == 10: - if self.pos%6==4: - self.do_send() - elif self.pos%6==5: - self.do_clear() - else: - self.getstr_send() - self.print_send_tab() + if self.pos%6 == 0: + self.str_recipient = self.edit_str(self.str_recipient, c) + if self.pos%6 == 1: + self.str_description = self.edit_str(self.str_description, c) + if self.pos%6 == 2: + self.str_amount = self.edit_str(self.str_amount, c, True) + elif self.pos%6 == 3: + self.str_fee = self.edit_str(self.str_fee, c, True) + elif self.pos%6==4: + if c == 10: self.do_send() + elif self.pos%6==5: + if c == 10: self.do_clear() + def run_receive_tab(self, c): if c == 10: t@@ -216,10 +231,12 @@ class ElectrumGui: self.wallet.labels[address] = s def run_banner_tab(self, c): + self.show_message(repr(c)) pass def main(self,url): + tty.setraw(sys.stdin) while self.tab != -1: self.run_tab(0, self.print_history, self.run_history_tab) self.run_tab(1, self.print_send_tab, self.run_send_tab) t@@ -227,6 +244,7 @@ class ElectrumGui: self.run_tab(3, self.print_contacts, self.run_contacts_tab) self.run_tab(4, self.print_banner, self.run_banner_tab) + tty.setcbreak(sys.stdin) curses.nocbreak(); self.stdscr.keypad(0); curses.echo() t@@ -305,24 +323,31 @@ class ElectrumGui: def settings_dialog(self): out = self.run_dialog('Settings', [ {'label':'Default GUI', 'type':'list', 'choices':['classic','lite','gtk','text'], 'value':self.config.get('gui')}, - {'label':'Default fee', 'type':'satoshis', 'value':self.config.get('fee')} + {'label':'Default fee', 'type':'satoshis', 'value': format_satoshis(self.config.get('fee')).strip() } ], buttons = 1) if out: - if out.get('Default GUI'): self.config.set_key('gui', out['Default GUI'], True) + if out.get('Default GUI'): + self.config.set_key('gui', out['Default GUI'], True) + if out.get('Default fee'): + fee = int ( Decimal( out['Default fee']) *10000000 ) + self.config.set_key('fee', fee, True) def password_dialog(self): out = self.run_dialog('Password', [ - {'label':'Password', 'type':'str'} + {'label':'Password', 'type':'password', 'value':''} ], buttons = 1) return out.get('Password') def run_dialog(self, title, items, interval=2, buttons=None, y_pos=3): - self.w = curses.newwin( 2+len(items)*interval, 50, y_pos, 5) + self.popup_pos = 0 + if buttons: + items.append({'label':' ok ','type':'button'}) + items.append({'label':'cancel','type':'button'}) + + self.w = curses.newwin( 5 + len(items)*interval + (2 if buttons else 0), 50, y_pos, 5) w = self.w - #items.append({'label':'cancel','type':'button'}) - if buttons: items.append({'label':' ok ','type':'button'}) out = {} while True: w.clear() t@@ -336,16 +361,19 @@ class ElectrumGui: if item.get('type') == 'list': value = item.get('value','') elif item.get('type') == 'satoshis': - value = format_satoshis(item.get('value')) + value = item.get('value') elif item.get('type') == 'str': value = item.get('value','') + elif item.get('type') == 'password': + value = '*'*len(item.get('value','')) + if not value: value = ' ' else: value = None if value: - w.addstr( 1+interval*i, 2, label) - w.addstr( 1+interval*i, 15, value, curses.A_REVERSE if self.popup_pos%num==i else curses.color_pair(1) ) + w.addstr( 2+interval*i, 2, label) + w.addstr( 2+interval*i, 15, value, curses.A_REVERSE if self.popup_pos%num==i else curses.color_pair(1) ) else: - w.addstr( 1+interval*i, 2, label, curses.A_REVERSE if self.popup_pos%num==i else 0) + w.addstr( 2+interval*i, 2, label, curses.A_REVERSE if self.popup_pos%num==i else 0) w.refresh() t@@ -353,26 +381,23 @@ class ElectrumGui: if c in [ord('q'), 27]: break elif c == curses.KEY_UP: self.popup_pos -= 1 elif c == curses.KEY_DOWN: self.popup_pos +=1 - elif c == 10: - i = self.popup_pos%num + else: + i = self.popup_pos%num item = items[i] _type = item.get('type') + if _type == 'str': - item['value'] = self.get_string(2+2*i, 15) + item['value'] = self.edit_str(item['value'], c) out[item.get('label')] = item.get('value') + elif _type == 'password': + item['value'] = self.edit_str(item['value'], c) + out[item.get('label')] = item ['value'] + elif _type == 'satoshis': - curses.curs_set(1) - curses.echo() - s = w.getstr(2+2*i, 15) - curses.noecho() - curses.curs_set(0) - try: - s = int( Decimal(s)*100000000 ) - item['value'] = s - out[item.get('label')] = item.get('value') - except: - pass + item['value'] = self.edit_str(item['value'], c, True) + out[item.get('label')] = item.get('value') + elif _type == 'list': choices = item.get('choices') try: t@@ -388,6 +413,8 @@ class ElectrumGui: out['button'] = item.get('label') break + if buttons and out.get('button') == 'cancel': + return return out