URI: 
       tcombobox.py - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
       tcombobox.py (2490B)
       ---
            1 '''
            2 ComboBox
            3 =======
            4 
            5 Based on Spinner
            6 '''
            7 
            8 __all__ = ('ComboBox', 'ComboBoxOption')
            9 
           10 from kivy.properties import ListProperty, ObjectProperty, BooleanProperty
           11 from kivy.uix.button import Button
           12 from kivy.uix.dropdown import DropDown
           13 from kivy.lang import Builder
           14 
           15 
           16 Builder.load_string('''
           17 <ComboBoxOption>:
           18     size_hint_y: None
           19     height: 44
           20 
           21 <ComboBox>:
           22     background_normal: 'atlas://data/images/defaulttheme/spinner'
           23     background_down: 'atlas://data/images/defaulttheme/spinner_pressed'
           24     on_key:
           25         if self.items: x, y = zip(*self.items); self.text = y[x.index(args[1])]
           26 ''')
           27 
           28 
           29 class ComboBoxOption(Button):
           30     pass
           31 
           32 
           33 class ComboBox(Button):
           34     items = ListProperty()
           35     key = ObjectProperty()
           36 
           37     option_cls = ObjectProperty(ComboBoxOption)
           38 
           39     dropdown_cls = ObjectProperty(DropDown)
           40 
           41     is_open = BooleanProperty(False)
           42 
           43     def __init__(self, **kwargs):
           44         self._dropdown = None
           45         super(ComboBox, self).__init__(**kwargs)
           46         self.items_dict = dict(self.items)
           47         self.bind(
           48             on_release=self._toggle_dropdown,
           49             dropdown_cls=self._build_dropdown,
           50             option_cls=self._build_dropdown,
           51             items=self._update_dropdown,
           52             key=self._update_text)
           53         self._build_dropdown()
           54         self._update_text()
           55 
           56     def _update_text(self, *largs):
           57         try:
           58             self.text = self.items_dict[self.key]
           59         except KeyError:
           60             pass
           61 
           62     def _build_dropdown(self, *largs):
           63         if self._dropdown:
           64             self._dropdown.unbind(on_select=self._on_dropdown_select)
           65             self._dropdown.dismiss()
           66             self._dropdown = None
           67         self._dropdown = self.dropdown_cls()
           68         self._dropdown.bind(on_select=self._on_dropdown_select)
           69         self._update_dropdown()
           70 
           71     def _update_dropdown(self, *largs):
           72         dp = self._dropdown
           73         cls = self.option_cls
           74         dp.clear_widgets()
           75         for key, value in self.items:
           76             item = cls(text=value)
           77             # extra attribute
           78             item.key = key
           79             item.bind(on_release=lambda option: dp.select(option.key))
           80             dp.add_widget(item)
           81 
           82     def _toggle_dropdown(self, *largs):
           83         self.is_open = not self.is_open
           84 
           85     def _on_dropdown_select(self, instance, data, *largs):
           86         self.key = data
           87         self.is_open = False
           88 
           89     def on_is_open(self, instance, value):
           90         if value:
           91             self._dropdown.open(self)
           92         else:
           93             self._dropdown.dismiss()