class ComboBox(Entry): def __init__(self, parent, text=None, icon=None): Entry.__init__(self, parent, scrollable=True, single_line=True, size_hint_expand=EXPAND_BOTH, size_hint_fill=FILL_BOTH) self.show() if text: self.text = text if icon: self.icon = icon ic = SafeIcon(self, 'go-down') ic.size_hint_min = 16, 16 # TODO file a bug for elm on phab ic.callback_clicked_add(self.activate) self.part_content_set('end', ic) self._itc = GenlistItemClass(item_style='default', text_get_func=self._gl_text_get, content_get_func=self._gl_content_get) self._list = Genlist(self) self._list.callback_selected_add(self._list_selected_cb) self._hover = Hover(self.parent, target=self) self._bg = Background(self, size_hint_expand=EXPAND_BOTH, size_hint_fill=FILL_BOTH) fr = Frame(self, style='pad_medium', size_hint_expand=EXPAND_BOTH, size_hint_fill=FILL_BOTH) fr.content = self._list fr.show() self._table = Table(self, size_hint_expand=EXPAND_BOTH, size_hint_fill=FILL_BOTH) self._table.pack(self._bg, 0, 0, 1, 1) self._table.pack(fr, 0, 0, 1, 1) self._selected_func = None def callback_selected_add(self, func): self._selected_func = func @property def icon(self): return self.part_content_get('icon') @icon.setter def icon(self, icon): icon.size_hint_min = 16, 16 # TODO file a bug for elm on phab self.part_content_set('icon', icon) @property def guide(self): self.part_text_get('guide') @guide.setter def guide(self, text): self.part_text_set('guide', text) def item_append(self, label=None, icon=None, end=None): item_data = (label, icon, end) self._list.item_append(self._itc, item_data) def clear(self): self._list.clear() def activate(self, source=None): self.focus = False # :/ # TODO calculate this based on _list and parent size # print(self._list.size) # print(self._list.geometry) self._bg.size_hint_min = 0, 200 loc = self._hover.best_content_location_get(ELM_HOVER_AXIS_VERTICAL) self._hover.part_content_set(loc, self._table) self._hover.show() self._table.show() self._bg.show() self._list.show() def dismiss(self): self._hover.dismiss() def _list_selected_cb(self, gl, item): label, icon, end = item.data self.text = label if icon: self.icon = SafeIcon(self, icon) item.selected = False self.dismiss() if callable(self._selected_func): self._selected_func(self) def _gl_text_get(self, gl, part, item_data): label, icon, end = item_data return label def _gl_content_get(self, gl, part, item_data): label, icon, end = item_data if icon and part == 'elm.swallow.icon': return SafeIcon(gl, icon) elif end and part == 'elm.swallow.end': return SafeIcon(gl, end)