URI: 
       tparse payto text - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit ea9e0eb053d96369a76814c073889545a7b54df1
   DIR parent c626cad0dd617912a97d97b0be9f6fa7423e3992
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Wed,  4 Jun 2014 14:49:55 +0200
       
       parse payto text
       
       Diffstat:
         M gui/qt/amountedit.py                |       2 --
         M gui/qt/main_window.py               |       4 ++--
         M gui/qt/paytoedit.py                 |      73 ++++++++++++++++++++++++++++++-
       
       3 files changed, 73 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/gui/qt/amountedit.py b/gui/qt/amountedit.py
       t@@ -58,5 +58,3 @@ class AmountEdit(QLineEdit):
                        s = s[:p] + '.' + s[p:p+8]
                self.setText(s)
                self.setCursorPosition(pos)
       -
       -
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -644,7 +644,8 @@ class ElectrumWindow(QMainWindow):
                grid.setRowStretch(8, 1)
        
                from paytoedit import PayToEdit
       -        self.payto_e = PayToEdit()
       +        self.amount_e = AmountEdit(self.get_decimal_point)
       +        self.payto_e = PayToEdit(self.amount_e)
                self.payto_help = HelpButton(_('Recipient of the funds.') + '\n\n' + _('You may enter a Bitcoin address, a label from your list of contacts (a list of completions will be proposed), or an alias (email-like address that forwards to a Bitcoin address)'))
                grid.addWidget(QLabel(_('Pay to')), 1, 0)
                grid.addWidget(self.payto_e, 1, 1, 1, 3)
       t@@ -672,7 +673,6 @@ class ElectrumWindow(QMainWindow):
                grid.addWidget(self.from_list, 3, 1, 1, 3)
                self.set_pay_from([])
        
       -        self.amount_e = AmountEdit(self.get_decimal_point)
                self.amount_help = HelpButton(_('Amount to be sent.') + '\n\n' \
                                              + _('The amount will be displayed in red if you do not have enough funds in your wallet. Note that if you have frozen some of your addresses, the available funds will be lower than your total balance.') \
                                              + '\n\n' + _('Keyboard shortcut: type "!" to send all your coins.'))
   DIR diff --git a/gui/qt/paytoedit.py b/gui/qt/paytoedit.py
       t@@ -19,11 +19,18 @@
        from PyQt4.QtCore import *
        from PyQt4.QtGui import *
        
       +import re
       +from decimal import Decimal
       +from electrum import bitcoin
       +
       +RE_ADDRESS = '[1-9A-HJ-NP-Za-km-z]{26,}'
       +RE_ALIAS = '(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>'
        
        class PayToEdit(QTextEdit):
        
       -    def __init__(self, *args, **kwargs):
       -        QTextEdit.__init__(self, *args, **kwargs)
       +    def __init__(self, amount_edit):
       +        QTextEdit.__init__(self)
       +        self.amount_edit = amount_edit
                self.document().contentsChanged.connect(self.update_size)
                self.heightMin = 0
                self.heightMax = 150
       t@@ -33,6 +40,57 @@ class PayToEdit(QTextEdit):
                self.c = None
        
        
       +    def lock_amount(self):
       +        e = self.amount_edit
       +        e.setReadOnly(True)
       +        e.setFrame(False)
       +
       +    def unlock_amount(self):
       +        e = self.amount_edit
       +        e.setReadOnly(False)
       +        e.setFrame(True)
       +
       +
       +    def parse_line(self, line):
       +        recipient, amount = line.split(',')
       +        amount = Decimal(amount.strip())
       +        recipient = recipient.strip()
       +        m = re.match(RE_ALIAS, recipient)
       +        to_address = m.group(2) if m else recipient
       +        assert bitcoin.is_address(to_address)
       +        return to_address, amount
       +
       +
       +    def check_text(self):
       +        # filter out empty lines
       +        lines = filter( lambda x: x, self.lines())
       +        outputs = []
       +        total = 0
       +
       +        for line in lines:
       +            try:
       +                to_address, amount = self.parse_line(line)
       +            except:
       +                continue
       +            outputs.append((to_address, amount))
       +            total += amount
       +
       +        self.outputs = outputs
       +
       +        self.amount_edit.setText(str(total) if total else "")
       +        if total or len(lines)>1:
       +            self.lock_amount()
       +        else:
       +            self.unlock_amount()
       +
       +    def lines(self):
       +        return str(self.toPlainText()).split('\n')
       +
       +
       +    def is_multiline(self):
       +        return len(self.lines()) > 1
       +
       +
            def update_size(self):
                docHeight = self.document().size().height()
                if self.heightMin <= docHeight <= self.heightMax:
       t@@ -56,6 +114,7 @@ class PayToEdit(QTextEdit):
                tc.movePosition(QTextCursor.EndOfWord)
                tc.insertText(completion.right(extra))
                self.setTextCursor(tc)
       +        self.check_text()
         
        
            def textUnderCursor(self):
       t@@ -70,10 +129,20 @@ class PayToEdit(QTextEdit):
                        e.ignore()
                        return
        
       +        if e.key() in [Qt.Key_Tab]:
       +            e.ignore()
       +            return
       +
       +        if e.key() in [Qt.Key_Down, Qt.Key_Up] and not self.is_multiline():
       +            e.ignore()
       +            return
       +
                isShortcut = (e.modifiers() and Qt.ControlModifier) and e.key() == Qt.Key_E
        
                if not self.c or not isShortcut:
                    QTextEdit.keyPressEvent(self, e)
       +            self.check_text()
       +
        
                ctrlOrShift = e.modifiers() and (Qt.ControlModifier or Qt.ShiftModifier)
                if self.c is None or (ctrlOrShift and e.text().isEmpty()):