Browse Source

Merge pull request #5822 from SomberNight/201912_qt_receive_tab_address

qt receive tab: show plain bitcoin address
hard-fail-on-bad-server-string
ThomasV 5 years ago
committed by GitHub
parent
commit
9d83dea0dc
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      electrum/gui/qt/address_list.py
  2. 77
      electrum/gui/qt/main_window.py
  3. 9
      electrum/gui/qt/request_list.py
  4. 7
      electrum/plugins/hw_wallet/qt.py

2
electrum/gui/qt/address_list.py

@ -227,7 +227,7 @@ class AddressList(MyTreeView):
menu.addAction(_('Details'), lambda: self.parent.show_address(addr)) menu.addAction(_('Details'), lambda: self.parent.show_address(addr))
persistent = QPersistentModelIndex(addr_idx) persistent = QPersistentModelIndex(addr_idx)
menu.addAction(_("Edit {}").format(addr_column_title), lambda p=persistent: self.edit(QModelIndex(p))) menu.addAction(_("Edit {}").format(addr_column_title), lambda p=persistent: self.edit(QModelIndex(p)))
menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr)) #menu.addAction(_("Request payment"), lambda: self.parent.receive_at(addr))
if self.wallet.can_export(): if self.wallet.can_export():
menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr)) menu.addAction(_("Private key"), lambda: self.parent.show_private_key(addr))
if not is_multisig and not self.wallet.is_watching_only(): if not is_multisig and not self.wallet.is_watching_only():

77
electrum/gui/qt/main_window.py

