add switch-gui button for qt
[electrum-nvc.git] / lib / gui_lite.py
index 5cdec0b..dc7b434 100644 (file)
@@ -26,10 +26,12 @@ import time
 import wallet
 import webbrowser
 import history_widget
+import receiving_widget
 import util
 import csv 
 import datetime
 
+from version import ELECTRUM_VERSION as electrum_version
 from wallet import format_satoshis
 import gui_qt
 import shutil
@@ -86,14 +88,17 @@ def load_theme_paths():
 
 class ElectrumGui(QObject):
 
-    def __init__(self, wallet, config):
+    def __init__(self, wallet, config, expert=None):
         super(QObject, self).__init__()
 
         self.wallet = wallet
         self.config = config
         self.check_qt_version()
-        self.app = QApplication(sys.argv)
-
+        self.expert = expert
+        if self.expert != None:
+            self.app = self.expert.app
+        else:
+            self.app = QApplication(sys.argv)
 
     def check_qt_version(self):
         qtVersion = qVersion()
@@ -120,14 +125,15 @@ class ElectrumGui(QObject):
 
         if url:
             self.set_url(url)
-
-        timer = Timer()
-        timer.start()
-        self.expert = gui_qt.ElectrumWindow(self.wallet, self.config)
-        self.expert.app = self.app
-        self.expert.connect_slots(timer)
-        self.expert.update_wallet()
-        self.app.exec_()
+            
+        if self.expert == None:
+            timer = Timer()
+            timer.start()
+            self.expert = gui_qt.ElectrumWindow(self.wallet, self.config)
+            self.expert.app = self.app
+            self.expert.connect_slots(timer)
+            self.expert.update_wallet()
+            self.app.exec_()
 
     def expand(self):
         """Hide the lite mode window and show pro-mode."""
@@ -152,16 +158,50 @@ class ElectrumGui(QObject):
         qt_gui_object = gui_qt.ElectrumGui(self.wallet, self.app)
         return qt_gui_object.restore_or_create()
 
+class TransactionWindow(QDialog):
+
+    def set_label(self):
+        label = unicode(self.label_edit.text())
+        self.parent.wallet.labels[self.tx_id] = label
+
+        super(TransactionWindow, self).accept() 
+
+    def __init__(self, transaction_id, parent):
+        super(TransactionWindow, self).__init__()
+
+        self.tx_id = str(transaction_id)
+        self.parent = parent
+
+        self.setModal(True)
+        self.resize(200,100)
+        self.setWindowTitle("Transaction successfully sent")
+
+        self.layout = QGridLayout(self)
+        self.layout.addWidget(QLabel("Your transaction has been sent.\nPlease enter a label for this transaction for future reference."))
+
+        self.label_edit = QLineEdit()
+        self.label_edit.setPlaceholderText(_("Transaction label"))
+        self.label_edit.setObjectName("label_input")
+        self.label_edit.setAttribute(Qt.WA_MacShowFocusRect, 0)
+        self.label_edit.setFocusPolicy(Qt.ClickFocus)
+        self.layout.addWidget(self.label_edit)
+
+        self.save_button = QPushButton(_("Save"))
+        self.layout.addWidget(self.save_button)
+        self.save_button.clicked.connect(self.set_label)
+
+        self.exec_()
+
 class MiniWindow(QDialog):
 
     def __init__(self, actuator, expand_callback, config):
         super(MiniWindow, self).__init__()
+        tx = "e08115d0f7819aee65b9d24f81ef9d46eb62bb67ddef5318156cbc3ceb7b703e"
 
         self.actuator = actuator
         self.config = config
-
         self.btc_balance = None
-        self.quote_currencies = ["EUR", "USD", "GBP"]
+        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
@@ -171,18 +211,15 @@ class MiniWindow(QDialog):
         self.balance_label = BalanceLabel(self.change_quote_currency)
         self.balance_label.setObjectName("balance_label")
 
-        self.receive_button = QPushButton(_("&Receive"))
-        self.receive_button.setObjectName("receive_button")
-        self.receive_button.setDefault(True)
-        self.receive_button.clicked.connect(self.copy_address)
 
         # Bitcoin address code
         self.address_input = QLineEdit()
-        self.address_input.setPlaceholderText(_("Enter a Bitcoin address..."))
+        self.address_input.setPlaceholderText(_("Enter a Bitcoin address or contact"))
         self.address_input.setObjectName("address_input")
 
+        self.address_input.setFocusPolicy(Qt.ClickFocus)
 
-        self.address_input.textEdited.connect(self.address_field_changed)
+        self.address_input.textChanged.connect(self.address_field_changed)
         resize_line_edit_width(self.address_input,
                                "1BtaFUr3qVvAmwrsuDuu5zk6e4s2rxd2Gy")
 
