URI: 
       tqt: easier import/export of channel backups - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 182c192558085adc665c5073f12d842b8e7b7ffa
   DIR parent 12e2beadd9ed51faae0035f12f22f7176054205f
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Fri, 19 Jun 2020 04:48:20 +0200
       
       qt: easier import/export of channel backups
       
       Diffstat:
         M electrum/gui/kivy/uix/dialogs/ligh… |       5 +++--
         M electrum/gui/qt/channels_list.py    |       5 ++++-
         M electrum/gui/qt/main_window.py      |      17 +++++++++++++----
         M electrum/gui/qt/qrcodewidget.py     |      26 ++++++++++++++++++++++----
       
       4 files changed, 42 insertions(+), 11 deletions(-)
       ---
   DIR diff --git a/electrum/gui/kivy/uix/dialogs/lightning_channels.py b/electrum/gui/kivy/uix/dialogs/lightning_channels.py
       t@@ -9,6 +9,7 @@ from kivy.clock import Clock
        
        from electrum.util import bh2u
        from electrum.lnutil import LOCAL, REMOTE, format_short_channel_id
       +from electrum.lnchannel import AbstractChannel, Channel
        from electrum.gui.kivy.i18n import _
        from .question import Question
        
       t@@ -285,7 +286,7 @@ Builder.load_string(r'''
        
        class ChannelBackupPopup(Popup):
        
       -    def __init__(self, chan, app, **kwargs):
       +    def __init__(self, chan: AbstractChannel, app: 'ElectrumWindow', **kwargs):
                super(ChannelBackupPopup,self).__init__(**kwargs)
                self.chan = chan
                self.app = app
       t@@ -320,7 +321,7 @@ class ChannelBackupPopup(Popup):
        
        class ChannelDetailsPopup(Popup):
        
       -    def __init__(self, chan, app, **kwargs):
       +    def __init__(self, chan: Channel, app: 'ElectrumWindow', **kwargs):
                super(ChannelDetailsPopup,self).__init__(**kwargs)
                self.is_closed = chan.is_closed()
                self.is_redeemed = chan.is_redeemed()
   DIR diff --git a/electrum/gui/qt/channels_list.py b/electrum/gui/qt/channels_list.py
       t@@ -132,7 +132,8 @@ class ChannelsList(MyTreeView):
                    _("If you lose your wallet file, the only thing you can do with a backup is to request your channel to be closed, so that your funds will be sent on-chain."),
                ])
                data = self.lnworker.export_channel_backup(channel_id)
       -        self.main_window.show_qrcode(data, 'channel backup', help_text=msg)
       +        self.main_window.show_qrcode(data, 'channel backup', help_text=msg,
       +                                     show_copy_text_btn=True)
        
            def request_force_close(self, channel_id):
                def task():
       t@@ -147,6 +148,8 @@ class ChannelsList(MyTreeView):
                menu.setSeparatorsCollapsible(True)  # consecutive separators are merged together
                selected = self.selected_in_column(self.Columns.NODE_ALIAS)
                if not selected:
       +            menu.addAction(_("Import channel backup"), lambda: self.parent.do_process_from_text_channel_backup())
       +            menu.exec_(self.viewport().mapToGlobal(position))
                    return
                multi_select = len(selected) > 1
                if multi_select:
   DIR diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py
       t@@ -585,7 +585,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
        
            def select_backup_dir(self, b):
                name = self.config.get('backup_dir', '')
       -        dirname = QFileDialog.getExistingDirectory(self, "Select your SSL certificate file", name)
       +        dirname = QFileDialog.getExistingDirectory(self, "Select your wallet backup directory", name)
                if dirname:
                    self.config.set_key('backup_dir', dirname)
                    self.backup_dir_e.setText(dirname)
       t@@ -2395,10 +2395,12 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
                d = SeedDialog(self, seed, passphrase)
                d.exec_()
        
       -    def show_qrcode(self, data, title = _("QR code"), parent=None, help_text=None):
       +    def show_qrcode(self, data, title = _("QR code"), parent=None, *,
       +                    help_text=None, show_copy_text_btn=False):
                if not data:
                    return
       -        d = QRDialog(data, parent or self, title, help_text=help_text)
       +        d = QRDialog(data, parent or self, title, help_text=help_text,
       +                     show_copy_text_btn=show_copy_text_btn)
                d.exec_()
        
            @protected
       t@@ -2605,7 +2607,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
                    self.show_critical(_("Electrum was unable to parse your transaction") + ":\n" + repr(e))
                    return
        
       -    def import_channel_backup(self, encrypted):
       +    def import_channel_backup(self, encrypted: str):
                if not self.question('Import channel backup?'):
                    return
                try:
       t@@ -2658,6 +2660,13 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
                if tx:
                    self.show_transaction(tx)
        
       +    def do_process_from_text_channel_backup(self):
       +        text = text_dialog(self, _('Input channel backup'), _("Channel Backup:"), _("Load backup"))
       +        if not text:
       +            return
       +        if text.startswith('channel_backup:'):
       +            self.import_channel_backup(text)
       +
            def do_process_from_file(self):
                tx = self.read_tx_from_file()
                if tx:
   DIR diff --git a/electrum/gui/qt/qrcodewidget.py b/electrum/gui/qt/qrcodewidget.py
       t@@ -93,7 +93,16 @@ class QRCodeWidget(QWidget):
        
        class QRDialog(WindowModalDialog):
        
       -    def __init__(self, data, parent=None, title = "", show_text=False, help_text=None):
       +    def __init__(
       +            self,
       +            data,
       +            parent=None,
       +            title="",
       +            show_text=False,
       +            *,
       +            help_text=None,
       +            show_copy_text_btn=False,
       +    ):
                WindowModalDialog.__init__(self, parent, title)
        
                vbox = QVBoxLayout()
       t@@ -119,14 +128,23 @@ class QRDialog(WindowModalDialog):
                    p.save(filename, 'png')
                    self.show_message(_("QR code saved to file") + " " + filename)
        
       -        def copy_to_clipboard():
       +        def copy_image_to_clipboard():
                    p = qrw.grab()
                    QApplication.clipboard().setPixmap(p)
                    self.show_message(_("QR code copied to clipboard"))
        
       -        b = QPushButton(_("Copy"))
       +        def copy_text_to_clipboard():
       +            QApplication.clipboard().setText(data)
       +            self.show_message(_("Text copied to clipboard"))
       +
       +        b = QPushButton(_("Copy Image"))
                hbox.addWidget(b)
       -        b.clicked.connect(copy_to_clipboard)
       +        b.clicked.connect(copy_image_to_clipboard)
       +
       +        if show_copy_text_btn:
       +            b = QPushButton(_("Copy Text"))
       +            hbox.addWidget(b)
       +            b.clicked.connect(copy_text_to_clipboard)
        
                b = QPushButton(_("Save"))
                hbox.addWidget(b)