def create_menu(self, position):
     menu = QMenu()
     selected = self.selectedItems()
     multi_select = len(selected) > 1
     if not selected:
         menu.addAction(_("Add contract"),
                        lambda: self.parent.contract_add_dialog())
         menu.addAction(_("Create contract"),
                        lambda: self.parent.contract_create_dialog())
     elif not multi_select:
         item = selected[0]
         name = item.text(0)
         address = item.text(1)
         column = self.currentColumn()
         column_title = self.headerItem().text(column)
         column_data = '\n'.join([item.text(column) for item in selected])
         menu.addAction(
             _("Copy %s") % column_title,
             lambda: self.parent.app.clipboard().setText(column_data))
         menu.addAction(_("Edit"),
                        lambda: self.parent.contract_edit_dialog(address))
         menu.addAction(_("Function"),
                        lambda: self.parent.contract_func_dialog(address))
         menu.addAction(_("Delete"),
                        lambda: self.parent.delete_samart_contact(address))
         URL = block_explorer_URL(self.config, {'contract': address})
         if URL:
             menu.addAction(_("View on block explorer"),
                            lambda: open_browser(URL))
     run_hook('create_smart_contract_menu', menu, selected)
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 2
0
    def create_menu(self, position):
        self.selectedIndexes()
        item = self.currentItem()
        if not item:
            return
        column = self.currentColumn()
        tx_hash = str(item.data(0, Qt.UserRole).toString())
        if not tx_hash:
            return
        if column is 0:
            column_title = "ID"
            column_data = tx_hash
        else:
            column_title = self.headerItem().text(column)
            column_data = item.text(column)

        tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
        height, conf, timestamp = self.wallet.get_tx_height(tx_hash)
        tx = self.wallet.transactions.get(tx_hash)
        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
        rbf = is_mine and height <=0 and tx and not tx.is_final()
        menu = QMenu()

        menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(column_data))
        if column in self.editable_columns:
            menu.addAction(_("Edit %s")%column_title, lambda: self.editItem(item, column))

        menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx))
        if rbf:
            menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
        if tx_URL:
            menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 3
0
    def create_menu(self, position):
        self.selectedIndexes()
        item = self.currentItem()
        if not item:
            return
        column = self.currentColumn()
        tx_hash = item.data(0, Qt.UserRole)
        if not tx_hash:
            return
        tx = self.wallet.transactions.get(tx_hash)
        if not tx:
            return
        if column is 0:
            column_title = "ID"
            column_data = tx_hash
        else:
            column_title = self.headerItem().text(column)
            column_data = item.text(column)

        tx_URL = block_explorer_URL(self.config, {'tx': tx_hash})
        height = self.wallet.get_tx_height(tx_hash).height
        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
        is_unconfirmed = height <= 0
        pr_key = self.wallet.invoices.paid.get(tx_hash)

        menu = QMenu()
        if height == TX_HEIGHT_LOCAL:
            menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))

        menu.addAction(
            _("Copy %s") % column_title,
            lambda: self.parent.app.clipboard().setText(column_data))
        if column in self.editable_columns:
            menu.addAction(
                _("Edit %s") % column_title,
                lambda: self.editItem(item, column))

        menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx))
        if is_unconfirmed and tx:
            # note: the current implementation of RBF *needs* the old tx fee
            rbf = is_mine and not tx.is_final() and fee is not None
            if rbf:
                menu.addAction(_("Increase fee"),
                               lambda: self.parent.bump_fee_dialog(tx))
            else:
                child_tx = self.wallet.cpfp(tx, 0)
                if child_tx:
                    menu.addAction(_("Child pays for parent"),
                                   lambda: self.parent.cpfp(tx, child_tx))
        if pr_key:
            menu.addAction(read_QIcon("seal"), _("View invoice"),
                           lambda: self.parent.show_invoice(pr_key))
        if tx_URL:
            menu.addAction(_("View on block explorer"),
                           lambda: open_browser(tx_URL))

        menu.addAction(_("Copy raw transaction"),
                       lambda: self.parent.app.clipboard().setText(str(tx)))

        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 4
0
    def create_menu(self, position):
        menu = QMenu()
        idx = self.indexAt(position)
        column = idx.column() or self.Columns.NAME
        selected_keys = []
        for s_idx in self.selected_in_column(self.Columns.NAME):
            sel_key = self.model().itemFromIndex(s_idx).data(Qt.UserRole)
            selected_keys.append(sel_key)
        if not selected_keys or not idx.isValid():
            menu.addAction(_("New contact"), lambda: self.parent.new_contact_dialog())
            menu.addAction(_("Import file"), lambda: self.import_contacts())
            menu.addAction(_("Export file"), lambda: self.export_contacts())
        else:
            column_title = self.model().horizontalHeaderItem(column).text()
            column_data = '\n'.join(self.model().itemFromIndex(s_idx).text()
                                    for s_idx in self.selected_in_column(column))
            menu.addAction(_("Copy {}").format(column_title), lambda: self.place_text_on_clipboard(column_data, title=column_title))
            if column in self.editable_columns:
                item = self.model().itemFromIndex(idx)
                if item.isEditable():
                    # would not be editable if openalias
                    persistent = QPersistentModelIndex(idx)
                    menu.addAction(_("Edit {}").format(column_title), lambda p=persistent: self.edit(QModelIndex(p)))
            menu.addAction(_("Pay to"), lambda: self.parent.payto_contacts(selected_keys))
            menu.addAction(_("Delete"), lambda: self.parent.delete_contacts(selected_keys))
            URLs = [block_explorer_URL(self.config, 'addr', key) for key in filter(is_address, selected_keys)]
            if URLs:
                menu.addAction(_("View on block explorer"), lambda: [webopen(u) for u in URLs])

        run_hook('create_contact_menu', menu, selected_keys)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 5