@@ -198,6 +235,8 @@ class MiniWindow(QDialog):
         self.amount_input = QLineEdit()
         self.amount_input.setPlaceholderText(_("... and amount"))
         self.amount_input.setObjectName("amount_input")
+
+        self.amount_input.setFocusPolicy(Qt.ClickFocus)
         # This is changed according to the user's displayed balance
         self.amount_validator = QDoubleValidator(self.amount_input)
         self.amount_validator.setNotation(QDoubleValidator.StandardNotation)
@@ -214,12 +253,17 @@ class MiniWindow(QDialog):
         self.send_button.setDisabled(True);
         self.send_button.clicked.connect(self.send)
 
+        # Creating the receive button
+        self.receive_button = QPushButton(_("&Receive"))
+        self.receive_button.setObjectName("receive_button")
+        self.receive_button.setDefault(True)
+
         main_layout = QGridLayout(self)
 
         main_layout.addWidget(self.balance_label, 0, 0)
         main_layout.addWidget(self.receive_button, 0, 1)
 
-        main_layout.addWidget(self.address_input, 1, 0, 1, -1)
+        main_layout.addWidget(self.address_input, 1, 0)
 
         main_layout.addWidget(self.amount_input, 2, 0)
         main_layout.addWidget(self.send_button, 2, 1)
@@ -228,15 +272,46 @@ class MiniWindow(QDialog):
         self.history_list.setObjectName("history")
         self.history_list.hide()
         self.history_list.setAlternatingRowColors(True)
-        main_layout.addWidget(self.history_list, 3, 0, 1, -1)
 
+        main_layout.addWidget(self.history_list, 3, 0, 1, 2)
+        
+
+        self.receiving = receiving_widget.ReceivingWidget(self)
+        self.receiving.setObjectName("receiving")
+
+        # Add to the right side 
+        self.receiving_box = QGroupBox(_("Select a receiving address"))
+        extra_layout = QGridLayout()
+
+        # Checkbox to filter used addresses
+        hide_used = QCheckBox(_('Hide used addresses'))
+        hide_used.setChecked(True)
+        hide_used.stateChanged.connect(self.receiving.toggle_used)
+
+        # Events for receiving addresses
+        self.receiving.clicked.connect(self.receiving.copy_address)
+        self.receiving.itemDoubleClicked.connect(self.receiving.edit_label)
+        self.receiving.itemChanged.connect(self.receiving.update_label)
+
+        # Label
+        extra_layout.addWidget( QLabel(_('Selecting an address will copy it to the clipboard.\nDouble clicking the label will allow you to edit it.') ),0,0)
+
+        extra_layout.addWidget(self.receiving, 1,0)
+        extra_layout.addWidget(hide_used, 2,0)
+        extra_layout.setColumnMinimumWidth(0,200)
+
+        self.receiving_box.setLayout(extra_layout)
+        main_layout.addWidget(self.receiving_box,0,3,-1,3)
+        self.receiving_box.hide()
+
+        self.receive_button.clicked.connect(self.toggle_receiving_layout)
+
+        # Creating the menu bar
         menubar = QMenuBar()
         electrum_menu = menubar.addMenu(_("&Bitcoin"))
 
         electrum_menu.addSeparator()
 
-        brain_seed = electrum_menu.addAction(_("&BrainWallet Info"))
-        brain_seed.triggered.connect(self.actuator.show_seed_dialog)
         quit_option = electrum_menu.addAction(_("&Quit"))
         quit_option.triggered.connect(self.close)
 
@@ -248,6 +323,9 @@ class MiniWindow(QDialog):
 
         export_csv = extra_menu.addAction( _("&Export transactions to CSV") )
         export_csv.triggered.connect(self.actuator.csv_transaction)
+        
+        master_key = extra_menu.addAction( _("Copy master public key to clipboard") ) 
+        master_key.triggered.connect(self.actuator.copy_master_public_key)
 
         expert_gui = view_menu.addAction(_("&Classic GUI"))
         expert_gui.triggered.connect(expand_callback)
@@ -283,6 +361,7 @@ class MiniWindow(QDialog):
         show_about = help_menu.addAction(_("&About"))
         show_about.triggered.connect(self.show_about)
         main_layout.setMenuBar(menubar)
+        self.main_layout = main_layout
 
         quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self)
         quit_shortcut.activated.connect(self.close)
@@ -303,6 +382,20 @@ class MiniWindow(QDialog):
         self.setObjectName("main_window")
         self.show()
 
+    def toggle_receiving_layout(self):
+        if self.receiving_box.isVisible():
+            self.receiving_box.hide()
+            self.receive_button.setProperty("isActive", False)
+
+            qApp.style().unpolish(self.receive_button)
+            qApp.style().polish(self.receive_button)
+        else:
+            self.receiving_box.show()
+            self.receive_button.setProperty("isActive", 'true')
+
+            qApp.style().unpolish(self.receive_button)
+            qApp.style().polish(self.receive_button)
+
     def toggle_theme(self, theme_name):
         old_path = QDir.currentPath()
         self.actuator.change_theme(theme_name)
