electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

choice_dialog.py (2574B)


      1 from kivy.app import App
      2 from kivy.factory import Factory
      3 from kivy.properties import ObjectProperty
      4 from kivy.lang import Builder
      5 from kivy.uix.checkbox import CheckBox
      6 from kivy.uix.label import Label
      7 from kivy.uix.widget import Widget
      8 
      9 Builder.load_string('''
     10 <ChoiceDialog@Popup>
     11     id: popup
     12     title: ''
     13     description: ''
     14     size_hint: 0.8, 0.8
     15     pos_hint: {'top':0.9}
     16     BoxLayout:
     17         orientation: 'vertical'
     18         Label:
     19             size_hint: 1, None
     20             text: root.description
     21             halign: 'left'
     22             text_size: self.width, None
     23             size: self.texture_size
     24         ScrollView:
     25             orientation: 'vertical'
     26             size_hint: 1, 0.8
     27             GridLayout:
     28                 row_default_height: '48dp'
     29                 id: choices
     30                 cols: 2
     31                 size_hint: 1, None
     32         BoxLayout:
     33             orientation: 'horizontal'
     34             size_hint: 1, 0.2
     35             Button:
     36                 text: 'Cancel'
     37                 size_hint: 0.5, None
     38                 height: '48dp'
     39                 on_release: popup.dismiss()
     40             Button:
     41                 text: 'OK'
     42                 size_hint: 0.5, None
     43                 height: '48dp'
     44                 on_release:
     45                     root.callback(popup.value)
     46                     popup.dismiss()
     47 ''')
     48 
     49 class ChoiceDialog(Factory.Popup):
     50 
     51     def __init__(self, title, choices, key, callback, *, description='', keep_choice_order=False):
     52         Factory.Popup.__init__(self)
     53         self.description = description
     54         if keep_choice_order:
     55             orig_index = {choice: i for (i, choice) in enumerate(choices)}
     56             sort_key = lambda x: orig_index[x[0]]
     57         else:
     58             sort_key = lambda x: x
     59         if type(choices) is list:
     60             choices = dict(map(lambda x: (x,x), choices))
     61         layout = self.ids.choices
     62         layout.bind(minimum_height=layout.setter('height'))
     63         for k, v in sorted(choices.items(), key=sort_key):
     64             l = Label(text=v)
     65             l.height = '48dp'
     66             l.size_hint_x = 4
     67             cb = CheckBox(group='choices')
     68             cb.value = k
     69             cb.height = '48dp'
     70             cb.size_hint_x = 1
     71             def f(cb, x):
     72                 if x: self.value = cb.value
     73             cb.bind(active=f)
     74             if k == key:
     75                 cb.active = True
     76             layout.add_widget(l)
     77             layout.add_widget(cb)
     78         layout.add_widget(Widget(size_hint_y=1))
     79         self.callback = callback
     80         self.title = title
     81         self.value = key