URI: 
       timprove lightning_dialog GUI settings - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 32e517f4071fc3bf721159cb3c6ed9e148a13589
   DIR parent 15eecab978242eb0d414fb765e22095044ae37e4
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 22 May 2019 12:30:45 +0200
       
       improve lightning_dialog GUI settings
       
       Diffstat:
         M electrum/gui/qt/__init__.py         |       2 +-
         M electrum/gui/qt/lightning_dialog.py |      81 +++++++++++++++++++------------
         M electrum/lnwatcher.py               |       5 ++++-
       
       3 files changed, 56 insertions(+), 32 deletions(-)
       ---
   DIR diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py
       t@@ -352,7 +352,7 @@ class ElectrumGui(Logger):
                    with self._num_wizards_lock:
                        if self._num_wizards_in_progress > 0 or len(self.windows) > 0:
                            return
       -                if self.config.get('lightning'):
       +                if self.config.get('persist_daemon'):
                            return
                    self.app.quit()
                self.app.setQuitOnLastWindowClosed(False)  # so _we_ can decide whether to quit
   DIR diff --git a/electrum/gui/qt/lightning_dialog.py b/electrum/gui/qt/lightning_dialog.py
       t@@ -31,13 +31,17 @@ from PyQt5.QtWidgets import *
        import PyQt5.QtCore as QtCore
        
        from electrum.i18n import _
       -from .util import *
       +from .util import HelpLabel, MyTreeView, Buttons
        
       -help_about = _("""The local watchtower will persist on this computer after you close
       -your wallet, but it requires to be online regularly.""")
       +help_local = _("""If this option is checked, Electrum will persist as a daemon after
       +you close all your wallet windows. Your local watchtower will keep
       +running, and it will protect your channels even if your wallet is not
       +open. For this to work, your computer needs to be online regularly.""")
        
       -help_remote = _(""" To setup a remote watchtower, configure a remote electrum daemon
       -with 'watchtower_host' and 'watchtower_port' """)
       +help_remote = _("""To setup a remote watchtower, you must run an Electrum daemon on a
       +computer that is always connected to the internet. Configure
       +'watchtower_host' and 'watchtower_port' in the remote daemon, and
       +enter the corresponding URL here""")
        
        class WatcherList(MyTreeView):
            def __init__(self, parent):
       t@@ -72,8 +76,6 @@ class LightningDialog(QDialog):
                self.lnwatcher = self.network.lnwatcher
                self.setWindowTitle(_('Lightning'))
                self.setMinimumSize(600, 20)
       -        watchtower_url = self.config.get('watchtower_url')
       -        self.watchtower_e = QLineEdit(watchtower_url)
                self.watcher_list = WatcherList(self)
                # channel_db
                network_w = QWidget()
       t@@ -87,29 +89,54 @@ class LightningDialog(QDialog):
                self.status = QLabel('')
                network_vbox.addWidget(self.status)
                network_vbox.addStretch(1)
       -        # local
       -        local_w = QWidget()
       -        vbox_local = QVBoxLayout(local_w)
       -        vbox_local.addWidget(WWLabel(help_about))
       -        vbox_local.addWidget(self.watcher_list)
       -        # remote
       -        remote_w = QWidget()
       -        vbox_remote = QVBoxLayout(remote_w)
       -        vbox_remote.addWidget(WWLabel(help_remote))
       -        g = QGridLayout(remote_w)
       -        g.addWidget(QLabel(_('URL') + ':'), 1, 0)
       -        g.addWidget(self.watchtower_e, 1, 1)
       -        vbox_remote.addLayout(g)
       -        vbox_remote.addStretch(1)
       +        # watchtower
       +        watcher_w = QWidget()
       +        watcher_vbox = QVBoxLayout(watcher_w)
       +        watcher_vbox.addWidget(self.watcher_list)
       +        # settings
       +        settings_w = QWidget()
       +        settings_vbox = QVBoxLayout(settings_w)
       +        persist_cb = QCheckBox(_("Persist as daemon after GUI is closed"))
       +        persist_cb.setToolTip(help_local)
       +        persist_cb.setChecked(bool(self.config.get('persist_daemon', False)))
       +        def on_persist_checked(v):
       +            self.config.set_key('persist_daemon', v == Qt.Checked, save=True)
       +        persist_cb.stateChanged.connect(on_persist_checked)
       +
       +        remote_cb = QCheckBox(_("Use a remote watchtower"))
       +        remote_cb.setToolTip(help_remote)
       +        remote_cb.setChecked(bool(self.config.get('use_watchtower', False)))
       +        def on_remote_checked(v):
       +            self.config.set_key('use_watchtower', v == Qt.Checked, save=True)
       +            self.watchtower_url_e.setEnabled(v == Qt.Checked)
       +        remote_cb.stateChanged.connect(on_remote_checked)
       +
       +        watchtower_url = self.config.get('watchtower_url')
       +        self.watchtower_url_e = QLineEdit(watchtower_url)
       +        self.watchtower_url_e.setEnabled(self.config.get('use_watchtower', False))
       +        def on_url():
       +            url = self.watchtower_url_e.text() or None
       +            watchtower_url = self.config.set_key('watchtower_url', url)
       +            if url:
       +                self.lnwatcher.set_remote_watchtower()
       +        self.watchtower_url_e.editingFinished.connect(on_url)
       +
       +        g = QGridLayout(settings_w)
       +        g.addWidget(persist_cb, 0, 0, 1, 3)
       +        g.addWidget(remote_cb, 1, 0, 1, 3)
       +        g.addWidget(QLabel(_('URL')), 2, 1)
       +        g.addWidget(self.watchtower_url_e, 2, 2)
       +        settings_vbox.addLayout(g)
       +        settings_vbox.addStretch(1)
                # tabs
                tabs = QTabWidget()
                tabs.addTab(network_w, _('Network'))
       -        tabs.addTab(local_w, _('Watchtower'))
       -        tabs.addTab(remote_w, _('Settings'))
       +        tabs.addTab(watcher_w, _('Watchtower'))
       +        tabs.addTab(settings_w, _('Settings'))
                vbox = QVBoxLayout(self)
                vbox.addWidget(tabs)
                b = QPushButton(_('Close'))
       -        b.clicked.connect(self.on_close)
       +        b.clicked.connect(self.close)
                vbox.addLayout(Buttons(b))
                self.watcher_list.update()
                self.network.register_callback(self.update_status, ['ln_status'])
       t@@ -120,12 +147,6 @@ class LightningDialog(QDialog):
                self.num_channels.setText(_(f'{known} channels'))
                self.status.setText(_(f'Requesting {unknown} channels...') if unknown else '')
        
       -    def on_close(self):
       -        url = self.watchtower_e.text()
       -        if url:
       -            self.lnwatcher.set_remote_watchtower()
       -        self.hide()
       -
            def is_hidden(self):
                return self.isMinimized() or self.isHidden()
        
   DIR diff --git a/electrum/lnwatcher.py b/electrum/lnwatcher.py
       t@@ -143,7 +143,10 @@ class LNWatcher(AddressSynchronizer):
        
            def set_remote_watchtower(self):
                watchtower_url = self.config.get('watchtower_url')
       -        self.watchtower = jsonrpclib.Server(watchtower_url) if watchtower_url else None
       +        try:
       +            self.watchtower = jsonrpclib.Server(watchtower_url) if watchtower_url else None
       +        except:
       +            self.watchtower = None
                self.watchtower_queue = asyncio.Queue()
        
            def get_num_tx(self, outpoint):