0
 def create_menu(self, position: QPoint):
     org_idx: QModelIndex = self.indexAt(position)
     idx = self.proxy.mapToSource(org_idx)
     if not idx.isValid():
         # can happen e.g. before list is populated for the first time
         return
     tx_item = idx.internalPointer().get_data()
     if tx_item.get('lightning') and tx_item['type'] == 'payment':
         menu = QMenu()
         menu.addAction(_("View Payment"), lambda: self.parent.show_lightning_transaction(tx_item))
         cc = self.add_copy_menu(menu, idx)
         cc.addAction(_("Payment Hash"), lambda: self.place_text_on_clipboard(tx_item['payment_hash'], title="Payment Hash"))
         cc.addAction(_("Preimage"), lambda: self.place_text_on_clipboard(tx_item['preimage'], title="Preimage"))
         menu.exec_(self.viewport().mapToGlobal(position))
         return
     tx_hash = tx_item['txid']
     if tx_item.get('lightning'):
         tx = self.wallet.lnworker.lnwatcher.db.get_transaction(tx_hash)
     else:
         tx = self.wallet.db.get_transaction(tx_hash)
     if not tx:
         return
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     tx_details = self.wallet.get_tx_info(tx)
     is_unconfirmed = tx_details.tx_mined_status.height <= 0
     menu = QMenu()
     if tx_details.can_remove:
         menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))
     cc = self.add_copy_menu(menu, idx)
     cc.addAction(_("Transaction ID"), lambda: self.place_text_on_clipboard(tx_hash, title="TXID"))
     for c in self.editable_columns:
         if self.isColumnHidden(c): continue
         label = self.hm.headerData(c, Qt.Horizontal, Qt.DisplayRole)
         # TODO use siblingAtColumn when min Qt version is >=5.11
         persistent = QPersistentModelIndex(org_idx.sibling(org_idx.row(), c))
         menu.addAction(_("Edit {}").format(label), lambda p=persistent: self.edit(QModelIndex(p)))
     menu.addAction(_("View Transaction"), lambda: self.show_transaction(tx_item, tx))
     channel_id = tx_item.get('channel_id')
     if channel_id:
         menu.addAction(_("View Channel"), lambda: self.parent.show_channel(bytes.fromhex(channel_id)))
     if is_unconfirmed and tx:
         # note: the current implementation of RBF *needs* the old tx fee
         if tx_details.can_bump and tx_details.fee is not None:
             menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
         else:
             child_tx = self.wallet.cpfp(tx, 0)
             if child_tx:
                 menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
         if tx_details.can_dscancel and tx_details.fee is not None:
             menu.addAction(_("Cancel (double-spend)"), lambda: self.parent.dscancel_dialog(tx))
     invoices = self.wallet.get_relevant_invoices_for_tx(tx)
     if len(invoices) == 1:
         menu.addAction(_("View invoice"), lambda inv=invoices[0]: self.parent.show_onchain_invoice(inv))
     elif len(invoices) > 1:
         menu_invs = menu.addMenu(_("Related invoices"))
         for inv in invoices:
             menu_invs.addAction(_("View invoice"), lambda inv=inv: self.parent.show_onchain_invoice(inv))
     if tx_URL:
         menu.addAction(_("View on block explorer"), lambda: webopen(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 6
0
 def create_menu(self, position):
     menu = QMenu()
     selected = self.selected_in_column(self.Columns.NAME)
     multi_select = len(selected) > 1
     if not selected:
         menu.addAction(_("Add contract"),
                        lambda: self.parent.contract_add_dialog())
         menu.addAction(_("Create contract"),
                        lambda: self.parent.contract_create_dialog())
     elif not multi_select:
         address = self.model().itemFromIndex(
             self.selected_in_column(self.Columns.ADDRESS)[0]).text()
         idx = self.indexAt(position)
         if not idx.isValid():
             return
         col = idx.column()
         column_title = self.model().horizontalHeaderItem(col).text()
         copy_text = self.model().itemFromIndex(idx).text()
         menu.addAction(
             _("Copy {}").format(column_title),
             lambda: self.place_text_on_clipboard(copy_text))
         menu.addAction(_("Edit"),
                        lambda: self.parent.contract_edit_dialog(address))
         menu.addAction(_("Function"),
                        lambda: self.parent.contract_func_dialog(address))
         menu.addAction(_("Delete"),
                        lambda: self.parent.delete_samart_contact(address))
         URL = block_explorer_URL(self.config, token=address)
         if URL:
             menu.addAction(_("View on block explorer"),
                            lambda: webopen(URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 7
0
    def create_menu(self, position):
        self.selectedIndexes()
        item = self.currentItem()
        if not item:
            return
        column = self.currentColumn()
        tx_hash = str(item.data(0, Qt.UserRole).toString())
        if not tx_hash:
            return
        if column is 0:
            column_title = "ID"
            column_data = tx_hash
        else:
            column_title = self.headerItem().text(column)
            column_data = item.text(column)

        tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
        height, conf, timestamp = self.wallet.get_tx_height(tx_hash)
        tx = self.wallet.transactions.get(tx_hash)
        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
        rbf = is_mine and height <=0 and tx and not tx.is_final()
        menu = QMenu()

        menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(column_data))
        if column in self.editable_columns:
            menu.addAction(_("Edit %s")%column_title, lambda: self.editItem(item, column))

        menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx))
        if rbf:
            menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
        if tx_URL:
            menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 8
0
 def create_menu(self, position: QPoint):
     menu = QMenu()
     selected = self.selected_in_column(self.Columns.NAME)
     multi_select = len(selected) > 1
     if not selected:
         menu.addAction(_("Add Token"), lambda: self.parent.token_add_dialog())
     elif not multi_select:
         name = self.model().itemFromIndex(self.selected_in_column(self.Columns.NAME)[0]).text()
         bind_addr = self.model().itemFromIndex(self.selected_in_column(self.Columns.BIND_ADDRESS)[0]).text()
         contract_addr = self.model().itemFromIndex(self.selected_in_column(self.Columns.NAME)[0]).data(
             Qt.UserRole)
         key = '{}_{}'.format(contract_addr, bind_addr)
         token = self.parent.wallet.db.get_token(key)
         idx = self.indexAt(position)
         if not idx.isValid():
             return
         col = idx.column()
         item = self.model().itemFromIndex(idx)
         column_title = self.model().horizontalHeaderItem(col).text()
         copy_text = self.model().itemFromIndex(idx).text()
         if col == self.Columns.BALANCE:
             copy_text = copy_text.strip()
         menu.addAction(_("Copy {}").format(column_title), lambda: self.place_text_on_clipboard(copy_text))
         menu.addAction(_("View Info"), lambda: self.parent.token_info_dialog(token))
         menu.addAction(_("Send"), lambda: self.parent.token_send_dialog(token))
         menu.addAction(_("Delete"), lambda: self.parent.delete_token(key))
         URL = block_explorer_URL(self.config, addr=bind_addr, token=contract_addr)
         if URL:
             menu.addAction(_("View on block explorer"), lambda: webopen(URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 9
0
    def create_menu(self, position):
        menu = QMenu()
        selected = self.selectedItems()
        if not selected:
            menu.addAction(_("New contact"),
                           lambda: self.parent.new_contact_dialog())
            menu.addAction(_("Import file"), lambda: self.import_contacts())
        else:
            names = [item.text(0) for item in selected]
            keys = [item.text(1) for item in selected]
            column = self.currentColumn()
            column_title = self.headerItem().text(column)
            column_data = '\n'.join([item.text(column) for item in selected])
            menu.addAction(
                _("Copy %s") % column_title,
                lambda: self.parent.app.clipboard().setText(column_data))
            if column in self.editable_columns:
                item = self.currentItem()
                menu.addAction(
                    _("Edit %s") % column_title,
                    lambda: self.editItem(item, column))
            menu.addAction(_("Pay to"),
                           lambda: self.parent.payto_contacts(keys))
            menu.addAction(_("Delete"),
                           lambda: self.parent.delete_contacts(keys))
            URLs = [
                block_explorer_URL(self.config, 'addr', key)
                for key in filter(is_address, keys)
            ]
            if URLs:
                menu.addAction(_("View on block explorer"),
                               lambda: map(webbrowser.open, URLs))

        run_hook('create_contact_menu', menu, selected)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 10
0
    def create_menu(self, position):
        menu = QMenu()
        selected = self.selected_in_column(0)
        selected_keys = []
        for idx in selected:
            sel_key = self.model().itemFromIndex(idx).data(Qt.UserRole)
            selected_keys.append(sel_key)
        idx = self.indexAt(position)
        if not selected or not idx.isValid():
            menu.addAction(_("New contact"), lambda: self.parent.new_contact_dialog())
            menu.addAction(_("Import file"), lambda: self.import_contacts())
            menu.addAction(_("Export file"), lambda: self.export_contacts())
        else:
            column = idx.column()
            column_title = self.model().horizontalHeaderItem(column).text()
            column_data = '\n'.join(self.model().itemFromIndex(idx).text() for idx in selected)
            menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
            if column in self.editable_columns:
                item = self.model().itemFromIndex(idx)
                if item.isEditable():
                    # would not be editable if openalias
                    persistent = QPersistentModelIndex(idx)
                    menu.addAction(_("Edit {}").format(column_title), lambda p=persistent: self.edit(QModelIndex(p)))
            menu.addAction(_("Pay to"), lambda: self.parent.payto_contacts(selected_keys))
            menu.addAction(_("Delete"), lambda: self.parent.delete_contacts(selected_keys))
            URLs = [block_explorer_URL(self.config, 'addr', key) for key in filter(is_address, selected_keys)]
            if URLs:
                menu.addAction(_("View on block explorer"), lambda: map(webbrowser.open, URLs))

        run_hook('create_contact_menu', menu, selected_keys)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 11
0
    def create_menu(self, position: QPoint):
        org_idx: QModelIndex = self.indexAt(position)
        idx = self.proxy.mapToSource(org_idx)
        if not idx.isValid():
            # can happen e.g. before list is populated for the first time
            return
        tx_item = self.thm.transactions.value_from_pos(idx.row())
        column = idx.column()
        column_title = self.thm.headerData(column, Qt.Horizontal,
                                           Qt.DisplayRole)
        column_data = self.thm.data(idx, Qt.DisplayRole).value()
        tx_hash = tx_item['txid']
        tx = self.wallet.db.get_token_tx(tx_hash)
        if not tx:
            return
        tx_URL = block_explorer_URL(self.config, tx=tx_hash)
        menu = QMenu()
        if column is TokenHistoryColumns.AMOUNT:
            column_data = column_data.strip()
        menu.addAction(
            _("Copy {}").format(column_title),
            lambda: self.parent.app.clipboard().setText(column_data))
        menu.addAction(_("Details"), lambda: self.show_transaction(tx_hash))

        if tx_URL:
            menu.addAction(_("View on block explorer"),
                           lambda: webopen(tx_URL))
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 12
0
 def create_menu(self, position):
     menu = QMenu()
     selected = self.selectedItems()
     multi_select = len(selected) > 1
     if not selected:
         menu.addAction(_("Add Token"),
                        lambda: self.parent.token_add_dialog())
     elif not multi_select:
         item = selected[0]
         name = item.text(0)
         bind_addr = item.text(1)
         contract_addr = item.data(0, Qt.UserRole)
         key = '{}_{}'.format(contract_addr, bind_addr)
         token = self.parent.tokens.get(key, None)
         column = self.currentColumn()
         column_title = self.headerItem().text(column)
         column_data = '\n'.join([item.text(column) for item in selected])
         menu.addAction(
             _("Copy %s") % column_title,
             lambda: self.parent.app.clipboard().setText(column_data))
         menu.addAction(_("View Info"),
                        lambda: self.parent.token_view_dialog(token))
         menu.addAction(_("Send"),
                        lambda: self.parent.token_send_dialog(token))
         menu.addAction(_("Delete"), lambda: self.parent.delete_token(key))
         URL = block_explorer_URL(self.config, {
             'addr': bind_addr,
             'token': contract_addr
         })
         if URL:
             menu.addAction(_("View on block explorer"),
                            lambda: open_browser(URL))
     run_hook('create_tokens_menu', menu, selected)
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 13
0
    def create_menu(self, position):
        menu = QMenu()
        selected = self.selectedItems()
        if not selected:
            menu.addAction(_("New contact"), lambda: self.parent.new_contact_dialog())
            menu.addAction(_("Import file"), lambda: self.import_contacts())
            menu.addAction(_("Export file"), lambda: self.export_contacts())
        else:
            names = [item.text(0) for item in selected]
            keys = [item.text(1) for item in selected]
            column = self.currentColumn()
            column_title = self.headerItem().text(column)
            column_data = '\n'.join([item.text(column) for item in selected])
            menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
            if column in self.editable_columns:
                item = self.currentItem()
                menu.addAction(_("Edit {}").format(column_title), lambda: self.editItem(item, column))
            menu.addAction(_("Pay to"), lambda: self.parent.payto_contacts(keys))
            menu.addAction(_("Delete"), lambda: self.parent.delete_contacts(keys))
            URLs = [block_explorer_URL(self.config, 'addr', key) for key in filter(is_address, keys)]
            if URLs:
                menu.addAction(_("View on block explorer"), lambda: map(webbrowser.open, URLs))

        run_hook('create_contact_menu', menu, selected)
        menu.exec_(self.viewport().mapToGlobal(position))
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selected_in_column(self.Columns.ADDRESS)
        if not selected:
            return
        multi_select = len(selected) > 1
        addrs = [self.item_from_index(item).text() for item in selected]
        menu = QMenu()
        if not multi_select:
            idx = self.indexAt(position)
            if not idx.isValid():
                return
            item = self.item_from_index(idx)
            if not item:
                return
            addr = addrs[0]
            addr_column_title = self.std_model.horizontalHeaderItem(
                self.Columns.LABEL).text()
            addr_idx = idx.sibling(idx.row(), self.Columns.LABEL)
            self.add_copy_menu(menu, idx)
            menu.addAction(_('Details'),
                           lambda: self.parent.show_address(addr))
            persistent = QPersistentModelIndex(addr_idx)
            menu.addAction(_("Edit {}").format(addr_column_title),
                           lambda p=persistent: self.edit(QModelIndex(p)))
            #menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"),
                               lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"),
                               lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"),
                               lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"),
                               lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"),
                               lambda: webopen(addr_URL))

            if not self.wallet.is_frozen_address(addr):
                menu.addAction(
                    _("Freeze"), lambda: self.parent.
                    set_frozen_state_of_addresses([addr], True))
            else:
                menu.addAction(
                    _("Unfreeze"), lambda: self.parent.
                    set_frozen_state_of_addresses([addr], False))

        coins = self.wallet.get_spendable_coins(addrs)
        if coins:
            menu.addAction(_("Spend from"),
                           lambda: self.parent.utxo_list.set_spend_list(coins))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 15
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selectedItems()
        multi_select = len(selected) > 1
        addrs = [item.text(1) for item in selected]
        if not addrs:
            return
        if not multi_select:
            item = self.itemAt(position)
            col = self.currentColumn()
            if not item:
                return
            addr = addrs[0]
            if not is_address(addr):
                item.setExpanded(not item.isExpanded())
                return

        menu = QMenu()
        if not multi_select:
            column_title = self.headerItem().text(col)
            copy_text = item.text(col)
            menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(copy_text))
            menu.addAction(_('Details'), lambda: self.parent.show_address(addr))
            if col in self.editable_columns:
                menu.addAction(_("Edit {}").format(column_title), lambda: self.editItem(item, col))
            menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))

            if not self.wallet.is_frozen(addr):
                menu.addAction(_("Freeze"), lambda: self.parent.set_frozen_state([addr], True))
            else:
                menu.addAction(_("Unfreeze"), lambda: self.parent.set_frozen_state([addr], False))
            if not self.wallet.is_registered(addr):
                if not self.wallet.is_pending(addr):
                    menu.addAction(_("Register"), lambda: self.parent.set_pending_state([addr], True))                
                else:
                    menu.addAction(_("UnRegister"), lambda: self.parent.set_pending_state([addr], False))

        coins = self.wallet.get_utxos(addrs)
        if coins:
            menu.addAction(_("Spend from"), lambda: self.parent.spend_coins(coins))
            if not multi_select:
                menu.addAction(_("Send registeraddress transaction from"), lambda: self.parent.do_register_addresses(coins, addr))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 16
