davemds pushed a commit to branch master.

http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=d8174aea3d6f185eca3a84934ef4bba67d713b91

commit d8174aea3d6f185eca3a84934ef4bba67d713b91
Author: davemds <[email protected]>
Date:   Fri Aug 1 16:31:24 2014 +0200

    Genlist: implemented search_by_text_item_get(), with a proper test
---
 efl/elementary/enums.pxd            |  6 +++
 efl/elementary/general.pyx          | 42 ++++++++++++++++++
 efl/elementary/genlist.pxd          |  3 +-
 efl/elementary/genlist_widget.pxi   | 41 ++++++++++++++++++
 examples/elementary/test.py         |  1 +
 examples/elementary/test_genlist.py | 86 ++++++++++++++++++++++++++++++++++++-
 6 files changed, 177 insertions(+), 2 deletions(-)

diff --git a/efl/elementary/enums.pxd b/efl/elementary/enums.pxd
index 624f01d..87ea2e9 100644
--- a/efl/elementary/enums.pxd
+++ b/efl/elementary/enums.pxd
@@ -188,6 +188,12 @@ cdef extern from "Elementary.h":
         ELM_GENLIST_ITEM_SCROLLTO_TOP
         ELM_GENLIST_ITEM_SCROLLTO_MIDDLE
 
+    ctypedef enum Elm_Glob_Match_Flags:
+        ELM_GLOB_MATCH_NO_ESCAPE
+        ELM_GLOB_MATCH_PATH
+        ELM_GLOB_MATCH_PERIOD
+        ELM_GLOB_MATCH_NOCASE
+        
     ctypedef enum Elm_Gesture_State:
         ELM_GESTURE_STATE_UNDEFINED
         ELM_GESTURE_STATE_START
diff --git a/efl/elementary/general.pyx b/efl/elementary/general.pyx
index 13d50e4..be3a096 100644
--- a/efl/elementary/general.pyx
+++ b/efl/elementary/general.pyx
@@ -177,6 +177,43 @@ Urgency levels of a notification
     .. versionadded:: 1.10
 
 
+.. _Elm_Glob_Match_Flags:
+
+Glob matching
+-------------
+
+Glob matching bitfiled flags
+
+.. data:: ELM_GLOB_MATCH_NO_ESCAPE
+
+    Treat backslash as an ordinary character instead of escape.
+
+    .. versionadded:: 1.11
+
+.. data:: ELM_GLOB_MATCH_PATH
+
+    Match a slash in string only with a slash in pattern and not by an
+    asterisk (*) or a question mark (?) metacharacter, nor by a bracket
+    expression ([]) containing a slash.
+
+    .. versionadded:: 1.11
+
+.. data:: ELM_GLOB_MATCH_PERIOD
+
+    Leading period in string has to be matched exactly by a period in
+    pattern. A period is considered to be leading if it is the first
+    character in string, or if both ELM_GLOB_MATCH_PATH is set and the
+    period immediately follows a slash.
+
+    .. versionadded:: 1.11
+
+.. data:: ELM_GLOB_MATCH_NOCASE
+
+    The pattern is matched case-insensitively.
+
+    .. versionadded:: 1.11
+
+
 """
 
 from cpython cimport PyUnicode_AsUTF8String, PyMem_Malloc, Py_DECREF, Py_INCREF
@@ -228,6 +265,11 @@ ELM_SYS_NOTIFY_URGENCY_CRITICAL = 
enums.ELM_SYS_NOTIFY_URGENCY_CRITICAL
 ELM_EVENT_SYS_NOTIFY_NOTIFICATION_CLOSED = 
enums.ELM_EVENT_SYS_NOTIFY_NOTIFICATION_CLOSED
 ELM_EVENT_SYS_NOTIFY_ACTION_INVOKED = enums.ELM_EVENT_SYS_NOTIFY_ACTION_INVOKED
 
+ELM_GLOB_MATCH_NO_ESCAPE = enums.ELM_GLOB_MATCH_NO_ESCAPE
+ELM_GLOB_MATCH_PATH = enums.ELM_GLOB_MATCH_PATH
+ELM_GLOB_MATCH_PERIOD = enums.ELM_GLOB_MATCH_PERIOD
+ELM_GLOB_MATCH_NOCASE = enums.ELM_GLOB_MATCH_NOCASE
+
 import traceback
 
 cdef void py_elm_sys_notify_send_cb(void *data, unsigned int id):
diff --git a/efl/elementary/genlist.pxd b/efl/elementary/genlist.pxd
index 7941c48..0d8d367 100644
--- a/efl/elementary/genlist.pxd
+++ b/efl/elementary/genlist.pxd
@@ -4,7 +4,7 @@ from object_item cimport Elm_Object_Item
 from general cimport Elm_Tooltip_Item_Content_Cb
 from enums cimport Elm_List_Mode, Elm_Object_Select_Mode, \
     Elm_Genlist_Item_Type, Elm_Genlist_Item_Scrollto_Type, \
-    Elm_Genlist_Item_Field_Type
+    Elm_Genlist_Item_Field_Type, Elm_Glob_Match_Flags
 
 cdef extern from "Elementary.h":
     ctypedef char           *(*GenlistItemLabelGetFunc)     (void *data, 
Evas_Object *obj, const char *part)
@@ -81,6 +81,7 @@ cdef extern from "Elementary.h":
     void                    elm_genlist_longpress_timeout_set(Evas_Object 
*obj, double timeout)
     double                  elm_genlist_longpress_timeout_get(const 
Evas_Object *obj)
     Elm_Object_Item *       elm_genlist_at_xy_item_get(const Evas_Object *obj, 
Evas_Coord x, Evas_Coord y, int *posret)
+    Elm_Object_Item *       elm_genlist_search_by_text_item_get(const 
Evas_Object *obj, Elm_Object_Item *item_to_search_from, const char *part_name, 
const char *pattern, Elm_Glob_Match_Flags flags)
 
     Elm_Object_Item *       elm_genlist_item_parent_get(const Elm_Object_Item 
*it)
     void                    elm_genlist_item_subitems_clear(Elm_Object_Item 
*item)
diff --git a/efl/elementary/genlist_widget.pxi 
b/efl/elementary/genlist_widget.pxi
index 68cf2a8..dcc0c2d 100644
--- a/efl/elementary/genlist_widget.pxi
+++ b/efl/elementary/genlist_widget.pxi
@@ -634,6 +634,47 @@ cdef class Genlist(Object):
         """
         return _object_item_to_python(elm_genlist_nth_item_get(self.obj, nth))
 
