URI: 
       tinvoice_dialog.py - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
       tinvoice_dialog.py (5307B)
       ---
            1 from typing import TYPE_CHECKING
            2 
            3 from kivy.factory import Factory
            4 from kivy.lang import Builder
            5 from kivy.core.clipboard import Clipboard
            6 from kivy.app import App
            7 from kivy.clock import Clock
            8 
            9 from electrum.gui.kivy.i18n import _
           10 from electrum.invoices import pr_tooltips, pr_color
           11 from electrum.invoices import PR_UNKNOWN, PR_UNPAID, PR_FAILED, PR_TYPE_LN
           12 
           13 if TYPE_CHECKING:
           14     from electrum.gui.kivy.main_window import ElectrumWindow
           15 
           16 
           17 Builder.load_string('''
           18 #:import KIVY_GUI_PATH electrum.gui.kivy.KIVY_GUI_PATH
           19 
           20 <InvoiceDialog@Popup>
           21     id: popup
           22     amount_str: ''
           23     title: ''
           24     data: ''
           25     description:''
           26     status_color: 1,1,1,1
           27     status_str:''
           28     warning: ''
           29     can_pay: True
           30     shaded: False
           31     show_text: False
           32     AnchorLayout:
           33         anchor_x: 'center'
           34         BoxLayout:
           35             orientation: 'vertical'
           36             size_hint: 1, 1
           37             padding: '10dp'
           38             spacing: '10dp'
           39             TopLabel:
           40                 text: _('Invoice data')+ ':'
           41             RefLabel:
           42                 data: root.data
           43                 text: root.data[:40] + "..."
           44                 name: _('Data')
           45                 show_text_with_qr: False
           46             TopLabel:
           47                 text: _('Description') + ':'
           48             RefLabel:
           49                 data: root.description or _('No description')
           50             TopLabel:
           51                 text: _('Amount') + ': ' + root.amount_str
           52             TopLabel:
           53                 text: _('Status') + ': ' + root.status_str
           54                 color: root.status_color
           55                 on_touch_down:
           56                     touch = args[1]
           57                     touched = bool(self.collide_point(*touch.pos))
           58                     if touched: root.show_log()
           59             TopLabel:
           60                 text: root.warning
           61                 color: (0.9, 0.6, 0.3, 1)
           62             Widget:
           63                 size_hint: 1, 0.2
           64             BoxLayout:
           65                 size_hint: 1, None
           66                 height: '48dp'
           67                 Button:
           68                     size_hint: 1, None
           69                     height: '48dp'
           70                     text: _('Delete')
           71                     on_release: root.delete_dialog()
           72                 IconButton:
           73                     icon: f'atlas://{KIVY_GUI_PATH}/theming/light/copy'
           74                     size_hint: 0.5, None
           75                     height: '48dp'
           76                     on_release: root.copy_to_clipboard()
           77                 IconButton:
           78                     icon: f'atlas://{KIVY_GUI_PATH}/theming/light/share'
           79                     size_hint: 0.5, None
           80                     height: '48dp'
           81                     on_release: root.do_share()
           82                 Button:
           83                     size_hint: 1, None
           84                     height: '48dp'
           85                     text: _('Pay')
           86                     on_release: root.do_pay()
           87                     disabled: not root.can_pay
           88 ''')
           89 
           90 class InvoiceDialog(Factory.Popup):
           91 
           92     def __init__(self, title, data, key):
           93         self.status = PR_UNKNOWN
           94         Factory.Popup.__init__(self)
           95         self.app = App.get_running_app()  # type: ElectrumWindow
           96         self.title = title
           97         self.data = data
           98         self.key = key
           99         invoice = self.app.wallet.get_invoice(key)
          100         self.amount_sat = invoice.get_amount_sat()
          101         self.amount_str = self.app.format_amount_and_units(self.amount_sat)
          102         self.description = invoice.message
          103         self.is_lightning = invoice.is_lightning()
          104         self.update_status()
          105         self.log = self.app.wallet.lnworker.logs[self.key] if self.is_lightning and self.app.wallet.lnworker else []
          106 
          107     def update_status(self):
          108         invoice = self.app.wallet.get_invoice(self.key)
          109         self.status = self.app.wallet.get_invoice_status(invoice)
          110         self.status_str = invoice.get_status_str(self.status)
          111         self.status_color = pr_color[self.status]
          112         self.can_pay = self.status in [PR_UNPAID, PR_FAILED]
          113         if self.can_pay and self.is_lightning and self.app.wallet.lnworker:
          114             if self.amount_sat and self.amount_sat > self.app.wallet.lnworker.num_sats_can_send():
          115                 self.warning = _('Warning') + ': ' + _('This amount exceeds the maximum you can currently send with your channels')
          116 
          117     def on_dismiss(self):
          118         self.app.request_popup = None
          119 
          120     def copy_to_clipboard(self):
          121         Clipboard.copy(self.data)
          122         msg = _('Text copied to clipboard.')
          123         Clock.schedule_once(lambda dt: self.app.show_info(msg))
          124 
          125     def do_share(self):
          126         self.app.do_share(self.data, _("Share Invoice"))
          127         self.dismiss()
          128 
          129     def do_pay(self):
          130         invoice = self.app.wallet.get_invoice(self.key)
          131         self.app.send_screen.do_pay_invoice(invoice)
          132         self.dismiss()
          133 
          134     def delete_dialog(self):
          135         from .question import Question
          136         def cb(result):
          137             if result:
          138                 self.dismiss()
          139                 self.app.wallet.delete_invoice(self.key)
          140                 self.app.send_screen.update()
          141         d = Question(_('Delete invoice?'), cb)
          142         d.open()
          143 
          144     def show_log(self):
          145         if self.log:
          146             log_str = _('Payment log:') + '\n\n'
          147             for payment_attempt_log in self.log:
          148                 route_str, chan_str, message = payment_attempt_log.formatted_tuple()
          149                 log_str += chan_str + '  ---  ' + message + '\n'
          150             self.app.show_info(log_str)