0
 def create_menu(self, position: QPoint):
     org_idx: QModelIndex = self.indexAt(position)
     idx = self.proxy.mapToSource(org_idx)
     if not idx.isValid():
         # can happen e.g. before list is populated for the first time
         return
     tx_item = self.hm.transactions.value_from_pos(idx.row())
     column = idx.column()
     if column == HistoryColumns.STATUS_ICON:
         column_title = _('Transaction ID')
         column_data = tx_item['txid']
     else:
         column_title = self.hm.headerData(column, Qt.Horizontal,
                                           Qt.DisplayRole)
         column_data = self.hm.data(idx, Qt.DisplayRole).value()
     tx_hash = tx_item['txid']
     tx = self.wallet.db.get_transaction(tx_hash)
     if not tx:
         return
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     height = self.wallet.get_tx_height(tx_hash).height
     is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
     is_unconfirmed = height <= 0
     pr_key = self.wallet.invoices.paid.get(tx_hash)
     menu = QMenu()
     if height == TX_HEIGHT_LOCAL:
         menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))
     menu.addAction(
         _("Copy {}").format(column_title),
         lambda: self.parent.app.clipboard().setText(column_data))
     for c in self.editable_columns:
         if self.isColumnHidden(c): continue
         label = self.hm.headerData(c, Qt.Horizontal, Qt.DisplayRole)
         # TODO use siblingAtColumn when min Qt version is >=5.11
         persistent = QPersistentModelIndex(
             org_idx.sibling(org_idx.row(), c))
         menu.addAction(_("Edit {}").format(label),
                        lambda p=persistent: self.edit(QModelIndex(p)))
     menu.addAction(_("Details"), lambda: self.show_transaction(tx_hash))
     if is_unconfirmed and tx:
         # note: the current implementation of RBF *needs* the old tx fee
         rbf = is_mine and not tx.is_final() and fee is not None
         if rbf:
             menu.addAction(_("Increase fee"),
                            lambda: self.parent.bump_fee_dialog(tx))
         else:
             child_tx = self.wallet.cpfp(tx, 0)
             if child_tx:
                 menu.addAction(_("Child pays for parent"),
                                lambda: self.parent.cpfp(tx, child_tx))
     if pr_key:
         menu.addAction(read_QIcon("seal"), _("View invoice"),
                        lambda: self.parent.show_invoice(pr_key))
     if tx_URL:
         menu.addAction(_("View on block explorer"),
                        lambda: webbrowser.open(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 17
0
 def create_menu(self, position: QPoint):
     org_idx: QModelIndex = self.indexAt(position)
     idx = self.proxy.mapToSource(org_idx)
     item: QStandardItem = self.std_model.itemFromIndex(idx)
     if not item:
         # can happen e.g. before list is populated for the first time
         return
     tx_hash = idx.data(self.TX_HASH_ROLE)
     column = idx.column()
     assert tx_hash, "create_menu: no tx hash"
     tx = self.wallet.transactions.get(tx_hash)
     assert tx, "create_menu: no tx"
     if column == 0:
         column_title = _('Transaction ID')
         column_data = tx_hash
     else:
         column_title = self.std_model.horizontalHeaderItem(column).text()
         column_data = item.text()
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     height = self.wallet.get_tx_height(tx_hash).height
     is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
     is_unconfirmed = height <= 0
     pr_key = self.wallet.invoices.paid.get(tx_hash)
     menu = QMenu()
     if height == TX_HEIGHT_LOCAL:
         menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))
     menu.addAction(
         _("Copy {}").format(column_title),
         lambda: self.parent.app.clipboard().setText(column_data))
     for c in self.editable_columns:
         label = self.std_model.horizontalHeaderItem(c).text()
         # TODO use siblingAtColumn when min Qt version is >=5.11
         persistent = QPersistentModelIndex(
             org_idx.sibling(org_idx.row(), c))
         menu.addAction(_("Edit {}").format(label),
                        lambda p=persistent: self.edit(QModelIndex(p)))
     menu.addAction(_("Details"), lambda: self.show_transaction(tx_hash))
     if is_unconfirmed and tx:
         # note: the current implementation of RBF *needs* the old tx fee
         rbf = is_mine and not tx.is_final() and fee is not None
         if rbf:
             menu.addAction(_("Increase fee"),
                            lambda: self.parent.bump_fee_dialog(tx))
         else:
             child_tx = self.wallet.cpfp(tx, 0)
             if child_tx:
                 menu.addAction(_("Child pays for parent"),
                                lambda: self.parent.cpfp(tx, child_tx))
     if pr_key:
         menu.addAction(self.icon_cache.get(":icons/seal"),
                        _("View invoice"),
                        lambda: self.parent.show_invoice(pr_key))
     if tx_URL:
         menu.addAction(_("View on block explorer"),
                        lambda: webbrowser.open(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 18
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selectedItems()
        multi_select = len(selected) > 1
        addrs = [unicode(item.text(0)) for item in selected]
        if not addrs:
            return
        if not multi_select:
            item = self.itemAt(position)
            col = self.currentColumn()
            if not item:
                return
            addr = addrs[0]
            if not is_address(addr):
                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()
        if not multi_select:
            column_title = self.headerItem().text(col)
            menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(item.text(col)))
            if col in self.editable_columns:
                menu.addAction(_("Edit %s")%column_title, lambda: self.editItem(item, col))
            menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
            menu.addAction(_('History'), lambda: self.parent.show_address(addr))
            menu.addAction(_('Public Keys'), lambda: self.parent.show_public_keys(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))

        if any(not self.wallet.is_frozen(addr) for addr in addrs):
            menu.addAction(_("Freeze"), lambda: self.parent.set_frozen_state(addrs, True))
        if any(self.wallet.is_frozen(addr) for addr in addrs):
            menu.addAction(_("Unfreeze"), lambda: self.parent.set_frozen_state(addrs, False))

        def can_send(addr):
            return not self.wallet.is_frozen(addr) and sum(self.wallet.get_addr_balance(addr)[:2])
        if any(can_send(addr) for addr in addrs):
            menu.addAction(_("Send From"), lambda: self.parent.send_from_addresses(addrs))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 19
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet, Imported_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        is_imported = isinstance(self.wallet, Imported_Wallet)
        selected = self.selectedItems()
        multi_select = len(selected) > 1
        addrs = [unicode(item.text(0)) for item in selected]
        if not addrs:
            return
        if not multi_select:
            item = self.itemAt(position)
            col = self.currentColumn()
            if not item:
                return
            addr = addrs[0]
            if not is_address(addr):
                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()
        if not multi_select:
            column_title = self.headerItem().text(col)
            menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(item.text(col)))
            if col in self.editable_columns:
                menu.addAction(_("Edit %s")%column_title, lambda: self.editItem(item, col))
            menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
            menu.addAction(_('History'), lambda: self.parent.show_address(addr))
            menu.addAction(_('Public Keys'), lambda: self.parent.show_public_keys(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
            if is_imported:
                menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))

        if any(not self.wallet.is_frozen(addr) for addr in addrs):
            menu.addAction(_("Freeze"), lambda: self.parent.set_frozen_state(addrs, True))
        if any(self.wallet.is_frozen(addr) for addr in addrs):
            menu.addAction(_("Unfreeze"), lambda: self.parent.set_frozen_state(addrs, False))

        def can_send(addr):
            return not self.wallet.is_frozen(addr) and sum(self.wallet.get_addr_balance(addr)[:2])
        if any(can_send(addr) for addr in addrs):
            menu.addAction(_("Send From"), lambda: self.parent.send_from_addresses(addrs))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 20
