URI: 
       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