URI: 
       treceive requests: encode lightning invoices as uppercase -> smaller QRs - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 20bbe85bcecb454a4647b675066d6accea37bc78
   DIR parent 8e89c0c971645c11e205a163b38e4b35fa3e85de
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Sat,  7 Dec 2019 05:58:58 +0100
       
       receive requests: encode lightning invoices as uppercase -> smaller QRs
       
       By encoding bolt11 invoices as uppercase text in QR codes,
       we can use the alphanumeric mode, which results in non-negligibly smaller QR codes.
       
       Diffstat:
         M electrum/gui/kivy/main_window.py    |       3 +--
         M electrum/gui/kivy/uix/dialogs/addr… |       8 +++++++-
         M electrum/gui/kivy/uix/dialogs/requ… |      10 ++++++++--
         M electrum/gui/qt/main_window.py      |       6 +++++-
       
       4 files changed, 21 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py
       t@@ -431,9 +431,8 @@ class ElectrumWindow(App):
            def show_request(self, is_lightning, key):
                from .uix.dialogs.request_dialog import RequestDialog
                request = self.wallet.get_request(key)
       -        status = request['status']
                data = request['invoice'] if is_lightning else request['URI']
       -        self.request_popup = RequestDialog('Request', data, key)
       +        self.request_popup = RequestDialog('Request', data, key, is_lightning=is_lightning)
                self.request_popup.set_status(request['status'])
                self.request_popup.open()
        
   DIR diff --git a/electrum/gui/kivy/uix/dialogs/addresses.py b/electrum/gui/kivy/uix/dialogs/addresses.py
       t@@ -1,3 +1,5 @@
       +from typing import TYPE_CHECKING
       +
        from kivy.app import App
        from kivy.factory import Factory
        from kivy.properties import ObjectProperty
       t@@ -7,6 +9,10 @@ from kivy.uix.popup import Popup
        
        from electrum.gui.kivy.i18n import _
        
       +if TYPE_CHECKING:
       +    from ...main_window import ElectrumWindow
       +
       +
        Builder.load_string('''
        <AddressLabel@Label>
            text_size: self.width, None
       t@@ -184,7 +190,7 @@ class AddressesDialog(Factory.Popup):
        
            def __init__(self, app):
                Factory.Popup.__init__(self)
       -        self.app = app
       +        self.app = app  # type: ElectrumWindow
        
            def get_card(self, addr, balance, is_used, label):
                ci = {}
   DIR diff --git a/electrum/gui/kivy/uix/dialogs/request_dialog.py b/electrum/gui/kivy/uix/dialogs/request_dialog.py
       t@@ -66,16 +66,22 @@ Builder.load_string('''
        
        class RequestDialog(Factory.Popup):
        
       -    def __init__(self, title, data, key):
       +    def __init__(self, title, data, key, *, is_lightning=False):
                self.status = PR_UNKNOWN
                Factory.Popup.__init__(self)
                self.app = App.get_running_app()
                self.title = title
                self.data = data
                self.key = key
       +        self.is_lightning = is_lightning
        
            def on_open(self):
       -        self.ids.qr.set_data(self.data)
       +        data = self.data
       +        if self.is_lightning:
       +            # encode lightning invoices as uppercase so QR encoding can use
       +            # alphanumeric mode; resulting in smaller QR codes
       +            data = data.upper()
       +        self.ids.qr.set_data(data)
        
            def set_status(self, status):
                self.status = status
   DIR diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py
       t@@ -60,7 +60,7 @@ from electrum.util import (format_time, format_satoshis, format_fee_satoshis,
                                   decimal_point_to_base_unit_name,
                                   UnknownBaseUnit, DECIMAL_POINT_DEFAULT, UserFacingException,
                                   get_new_wallet_name, send_exception_to_crash_reporter,
       -                           InvalidBitcoinURI)
       +                           InvalidBitcoinURI, maybe_extract_bolt11_invoice)
        from electrum.util import PR_TYPE_ONCHAIN, PR_TYPE_LN
        from electrum.transaction import (Transaction, PartialTxInput,
                                          PartialTransaction, PartialTxOutput)
       t@@ -1171,6 +1171,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
        
            def update_receive_qr(self):
                uri = str(self.receive_address_e.text())
       +        if maybe_extract_bolt11_invoice(uri):
       +            # encode lightning invoices as uppercase so QR encoding can use
       +            # alphanumeric mode; resulting in smaller QR codes
       +            uri = uri.upper()
                self.receive_qr.setData(uri)
                if self.qr_window and self.qr_window.isVisible():
                    self.qr_window.qrw.setData(uri)