0
    def create_menu(self, position):
        self.selectedIndexes()
        item = self.currentItem()
        if not item:
            return
        column = self.currentColumn()
        tx_hash = item.data(0, Qt.UserRole)
        if not tx_hash:
            return
        if column is 0:
            column_title = "ID"
            column_data = tx_hash
        else:
            column_title = self.headerItem().text(column)
            column_data = item.text(column)

        tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
        height, conf, timestamp = self.wallet.get_tx_height(tx_hash)
        tx = self.wallet.transactions.get(tx_hash)
        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
        is_unconfirmed = height <= 0
        pr_key = self.wallet.invoices.paid.get(tx_hash)

        menu = QMenu()

        if height == TX_HEIGHT_LOCAL:
            menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))

        menu.addAction(
            _("Copy {}").format(column_title),
            lambda: self.parent.app.clipboard().setText(column_data))
        for c in self.editable_columns:
            menu.addAction(
                _("Edit {}").format(self.headerItem().text(c)),
                lambda: self.editItem(item, c))

        menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx))

        if is_unconfirmed and tx:
            rbf = is_mine and not tx.is_final()
            if rbf:
                menu.addAction(_("Increase fee"),
                               lambda: self.parent.bump_fee_dialog(tx))
            else:
                child_tx = self.wallet.cpfp(tx, 0)
                if child_tx:
                    menu.addAction(_("Child pays for parent"),
                                   lambda: self.parent.cpfp(tx, child_tx))
        if pr_key:
            menu.addAction(QIcon(":icons/seal"), _("View invoice"),
                           lambda: self.parent.show_invoice(pr_key))
        if tx_URL:
            menu.addAction(_("View on block explorer"),
                           lambda: webbrowser.open(tx_URL))
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 21
0
    def create_menu(self, position: QPoint):
        org_idx: QModelIndex = self.indexAt(position)
        idx = self.proxy.mapToSource(org_idx)
        if not idx.isValid():
            # can happen e.g. before list is populated for the first time
            return
        tx_item = self.hm.transactions.value_from_pos(idx.row())
        column = idx.column()
        if column == HistoryColumns.STATUS_ICON:
            column_title = _('Transaction ID')
            column_data = tx_item['txid']
        else:
            column_title = self.hm.headerData(column, Qt.Horizontal, Qt.DisplayRole)
            column_data = self.hm.data(idx, Qt.DisplayRole).value()
        tx_hash = tx_item['txid']
        tx = self.wallet.db.get_transaction(tx_hash)
        if not tx:
            return
        tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
        height = self.wallet.get_tx_height(tx_hash).height
        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
        is_unconfirmed = height <= 0
        pr_key = self.wallet.invoices.paid.get(tx_hash)
        menu = QMenu()
        if height == TX_HEIGHT_LOCAL:
            menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))

        amount_columns = [HistoryColumns.COIN_VALUE, HistoryColumns.RUNNING_COIN_BALANCE, HistoryColumns.FIAT_VALUE, HistoryColumns.FIAT_ACQ_PRICE, HistoryColumns.FIAT_CAP_GAINS]
        if column in amount_columns:
            column_data = column_data.strip()
        menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))

        for c in self.editable_columns:
            if self.isColumnHidden(c): continue
            label = self.hm.headerData(c, Qt.Horizontal, Qt.DisplayRole)
            # TODO use siblingAtColumn when min Qt version is >=5.11
            persistent = QPersistentModelIndex(org_idx.sibling(org_idx.row(), c))
            menu.addAction(_("Edit {}").format(label), lambda p=persistent: self.edit(QModelIndex(p)))
        menu.addAction(_("Details"), lambda: self.show_transaction(tx_hash))
        if is_unconfirmed and tx:
            # note: the current implementation of RBF *needs* the old tx fee
            rbf = is_mine and not tx.is_final() and fee is not None
            if rbf:
                menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
            else:
                child_tx = self.wallet.cpfp(tx, 0)
                if child_tx:
                    menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
        if pr_key:
            menu.addAction(read_QIcon("seal"), _("View invoice"), lambda: self.parent.show_invoice(pr_key))
        if tx_URL:
            menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 22
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selectedItems()
        multi_select = len(selected) > 1
        addrs = [unicode(item.text(0)) for item in selected]
        if not addrs:
            return
        if not multi_select:
            item = self.itemAt(position)
            col = self.currentColumn()
            if not item:
                return
            addr = addrs[0]
            if not is_address(addr):
                item.setExpanded(not item.isExpanded())
                return

        menu = QMenu()
        if not multi_select:
            column_title = self.headerItem().text(col)
            menu.addAction(
                _("Copy %s") % column_title,
                lambda: self.parent.app.clipboard().setText(item.text(col)))
            if col in self.editable_columns:
                menu.addAction(
                    _("Edit %s") % column_title,
                    lambda: self.editItem(item, col))
            menu.addAction(_("Request payment"),
                           lambda: self.parent.receive_at(addr))
            menu.addAction(_('History'),
                           lambda: self.parent.show_address(addr))
            menu.addAction(_('Public Keys'),
                           lambda: self.parent.show_public_keys(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"),
                               lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"),
                               lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"),
                               lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"),
                               lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"),
                               lambda: webbrowser.open(addr_URL))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 23
0
 def create_menu(self, position: QPoint):
     org_idx: QModelIndex = self.indexAt(position)
     idx = self.proxy.mapToSource(org_idx)
     if not idx.isValid():
         # can happen e.g. before list is populated for the first time
         return
     tx_item = self.hm.transactions.value_from_pos(idx.row())
     if tx_item.get('lightning'):
         return
     tx_hash = tx_item['txid']
     tx = self.wallet.db.get_transaction(tx_hash)
     if not tx:
         return
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     height = self.wallet.get_tx_height(tx_hash).height
     is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
     is_unconfirmed = height <= 0
     invoice_keys = self.wallet._get_relevant_invoice_keys_for_tx(tx)
     menu = QMenu()
     if height in [TX_HEIGHT_FUTURE, TX_HEIGHT_LOCAL]:
         menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))
     menu.addAction(
         _("Copy Transaction ID"),
         lambda: self.place_text_on_clipboard(tx_hash, title="TXID"))
     self.add_copy_menu(menu, idx)
     for c in self.editable_columns:
         if self.isColumnHidden(c): continue
         label = self.hm.headerData(c, Qt.Horizontal, Qt.DisplayRole)
         # TODO use siblingAtColumn when min Qt version is >=5.11
         persistent = QPersistentModelIndex(
             org_idx.sibling(org_idx.row(), c))
         menu.addAction(_("Edit {}").format(label),
                        lambda p=persistent: self.edit(QModelIndex(p)))
     menu.addAction(_("Details"), lambda: self.show_transaction(tx_item))
     if is_unconfirmed and tx:
         # note: the current implementation of RBF *needs* the old tx fee
         rbf = is_mine and not tx.is_final() and fee is not None
         if rbf:
             menu.addAction(_("Increase fee"),
                            lambda: self.parent.bump_fee_dialog(tx))
         else:
             child_tx = self.wallet.cpfp(tx, 0)
             if child_tx:
                 menu.addAction(_("Child pays for parent"),
                                lambda: self.parent.cpfp(tx, child_tx))
     if invoice_keys:
         menu.addAction(
             read_QIcon("seal"), _("View invoice"), lambda:
             [self.parent.show_invoice(key) for key in invoice_keys])
     if tx_URL:
         menu.addAction(_("View on block explorer"),
                        lambda: webopen(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 24
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selected_in_column(self.Columns.ADDRESS)
        if not selected:
            return
        multi_select = len(selected) > 1
        addrs = [self.model().itemFromIndex(item).text() for item in selected]
        menu = QMenu()
        if not multi_select:
            idx = self.indexAt(position)
            col = idx.column()
            item = self.model().itemFromIndex(idx)
            if not item:
                return
            addr = addrs[0]

            addr_column_title = self.model().horizontalHeaderItem(self.Columns.LABEL).text()
            addr_idx = idx.sibling(idx.row(), self.Columns.LABEL)

            column_title = self.model().horizontalHeaderItem(col).text()
            copy_text = self.model().itemFromIndex(idx).text()
            if col == self.Columns.COIN_BALANCE or col == self.Columns.FIAT_BALANCE:
                copy_text = copy_text.strip()
            menu.addAction(_("Copy {}").format(column_title), lambda: self.place_text_on_clipboard(copy_text))
            menu.addAction(_('Details'), lambda: self.parent.show_address(addr))
            persistent = QPersistentModelIndex(addr_idx)
            menu.addAction(_("Edit {}").format(addr_column_title), lambda p=persistent: self.edit(QModelIndex(p)))
            menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))

            if not self.wallet.is_frozen_address(addr):
                menu.addAction(_("Freeze"), lambda: self.parent.set_frozen_state_of_addresses([addr], True))
            else:
                menu.addAction(_("Unfreeze"), lambda: self.parent.set_frozen_state_of_addresses([addr], False))

        coins = self.wallet.get_spendable_coins(addrs, config=self.config)
        if coins:
            menu.addAction(_("Spend from"), lambda: self.parent.spend_coins(coins))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 25
