commit 0e23f33f59b3ae841eee89cfcccf05af8a56c60b
parent cf818fe08cdb1dcfc5651d9c2ea3edeee68c7e3e
Author: ThomasV <thomasv@electrum.org>
Date: Thu, 11 Feb 2021 14:46:36 +0100
kivy and qt: adapt open_channel dialogs to trampoline
Diffstat:
2 files changed, 72 insertions(+), 36 deletions(-)
diff --git a/electrum/gui/kivy/uix/dialogs/lightning_open_channel.py b/electrum/gui/kivy/uix/dialogs/lightning_open_channel.py
@@ -21,6 +21,7 @@ Builder.load_string('''
#:import KIVY_GUI_PATH electrum.gui.kivy.KIVY_GUI_PATH
<LightningOpenChannelDialog@Popup>
+ use_gossip: False
id: s
name: 'lightning_open_channel'
title: _('Open Lightning Channel')
@@ -45,8 +46,9 @@ Builder.load_string('''
size: '22dp', '22dp'
pos_hint: {'center_y': .5}
BlueButton:
- text: s.pubkey if s.pubkey else _('Node ID')
+ text: s.pubkey if s.pubkey else (_('Node ID') if root.use_gossip else _('Trampoline node'))
shorten: True
+ on_release: s.suggest_node()
CardSeparator:
color: blue_bottom.foreground_color
BoxLayout:
@@ -61,7 +63,7 @@ Builder.load_string('''
text: s.amount if s.amount else _('Amount')
on_release: app.amount_dialog(s, True)
TopLabel:
- text: _('Paste or scan a node ID, a connection string or a lightning invoice.')
+ text: _('Paste or scan a node ID, a connection string or a lightning invoice.') if root.use_gossip else _('Choose a trampoline node and the amount')
BoxLayout:
size_hint: 1, None
height: '48dp'
@@ -107,14 +109,19 @@ class LightningOpenChannelDialog(Factory.Popup, Logger):
d.open()
def suggest_node(self):
- suggested = self.app.wallet.lnworker.suggest_peer()
- if suggested:
- self.pubkey = suggested.hex()
+ if self.use_gossip:
+ suggested = self.app.wallet.lnworker.suggest_peer()
+ if suggested:
+ self.pubkey = suggested.hex()
+ else:
+ _, _, percent = self.app.wallet.network.lngossip.get_sync_progress_estimate()
+ if percent is None:
+ percent = "??"
+ self.pubkey = f"Please wait, graph is updating ({percent}% / 30% done)."
else:
- _, _, percent = self.app.wallet.network.lngossip.get_sync_progress_estimate()
- if percent is None:
- percent = "??"
- self.pubkey = f"Please wait, graph is updating ({percent}% / 30% done)."
+ self.trampoline_index += 1
+ self.trampoline_index = self.trampoline_index % len(self.trampoline_names)
+ self.pubkey = self.trampoline_names[self.trampoline_index]
def __init__(self, app, lnaddr=None, msg=None):
Factory.Popup.__init__(self)
@@ -122,6 +129,13 @@ class LightningOpenChannelDialog(Factory.Popup, Logger):
self.app = app # type: ElectrumWindow
self.lnaddr = lnaddr
self.msg = msg
+ self.use_gossip = bool(self.app.network.channel_db)
+ if not self.use_gossip:
+ from electrum.lnworker import hardcoded_trampoline_nodes
+ self.trampolines = hardcoded_trampoline_nodes()
+ self.trampoline_names = list(self.trampolines.keys())
+ self.trampoline_index = 0
+ self.pubkey = ''
def open(self, *args, **kwargs):
super(LightningOpenChannelDialog, self).open(*args, **kwargs)
@@ -153,9 +167,12 @@ class LightningOpenChannelDialog(Factory.Popup, Logger):
if not self.pubkey or not self.amount:
self.app.show_info(_('All fields must be filled out'))
return
- conn_str = self.pubkey
- if self.ipport:
- conn_str += '@' + self.ipport.strip()
+ if self.use_gossip:
+ conn_str = self.pubkey
+ if self.ipport:
+ conn_str += '@' + self.ipport.strip()
+ else:
+ conn_str = str(self.trampolines[self.pubkey])
amount = '!' if self.is_max else self.app.get_amount(self.amount)
self.app.protected('Create a new channel?', self.do_open_channel, (conn_str, amount))
self.dismiss()
diff --git a/electrum/gui/qt/channels_list.py b/electrum/gui/qt/channels_list.py
@@ -6,7 +6,7 @@ from typing import Sequence, Optional
from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QMenu, QHBoxLayout, QLabel, QVBoxLayout, QGridLayout, QLineEdit,
- QPushButton, QAbstractItemView)
+ QPushButton, QAbstractItemView, QComboBox)
from PyQt5.QtGui import QFont, QStandardItem, QBrush
from electrum.util import bh2u, NotEnoughFunds, NoDynamicFeeEstimates
@@ -343,9 +343,30 @@ class ChannelsList(MyTreeView):
lnworker = self.parent.wallet.lnworker
d = WindowModalDialog(self.parent, _('Open Channel'))
vbox = QVBoxLayout(d)
- vbox.addWidget(QLabel(_('Enter Remote Node ID or connection string or invoice')))
- remote_nodeid = QLineEdit()
- remote_nodeid.setMinimumWidth(700)
+ if self.parent.network.channel_db:
+ vbox.addWidget(QLabel(_('Enter Remote Node ID or connection string or invoice')))
+ remote_nodeid = QLineEdit()
+ remote_nodeid.setMinimumWidth(700)
+ suggest_button = QPushButton(d, text=_('Suggest Peer'))
+ def on_suggest():
+ self.parent.wallet.network.start_gossip()
+ nodeid = bh2u(lnworker.suggest_peer() or b'')
+ if not nodeid:
+ remote_nodeid.setText("")
+ remote_nodeid.setPlaceholderText(
+ "Please wait until the graph is synchronized to 30%, and then try again.")
+ else:
+ remote_nodeid.setText(nodeid)
+ remote_nodeid.repaint() # macOS hack for #6269
+ suggest_button.clicked.connect(on_suggest)
+ else:
+ from electrum.lnworker import hardcoded_trampoline_nodes
+ trampolines = hardcoded_trampoline_nodes()
+ trampoline_names = list(trampolines.keys())
+ trampoline_combo = QComboBox()
+ trampoline_combo.addItems(trampoline_names)
+ trampoline_combo.setCurrentIndex(1)
+
amount_e = BTCAmountEdit(self.parent.get_decimal_point)
# max button
def spend_max():
@@ -367,37 +388,31 @@ class ChannelsList(MyTreeView):
max_button.setFixedWidth(100)
max_button.setCheckable(True)
- suggest_button = QPushButton(d, text=_('Suggest Peer'))
- def on_suggest():
- self.parent.wallet.network.start_gossip()
- nodeid = bh2u(lnworker.suggest_peer() or b'')
- if not nodeid:
- remote_nodeid.setText("")
- remote_nodeid.setPlaceholderText(
- "Please wait until the graph is synchronized to 30%, and then try again.")
- else:
- remote_nodeid.setText(nodeid)
- remote_nodeid.repaint() # macOS hack for #6269
- suggest_button.clicked.connect(on_suggest)
-
clear_button = QPushButton(d, text=_('Clear'))
def on_clear():
amount_e.setText('')
amount_e.setFrozen(False)
amount_e.repaint() # macOS hack for #6269
- remote_nodeid.setText('')
- remote_nodeid.repaint() # macOS hack for #6269
+ if self.parent.network.channel_db:
+ remote_nodeid.setText('')
+ remote_nodeid.repaint() # macOS hack for #6269
max_button.setChecked(False)
max_button.repaint() # macOS hack for #6269
clear_button.clicked.connect(on_clear)
+ clear_button.setFixedWidth(100)
h = QGridLayout()
- h.addWidget(QLabel(_('Remote Node ID')), 0, 0)
- h.addWidget(remote_nodeid, 0, 1, 1, 3)
- h.addWidget(suggest_button, 1, 1)
- h.addWidget(clear_button, 1, 2)
+ if self.parent.network.channel_db:
+ h.addWidget(QLabel(_('Remote Node ID')), 0, 0)
+ h.addWidget(remote_nodeid, 0, 1, 1, 4)
+ h.addWidget(suggest_button, 0, 5)
+ else:
+ h.addWidget(QLabel(_('Trampoline Node')), 0, 0)
+ h.addWidget(trampoline_combo, 0, 1, 1, 3)
+
h.addWidget(QLabel('Amount'), 2, 0)
h.addWidget(amount_e, 2, 1)
h.addWidget(max_button, 2, 2)
+ h.addWidget(clear_button, 2, 3)
vbox.addLayout(h)
ok_button = OkButton(d)
ok_button.setDefault(True)
@@ -411,7 +426,11 @@ class ChannelsList(MyTreeView):
funding_sat = '!'
else:
funding_sat = amount_e.get_amount()
- connect_str = str(remote_nodeid.text()).strip()
+ if self.parent.network.channel_db:
+ connect_str = str(remote_nodeid.text()).strip()
+ else:
+ name = trampoline_names[trampoline_combo.currentIndex()]
+ connect_str = str(trampolines[name])
if not connect_str or not funding_sat:
return
self.parent.open_channel(connect_str, funding_sat, 0)