New port numbers
[electrum-nvc.git] / gui / text.py
index 72ba085..4cf9a9f 100644 (file)
@@ -1,11 +1,11 @@
-import curses, datetime
+import curses, datetime, locale
 from decimal import Decimal
 _ = lambda x:x
 #from i18n import _
-from electrum.util import format_satoshis, set_verbosity
-from electrum.bitcoin import is_valid
+from electrum_nvc.util import format_satoshis, set_verbosity
+from electrum_nvc.bitcoin import is_valid
 
-from electrum import Wallet, WalletStorage
+from electrum_nvc import Wallet, WalletStorage
 
 import tty, sys
 
@@ -18,11 +18,14 @@ class ElectrumGui:
         self.network = network
         storage = WalletStorage(config)
         if not storage.file_exists:
-            print "Wallet not found. try 'electrum create'"
+            print "Wallet not found. try 'electrum-nvc create'"
             exit()
 
         self.wallet = Wallet(storage)
-        self.wallet.start_threads(network)
+        self.wallet.start_threads(self.network)
+
+        locale.setlocale(locale.LC_ALL, '')
+        self.encoding = locale.getpreferredencoding()
 
         self.stdscr = curses.initscr()
         curses.noecho()
@@ -46,19 +49,22 @@ class ElectrumGui:
         self.str_description = ""
         self.str_amount = ""
         self.str_fee = ""
-        
-        self.network.register_callback('updated', self.refresh)
-        self.network.register_callback('connected', self.refresh)
-        self.network.register_callback('disconnected', self.refresh)
-        self.network.register_callback('disconnecting', self.refresh)
+        self.history = None
+       
+        if self.network: 
+            self.network.register_callback('updated', self.update)
+            self.network.register_callback('connected', self.refresh)
+            self.network.register_callback('disconnected', self.refresh)
+            self.network.register_callback('disconnecting', self.refresh)
+
         self.tab_names = [_("History"), _("Send"), _("Receive"), _("Contacts"), _("Wall")]
         self.num_tabs = len(self.tab_names)
-        
+
 
     def set_cursor(self, x):
         try:
             curses.curs_set(x)
-        except:
+        except Exception:
             pass
 
     def restore_or_create(self):
@@ -76,41 +82,57 @@ class ElectrumGui:
         self.set_cursor(0)
         return s
 
+    def update(self):
+        self.update_history()
+        if self.tab == 0: 
+            self.print_history()
+        self.refresh()
 
     def print_history(self):
+
+        width = [20, 40, 14, 14]
+        delta = (self.maxx - sum(width) - 4)/3
+        format_str = "%"+"%d"%width[0]+"s"+"%"+"%d"%(width[1]+delta)+"s"+"%"+"%d"%(width[2]+delta)+"s"+"%"+"%d"%(width[3]+delta)+"s"
+
+        if self.history is None:
+            self.update_history()
+
+        self.print_list(self.history[::-1], format_str%( _("Date"), _("Description"), _("Amount"), _("Balance")))
+
+    def update_history(self):
         width = [20, 40, 14, 14]
         delta = (self.maxx - sum(width) - 4)/3
         format_str = "%"+"%d"%width[0]+"s"+"%"+"%d"%(width[1]+delta)+"s"+"%"+"%d"%(width[2]+delta)+"s"+"%"+"%d"%(width[3]+delta)+"s"
 
         b = 0 
-        messages = []
+        self.history = []
 
         for item in self.wallet.get_tx_history():
             tx_hash, conf, is_mine, value, fee, balance, timestamp = item
             if conf:
                 try:
                     time_str = datetime.datetime.fromtimestamp( timestamp).isoformat(' ')[:-3]
-                except:
+                except Exception:
                     time_str = "------"
             else:
                 time_str = 'pending'
 
             label, is_default_label = self.wallet.get_label(tx_hash)
-            messages.append( format_str%( time_str, label, format_satoshis(value, whitespaces=True), format_satoshis(balance, whitespaces=True) ) )
-
-        self.print_list(messages[::-1], format_str%( _("Date"), _("Description"), _("Amount"), _("Balance")))
+            self.history.append( format_str%( time_str, label, format_satoshis(value, whitespaces=True), format_satoshis(balance, whitespaces=True) ) )
 
 
     def print_balance(self):
-        if self.network.interface and self.network.interface.is_connected:
+        if not self.network:
+            msg = _("Offline")
+        elif self.network.interface and self.network.interface.is_connected:
             if not self.wallet.up_to_date:
-                msg = _( "Synchronizing..." )
+                msg = _("Synchronizing...")
             else: 
                 c, u =  self.wallet.get_balance()
-                msg = _("Balance")+": %f  "%(Decimal( c ) / 100000000)
-                if u: msg += "  [%f unconfirmed]"%(Decimal( u ) / 100000000)
+                msg = _("Balance")+": %f  "%(Decimal( c ) / 1000000)
+                if u: msg += "  [%f unconfirmed]"%(Decimal( u ) / 1000000)
         else:
-                msg = _( "Not connected" )
+            msg = _("Not connected")
             
         self.stdscr.addstr( self.maxy -1, 3, msg)
 
@@ -125,8 +147,9 @@ class ElectrumGui:
         self.print_list(messages, "%19s  %25s "%("Address", "Label"))
 
     def print_receive(self):
-        messages = map(lambda addr: "%30s    %30s       "%(addr, self.wallet.labels.get(addr,"")), self.wallet.addresses())
-        self.print_list(messages, "%19s  %25s "%("Address", "Label"))
+        fmt = "%-35s  %-30s"
+        messages = map(lambda addr: fmt % (addr, self.wallet.labels.get(addr,"")), self.wallet.addresses())
+        self.print_list(messages,   fmt % ("Address", "Label"))
 
     def print_edit_line(self, y, label, text, index, size):
         text += " "*(size - len(text) )
@@ -143,18 +166,21 @@ class ElectrumGui:
         self.stdscr.addstr( 12, 25, _("[Clear]"), curses.A_REVERSE if self.pos%6==5 else curses.color_pair(2))
 
     def print_banner(self):
-        for i, x in enumerate( self.network.banner.split('\n') ):
-            self.stdscr.addstr( 1+i, 1, x )
+        if self.network:
+            self.print_list( self.network.banner.split('\n'))
 
-    def print_list(self, list, firstline):
+    def print_list(self, list, firstline = None):
         self.maxpos = len(list)
         if not self.maxpos: return
-        firstline += " "*(self.maxx -2 - len(firstline))
-        self.stdscr.addstr( 1, 1, firstline )
+        if firstline:
+            firstline += " "*(self.maxx -2 - len(firstline))
+            self.stdscr.addstr( 1, 1, firstline )
         for i in range(self.maxy-4):
             msg = list[i] if i < len(list) else ""
             msg += " "*(self.maxx - 2 - len(msg))
-            self.stdscr.addstr( i+2, 1, msg[0:self.maxx - 2], curses.A_REVERSE if i == (self.pos % self.maxpos) else 0)
+            m = msg[0:self.maxx - 2]
+            m = m.encode(self.encoding)
+            self.stdscr.addstr( i+2, 1, m, curses.A_REVERSE if i == (self.pos % self.maxpos) else 0)
 
     def refresh(self):
         if self.tab == -1: return
@@ -261,16 +287,16 @@ class ElectrumGui:
 
     def do_send(self):
         if not is_valid(self.str_recipient):
-            self.show_message(_('Invalid Bitcoin address'))
+            self.show_message(_('Invalid Novacoin address'))
             return
         try:
-            amount = int( Decimal( self.str_amount) * 100000000 )
-        except:
+            amount = int( Decimal( self.str_amount) * 1000000 )
+        except Exception:
             self.show_message(_('Invalid Amount'))
             return
         try:
-            fee = int( Decimal( self.str_fee) * 100000000 )
-        except:
+            fee = int( Decimal( self.str_fee) * 1000000 )
+        except Exception:
             self.show_message(_('Invalid Fee'))
             return
 
@@ -283,7 +309,7 @@ class ElectrumGui:
 
         try:
             tx = self.wallet.mktx( [(self.str_recipient, amount)], password, fee)
-        except BaseException, e:
+        except Exception as e:
             self.show_message(str(e))
             return
             
@@ -293,7 +319,7 @@ class ElectrumGui:
         h = self.wallet.send_tx(tx)
         self.show_message(_("Please wait..."), getchar=False)
         self.wallet.tx_event.wait()
-        status, msg = self.wallet.receive_tx( h )
+        status, msg = self.wallet.receive_tx( h, tx )
 
         if status:
             self.show_message(_('Payment sent.'))
@@ -307,7 +333,8 @@ class ElectrumGui:
         w = self.w
         w.clear()
         w.border(0)
-        w.addstr(2,2,message)
+        for i, line in enumerate(message.split('\n')):
+            w.addstr(2+i,2,line)
         w.refresh()
         if getchar: c = self.stdscr.getch()
 
@@ -317,21 +344,32 @@ class ElectrumGui:
 
 
     def network_dialog(self):
+        if not self.network: return
+        auto_connect = self.network.config.get('auto_cycle')
+        host, port, protocol = self.network.default_server.split(':')
+        srv = 'auto-connect' if auto_connect else self.network.default_server
+
         out = self.run_dialog('Network', [
-            {'label':'server', 'type':'str', 'value':self.network.interface.server},
+            {'label':'server', 'type':'str', 'value':srv},
             {'label':'proxy', 'type':'str', 'value':self.config.get('proxy', '')},
             ], buttons = 1)
         if out:
             if out.get('server'):
                 server = out.get('server')
+                auto_connect = server == 'auto-connect'
+                if not auto_connect:
+                    try:
+                        host, port, protocol = server.split(':')
+                    except Exception:
+                        self.show_message("Error:" + server + "\nIn doubt, type \"auto-connect\"")
+                        return False
+
                 if out.get('proxy'):
                     proxy = self.parse_proxy_options(out.get('proxy'))
                 else:
                     proxy = None
 
-                self.wallet.config.set_key("proxy", proxy, True)
-                self.wallet.config.set_key("server", server, True)
-                self.network.interface.set_server(server, proxy)
+                self.network.set_parameters(host, port, protocol, proxy, auto_connect)
                 
 
 
@@ -430,7 +468,7 @@ class ElectrumGui:
                     choices = item.get('choices')
                     try:
                         j = choices.index(item.get('value'))
-                    except:
+                    except Exception:
                         j = 0
                     new_choice = choices[(j + 1)% len(choices)]
                     item['value'] = new_choice