0
    def create_menu(self, position):
        menu = QMenu()
        selected = self.selectedItems()
        item = self.itemAt(position)
        if selected:
            names = [item.text(2) for item in selected]
            keys = [item.text(3) for item in selected]
            URLs = [block_explorer_URL(self.config, 'addr', key) for key in filter(is_address, keys)]
            #if URLs:
                #menu.addAction(_("View on block explorer"), lambda: map(webbrowser.open, URLs))

        run_hook('create_contact_menu', menu, selected)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 26
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selectedItems()
        multi_select = len(selected) > 1
        addrs = [item.text(1) for item in selected]
        if not addrs:
            return
        if not multi_select:
            item = self.itemAt(position)
            col = self.currentColumn()
            if not item:
                return
            addr = addrs[0]
            if not is_address(addr):
                item.setExpanded(not item.isExpanded())
                return

        menu = QMenu()
        if not multi_select:
            column_title = self.headerItem().text(col)
            copy_text = item.text(col)
            menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(copy_text))
            menu.addAction(_('Details'), lambda: self.parent.show_address(addr))
            if col in self.editable_columns:
                menu.addAction(_("Edit {}").format(column_title), lambda: self.editItem(item, col))
            menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))

            if not self.wallet.is_frozen(addr):
                menu.addAction(_("Freeze"), lambda: self.parent.set_frozen_state([addr], True))
            else:
                menu.addAction(_("Unfreeze"), lambda: self.parent.set_frozen_state([addr], False))

        coins = self.wallet.get_utxos(addrs)
        if coins:
            menu.addAction(_("Spend from"), lambda: self.parent.spend_coins(coins))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 27