@ -38,7 +38,7 @@ import queue
import asyncio import asyncio
from typing import Optional, TYPE_CHECKING, Sequence, List, Union from typing import Optional, TYPE_CHECKING, Sequence, List, Union
from PyQt5.QtGui import QPixmap, QKeySequence, QIcon, QCursor from PyQt5.QtGui import QPixmap, QKeySequence, QIcon, QCursor, QFont
from PyQt5.QtCore import Qt, QRect, QStringListModel, QSize, pyqtSignal from PyQt5.QtCore import Qt, QRect, QStringListModel, QSize, pyqtSignal
from PyQt5.QtWidgets import (QMessageBox, QComboBox, QSystemTrayIcon, QTabWidget, from PyQt5.QtWidgets import (QMessageBox, QComboBox, QSystemTrayIcon, QTabWidget,
QMenuBar, QFileDialog, QCheckBox, QLabel, QMenuBar, QFileDialog, QCheckBox, QLabel,
@ -89,7 +89,7 @@ from .util import (read_QIcon, ColorScheme, text_dialog, icon_path, WaitingDialo
CloseButton, HelpButton, MessageBoxMixin, EnterButton, CloseButton, HelpButton, MessageBoxMixin, EnterButton,
import_meta_gui, export_meta_gui, import_meta_gui, export_meta_gui,
filename_field, address_field, char_width_in_lineedit, webopen, filename_field, address_field, char_width_in_lineedit, webopen,
TRANSACTION_FILE_EXTENSION_FILTER) TRANSACTION_FILE_EXTENSION_FILTER, MONOSPACE_FONT)
from .util import ButtonsTextEdit from .util import ButtonsTextEdit
from .installwizard import WIF_HELP_TEXT from .installwizard import WIF_HELP_TEXT
from .history_list import HistoryList, HistoryModel from .history_list import HistoryList, HistoryModel
@ -1003,18 +1003,36 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
buttons.addWidget(self.create_lightning_invoice_button) buttons.addWidget(self.create_lightning_invoice_button)
grid.addLayout(buttons, 4, 3, 1, 2) grid.addLayout(buttons, 4, 3, 1, 2)
self.receive_address_e = ButtonsTextEdit() self.receive_payreq_e = ButtonsTextEdit()
self.receive_address_e.addCopyButton(self.app) self.receive_payreq_e.addCopyButton(self.app)
self.receive_address_e.setReadOnly(True) self.receive_payreq_e.setReadOnly(True)
self.receive_address_e.textChanged.connect(self.update_receive_qr) self.receive_payreq_e.textChanged.connect(self.update_receive_qr)
self.receive_address_e.textChanged.connect(self.update_receive_address_styling) self.receive_payreq_e.setFocusPolicy(Qt.ClickFocus)
self.receive_address_e.setFocusPolicy(Qt.ClickFocus)
self.receive_qr = QRCodeWidget(fixedSize=230) self.receive_qr = QRCodeWidget(fixedSize=220)
self.receive_qr.mouseReleaseEvent = lambda x: self.toggle_qr_window() self.receive_qr.mouseReleaseEvent = lambda x: self.toggle_qr_window()
self.receive_qr.enterEvent = lambda x: self.app.setOverrideCursor(QCursor(Qt.PointingHandCursor)) self.receive_qr.enterEvent = lambda x: self.app.setOverrideCursor(QCursor(Qt.PointingHandCursor))
self.receive_qr.leaveEvent = lambda x: self.app.setOverrideCursor(QCursor(Qt.ArrowCursor)) self.receive_qr.leaveEvent = lambda x: self.app.setOverrideCursor(QCursor(Qt.ArrowCursor))
def on_receive_address_changed():
addr = str(self.receive_address_e.text())
self.receive_address_widgets.setVisible(bool(addr))
msg = _('Bitcoin address where the payment should be received. Note that each payment request uses a different Bitcoin address.')
receive_address_label = HelpLabel(_('Receiving address'), msg)
self.receive_address_e = ButtonsTextEdit()
self.receive_address_e.setFont(QFont(MONOSPACE_FONT))
self.receive_address_e.addCopyButton(self.app)
self.receive_address_e.setReadOnly(True)
self.receive_address_e.textChanged.connect(on_receive_address_changed)
self.receive_address_e.textChanged.connect(self.update_receive_address_styling)
self.receive_address_e.setMinimumHeight(6 * char_width_in_lineedit())
self.receive_address_e.setMaximumHeight(10 * char_width_in_lineedit())
qr_show = lambda: self.show_qrcode(str(self.receive_address_e.text()), _('Receiving address'), parent=self)
qr_icon = "qrcode_white.png" if ColorScheme.dark_scheme else "qrcode.png"
self.receive_address_e.addButton(qr_icon, qr_show, _("Show as QR code"))
self.receive_requests_label = QLabel(_('Incoming payments')) self.receive_requests_label = QLabel(_('Incoming payments'))
from .request_list import RequestList from .request_list import RequestList
@ -1025,14 +1043,29 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
vbox_g.addLayout(grid) vbox_g.addLayout(grid)
vbox_g.addStretch() vbox_g.addStretch()
self.receive_widgets = QTabWidget() receive_tabbed_widgets = QTabWidget()
self.receive_widgets.addTab(self.receive_qr, 'QR Code') receive_tabbed_widgets.addTab(self.receive_qr, 'QR Code')
self.receive_widgets.addTab(self.receive_address_e, 'Text') receive_tabbed_widgets.addTab(self.receive_payreq_e, 'Text')
vbox_receive_address = QVBoxLayout()
vbox_receive_address.setContentsMargins(0, 0, 0, 0)
vbox_receive_address.setSpacing(0)
vbox_receive_address.addWidget(receive_address_label)
vbox_receive_address.addWidget(self.receive_address_e)
self.receive_address_widgets = QWidget()
self.receive_address_widgets.setLayout(vbox_receive_address)
size_policy = self.receive_address_widgets.sizePolicy()
size_policy.setRetainSizeWhenHidden(True)
self.receive_address_widgets.setSizePolicy(size_policy)
vbox_receive = QVBoxLayout()
vbox_receive.addWidget(receive_tabbed_widgets)
vbox_receive.addWidget(self.receive_address_widgets)
hbox = QHBoxLayout() hbox = QHBoxLayout()
hbox.addLayout(vbox_g) hbox.addLayout(vbox_g)
hbox.addStretch() hbox.addStretch()
hbox.addWidget(self.receive_widgets) hbox.addLayout(vbox_receive)
w = QWidget() w = QWidget()
w.searchable_list = self.request_list w.searchable_list = self.request_list
@ -1044,6 +1077,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
vbox.addWidget(self.request_list) vbox.addWidget(self.request_list)
vbox.setStretchFactor(self.request_list, 1000) vbox.setStretchFactor(self.request_list, 1000)
on_receive_address_changed()
return w return w
def delete_request(self, key): def delete_request(self, key):
@ -1137,6 +1172,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
self.saved = True self.saved = True
def clear_receive_tab(self): def clear_receive_tab(self):
self.receive_payreq_e.setText('')
self.receive_address_e.setText('') self.receive_address_e.setText('')
self.receive_message_e.setText('') self.receive_message_e.setText('')
self.receive_amount_e.setAmount(None) self.receive_amount_e.setAmount(None)
@ -1164,14 +1200,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
def show_receive_tab(self): def show_receive_tab(self):
self.tabs.setCurrentIndex(self.tabs.indexOf(self.receive_tab)) self.tabs.setCurrentIndex(self.tabs.indexOf(self.receive_tab))
def receive_at(self, addr):
if not bitcoin.is_address(addr):
return
self.show_receive_tab()
self.receive_address_e.setText(addr)
def update_receive_qr(self): def update_receive_qr(self):
uri = str(self.receive_address_e.text()) uri = str(self.receive_payreq_e.text())
if maybe_extract_bolt11_invoice(uri): if maybe_extract_bolt11_invoice(uri):
# encode lightning invoices as uppercase so QR encoding can use # encode lightning invoices as uppercase so QR encoding can use
# alphanumeric mode; resulting in smaller QR codes # alphanumeric mode; resulting in smaller QR codes
@ -1182,13 +1212,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
def update_receive_address_styling(self): def update_receive_address_styling(self):
addr = str(self.receive_address_e.text()) addr = str(self.receive_address_e.text())
# note: 'addr' could be ln invoice or BIP21 URI
try:
uri = util.parse_URI(addr)
except InvalidBitcoinURI:
pass
else:
addr = uri.get('address')
if is_address(addr) and self.wallet.is_used(addr): if is_address(addr) and self.wallet.is_used(addr):
self.receive_address_e.setStyleSheet(ColorScheme.RED.as_stylesheet(True)) self.receive_address_e.setStyleSheet(ColorScheme.RED.as_stylesheet(True))
self.receive_address_e.setToolTip(_("This address has already been used. " self.receive_address_e.setToolTip(_("This address has already been used. "

9
electrum/gui/qt/request_list.py

@ -83,9 +83,12 @@ class RequestList(MyTreeView):
if req is None: if req is None:
self.update() self.update()
return return
is_lightning = request_type == PR_TYPE_LN if request_type == PR_TYPE_LN:
text = req.get('invoice') if is_lightning else req.get('URI') self.parent.receive_payreq_e.setText(req.get('invoice'))
self.parent.receive_address_e.setText(text) self.parent.receive_address_e.setText('')
else:
self.parent.receive_payreq_e.setText(req.get('URI'))
self.parent.receive_address_e.setText(req['address'])
def refresh_status(self): def refresh_status(self):
m = self.model() m = self.model()

7
electrum/plugins/hw_wallet/qt.py

@ -263,13 +263,6 @@ class QtPluginBase(object):
def show_address(): def show_address():
addr = str(receive_address_e.text()) addr = str(receive_address_e.text())
# note: 'addr' could be ln invoice or BIP21 URI
try:
uri = parse_URI(addr)
except InvalidBitcoinURI:
pass
else:
addr = uri.get('address')
keystore.thread.add(partial(plugin.show_address, wallet, addr, keystore)) keystore.thread.add(partial(plugin.show_address, wallet, addr, keystore))
dev_name = f"{plugin.device} ({keystore.label})" dev_name = f"{plugin.device} ({keystore.label})"
receive_address_e.addButton("eye1.png", show_address, _("Show on {}").format(dev_name)) receive_address_e.addButton("eye1.png", show_address, _("Show on {}").format(dev_name))

Loading…
Cancel
Save