From 4f8dfc195f98bd1a12efe4f1c5d2259e75d2b4c1 Mon Sep 17 00:00:00 2001 From: Dave Andreoli Date: Sat, 23 Jan 2016 12:19:20 +0100 Subject: [PATCH] New elm widget: Combobox with docs and example --- doc/elementary/combobox.rst | 44 ++++++++++ doc/elementary/elementary.rst | 1 + doc/images/combobox-preview.png | Bin 0 -> 30083 bytes efl/elementary/__init__.pyx | 1 + efl/elementary/combobox.pxi | 116 +++++++++++++++++++++++++++ efl/elementary/combobox_cdef.pxi | 9 +++ examples/elementary/test.py | 2 + examples/elementary/test_combobox.py | 103 ++++++++++++++++++++++++ 8 files changed, 276 insertions(+) create mode 100644 doc/elementary/combobox.rst create mode 100644 doc/images/combobox-preview.png create mode 100644 efl/elementary/combobox.pxi create mode 100644 efl/elementary/combobox_cdef.pxi create mode 100644 examples/elementary/test_combobox.py diff --git a/doc/elementary/combobox.rst b/doc/elementary/combobox.rst new file mode 100644 index 0000000..713416a --- /dev/null +++ b/doc/elementary/combobox.rst @@ -0,0 +1,44 @@ +.. currentmodule:: efl.elementary + +Combobox +######## + +.. image:: /images/combobox-preview.png + + +Widget description +================== + +This is a the classic combobox widget, it is the composition of a +:class:`Button`, an :class:`Entry`, a :class:`Genlist` and an :class:`Hover`. +Thus you can use all the functionality of the base classes on the +:class:`Combobox` itself. + + +Available styles +================ + +- ``default`` a normal combobox. + + +Emitted signals +=============== + +- ``dismissed``: The combobox hover has been dismissed. +- ``expanded``: The combobox hover has been expanded. +- ``clicked``: The combobox button has been clicked. +- ``item,selected``: An item has been selected (highlighted). +- ``item,pressed``: An item has been pressed (clicked). +- ``filter,done``: Item filtering on genlist is completed. + + +Inheritance diagram +=================== + +.. inheritance-diagram:: Combobox + :parts: 2 + + +.. autoclass:: _Combobox +.. autoclass:: Combobox + diff --git a/doc/elementary/elementary.rst b/doc/elementary/elementary.rst index 6349fa0..f1a81a3 100644 --- a/doc/elementary/elementary.rst +++ b/doc/elementary/elementary.rst @@ -402,6 +402,7 @@ Inheritance diagram efl.elementary.Check efl.elementary.Clock efl.elementary.Colorselector + efl.elementary.Combobox efl.elementary.Configuration efl.elementary.Conformant efl.elementary.Ctxpopup diff --git a/doc/images/combobox-preview.png b/doc/images/combobox-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..73250f44cdaca70026c68e25968e965c48c566d5 GIT binary patch literal 30083 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 AGynhq literal 0 HcmV?d00001 diff --git a/efl/elementary/__init__.pyx b/efl/elementary/__init__.pyx index 2c0ca00..b3f7382 100644 --- a/efl/elementary/__init__.pyx +++ b/efl/elementary/__init__.pyx @@ -610,6 +610,7 @@ include "calendar.pxi" include "check.pxi" include "clock.pxi" include "colorselector.pxi" +include "combobox.pxi" include "configuration.pxi" include "conformant.pxi" include "ctxpopup.pxi" diff --git a/efl/elementary/combobox.pxi b/efl/elementary/combobox.pxi new file mode 100644 index 0000000..5253468 --- /dev/null +++ b/efl/elementary/combobox.pxi @@ -0,0 +1,116 @@ +# Copyright (C) 2007-2015 various contributors (see AUTHORS) +# +# This file is part of Python-EFL. +# +# Python-EFL is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# Python-EFL is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this Python-EFL. If not, see . +# + +include "combobox_cdef.pxi" + +cdef class _Combobox(Object): + def __init__(self, evasObject parent, *args, **kwargs): + self._set_obj(elm_combobox_add(parent.obj)) + self._set_properties_from_keyword_args(kwargs) + + property expanded: + """ Returns whether the combobox is expanded or not. + + :type: bool (**readonly**) + + """ + def __get__(self): + return bool(elm_combobox_expanded_get(self.obj)) + + def expanded_get(self): + return bool(elm_combobox_expanded_get(self.obj)) + + def hover_begin(self): + """ This triggers the combobox popup from code, the same as if the user + had clicked the button. + """ + elm_combobox_hover_begin(self.obj) + + def hover_end(self): + """ This dismisses the combobox popup as if the user had clicked + outside the hover. + """ + elm_combobox_hover_end(self.obj) + + def callback_dismissed_add(self, func, *args, **kwargs): + """ The combobox hover has been dismissed """ + self._callback_add("dismissed", func, args, kwargs) + + def callback_dismissed_del(self, func): + self._callback_del("dismissed", func) + + def callback_expanded_add(self, func, *args, **kwargs): + """ The combobox hover has been expanded """ + self._callback_add("expanded", func, args, kwargs) + + def callback_expanded_del(self, func): + self._callback_del("expanded", func) + + def callback_clicked_add(self, func, *args, **kwargs): + """ The combobox button has been clicked """ + self._callback_add("clicked", func, args, kwargs) + + def callback_clicked_del(self, func): + self._callback_del("clicked", func) + + def callback_item_selected_add(self, func, *args, **kwargs): + """ An item has been selected """ + self._callback_add_full("item,selected", _cb_object_item_conv, + func, args, kwargs) + + def callback_item_selected_del(self, func): + self._callback_del_full("item,selected", _cb_object_item_conv, func) + + def callback_item_pressed_add(self, func, *args, **kwargs): + """ An item has been pressed """ + self._callback_add_full("item,pressed", _cb_object_item_conv, + func, args, kwargs) + + def callback_item_pressed_del(self, func): + self._callback_del_full("item,pressed", _cb_object_item_conv, func) + + def callback_filter_done_add(self, func, *args, **kwargs): + """ Item filtering is done """ + self._callback_add("filter,done", func, args, kwargs) + + def callback_filter_done_del(self, func): + self._callback_del("filter,done", func) + + +class Combobox(_Combobox, Button, Entry, Genlist, Hover): + """ + + This is the class that actually implements the widget. + + .. versionadded:: 1.17 + + """ + def __init__(self, evasObject parent, *args, **kwargs): + """Combobox(...) + + :param parent: The parent object + :type parent: :py:class:`efl.evas.Object` + :param \**kwargs: All the remaining keyword arguments are interpreted + as properties of the instance + + """ + _Combobox.__init__(self, parent, *args, **kwargs) + + + +_object_mapping_register("Elm_Combobox", Combobox) diff --git a/efl/elementary/combobox_cdef.pxi b/efl/elementary/combobox_cdef.pxi new file mode 100644 index 0000000..8df1cdc --- /dev/null +++ b/efl/elementary/combobox_cdef.pxi @@ -0,0 +1,9 @@ +cdef extern from "Elementary.h": + + ctypedef cEo Elm_Combobox + + Evas_Object * elm_combobox_add(Evas_Object *parent) + Eina_Bool elm_combobox_expanded_get(const Elm_Combobox *obj) + void elm_combobox_hover_begin(Elm_Combobox *obj) + void elm_combobox_hover_end(Elm_Combobox *obj) + diff --git a/examples/elementary/test.py b/examples/elementary/test.py index 486a5fb..f2e984d 100755 --- a/examples/elementary/test.py +++ b/examples/elementary/test.py @@ -174,6 +174,7 @@ items = [ ("Genlist 2", "test_genlist_2", "test_genlist_2"), ("Genlist Tree", "test_genlist_tree", "test_genlist_tree"), ("Genlist Group", "test_genlist_group", "test_genlist_group"), + ("Genlist Filter", "test_genlist_filter", "test_genlist_filter"), ("Genlist Sorted", "test_genlist_sorted", "test_genlist_sorted"), ("Genlist Iteration", "test_genlist_iteration", "test_genlist_iteration"), ("Genlist Decorate Item Mode", "test_genlist_decorate", "test_genlist_decorate"), @@ -217,6 +218,7 @@ items = [ ("Selectors", [ ("Action Slider", "test_actionslider", "actionslider_clicked"), ("Color Selector", "test_colorselector", "colorselector_clicked"), + ("Combobox", "test_combobox", "combobox_clicked"), ("Day Selector", "test_dayselector", "dayselector_clicked"), ("Disk Selector", "test_diskselector", "diskselector_clicked"), ("File Selector", "test_fileselector", "fileselector_clicked"), diff --git a/examples/elementary/test_combobox.py b/examples/elementary/test_combobox.py new file mode 100644 index 0000000..632e92e --- /dev/null +++ b/examples/elementary/test_combobox.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from efl.evas import EVAS_HINT_EXPAND, EXPAND_BOTH, EXPAND_HORIZ, FILL_HORIZ, \ + EVAS_ASPECT_CONTROL_VERTICAL +from efl import elementary as elm +from efl.elementary import StandardWindow, Box, Button, Icon, Separator, \ + Combobox, GenlistItemClass + + +class ComboboxItemClass(GenlistItemClass): + def text_get(self, gl, part, item_data): + return item_data + + def content_get(self, gl, part, item_data): + if part == 'elm.swallow.end': + return Icon(gl, standard='clock') + else: + return Icon(gl, standard='home') + + def filter_get(self, gl, key, item_data): + if not key: + return True + if key.lower() in item_data.lower(): + return True + return False + + +def btn_click_cb(btn, cbox): + if cbox.expanded: + cbox.hover_end() + else: + cbox.hover_begin() + +def combobox_item_pressed_cb(cbox, item): + print("ITEM,PRESSED", item) + cbox.text = item.text + cbox.hover_end() + +def combobox_changed_cb(cbox): + cbox.filter = cbox.text + + +def combobox_clicked(obj): + win = StandardWindow("combobox", "Combobox", autodel=True, size=(320, 500)) + if obj is None: + win.callback_delete_request_add(lambda o: elm.exit()) + + bx = Box(win, size_hint_weight=EXPAND_BOTH) + win.resize_object_add(bx) + bx.show() + + itc = ComboboxItemClass() + + # combo 1 - a short list with callbacks + cbox1 = Combobox(win, size_hint_expand=EXPAND_HORIZ, + size_hint_fill=FILL_HORIZ) + cbox1.part_text_set("guide", "A short list (with callbacks attached)") + cbox1.callback_item_pressed_add(combobox_item_pressed_cb) + cbox1.callback_dismissed_add(lambda cbox: print("DISMISSED", cbox)) + cbox1.callback_expanded_add(lambda cbox: print("EXPANDED", cbox)) + cbox1.callback_clicked_add(lambda cbox: print("CLICKED", cbox)) + cbox1.callback_item_selected_add(lambda cbox, item: print("ITEM,SELECTED", item)) + + for i in range(1, 7): + cbox1.item_append(itc, "Item # %d" % i) + bx.pack_end(cbox1) + cbox1.show() + + # combo 2 - a long list with filtering + cbox2 = Combobox(win, size_hint_expand=EXPAND_HORIZ, + size_hint_fill=FILL_HORIZ) + cbox2.part_text_set("guide", "A long list (with item filtering)") + cbox2.callback_item_pressed_add(combobox_item_pressed_cb) + cbox2.callback_changed_add(combobox_changed_cb) + cbox2.callback_filter_done_add(lambda cbox: print("FILTER,DONE", cbox)) + + for i in range(1, 1001): + cbox2.item_append(itc, "Item # %d" % i) + bx.pack_end(cbox2) + cbox2.show() + + # combo 3 - disabled + cbox3 = Combobox(win, text="Disabled Combobox", disabled=True, + size_hint_expand=EXPAND_HORIZ, size_hint_fill=FILL_HORIZ) + cbox3.part_text_set("guide", "A long list") + bx.pack_end(cbox3) + cbox3.show() + + # expand-from-code button + bt = Button(win, text="Toggle first combo hover state") + bt.callback_clicked_add(btn_click_cb, cbox1) + bx.pack_start(bt) + bt.show() + + # + win.show() + + +if __name__ == "__main__": + combobox_clicked(None) + elm.run() +