0
 def create_menu(self, position: QPoint):
     org_idx: QModelIndex = self.indexAt(position)
     idx = self.proxy.mapToSource(org_idx)
     item: QStandardItem = self.std_model.itemFromIndex(idx)
     if not item:
         # can happen e.g. before list is populated for the first time
         return
     tx_hash = idx.data(self.TX_HASH_ROLE)
     column = idx.column()
     assert tx_hash, "create_menu: no tx hash"
     tx = self.wallet.transactions.get(tx_hash)
     assert tx, "create_menu: no tx"
     if column == 0:
         column_title = _('Transaction ID')
         column_data = tx_hash
     else:
         column_title = self.std_model.horizontalHeaderItem(column).text()
         column_data = item.text()
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     height = self.wallet.get_tx_height(tx_hash).height
     is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
     is_unconfirmed = height <= 0
     pr_key = self.wallet.invoices.paid.get(tx_hash)
     menu = QMenu()
     if height == TX_HEIGHT_LOCAL:
         menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))
     menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
     for c in self.editable_columns:
         label = self.std_model.horizontalHeaderItem(c).text()
         # TODO use siblingAtColumn when min Qt version is >=5.11
         persistent = QPersistentModelIndex(org_idx.sibling(org_idx.row(), c))
         menu.addAction(_("Edit {}").format(label), lambda p=persistent: self.edit(QModelIndex(p)))
     menu.addAction(_("Details"), lambda: self.show_transaction(tx_hash))
     if is_unconfirmed and tx:
         # note: the current implementation of RBF *needs* the old tx fee
         rbf = is_mine and not tx.is_final() and fee is not None
         if rbf:
             menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
         else:
             child_tx = self.wallet.cpfp(tx, 0)
             if child_tx:
                 menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
     if pr_key:
         menu.addAction(self.icon_cache.get(":icons/seal"), _("View invoice"), lambda: self.parent.show_invoice(pr_key))
     if tx_URL:
         menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 28