@@ -359,7 +452,7 @@ class MiniWindow(QDialog):
             quote_text = "(%s)" % quote_text
         btc_balance = "%.2f" % (btc_balance / bitcoin(1))
         self.balance_label.set_balance_text(btc_balance, quote_text)
-        self.setWindowTitle("Electrum - %s BTC" % btc_balance)
+        self.setWindowTitle("Electrum %s - %s BTC" % (electrum_version, btc_balance))
 
     def amount_input_changed(self, amount_text):
         """Update the number of bitcoins displayed."""
@@ -411,6 +504,13 @@ class MiniWindow(QDialog):
             self.send_button.setDisabled(True)
 
     def address_field_changed(self, address):
+        # label or alias, with address in brackets
+        match2 = re.match("(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>",
+                          address)
+        if match2:
+          address = match2.group(2)
+          self.address_input.setText(address)
+
         if self.actuator.is_valid(address):
             self.check_button_status()
             self.address_input.setProperty("isValid", True)
@@ -434,15 +534,19 @@ class MiniWindow(QDialog):
 
     def update_completions(self, completions):
         self.address_completions.setStringList(completions)
 
     def update_history(self, tx_history):
-        from util import format_satoshis
+        from util import format_satoshis, age
+
+        self.history_list.empty()
+
         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)
-            self.history_list.append(label, v_str)
+            self.history_list.append(label, v_str, age(timestamp))
 
     def acceptbit(self):
         self.actuator.acceptbit(self.quote_currencies[0])
@@ -452,16 +556,18 @@ class MiniWindow(QDialog):
 
     def show_about(self):
         QMessageBox.about(self, "Electrum",
-            _("Electrum's focus is speed, with low resource usage and simplifying Bitcoin. You do not need to perform regular backups, because your wallet can be recovered from a secret phrase that you can memorize or write on paper. Startup times are instant because it operates in conjuction with high-performance servers that handle the most complicated parts of the Bitcoin system.\n\nSend donations to 1JwTMv4GWaPdf931N6LNPJeZBfZgZJ3zX1"))
+            _("Electrum's focus is speed, with low resource usage and simplifying Bitcoin. You do not need to perform regular backups, because your wallet can be recovered from a secret phrase that you can memorize or write on paper. Startup times are instant because it operates in conjuction with high-performance servers that handle the most complicated parts of the Bitcoin system."))
 
     def show_report_bug(self):
         QMessageBox.information(self, "Electrum - " + _("Reporting Bugs"),
-            _("Email bug reports to %s") % "genjix" + "@" + "riseup.net")
+            _("Please report any bugs as issues on github: <a href=\"https://github.com/spesmilo/electrum/issues\">https://github.com/spesmilo/electrum/issues</a>"))
 
     def show_history(self, toggle_state):
         if toggle_state:
+            self.main_layout.setRowMinimumHeight(3,200)
             self.history_list.show()
         else:
+            self.main_layout.setRowMinimumHeight(3,0)
             self.history_list.hide()
 
     def backup_wallet(self):
@@ -756,9 +862,10 @@ class MiniActuator:
             print "Dumped error tx to", dumpf.name
             QMessageBox.warning(parent_window, _('Error'), message, _('OK'))
             return False
-
-        QMessageBox.information(parent_window, '',
-            _('Your transaction has been sent.') + '\n' + message, _('OK'))
+      
+        TransactionWindow(message, self)
+#        QMessageBox.information(parent_window, '',
+#            _('Your transaction has been sent.') + '\n' + message, _('OK'))
         return True
 
     def fetch_destination(self, address):
@@ -784,8 +891,15 @@ class MiniActuator:
 
     def is_valid(self, address):
         """Check if bitcoin address is valid."""
+
         return self.wallet.is_valid(address)
 
+    def copy_master_public_key(self):
+        master_pubkey = self.wallet.master_public_key
+        qApp.clipboard().setText(master_pubkey)
+        QMessageBox.information(None,"Copy succesful", "Your public master key has been copied to your clipboard.")
+        
+
     def acceptbit(self, currency):
         master_pubkey = self.wallet.master_public_key
         url = "http://acceptbit.com/mpk/%s/%s" % (master_pubkey, currency)
@@ -879,6 +993,7 @@ class MiniDriver(QObject):
         tx_history = self.wallet.get_tx_history()
         self.window.update_history(tx_history)
 
+
 if __name__ == "__main__":
     app = QApplication(sys.argv)
     with open(rsrc("style.css")) as style_file: