Coinbase BuyBack plugin
[electrum-nvc.git] / gui / qt / lite_window.py
index de796e3..6886743 100644 (file)
@@ -111,12 +111,12 @@ def csv_transaction(wallet):
                         time_string = "pending"
 
                     if value is not None:
-                        value_string = format_satoshis(value, True, wallet.num_zeros)
+                        value_string = format_satoshis(value, True)
                     else:
                         value_string = '--'
 
                     if fee is not None:
-                        fee_string = format_satoshis(fee, True, wallet.num_zeros)
+                        fee_string = format_satoshis(fee, True)
                     else:
                         fee_string = '0'
 
@@ -125,9 +125,9 @@ def csv_transaction(wallet):
                     else:
                       label = ""
 
-                    balance_string = format_satoshis(balance, False, wallet.num_zeros)
+                    balance_string = format_satoshis(balance, False)
                     transaction.writerow([tx_hash, label, confirmations, value_string, fee_string, balance_string, time_string])
-                QMessageBox.information(None,"CSV Export created", "Your CSV export has been successfully created.")
+                QMessageBox.information(None,_("CSV Export created"), _("Your CSV export has been successfully created."))
     except (IOError, os.error), reason:
         export_error_label = _("Electrum was unable to produce a transaction export.")
         QMessageBox.critical(None,_("Unable to create csv"), export_error_label + "\n" + str(reason))
@@ -179,7 +179,7 @@ class MiniWindow(QDialog):
         self.btc_balance = None
         self.quote_currencies = ["BRL", "CNY", "EUR", "GBP", "RUB", "USD"]
         self.actuator.set_configured_currency(self.set_quote_currency)
-        #self.exchanger = exchange_rate.Exchanger(self)
+
         # Needed because price discovery is done in a different thread
         # which needs to be sent back to this main one to update the GUI
         self.connect(self, SIGNAL("refresh_balance()"), self.refresh_balance)
@@ -209,7 +209,7 @@ class MiniWindow(QDialog):
         address_layout.addWidget(self.address_input)
 
         self.amount_input = QLineEdit()
-        self.amount_input.setPlaceholderText(_("... and amount"))
+        self.amount_input.setPlaceholderText(_("... and amount") + " (%s)"%self.actuator.g.base_unit())
         self.amount_input.setObjectName("amount_input")
 
         self.amount_input.setFocusPolicy(Qt.ClickFocus)
@@ -224,10 +224,10 @@ class MiniWindow(QDialog):
         self.amount_input.setAttribute(Qt.WA_MacShowFocusRect, 0)
         self.amount_input.textChanged.connect(self.amount_input_changed)
 
-        if self.actuator.wallet.seed:
-            self.send_button = QPushButton(_("&Send"))
-        else:
-            self.send_button = QPushButton(_("&Create"))
+        #if self.actuator.g.wallet.seed:
+        self.send_button = QPushButton(_("&Send"))
+        #else:
+        #    self.send_button = QPushButton(_("&Create"))
 
         self.send_button.setObjectName("send_button")
         self.send_button.setDisabled(True);
@@ -307,7 +307,6 @@ class MiniWindow(QDialog):
         self.layout().setSizeConstraint(QLayout.SetFixedSize)
         self.setObjectName("main_window")
 
-        self.show()
 
     def context_menu(self):
         view_menu = QMenu()
@@ -356,8 +355,7 @@ class MiniWindow(QDialog):
     def closeEvent(self, event):
         g = self.geometry()
         self.config.set_key("winpos-lite", [g.left(),g.top(),g.width(),g.height()],True)
-        
-        super(MiniWindow, self).closeEvent(event)
+        self.actuator.g.closeEvent(event)
         qApp.quit()
 
     def set_payment_fields(self, dest_address, amount):
@@ -403,20 +401,23 @@ class MiniWindow(QDialog):
         quote_text = self.create_quote_text(btc_balance)
         if quote_text:
             quote_text = "(%s)" % quote_text
-        btc_balance = "%.4f" % (btc_balance / bitcoin(1))
-        self.balance_label.set_balance_text(btc_balance, quote_text)
-        self.setWindowTitle("Electrum %s - %s BTC" % (electrum_version, btc_balance))
+
+        amount = self.actuator.g.format_amount(btc_balance)
+        unit = self.actuator.g.base_unit()
+
+        self.balance_label.set_balance_text(amount, unit, quote_text)
+        self.setWindowTitle("Electrum %s - %s %s" % (electrum_version, amount, unit))
 
     def amount_input_changed(self, amount_text):
         """Update the number of bitcoins displayed."""
         self.check_button_status()
 
         try:
-            amount = D(str(amount_text))
+            amount = D(str(amount_text)) * (10**self.actuator.g.decimal_point)
         except decimal.InvalidOperation:
             self.balance_label.show_balance()
         else:
-            quote_text = self.create_quote_text(amount * bitcoin(1))
+            quote_text = self.create_quote_text(amount)
             if quote_text:
                 self.balance_label.set_amount_text(quote_text)
                 self.balance_label.show_amount()
@@ -426,14 +427,10 @@ class MiniWindow(QDialog):
     def create_quote_text(self, btc_balance):
         """Return a string copy of the amount fiat currency the 
         user has in bitcoins."""
-        quote_currency = self.quote_currencies[0]
-        quote_balance = None #self.exchanger.exchange(btc_balance, quote_currency)
-        if quote_balance is None:
-            quote_text = ""
-        else:
-            quote_text = "%.2f %s" % ((quote_balance / bitcoin(1)),
-                                      quote_currency)
-        return quote_text
+        from electrum.plugins import run_hook
+        r = {}
+        run_hook('set_quote_text', btc_balance, r)
+        return r.get(0,'')
 
     def send(self):
         if self.actuator.send(self.address_input.text(),
@@ -445,7 +442,7 @@ class MiniWindow(QDialog):
         """Check that the bitcoin address is valid and that something
         is entered in the amount before making the send button clickable."""
         try:
-            value = D(str(self.amount_input.text())) * 10**8
+            value = D(str(self.amount_input.text())) * (10**self.actuator.g.decimal_point)
         except decimal.InvalidOperation:
             value = None
         # self.address_input.property(...) returns a qVariant, not a bool.
@@ -495,9 +492,8 @@ class MiniWindow(QDialog):
 
         for item in tx_history[-10:]:
             tx_hash, conf, is_mine, value, fee, balance, timestamp = item
-            label = self.actuator.wallet.get_label(tx_hash)[0]
-            #amount = D(value) / 10**8
-            v_str = format_satoshis(value, True)
+            label = self.actuator.g.wallet.get_label(tx_hash)[0]
+            v_str = self.actuator.g.format_amount(value, True)
             self.history_list.append(label, v_str, age(timestamp))
 
 
@@ -546,11 +542,15 @@ class BalanceLabel(QLabel):
                 menu.exec_(position)
                 
 
-    def set_balance_text(self, btc_balance, quote_text):
+    def set_balance_text(self, amount, unit, quote_text):
         """Set the amount of bitcoins in the gui."""
         if self.state == self.SHOW_CONNECTING:
             self.state = self.SHOW_BALANCE
-        self.balance_text = "<span style='font-size: 18pt'>%s</span> <span style='font-size: 10pt'>BTC</span> <span style='font-size: 10pt'>%s</span>" % (btc_balance, quote_text)
+
+        self.balance_text = "<span style='font-size: 18pt'>%s</span>"%amount\
+            + " <span style='font-size: 10pt'>%s</span>" % unit \
+            + " <span style='font-size: 10pt'>%s</span>" % quote_text
+
         if self.state == self.SHOW_BALANCE:
             self.setText(self.balance_text)
 
@@ -644,11 +644,10 @@ class MiniActuator:
     sending/receiving bitcoins."""
     
     
-    def __init__(self, config, wallet):
+    def __init__(self, main_window):
         """Retrieve the gui theme used in previous session."""
-        self.config = config
-        self.wallet = wallet
-        self.theme_name = self.config.get('litegui_theme','Cleanlook')
+        self.g = main_window
+        self.theme_name = self.g.config.get('litegui_theme','Cleanlook')
         self.themes = load_theme_paths()
 
     def load_theme(self):
@@ -673,13 +672,13 @@ class MiniActuator:
     def change_theme(self, theme_name):
         """Change theme."""
         self.theme_name = theme_name
-        self.config.set_key('litegui_theme',theme_name)
+        self.g.config.set_key('litegui_theme',theme_name)
         self.load_theme()
     
     def set_configured_currency(self, set_quote_currency):
         """Set the inital fiat currency conversion country (USD/EUR/GBP) in 
         the GUI to what it was set to in the wallet."""
-        currency = self.config.get('currency')
+        currency = self.g.config.get('currency')
         # currency can be none when Electrum is used for the first
         # time and no setting has been created yet.
         if currency is not None:
@@ -687,14 +686,15 @@ class MiniActuator:
 
     def set_config_currency(self, conversion_currency):
         """Change the wallet fiat currency country."""
-        self.config.set_key('conversion_currency',conversion_currency,True)
+        self.g.config.set_key('currency',conversion_currency,True)
+        self.g.update_status()
 
     def copy_address(self, receive_popup):
         """Copy the wallet addresses into the client."""
-        addrs = [addr for addr in self.wallet.addresses(True)
-                 if not self.wallet.is_change(addr)]
+        addrs = [addr for addr in self.g.wallet.addresses(True)
+                 if not self.g.wallet.is_change(addr)]
         # Select most recent addresses from gap limit
-        addrs = addrs[-self.wallet.gap_limit:]
+        addrs = addrs[-self.g.wallet.gap_limit:]
         copied_address = random.choice(addrs)
         qApp.clipboard().setText(copied_address)
         receive_popup.setup(copied_address)
@@ -729,11 +729,11 @@ class MiniActuator:
                 _('Invalid Bitcoin Address') + ':\n' + address, _('OK'))
             return False
 
-        convert_amount = lambda amount: \
-            int(D(unicode(amount)) * bitcoin(1))
-        amount = convert_amount(amount)
+        amount = D(unicode(amount)) * (10*self.g.decimal_point)
+        print "amount", amount
+        return
 
-        if self.wallet.use_encryption:
+        if self.g.wallet.use_encryption:
             password_dialog = PasswordDialog(parent_window)
             password = password_dialog.run()
             if not password:
@@ -748,17 +748,17 @@ class MiniActuator:
             fee = bitcoin(1) / 1000
 
         try:
-            tx = self.wallet.mktx([(dest_address, amount)], password, fee)
-        except BaseException as error:
+            tx = self.g.wallet.mktx([(dest_address, amount)], password, fee)
+        except Exception as error:
             QMessageBox.warning(parent_window, _('Error'), str(error), _('OK'))
             return False
 
         if tx.is_complete:
-            h = self.wallet.send_tx(tx)
+            h = self.g.wallet.send_tx(tx)
 
-            self.waiting_dialog(lambda: False if self.wallet.tx_event.isSet() else _("Sending transaction, please wait..."))
+            self.waiting_dialog(lambda: False if self.g.wallet.tx_event.isSet() else _("Sending transaction, please wait..."))
               
-            status, message = self.wallet.receive_tx(h)
+            status, message = self.g.wallet.receive_tx(h, tx)
 
             if not status:
                 import tempfile
@@ -777,7 +777,7 @@ class MiniActuator:
                 with open(fileName,'w') as f:
                     f.write(json.dumps(tx.as_dict(),indent=4) + '\n')
                 QMessageBox.information(QWidget(), _('Unsigned transaction created'), _("Unsigned transaction was saved to file:") + " " +fileName, _('OK'))
-            except BaseException as e:
+            except Exception as e:
                 QMessageBox.warning(QWidget(), _('Error'), _('Could not write transaction to file: %s' % e), _('OK'))
         return True
 
@@ -794,7 +794,7 @@ class MiniActuator:
         
         if match1:
             dest_address = \
-                self.wallet.get_alias(recipient, True, 
+                self.g.wallet.get_alias(recipient, True, 
                                       self.show_message, self.question)
             return dest_address
         elif match2:
@@ -813,16 +813,17 @@ class MiniDriver(QObject):
     SYNCHRONIZING = 2
     READY = 3
 
-    def __init__(self, wallet, window):
+    def __init__(self, main_window, mini_window):
         super(QObject, self).__init__()
 
-        self.wallet = wallet
-        self.network = wallet.network
-        self.window = window
+        self.g = main_window
+        self.network = main_window.network
+        self.window = mini_window
 
-        self.wallet.network.register_callback('updated',self.update_callback)
-        self.wallet.network.register_callback('connected', self.update_callback)
-        self.wallet.network.register_callback('disconnected', self.update_callback)
+        if self.network:
+            self.network.register_callback('updated',self.update_callback)
+            self.network.register_callback('connected', self.update_callback)
+            self.network.register_callback('disconnected', self.update_callback)
 
         self.state = None
 
@@ -837,19 +838,24 @@ class MiniDriver(QObject):
         self.emit(SIGNAL("updatesignal()"))
 
     def update(self):
-        if not self.network.interface:
+        if not self.network:
+            self.initializing()
+        elif not self.network.interface:
             self.initializing()
         elif not self.network.interface.is_connected:
             self.connecting()
-        elif not self.wallet.up_to_date:
+
+        if self.g.wallet is None:
+            self.ready()
+        elif not self.g.wallet.up_to_date:
             self.synchronizing()
         else:
             self.ready()
-
-        if self.wallet.up_to_date:
             self.update_balance()
             self.update_completions()
             self.update_history()
+            self.window.receiving.update_list()
+
 
     def initializing(self):
         if self.state == self.INITIALIZING:
@@ -876,19 +882,19 @@ class MiniDriver(QObject):
         self.window.activate()
 
     def update_balance(self):
-        conf_balance, unconf_balance = self.wallet.get_balance()
+        conf_balance, unconf_balance = self.g.wallet.get_balance()
         balance = D(conf_balance + unconf_balance)
         self.window.set_balances(balance)
 
     def update_completions(self):
         completions = []
-        for addr, label in self.wallet.labels.items():
-            if addr in self.wallet.addressbook:
+        for addr, label in self.g.wallet.labels.items():
+            if addr in self.g.wallet.addressbook:
                 completions.append("%s <%s>" % (label, addr))
         self.window.update_completions(completions)
 
     def update_history(self):
-        tx_history = self.wallet.get_tx_history()
+        tx_history = self.g.wallet.get_tx_history()
         self.window.update_history(tx_history)