0
 def create_menu(self, position):
     self.selectedIndexes()
     item = self.currentItem()
     if not item:
         return
     tx_hash = str(item.data(0, Qt.UserRole).toString())
     if not tx_hash:
         return
     tx_URL = block_explorer_URL(self.config, "tx", tx_hash)
     if not tx_URL:
         return
     menu = QMenu()
     menu.addAction(_("Copy ID to Clipboard"), lambda: self.parent.app.clipboard().setText(tx_hash))
     menu.addAction(_("Details"), lambda: self.parent.show_transaction(self.wallet.transactions.get(tx_hash)))
     menu.addAction(_("Edit description"), lambda: self.editItem(item, self.editable_columns[0]))
     menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
 def create_menu(self, position):
     self.selectedIndexes()
     item = self.currentItem()
     if not item:
         return
     tx_hash = str(item.data(0, Qt.UserRole).toString())
     if not tx_hash:
         return
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     if not tx_URL:
         return
     menu = QMenu()
     menu.addAction(_("Copy ID to Clipboard"), lambda: self.parent.app.clipboard().setText(tx_hash))
     menu.addAction(_("Details"), lambda: self.parent.show_transaction(self.wallet.transactions.get(tx_hash)))
     menu.addAction(_("Edit description"), lambda: self.editItem(item, self.editable_columns[0]))
     menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 30
0
 def create_menu(self, position):
     menu = QMenu()
     selected = self.selectedItems()
     item = self.itemAt(position)
     col = self.currentColumn()
     if len(selected) == 1:
         names = [item.text(2) for item in selected]
         keys = [item.text(3) for item in selected]
         URLs = [block_explorer_URL(self.config, 'addr', key) for key in filter(is_address, keys)]
         #if URLs:
             #menu.addAction(_("View on block explorer"), lambda: map(webbrowser.open, URLs))
         if col : # filter 0 col
             column_title = self.headerItem().text(col)
             copy_text = item.text(col)
             #menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(copy_text))
     run_hook('create_contact_menu', menu, selected)
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 31
0
 def create_menu(self, position):
     self.selectedIndexes()
     item = self.currentItem()
     if not item:
         return
     column = self.currentColumn()
     tx_hash = item.data(0, self.TX_HASH_ROLE)
     if not tx_hash:
         return
     tx = self.wallet.transactions.get(tx_hash)
     if not tx:
         return
     if column is 0:
         column_title = "ID"
         column_data = tx_hash
     else:
         column_title = self.headerItem().text(column)
         column_data = item.text(column)
     tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
     height = self.wallet.get_tx_height(tx_hash).height
     is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
     is_unconfirmed = height <= 0
     pr_key = self.wallet.invoices.paid.get(tx_hash)
     menu = QMenu()
     if height == TX_HEIGHT_LOCAL:
         menu.addAction(_("Remove"), lambda: self.remove_local_tx(tx_hash))
     menu.addAction(_("Copy {}").format(column_title), lambda: self.parent.app.clipboard().setText(column_data))
     for c in self.editable_columns:
         menu.addAction(_("Edit {}").format(self.headerItem().text(c)),
                        lambda bound_c=c: self.editItem(item, bound_c))
     menu.addAction(_("Details"), lambda: self.show_transaction(tx_hash))
     if is_unconfirmed and tx:
         # note: the current implementation of RBF *needs* the old tx fee
         rbf = is_mine and not tx.is_final() and fee is not None
         if rbf:
             menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
         else:
             child_tx = self.wallet.cpfp(tx, 0)
             if child_tx:
                 menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
     if pr_key:
         menu.addAction(self.icon_cache.get(":icons/seal"), _("View invoice"), lambda: self.parent.show_invoice(pr_key))
     if tx_URL:
         menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 32
