tadd account menus and details window - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit 4524c107cf867eec17c1d1f2cd51d872ca79914f
 (DIR) parent 2c0814f0d38aa97f84623267fba9860d79c453ed
 (HTM) Author: ThomasV <thomasv@gitorious>
       Date:   Tue, 24 Sep 2013 16:55:25 +0200
       
       add account menus and details window
       
       Diffstat:
         M gui/qt/main_window.py               |      59 ++++++++++++++++++++++++++++++-
         M gui/qt/transaction_dialog.py        |       2 +-
         M icons.qrc                           |       1 +
         M lib/wallet.py                       |      14 ++++++++++++++
       
       4 files changed, 74 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -1034,6 +1034,22 @@ class ElectrumWindow(QMainWindow):
                    self.update_receive_tab()
                    self.update_history_tab()
        
       +    def edit_account_label(self, k):
       +        text, ok = QInputDialog.getText(self, _('Rename account'), _('Name') + ':')
       +        if ok:
       +            label = unicode(text)
       +            self.set_label(k,label)
       +            self.update_receive_tab()
       +
       +    def create_account_menu(self, position, k, item):
       +        menu = QMenu()
       +        if item.isExpanded():
       +            menu.addAction(_("Reduce"), lambda: item.setExpanded(False))
       +        else:
       +            menu.addAction(_("Expand"), lambda: item.setExpanded(True))
       +        menu.addAction(_("Rename"), lambda: self.edit_account_label(k))
       +        menu.addAction(_("View details"), lambda: self.show_account_details(k))
       +        menu.exec_(self.receive_list.viewport().mapToGlobal(position))
        
            def create_receive_menu(self, position):
                # fixme: this function apparently has a side effect.
       t@@ -1042,10 +1058,16 @@ class ElectrumWindow(QMainWindow):
        
                item = self.receive_list.itemAt(position)
                if not item: return
       +
                addr = unicode(item.text(0))
                if not is_valid(addr): 
       -            item.setExpanded(not item.isExpanded())
       +            k = str(item.data(0,32).toString())
       +            if k:
       +                self.create_account_menu(position, k, item)
       +            else:
       +                item.setExpanded(not item.isExpanded())
                    return 
       +
                menu = QMenu()
                menu.addAction(_("Copy to clipboard"), lambda: self.app.clipboard().setText(addr))
                menu.addAction(_("QR code"), lambda: self.show_qrcode("bitcoin:" + addr, _("Address")) )
       t@@ -1144,6 +1166,11 @@ class ElectrumWindow(QMainWindow):
                    account_item = QTreeWidgetItem( [ name, '', self.format_amount(c+u), ''] )
                    l.addTopLevelItem(account_item)
                    account_item.setExpanded(True)
       +            account_item.setData(0, 32, k)
       +
       +            if not self.wallet.is_seeded(k):
       +                icon = QIcon(":icons/key.png")
       +                account_item.setIcon(0, icon)
                    
                    for is_change in ([0,1] if self.expert_mode else [0]):
                        if self.expert_mode:
       t@@ -1965,3 +1992,33 @@ class ElectrumWindow(QMainWindow):
                vbox.addLayout(close_button(d))
        
                d.exec_()
       +
       +
       +    def show_account_details(self, k):
       +        d = QDialog(self)
       +        d.setWindowTitle(_('Account Details'))
       +        d.setModal(1)
       +
       +        vbox = QVBoxLayout(d)
       +        roots = self.wallet.get_roots(k)
       +
       +        name = self.wallet.get_account_name(k)
       +        label = QLabel('Name: ' + name)
       +        vbox.addWidget(label)
       +
       +        acctype = '2 of 2' if len(roots) == 2 else '2 of 3' if len(roots) == 3 else 'Single key'
       +        vbox.addWidget(QLabel('Type: ' + acctype))
       +
       +        label = QLabel('Derivation: ' + k)
       +        vbox.addWidget(label)
       +
       +        #for root in roots:
       +        #    mpk = self.wallet.master_public_keys[root]
       +        #    text = QTextEdit()
       +        #    text.setReadOnly(True)
       +        #    text.setMaximumHeight(120)
       +        #    text.setText(repr(mpk))
       +        #    vbox.addWidget(text)
       +
       +        vbox.addLayout(close_button(d))
       +        d.exec_()
 (DIR) diff --git a/gui/qt/transaction_dialog.py b/gui/qt/transaction_dialog.py
       t@@ -34,7 +34,7 @@ from PyQt4.QtCore import *
        import PyQt4.QtCore as QtCore
        
        from electrum import transaction
       -from qt_util import MyTreeWidget
       +from util import MyTreeWidget
        
        class TxDialog(QDialog):
        
 (DIR) diff --git a/icons.qrc b/icons.qrc
       t@@ -7,6 +7,7 @@
            <file>icons/clock4.png</file>
            <file>icons/clock5.png</file>
            <file>icons/confirmed.png</file>
       +    <file>icons/key.png</file>
            <file>icons/lock.png</file>
            <file>icons/unlock.png</file>
            <file>icons/preferences.png</file>
 (DIR) diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -491,6 +491,20 @@ class Wallet:
                raise BaseException("Address not found", address)
        
        
       +    def get_roots(self, account):
       +        roots = []
       +        for a in account.split('&'):
       +            s = a.strip()
       +            m = re.match("(m/\d+'/)(\d+)", s)
       +            roots.append( m.group(1) )
       +        return roots
       +
       +    def is_seeded(self, account):
       +        for root in self.get_roots(account):
       +            if root not in self.master_private_keys.keys(): 
       +                return False
       +        return True
       +
            def rebase_sequence(self, account, sequence):
                c, i = sequence
                dd = []