tkivy: simplify open_channel dialog - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit a54cb30cf3acd5fab5a58ccdd2d57452b87f2b72 DIR parent c15267e1f64fac4d7747bee15503e1241f03b0b6 HTML Author: ThomasV <thomasv@electrum.org> Date: Mon, 17 Jun 2019 08:29:17 +0200 kivy: simplify open_channel dialog Diffstat: M electrum/gui/kivy/Makefile | 2 +- M electrum/gui/kivy/uix/dialogs/ligh… | 14 +++++++------- M electrum/gui/kivy/uix/dialogs/ligh… | 90 ++++++++++++++++--------------- M electrum/lnworker.py | 4 +++- 4 files changed, 57 insertions(+), 53 deletions(-) --- DIR diff --git a/electrum/gui/kivy/Makefile b/electrum/gui/kivy/Makefile t@@ -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 DIR diff --git a/electrum/gui/kivy/uix/dialogs/lightning_channels.py b/electrum/gui/kivy/uix/dialogs/lightning_channels.py t@@ -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' t@@ -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 t@@ -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: DIR diff --git a/electrum/gui/kivy/uix/dialogs/lightning_open_channel.py b/electrum/gui/kivy/uix/dialogs/lightning_open_channel.py t@@ -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: t@@ -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): t@@ -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__() t@@ -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() DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -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