0
    def create_menu(self, position):
        self.selectedIndexes()
        item = self.currentItem()
        if not item:
            return
        column = self.currentColumn()
        tx_hash = item.data(0, Qt.UserRole)
        if not tx_hash:
            return
        if column is 0:
            column_title = "ID"
            column_data = tx_hash
        else:
            column_title = self.headerItem().text(column)
            column_data = item.text(column)

        tx_URL = block_explorer_URL(self.config, 'tx', tx_hash)
        height, conf, timestamp = self.wallet.get_tx_height(tx_hash)
        tx = self.wallet.transactions.get(tx_hash)
        is_relevant, is_mine, v, fee = self.wallet.get_wallet_delta(tx)
        is_unconfirmed = height <= 0
        pr_key = self.wallet.invoices.paid.get(tx_hash)

        menu = QMenu()

        menu.addAction(_("Copy %s")%column_title, lambda: self.parent.app.clipboard().setText(column_data))
        if column in self.editable_columns:
            menu.addAction(_("Edit %s")%column_title, lambda: self.editItem(item, column))

        menu.addAction(_("Details"), lambda: self.parent.show_transaction(tx))
        if is_unconfirmed and tx:
            rbf = is_mine and not tx.is_final()
            if rbf:
                menu.addAction(_("Increase fee"), lambda: self.parent.bump_fee_dialog(tx))
            else:
                child_tx = self.wallet.cpfp(tx, 0)
                if child_tx:
                    menu.addAction(_("Child pays for parent"), lambda: self.parent.cpfp(tx, child_tx))
        if pr_key:
            menu.addAction(QIcon(":icons/seal"), _("View invoice"), lambda: self.parent.show_invoice(pr_key))
        if tx_URL:
            menu.addAction(_("View on block explorer"), lambda: webbrowser.open(tx_URL))
        menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 33
0
 def create_menu(self, position):
     menu = QMenu()
     selected = self.selectedItems()
     multi_select = len(selected) > 1
     if not selected:
         pass
     elif not multi_select:
         item = selected[0]
         txid = item.data(0, Qt.UserRole)
         column = self.currentColumn()
         column_title = self.headerItem().text(column)
         column_data = '\n'.join([item.text(column) for item in selected])
         menu.addAction(
             _("Copy %s") % column_title,
             lambda: self.parent.app.clipboard().setText(column_data))
         menu.addAction(_("Copy Transaction ID"),
                        lambda: self.parent.app.clipboard().setText(txid))
         URL = block_explorer_URL(self.config, {'tx': txid})
         if URL:
             menu.addAction(_("View on block explorer"),
                            lambda: open_browser(URL))
     run_hook('create_token_hist_menu', menu, selected)
     menu.exec_(self.viewport().mapToGlobal(position))
Esempio n. 34
0
    def create_menu(self, position):
        from electrum.wallet import Multisig_Wallet
        is_multisig = isinstance(self.wallet, Multisig_Wallet)
        can_delete = self.wallet.can_delete_address()
        selected = self.selected_in_column(1)
        multi_select = len(selected) > 1
        addrs = [self.model().itemFromIndex(item).text() for item in selected]
        if not multi_select:
            idx = self.indexAt(position)
            col = idx.column()
            item = self.model().itemFromIndex(idx)
            if not item:
                return
            addr = addrs[0]

        menu = QMenu()
        if not multi_select:
            addr_column_title = self.model().horizontalHeaderItem(2).text()
            addr_idx = idx.sibling(idx.row(), 2)

            column_title = self.model().horizontalHeaderItem(col).text()
            copy_text = self.model().itemFromIndex(idx).text()
            menu.addAction(
                _("Copy {}").format(column_title),
                lambda: self.place_text_on_clipboard(copy_text))
            menu.addAction(_('Details'),
                           lambda: self.parent.show_address(addr))
            persistent = QPersistentModelIndex(addr_idx)
            menu.addAction(_("Edit {}").format(addr_column_title),
                           lambda p=persistent: self.edit(QModelIndex(p)))
            menu.addAction(_("Request payment"),
                           lambda: self.parent.receive_at(addr))
            if self.wallet.can_export():
                menu.addAction(_("Private key"),
                               lambda: self.parent.show_private_key(addr))
            if not is_multisig and not self.wallet.is_watching_only():
                menu.addAction(_("Sign/verify message"),
                               lambda: self.parent.sign_verify_message(addr))
                menu.addAction(_("Encrypt/decrypt message"),
                               lambda: self.parent.encrypt_message(addr))
            if can_delete:
                menu.addAction(_("Remove from wallet"),
                               lambda: self.parent.remove_address(addr))
            addr_URL = block_explorer_URL(self.config, 'addr', addr)
            if addr_URL:
                menu.addAction(_("View on block explorer"),
                               lambda: webbrowser.open(addr_URL))

            if not self.wallet.is_frozen(addr):
                menu.addAction(
                    _("Freeze"),
                    lambda: self.parent.set_frozen_state([addr], True))
            else:
                menu.addAction(
                    _("Unfreeze"),
                    lambda: self.parent.set_frozen_state([addr], False))

        coins = self.wallet.get_utxos(addrs)
        if coins:
            menu.addAction(_("Spend from"),
                           lambda: self.parent.spend_coins(coins))

        run_hook('receive_menu', menu, addrs, self.wallet)
        menu.exec_(self.viewport().mapToGlobal(position))