kivy: simplify open_channel dialog
This commit is contained in:
@@ -5,7 +5,7 @@ PYTHON = python3
|
||||
.PHONY: theming apk clean
|
||||
|
||||
theming:
|
||||
#bash -c 'for i in network lightning; do convert -background none theming/light/$$i.{svg,png}; done'
|
||||
bash -c 'for i in network lightning; do convert -background none theming/light/$$i.{svg,png}; done'
|
||||
$(PYTHON) -m kivy.atlas theming/light 1024 theming/light/*.png
|
||||
prepare:
|
||||
# running pre build setup
|
||||
|
||||
@@ -20,8 +20,8 @@ Builder.load_string(r'''
|
||||
color: (.5,.5,.5,1) if not card.active else (1,1,1,1)
|
||||
text: root.channelId
|
||||
Label:
|
||||
text: _('State:\n') + (card._chan.get_state() if card._chan else 'n/a')
|
||||
font_size: '10sp'
|
||||
text: (card._chan.get_state() if card._chan else 'n/a')
|
||||
|
||||
|
||||
<LightningChannelsDialog@Popup>:
|
||||
name: 'lightning_channels'
|
||||
@@ -31,11 +31,6 @@ Builder.load_string(r'''
|
||||
id: box
|
||||
orientation: 'vertical'
|
||||
spacing: '1dp'
|
||||
Button:
|
||||
size_hint: 1, None
|
||||
height: '48dp'
|
||||
text: _('New channel...')
|
||||
on_press: popup.app.popup_dialog('lightning_open_channel_dialog')
|
||||
ScrollView:
|
||||
GridLayout:
|
||||
cols: 1
|
||||
@@ -44,6 +39,11 @@ Builder.load_string(r'''
|
||||
height: self.minimum_height
|
||||
spacing: '2dp'
|
||||
padding: '12dp'
|
||||
Button:
|
||||
size_hint: 1, None
|
||||
height: '48dp'
|
||||
text: _('New channel...')
|
||||
on_press: popup.app.popup_dialog('lightning_open_channel_dialog')
|
||||
|
||||
<ChannelDetailsItem@BoxLayout>:
|
||||
canvas.before:
|
||||
|
||||
@@ -33,29 +33,21 @@ Builder.load_string('''
|
||||
size: '22dp', '22dp'
|
||||
pos_hint: {'center_y': .5}
|
||||
BlueButton:
|
||||
text: s.pubkey if s.pubkey else _('Node ID, [pubkey]@[host]:[port]')
|
||||
text: s.pubkey if s.pubkey else _('Node ID')
|
||||
shorten: True
|
||||
on_release: s.choose_node()
|
||||
IconButton:
|
||||
on_release: app.scan_qr(on_complete=s.on_pubkey)
|
||||
icon: 'atlas://electrum/gui/kivy/theming/light/camera'
|
||||
color: blue_bottom.foreground_color
|
||||
size: '22dp', '22dp'
|
||||
pos_hint: {'center_y': .5}
|
||||
size_hint: None, None
|
||||
CardSeparator:
|
||||
color: blue_bottom.foreground_color
|
||||
BoxLayout:
|
||||
size_hint: 1, None
|
||||
height: blue_bottom.item_height
|
||||
Image:
|
||||
source: 'atlas://electrum/gui/kivy/theming/light/network'
|
||||
size_hint: None, None
|
||||
size: '22dp', '22dp'
|
||||
pos_hint: {'center_y': .5}
|
||||
BlueButton:
|
||||
text: s.ipport if s.ipport else _('Auto-detect IP/port')
|
||||
on_release: s.ipport_dialog()
|
||||
#CardSeparator:
|
||||
# color: blue_bottom.foreground_color
|
||||
#BoxLayout:
|
||||
# size_hint: 1, None
|
||||
# height: blue_bottom.item_height
|
||||
# Image:
|
||||
# source: 'atlas://electrum/gui/kivy/theming/light/network'
|
||||
# size_hint: None, None
|
||||
# size: '22dp', '22dp'
|
||||
# pos_hint: {'center_y': .5}
|
||||
# BlueButton:
|
||||
# text: s.ipport if s.ipport else _('host:port')
|
||||
# on_release: s.ipport_dialog()
|
||||
CardSeparator:
|
||||
color: blue_bottom.foreground_color
|
||||
BoxLayout:
|
||||
@@ -67,18 +59,32 @@ Builder.load_string('''
|
||||
size: '22dp', '22dp'
|
||||
pos_hint: {'center_y': .5}
|
||||
BlueButton:
|
||||
text: s.amount if s.amount else _('Channel capacity amount')
|
||||
text: s.amount if s.amount else _('Amount')
|
||||
on_release: app.amount_dialog(s, True)
|
||||
Button:
|
||||
BoxLayout:
|
||||
size_hint: 1, None
|
||||
height: blue_bottom.item_height
|
||||
text: _('Paste')
|
||||
on_release: s.do_paste()
|
||||
Button:
|
||||
size_hint: 1, None
|
||||
height: blue_bottom.item_height
|
||||
text: _('Open Channel')
|
||||
on_release: s.do_open_channel()
|
||||
IconButton:
|
||||
icon: 'atlas://electrum/gui/kivy/theming/light/copy'
|
||||
size_hint: 0.5, None
|
||||
height: '48dp'
|
||||
on_release: s.do_paste()
|
||||
IconButton:
|
||||
icon: 'atlas://electrum/gui/kivy/theming/light/camera'
|
||||
size_hint: 0.5, None
|
||||
height: '48dp'
|
||||
on_release: app.scan_qr(on_complete=s.on_pubkey)
|
||||
Button:
|
||||
text: _('Suggest')
|
||||
size_hint: 1, None
|
||||
height: '48dp'
|
||||
on_release: s.choose_node()
|
||||
Button:
|
||||
text: _('Open')
|
||||
size_hint: 1, None
|
||||
height: '48dp'
|
||||
on_release: s.open_channel()
|
||||
Widget:
|
||||
size_hint: 1, 1
|
||||
''')
|
||||
|
||||
class LightningOpenChannelDialog(Factory.Popup):
|
||||
@@ -88,18 +94,10 @@ class LightningOpenChannelDialog(Factory.Popup):
|
||||
d = LabelDialog(_('IP/port in format:\n[host]:[port]'), self.ipport, callback)
|
||||
d.open()
|
||||
|
||||
def on_pubkey(self, data):
|
||||
self.pubkey = data.replace('\n', '') # strip newlines if we choose from ChoiseDialog
|
||||
|
||||
def choose_node(self):
|
||||
lines = []
|
||||
suggested = self.app.wallet.lnworker.suggest_peer()
|
||||
if suggested:
|
||||
assert len(suggested) == 33
|
||||
for i in range(0, 34, 11):
|
||||
lines += [bh2u(suggested[i:i+11])]
|
||||
servers = ['\n'.join(lines)]
|
||||
ChoiceDialog(_('Choose node to connect to'), sorted(servers), self.pubkey, self.on_pubkey).open()
|
||||
self.pubkey = suggested.hex()
|
||||
|
||||
def __init__(self, app, lnaddr=None, msg=None):
|
||||
super(LightningOpenChannelDialog, self).__init__()
|
||||
@@ -125,17 +123,21 @@ class LightningOpenChannelDialog(Factory.Popup):
|
||||
return
|
||||
self.pubkey = contents
|
||||
|
||||
def do_open_channel(self):
|
||||
def open_channel(self):
|
||||
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()
|
||||
amount = self.app.get_amount(self.amount)
|
||||
self.app.protected('Enter PIN to create a new channel', self.do_open_channel, (conn_str, amount))
|
||||
self.dismiss()
|
||||
|
||||
def do_open_channel(self, conn_str, amount, password):
|
||||
try:
|
||||
node_id_hex = self.app.wallet.lnworker.open_channel(conn_str, self.app.get_amount(self.amount), 0)
|
||||
node_id_hex = self.app.wallet.lnworker.open_channel(conn_str, amount, 0, password=password)
|
||||
except Exception as e:
|
||||
self.app.show_error(_('Problem opening channel: ') + '\n' + repr(e))
|
||||
return
|
||||
self.app.show_info(_('Please wait for confirmation, channel is opening with node ') + node_id_hex[:16])
|
||||
self.dismiss()
|
||||
|
||||
@@ -435,12 +435,14 @@ class LNWallet(LNWorker):
|
||||
return ctr
|
||||
|
||||
def suggest_peer(self):
|
||||
r = []
|
||||
for node_id, peer in self.peers.items():
|
||||
if not peer.initialized.is_set():
|
||||
continue
|
||||
if not all([chan.is_closed() for chan in peer.channels.values()]):
|
||||
continue
|
||||
return node_id
|
||||
r.append(node_id)
|
||||
return random.choice(r) if r else None
|
||||
|
||||
def channels_for_peer(self, node_id):
|
||||
assert type(node_id) is bytes
|
||||
|
||||
Reference in New Issue
Block a user