+    def search_by_text_item_get(self, GenlistItem item_to_search_from,
+                                part_name, pattern, Elm_Glob_Match_Flags 
flags):
+        """Search genlist item by given string.
+        
+        This function uses globs (like "\*.jpg") for searching and takes
+        search flags as last parameter. That is a bitfield with values
+        to be ored together or 0 for no flags.
+
+        :param item_to_search_from: item to start search from, or None to
+            search from the first item.
+        :type item_to_search_from: :py:class:`GenlistItem`
+        :param part_name: Name of the TEXT part of genlist item to search
+            string in (usually "elm.text").
+        :type part_name: string
+        :param pattern: The search pattern.
+        :type pattern: string
+        :param flags: Search flags
+        :type flags: :ref:`Elm_Glob_Match_Flags`
+
+        :return: The first item found
+        :rtype: :py:class:`GenlistItem`
+
+        .. versionadded:: 1.11
+
+        """
+        cdef Elm_Object_Item *from_item = NULL
+
+        if isinstance(part_name, unicode):
+            part_name = PyUnicode_AsUTF8String(part_name)
+        if isinstance(pattern, unicode):
+            pattern = PyUnicode_AsUTF8String(pattern)
+        if item_to_search_from is not None:
+            from_item = _object_item_from_python(item_to_search_from)
+
+        return _object_item_to_python(elm_genlist_search_by_text_item_get(
+                    self.obj, from_item,
+                    <const char *>part_name if part_name is not None else NULL,
+                    <const char *>pattern if pattern is not None else NULL,
+                    flags))
+    
+    
     property focus_on_selection:
         """
 
diff --git a/examples/elementary/test.py b/examples/elementary/test.py
index b0014f6..0f7f0dd 100755
--- a/examples/elementary/test.py
+++ b/examples/elementary/test.py
@@ -181,6 +181,7 @@ items = [
         ("Genlist Iteration", "test_genlist", "genlist5_clicked"),
         ("Genlist Decorate Item Mode", "test_genlist", "genlist10_clicked"),
         ("Genlist Decorate All Mode", "test_genlist", "genlist15_clicked"),
+        ("Genlist Search By Text", "test_genlist", "genlist20_clicked"),
         ("List", "test_list", "list_clicked"),
         ("List 2", "test_list", "list2_clicked"),
         ("List 3", "test_list", "list3_clicked"),
diff --git a/examples/elementary/test_genlist.py 
b/examples/elementary/test_genlist.py
index 611cb86..6bdea80 100644
--- a/examples/elementary/test_genlist.py
+++ b/examples/elementary/test_genlist.py
@@ -23,9 +23,10 @@ from efl.elementary.genlist import Genlist, GenlistItem, 
GenlistItemClass, \
     ELM_GENLIST_ITEM_NONE, ELM_OBJECT_SELECT_MODE_ALWAYS, \
     ELM_OBJECT_SELECT_MODE_DEFAULT, ELM_GENLIST_ITEM_GROUP, \
     ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY
-from efl.elementary.general import cache_all_flush
+from efl.elementary.general import cache_all_flush, ELM_GLOB_MATCH_NOCASE
 from efl.elementary.radio import Radio
 from efl.elementary.check import Check
+from efl.elementary.entry import Entry
 
 EXPAND_BOTH = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND
 EXPAND_HORIZ = EVAS_HINT_EXPAND, 0.0
@@ -647,6 +648,88 @@ def genlist15_clicked(obj, item=None):
 
     win.show()
 
+### Genlist search by text
+cities = ("Albany","Annapolis","Atlanta","Augusta","Austin","Baton Rouge",
+"Bismarck","Boise","Boston","Carson City","Charleston","Cheyenne","Columbia",
+"Columbus","Concord","Denver","Des Moines","Dover","Frankfort","Harrisburg",
+"Hartford","Helena","Honolulu","Indianapolis","Jackson","Jefferson City",
+"Juneau","Lansing","Lincoln","Little Rock","Madison","Montgomery","Montpelier",
+"Nashville","Oklahoma City","Olympia","Phoenix","Pierre","Providence",
+"Raleigh","Richmond","Sacramento","Saint Paul","Salem","Salt Lake City",
+"Santa Fe","Springfield","Tallahassee","Topeka","Trenton"
+)
+
+class ItemClass20(GenlistItemClass):
+    def text_get(self, obj, part, data):
+        if part == "elm.text":
+            return data
+
+    def content_get(self, obj, part, data):
+        if part == "elm.swallow.icon":
+            return Icon(obj, file=os.path.join(img_path, "logo_small.png"))
+
+def genlist20_search_cb(en, gl, tg):
+    flags = ELM_GLOB_MATCH_NOCASE if tg.state == False else 0
+    from_item = gl.selected_item.next if gl.selected_item else None
+
+    item = gl.search_by_text_item_get(from_item, "elm.text", en.text, flags)
+    if item:
+        item.selected = True
+        en.focus = True
+    elif gl.selected_item:
+        gl.selected_item.selected = False
+        
+
+def genlist20_clicked(obj, item=None):
+    win = StandardWindow("genlist-search-by-text",
+        "Genlist Search By Text", autodel=True, size=(300, 520))
+
+    gl = Genlist(win, size_hint_align=FILL_BOTH, size_hint_weight=EXPAND_BOTH)
+
+    bx = Box(win, size_hint_weight=EXPAND_BOTH)
+    win.resize_object_add(bx)
+    bx.show()
+
+    lb = Label(win)
+    lb.text = \
+    "<align=left>This example show the usage of 
search_by_text_item_get().<br>" \
+    "Enter a search string and press Enter to show the next result.<br>" \
+    "Search will start from the selected item (not included).<br>" \
+    "You can search using glob patterns.</align>"
+    fr = Frame(win, text="Information", content=lb,
+               size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ)
+    bx.pack_end(fr)
+    fr.show()
+
+    tg = Check(win, style="toggle", text="Case Sensitive Search");
+    bx.pack_end(tg)
+    tg.show()
+
+    bx_entry = Box(win, horizontal=True,
+                   size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ)
+    bx.pack_end(bx_entry)
+    bx_entry.show()
+
+    lb = Label(win, text="Search:")
+    bx_entry.pack_end(lb)
+    lb.show()
+
+    en = Entry(win, single_line=True, scrollable=True,
+               size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ)
+    en.part_text_set("guide", "Type the search query")
+    en.callback_activated_add(genlist20_search_cb, gl, tg)
+    bx_entry.pack_end(en)
+    en.show()
+    en.focus = True
+
+    bx.pack_end(gl)
+    gl.show()
+
+    itc20 = ItemClass20()
+    for name in cities:
+        gl.item_append(itc20, name)
+
+    win.show()
 
 if __name__ == "__main__":
     elementary.init()
@@ -676,6 +759,7 @@ if __name__ == "__main__":
         ("Genlist Iteration", genlist5_clicked),
         ("Genlist Decorate Item Mode", genlist10_clicked),
         ("Genlist Decorate All Mode", genlist15_clicked),
+        ("Genlist Search By Text", genlist20_clicked),
     ]
 
     li = List(win, size_hint_weight=EXPAND_BOTH, size_hint_align=FILL_BOTH)

-- 


Reply via email to