kuuko pushed a commit to branch master. http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=6299a6c8ae824d4d99e2dad3a937e82d50414763
commit 6299a6c8ae824d4d99e2dad3a937e82d50414763 Author: Kai Huuhko <kai.huu...@gmail.com> Date: Tue Oct 8 09:08:37 2013 +0300 Elementary: Make inheriting from scrollable a responsibility for the user. --- efl/elementary/diskselector.pyx | 56 +++------ efl/elementary/entry.pyx | 58 +++------ efl/elementary/gengrid.pyx | 230 +++--------------------------------- efl/elementary/genlist.pyx | 20 +++- efl/elementary/genlist_item.pxi | 10 +- efl/elementary/genlist_widget.pxi | 2 +- efl/elementary/list.pyx | 71 ++--------- efl/elementary/photocam.pyx | 22 ---- efl/elementary/scroller.pxd | 47 +------- efl/elementary/scroller.pyx | 75 +++++++++--- examples/elementary/test_conform.py | 24 ++-- examples/elementary/test_entry.py | 41 +++---- examples/elementary/test_gengrid.py | 7 +- 13 files changed, 176 insertions(+), 487 deletions(-) diff --git a/efl/elementary/diskselector.pyx b/efl/elementary/diskselector.pyx index 9537d0f..ed06a46 100644 --- a/efl/elementary/diskselector.pyx +++ b/efl/elementary/diskselector.pyx @@ -55,6 +55,20 @@ Default text parts of the diskselector items that you can use for are: .. note:: The "scroll,anim,*" and "scroll,drag,*" signals are only emitted by user intervention. +Scollable Interface +=================== + +This widget supports the scrollable interface. + +If you wish to control the scolling behaviour using these functions, +inherit both the widget class and the +:py:class:`Scrollable<efl.elementary.scroller.Scrollable>` class +using multiple inheritance, for example:: + + class ScrollableGenlist(Genlist, Scrollable): + def __init__(self, canvas, *args, **kwargs): + Genlist.__init__(self, canvas) + """ @@ -99,7 +113,6 @@ cdef extern from "Elementary.h": from object_item cimport ObjectItem, _object_item_callback, \ _object_item_to_python, _object_item_list_to_python -from scroller cimport * cdef class DiskselectorItem(ObjectItem): @@ -329,47 +342,6 @@ cdef class Diskselector(Object): def __get__(self): return elm_diskselector_display_item_num_get(self.obj) - property bounce: - """Bouncing behaviour when the scrolled content reaches an edge. - - Tell the internal scroller object whether it should bounce or not - when it reaches the respective edges for each axis. - - .. seealso:: :py:attr:`elementary.scroller.Scroller.bounce` - - :type: (bool h_bounce, bool v_bounce) - - """ - def __set__(self, bounce): - h_bounce, v_bounce = bounce - elm_scroller_bounce_set(self.obj, h_bounce, v_bounce) - def __get__(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - - property scroller_policy: - """The scrollbar policy. - - This sets the scrollbar visibility policy for the given scroller. - ELM_SCROLLER_POLICY_AUTO means the scrollbar is made visible if it - is needed, and otherwise kept hidden. ELM_SCROLLER_POLICY_ON turns - it on all the time, and ELM_SCROLLER_POLICY_OFF always keeps it off. - This applies respectively for the horizontal and vertical scrollbars. - - Both are disabled by default, i.e., are set to ELM_SCROLLER_POLICY_OFF. - - :type: tuple of Elm_Scroller_Policy - - """ - def __get__(self): - cdef Elm_Scroller_Policy h_policy, v_policy - elm_scroller_policy_get(self.obj, &h_policy, &v_policy) - return (h_policy, v_policy) - def __set__(self, policy): - h_policy, v_policy = policy - elm_scroller_policy_set(self.obj, h_policy, v_policy) - def clear(self): """clear() diff --git a/efl/elementary/entry.pyx b/efl/elementary/entry.pyx index f342d85..056a0a5 100644 --- a/efl/elementary/entry.pyx +++ b/efl/elementary/entry.pyx @@ -39,6 +39,20 @@ Other features include password mode, filtering of inserted text with :py:func:`markup_filter_append()` and related functions, inline "items" and formatted markup text. +Scollable Interface +=================== + +This widget supports the scrollable interface. + +If you wish to control the scolling behaviour using these functions, +inherit both the widget class and the +:py:class:`Scrollable<efl.elementary.scroller.Scrollable>` class +using multiple inheritance, for example:: + + class ScrollableGenlist(Genlist, Scrollable): + def __init__(self, canvas, *args, **kwargs): + Genlist.__init__(self, canvas) + Formatted text ============== @@ -632,7 +646,6 @@ cdef extern from "Elementary.h": Eina_Bool elm_cnp_selection_get(Evas_Object *obj, Elm_Sel_Type selection, Elm_Sel_Format format, Elm_Drop_Cb datacb, void *udata) from hover cimport Hover -from scroller cimport * cimport enums @@ -1663,49 +1676,6 @@ cdef class Entry(Object): cpdef end_visible_set(self, setting): elm_entry_end_visible_set(self.obj, setting) - property scrollbar_policy: - """This sets the entry's scrollbar policy (i.e. enabling/disabling - them). - - Setting an entry to single-line mode with :py:attr:`single_line` - will automatically disable the display of scrollbars when the entry - moves inside its scroller. - - :type: (:ref:`Elm_Scroller_Policy` **h**, :ref:`Elm_Scroller_Policy` **v**) - - """ - def __set__(self, value): - cdef Elm_Scroller_Policy h, v - h, v = value - elm_scroller_policy_set(self.obj, h, v) - - def scrollbar_policy_set(self, Elm_Scroller_Policy h, Elm_Scroller_Policy v): - elm_scroller_policy_set(self.obj, h, v) - - property bounce: - """Whether the entry will bounce when scrolling reaches - the end of the contained entry. - - :type: (bool **h_bounce**, bool **v_bounce**) - - """ - def __get__(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - - def __set__(self, value): - cdef Eina_Bool h_bounce, v_bounce - h_bounce, v_bounce = value - elm_scroller_bounce_set(self.obj, h_bounce, v_bounce) - - def bounce_set(self, h_bounce, v_bounce): - elm_scroller_bounce_set(self.obj, h_bounce, v_bounce) - def bounce_get(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - property input_panel_layout: """The input panel layout of the entry diff --git a/efl/elementary/gengrid.pyx b/efl/elementary/gengrid.pyx index e645fdd..d64e1d0 100644 --- a/efl/elementary/gengrid.pyx +++ b/efl/elementary/gengrid.pyx @@ -33,6 +33,20 @@ clicking on items to select them and clicking on the grid's viewport and swiping to pan the whole view) or via the keyboard, navigating through item with the arrow keys. +Scollable Interface +=================== + +This widget supports the scrollable interface. + +If you wish to control the scolling behaviour using these functions, +inherit both the widget class and the +:py:class:`Scrollable<efl.elementary.scroller.Scrollable>` class +using multiple inheritance, for example:: + + class ScrollableGenlist(Genlist, Scrollable): + def __init__(self, canvas, *args, **kwargs): + Genlist.__init__(self, canvas) + Gengrid layouts =============== @@ -380,7 +394,6 @@ cdef extern from "Elementary.h": from object_item cimport ObjectItem, _object_item_to_python, \ elm_object_item_widget_get, _object_item_from_python, \ _object_item_list_to_python, elm_object_item_data_get -from scroller cimport * cimport enums import traceback @@ -1210,31 +1223,6 @@ cdef class Gengrid(Object): def horizontal_get(self): return bool(elm_gengrid_horizontal_get(self.obj)) - property bounce: - """The bouncing effect occurs whenever one reaches the gengrid's - edge's while panning it -- it will scroll past its limits a - little bit and return to the edge again, in a animated for, - automatically. - - .. note:: By default, gengrids have bouncing enabled on both axis - - """ - def __get__(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - - def __set__(self, value): - h_bounce, v_bounce = value - elm_scroller_bounce_set(self.obj, bool(h_bounce), bool(v_bounce)) - - def bounce_set(self, h_bounce, v_bounce): - elm_scroller_bounce_set(self.obj, bool(h_bounce), bool(v_bounce)) - def bounce_get(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - def item_append(self, GengridItemClass item_class not None, item_data, func=None): """item_append(self, GengridItemClass item_class, item_data, func=None) -> GengridItem @@ -1430,34 +1418,6 @@ cdef class Gengrid(Object): def last_item_get(self): return _object_item_to_python(elm_gengrid_last_item_get(self.obj)) - property scroller_policy: - """This sets the scrollbar visibility policy for the given gengrid - scroller. #ELM_SCROLLER_POLICY_AUTO means the scrollbar is made - visible if it is needed, and otherwise kept hidden. - #ELM_SCROLLER_POLICY_ON turns it on all the time, and - #ELM_SCROLLER_POLICY_OFF always keeps it off. This applies - respectively for the horizontal and vertical scrollbars. Default is - #ELM_SCROLLER_POLICY_AUTO - - :type: Elm_Scroller_Policy - - """ - def __get__(self): - cdef Elm_Scroller_Policy policy_h, policy_v - elm_scroller_policy_get(self.obj, &policy_h, &policy_v) - return (policy_h, policy_v) - - def __set__(self, value): - policy_h, policy_v = value - elm_scroller_policy_set(self.obj, policy_h, policy_v) - - def scroller_policy_set(self, policy_h, policy_v): - elm_scroller_policy_set(self.obj, policy_h, policy_v) - def scroller_policy_get(self): - cdef Elm_Scroller_Policy policy_h, policy_v - elm_scroller_policy_get(self.obj, &policy_h, &policy_v) - return (policy_h, policy_v) - property items_count: """Return how many items are currently in a list. @@ -1569,168 +1529,6 @@ cdef class Gengrid(Object): def reorder_mode_get(self, mode): return bool(elm_gengrid_reorder_mode_get(self.obj)) - property page_relative: - """The gengrid's scroller is capable of binding scrolling by the - user to "pages". It means that, while scrolling and, specially - after releasing the mouse button, the grid will **snap** to the - nearest displaying page's area. When page sizes are set, the - grid's continuous content area is split into (equal) page sized - pieces. - - This function sets the size of a page **relatively to the viewport - dimensions** of the gengrid, for each axis. A value ``1.0`` means - "the exact viewport's size", in that axis, while ``0.0`` turns - paging off in that axis. Likewise, ``0.5`` means "half a viewport". - Sane usable values are, than, between ``0.0`` and ``1.0``. Values - beyond those will make it behave behave inconsistently. If you only - want one axis to snap to pages, use the value ``0.0`` for the other - one. - - There is a function setting page size values in **absolute** values, - too -- elm_gengrid_page_size_set(). Naturally, its use is mutually - exclusive to this one. - - :type: tuple of floats - - """ - def __get__(self): - cdef double h_pagerel, v_pagerel - elm_scroller_page_relative_get(self.obj, &h_pagerel, &v_pagerel) - return (h_pagerel, v_pagerel) - - def __set__(self, value): - h_pagerel, v_pagerel = value - elm_scroller_page_relative_set(self.obj, h_pagerel, v_pagerel) - - def page_relative_set(self, h_pagerel, v_pagerel): - elm_scroller_page_relative_set(self.obj, h_pagerel, v_pagerel) - def page_relative_get(self): - cdef double h_pagerel, v_pagerel - elm_scroller_page_relative_get(self.obj, &h_pagerel, &v_pagerel) - return (h_pagerel, v_pagerel) - - property page_size: - """The gengrid's scroller is capable of binding scrolling by the - user to "pages". It means that, while scrolling and, specially - after releasing the mouse button, the grid will **snap** to the - nearest displaying page's area. When page sizes are set, the - grid's continuous content area is split into (equal) page sized - pieces. - - This function sets the size of a page of the gengrid, in pixels, - for each axis. Sane usable values are, between ``0`` and the - dimensions of ``obj``, for each axis. Values beyond those will - make it behave behave inconsistently. If you only want one axis - to snap to pages, use the value ``0`` for the other one. - - There is a function setting page size values in **relative** - values, too -- elm_gengrid_page_relative_set(). Naturally, its - use is mutually exclusive to this one. - - """ - def __set__(self, value): - h_pagesize, v_pagesize = value - elm_scroller_page_size_set(self.obj, h_pagesize, v_pagesize) - - def page_size_set(self, h_pagesize, v_pagesize): - elm_scroller_page_size_set(self.obj, h_pagesize, v_pagesize) - - property current_page: - """The page number starts from 0. 0 is the first page. - Current page means the page which meet the top-left of the viewport. - If there are two or more pages in the viewport, it returns the - number of page which meet the top-left of the viewport. - - .. seealso:: - :py:attr:`last_page` - :py:func:`page_show()` - :py:func:`page_bring_in()` - - :type: tuple of ints - - """ - def __get__(self): - cdef int h_pagenum, v_pagenum - elm_scroller_current_page_get(self.obj, &h_pagenum, &v_pagenum) - return (h_pagenum, v_pagenum) - - def current_page_get(self): - cdef int h_pagenum, v_pagenum - elm_scroller_current_page_get(self.obj, &h_pagenum, &v_pagenum) - return (h_pagenum, v_pagenum) - - property last_page: - """The page number starts from 0. 0 is the first page. - This returns the last page number among the pages. - - .. seealso:: - :py:attr:`current_page` - :py:func:`page_show()` - :py:func:`page_bring_in()` - - :type: tuple of ints - - """ - def __get__(self): - cdef int h_pagenum, v_pagenum - elm_scroller_last_page_get(self.obj, &h_pagenum, &v_pagenum) - return (h_pagenum, v_pagenum) - - def last_page_get(self): - cdef int h_pagenum, v_pagenum - elm_scroller_last_page_get(self.obj, &h_pagenum, &v_pagenum) - return (h_pagenum, v_pagenum) - - def page_show(self, h_pagenum, v_pagenum): - """page_show(int h_pagenum, int v_pagenum) - - Show a specific virtual region within the gengrid content object - by page number. - - :param h_pagenumber: The horizontal page number - :param v_pagenumber: The vertical page number - - 0, 0 of the indicated page is located at the top-left of the viewport. - This will jump to the page directly without animation. - - Example of usage:: - - sc = Gengrid(win) - sc.content = content - sc.page_relative = (1, 0) - h_page, v_page = sc.current_page - sc.page_show(h_page + 1, v_page) - - .. seealso:: :py:func:`page_bring_in()` - - """ - elm_scroller_page_show(self.obj, h_pagenum, v_pagenum) - - def page_bring_in(self, h_pagenum, v_pagenum): - """page_show(int h_pagenum, int v_pagenum) - - Show a specific virtual region within the gengrid content object - by page number. - - :param h_pagenumber: The horizontal page number - :param v_pagenumber: The vertical page number - - 0, 0 of the indicated page is located at the top-left of the viewport. - This will slide to the page with animation. - - Example of usage:: - - sc = Gengrid(win) - sc.content = content - sc.page_relative = (1, 0) - h_page, v_page = sc.current_page - sc.page_bring_in(h_page + 1, v_page) - - .. seealso:: :py:func:`page_show()` - - """ - elm_scroller_page_bring_in(self.obj, h_pagenum, v_pagenum) - property filled: """The fill state of the whole grid of items of a gengrid within its given viewport. By default, this value is False, meaning diff --git a/efl/elementary/genlist.pyx b/efl/elementary/genlist.pyx index 7c67f10..1b4ebb0 100644 --- a/efl/elementary/genlist.pyx +++ b/efl/elementary/genlist.pyx @@ -221,6 +221,20 @@ per application with elm_theme_extension_add(). If you absolutely must have a specific style that overrides any theme the user or system sets up you can use elm_theme_overlay_add() to add such a file. +Scollable Interface +=================== + +This widget supports the scrollable interface. + +If you wish to control the scolling behaviour using these functions, +inherit both the widget class and the +:py:class:`Scrollable<efl.elementary.scroller.Scrollable>` class +using multiple inheritance, for example:: + + class ScrollableGenlist(Genlist, Scrollable): + def __init__(self, canvas, *args, **kwargs): + Genlist.__init__(self, canvas) + Implementation ============== @@ -810,7 +824,7 @@ cdef class GenlistIterator(object): Elm_Object_Item *current_item GenlistItem ret - def __cinit__(self, GenlistWidget gl): + def __cinit__(self, Genlist gl): self.current_item = elm_genlist_first_item_get(gl.obj) def __next__(self): @@ -835,7 +849,7 @@ include "genlist_item_class.pxi" include "genlist_item.pxi" include "genlist_widget.pxi" -class Genlist(GenlistWidget, ScrollableInterface): - pass +#class Genlist(GenlistWidget, ScrollableInterface): + #pass _object_mapping_register("elm_genlist", Genlist) diff --git a/efl/elementary/genlist_item.pxi b/efl/elementary/genlist_item.pxi index 59d9a9b..f0e2d35 100644 --- a/efl/elementary/genlist_item.pxi +++ b/efl/elementary/genlist_item.pxi @@ -91,7 +91,7 @@ cdef class GenlistItem(ObjectItem): self.cb_func, self.item_data) - def append_to(self, GenlistWidget genlist not None): + def append_to(self, Genlist genlist not None): """append_to(Genlist genlist) -> GenlistItem Append a new item (add as last row) to this genlist. @@ -121,7 +121,7 @@ cdef class GenlistItem(ObjectItem): Py_DECREF(self) return None - def prepend_to(self, GenlistWidget genlist not None): + def prepend_to(self, Genlist genlist not None): """prepend_to(Genlist genlist) -> GenlistItem Prepend a new item (add as first row) to this Genlist. @@ -164,7 +164,7 @@ cdef class GenlistItem(ObjectItem): """ cdef: Elm_Object_Item *item, *before - GenlistWidget genlist = before_item.widget + Genlist genlist = before_item.widget Evas_Smart_Cb cb = NULL if self.cb_func is not None: @@ -198,7 +198,7 @@ cdef class GenlistItem(ObjectItem): """ cdef: Elm_Object_Item *item, *after - GenlistWidget genlist = after_item.widget + Genlist genlist = after_item.widget Evas_Smart_Cb cb = NULL if self.cb_func is not None: @@ -219,7 +219,7 @@ cdef class GenlistItem(ObjectItem): Py_DECREF(self) return None - def sorted_insert(self, GenlistWidget genlist not None, comparison_func): + def sorted_insert(self, Genlist genlist not None, comparison_func): """sorted_insert(Genlist genlist, comparison_func) -> GenlistItem Insert a new item into the sorted genlist object diff --git a/efl/elementary/genlist_widget.pxi b/efl/elementary/genlist_widget.pxi index 9be8221..e794d31 100644 --- a/efl/elementary/genlist_widget.pxi +++ b/efl/elementary/genlist_widget.pxi @@ -1,4 +1,4 @@ -cdef class GenlistWidget(Object): +cdef class Genlist(Object): """This is the class that actually implements the widget.""" diff --git a/efl/elementary/list.pyx b/efl/elementary/list.pyx index 9fbffe4..c47ee7b 100644 --- a/efl/elementary/list.pyx +++ b/efl/elementary/list.pyx @@ -70,6 +70,19 @@ Default text parts of the list items that you can use for are: - "default" - label in the list item +Scollable Interface +=================== + +This widget supports the scrollable interface. + +If you wish to control the scolling behaviour using these functions, +inherit both the widget class and the +:py:class:`Scrollable<efl.elementary.scroller.Scrollable>` class +using multiple inheritance, for example:: + + class ScrollableGenlist(Genlist, Scrollable): + def __init__(self, canvas, *args, **kwargs): + Genlist.__init__(self, canvas) Enumerations ------------ @@ -223,7 +236,6 @@ from object cimport Object from object_item cimport _object_item_callback, \ _object_item_to_python, \ _object_item_list_to_python -from scroller cimport * cimport enums @@ -746,63 +758,6 @@ cdef class List(Object): def select_mode_get(self): return elm_list_select_mode_get(self.obj) - property bounce: - """The bouncing behaviour when the scrolled content reaches an edge. - - Whether the internal scroller object should bounce or not when it - reaches the respective edges for each axis. - - :type: (bool **h**, bool **v**) - - """ - def __set__(self, value): - h, v = value - elm_scroller_bounce_set(self.obj, h, v) - - def __get__(self): - cdef Eina_Bool h, v - elm_scroller_bounce_get(self.obj, &h, &v) - return (h, v) - - def bounce_set(self, h, v): - elm_scroller_bounce_set(self.obj, h, v) - def bounce_get(self): - cdef Eina_Bool h, v - elm_scroller_bounce_get(self.obj, &h, &v) - return (h, v) - - property scroller_policy: - """The scrollbar policy. - - This sets the scrollbar visibility policy for the given scroller. - ELM_SCROLLER_POLICY_AUTO means the scrollbar is made visible if it - is needed, and otherwise kept hidden. ELM_SCROLLER_POLICY_ON turns - it on all the time, and ELM_SCROLLER_POLICY_OFF always keeps it off. - This applies respectively for the horizontal and vertical scrollbars. - - The both are disabled by default, i.e., are set to - ELM_SCROLLER_POLICY_OFF. - - :type: :ref:`Scrolling policy <Elm_Scroller_Policy>` - - """ - def __set__(self, value): - policy_h, policy_v = value - elm_scroller_policy_set(self.obj, policy_h, policy_v) - - def __get__(self): - cdef Elm_Scroller_Policy policy_h, policy_v - elm_scroller_policy_get(self.obj, &policy_h, &policy_v) - return (policy_h, policy_v) - - def scroller_policy_set(self, policy_h, policy_v): - elm_scroller_policy_set(self.obj, policy_h, policy_v) - def scroller_policy_get(self): - cdef Elm_Scroller_Policy policy_h, policy_v - elm_scroller_policy_get(self.obj, &policy_h, &policy_v) - return (policy_h, policy_v) - - def item_append(self, label, evasObject icon = None, evasObject end = None, callback = None, *args, **kargs): return ListItem(label, icon, end, callback, *args, **kargs).append_to(self) diff --git a/efl/elementary/photocam.pyx b/efl/elementary/photocam.pyx index 7da71c5..1c52ad8 100644 --- a/efl/elementary/photocam.pyx +++ b/efl/elementary/photocam.pyx @@ -126,7 +126,6 @@ cdef extern from "Elementary.h": Eina_Bool elm_photocam_gesture_enabled_get(Evas_Object *obj) from efl.evas cimport Image as evasImage -from scroller cimport * cimport enums @@ -381,27 +380,6 @@ cdef class Photocam(Object): def internal_image_get(self): return self.internal_image - property bounce: - """Photocam scrolling bouncing. - - :type: tuple of bools - - """ - def __set__(self, value): - h_bounce, v_bounce = value - elm_scroller_bounce_set(self.obj, h_bounce, v_bounce) - def __get__(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - - def bounce_set(self, h_bounce, v_bounce): - elm_scroller_bounce_set(self.obj, h_bounce, v_bounce) - def bounce_get(self): - cdef Eina_Bool h_bounce, v_bounce - elm_scroller_bounce_get(self.obj, &h_bounce, &v_bounce) - return (h_bounce, v_bounce) - property gesture_enabled: """Set the gesture state for photocam. diff --git a/efl/elementary/scroller.pxd b/efl/elementary/scroller.pxd index 4d6a8a9..a108bd0 100644 --- a/efl/elementary/scroller.pxd +++ b/efl/elementary/scroller.pxd @@ -1,47 +1,4 @@ -from efl.evas cimport Eina_Bool, Evas_Object, Evas_Coord, const_Evas_Object -from enums cimport Elm_Scroller_Policy, Elm_Scroller_Single_Direction, \ - Elm_Scroller_Movement_Block -from libc.string cimport const_char -from cpython cimport PyUnicode_AsUTF8String from object cimport Object -cdef extern from "Elementary.h": - Evas_Object *elm_scroller_add(Evas_Object *parent) - void elm_scroller_custom_widget_base_theme_set(Evas_Object *obj, const_char *widget, const_char *base) - void elm_scroller_content_min_limit(Evas_Object *obj, Eina_Bool w, Eina_Bool h) - void elm_scroller_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) - void elm_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v) - void elm_scroller_policy_get(Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v) - void elm_scroller_single_direction_set(Evas_Object *obj, Elm_Scroller_Single_Direction single_dir) - Elm_Scroller_Single_Direction elm_scroller_single_direction_get(const_Evas_Object *obj) - void elm_scroller_region_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) - void elm_scroller_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) - void elm_scroller_page_snap_set(Evas_Object *obj, Eina_Bool page_h_snap, Eina_Bool page_v_snap) - void elm_scroller_page_snap_get(const_Evas_Object *obj, Eina_Bool *page_h_snap, Eina_Bool *page_v_snap) - void elm_scroller_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce) - void elm_scroller_bounce_get(Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce) - void elm_scroller_page_relative_set(Evas_Object *obj, double h_pagerel, double v_pagerel) - void elm_scroller_page_relative_get(Evas_Object *obj, double *h_pagerel, double *v_pagerel) - void elm_scroller_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize) - void elm_scroller_page_size_get(const_Evas_Object *obj, Evas_Coord *h_pagesize, Evas_Coord *v_pagesize) - void elm_scroller_page_scroll_limit_set(const_Evas_Object *obj, Evas_Coord page_limit_h, Evas_Coord page_limit_v) - void elm_scroller_page_scroll_limit_get(const_Evas_Object *obj, Evas_Coord *page_limit_h, Evas_Coord *page_limit_v) - void elm_scroller_current_page_get(Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) - void elm_scroller_last_page_get(Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) - void elm_scroller_page_show(Evas_Object *obj, int h_pagenumber, int v_pagenumber) - void elm_scroller_page_bring_in(Evas_Object *obj, int h_pagenumber, int v_pagenumber) - void elm_scroller_region_bring_in(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) - void elm_scroller_propagate_events_set(Evas_Object *obj, Eina_Bool propagation) - Eina_Bool elm_scroller_propagate_events_get(Evas_Object *obj) - void elm_scroller_gravity_set(Evas_Object *obj, double x, double y) - void elm_scroller_gravity_get(Evas_Object *obj, double *x, double *y) - void elm_scroller_movement_block_set(Evas_Object *obj, Elm_Scroller_Movement_Block block) - Elm_Scroller_Movement_Block elm_scroller_movement_block_get(const_Evas_Object *obj) - -cdef class ScrollableInterface(Object): - cpdef single_direction_set(self, Elm_Scroller_Single_Direction single_dir) - cpdef single_direction_get(self) - cpdef page_size_set(self, h_pagesize, v_pagesize) - cpdef page_size_get(self) - cpdef page_scroll_limit_set(self, int page_limit_h, int page_limit_v) - cpdef page_scroll_limit_get(self) +cdef class Scrollable(Object): + pass diff --git a/efl/elementary/scroller.pyx b/efl/elementary/scroller.pyx index 218ef55..fc3d0e7 100644 --- a/efl/elementary/scroller.pyx +++ b/efl/elementary/scroller.pyx @@ -140,6 +140,45 @@ Type that blocks the scroll movement in one or more direction. """ +from efl.evas cimport Eina_Bool, Evas_Object, Evas_Coord, const_Evas_Object +from enums cimport Elm_Scroller_Policy, Elm_Scroller_Single_Direction, \ + Elm_Scroller_Movement_Block +from libc.string cimport const_char +from cpython cimport PyUnicode_AsUTF8String + +cdef extern from "Elementary.h": + Evas_Object *elm_scroller_add(Evas_Object *parent) + void elm_scroller_custom_widget_base_theme_set(Evas_Object *obj, const_char *widget, const_char *base) + void elm_scroller_content_min_limit(Evas_Object *obj, Eina_Bool w, Eina_Bool h) + void elm_scroller_region_show(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) + void elm_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v) + void elm_scroller_policy_get(Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v) + void elm_scroller_single_direction_set(Evas_Object *obj, Elm_Scroller_Single_Direction single_dir) + Elm_Scroller_Single_Direction elm_scroller_single_direction_get(const_Evas_Object *obj) + void elm_scroller_region_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) + void elm_scroller_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) + void elm_scroller_page_snap_set(Evas_Object *obj, Eina_Bool page_h_snap, Eina_Bool page_v_snap) + void elm_scroller_page_snap_get(const_Evas_Object *obj, Eina_Bool *page_h_snap, Eina_Bool *page_v_snap) + void elm_scroller_bounce_set(Evas_Object *obj, Eina_Bool h_bounce, Eina_Bool v_bounce) + void elm_scroller_bounce_get(Evas_Object *obj, Eina_Bool *h_bounce, Eina_Bool *v_bounce) + void elm_scroller_page_relative_set(Evas_Object *obj, double h_pagerel, double v_pagerel) + void elm_scroller_page_relative_get(Evas_Object *obj, double *h_pagerel, double *v_pagerel) + void elm_scroller_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize) + void elm_scroller_page_size_get(const_Evas_Object *obj, Evas_Coord *h_pagesize, Evas_Coord *v_pagesize) + void elm_scroller_page_scroll_limit_set(const_Evas_Object *obj, Evas_Coord page_limit_h, Evas_Coord page_limit_v) + void elm_scroller_page_scroll_limit_get(const_Evas_Object *obj, Evas_Coord *page_limit_h, Evas_Coord *page_limit_v) + void elm_scroller_current_page_get(Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) + void elm_scroller_last_page_get(Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) + void elm_scroller_page_show(Evas_Object *obj, int h_pagenumber, int v_pagenumber) + void elm_scroller_page_bring_in(Evas_Object *obj, int h_pagenumber, int v_pagenumber) + void elm_scroller_region_bring_in(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) + void elm_scroller_propagate_events_set(Evas_Object *obj, Eina_Bool propagation) + Eina_Bool elm_scroller_propagate_events_get(Evas_Object *obj) + void elm_scroller_gravity_set(Evas_Object *obj, double x, double y) + void elm_scroller_gravity_get(Evas_Object *obj, double *x, double *y) + void elm_scroller_movement_block_set(Evas_Object *obj, Elm_Scroller_Movement_Block block) + Elm_Scroller_Movement_Block elm_scroller_movement_block_get(const_Evas_Object *obj) + from efl.evas cimport Evas_Object, const_Evas_Object, \ Object as evasObject from efl.eo cimport object_from_instance, _object_mapping_register @@ -163,7 +202,7 @@ ELM_SCROLLER_MOVEMENT_NO_BLOCK = enums.ELM_SCROLLER_MOVEMENT_NO_BLOCK ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL = enums.ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL = enums.ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL -cdef class ScrollableInterface(Object): +cdef class Scrollable(Object): """ @@ -268,16 +307,16 @@ cdef class ScrollableInterface(Object): :since: 1.8 """ - def __set__(self, value): - self.single_direction_set(value) + def __set__(self, Elm_Scroller_Single_Direction single_dir): + elm_scroller_single_direction_set(self.obj, single_dir) def __get__(self): - return self.single_direction_get() + return elm_scroller_single_direction_get(self.obj) - cpdef single_direction_set(self, Elm_Scroller_Single_Direction single_dir): + def single_direction_set(self, Elm_Scroller_Single_Direction single_dir): elm_scroller_single_direction_set(self.obj, single_dir) - cpdef single_direction_get(self): + def single_direction_get(self): return elm_scroller_single_direction_get(self.obj) property region: @@ -428,15 +467,18 @@ cdef class ScrollableInterface(Object): """ def __set__(self, value): - self.page_size_set(*value) + h_pagesize, v_pagesize = value + elm_scroller_page_size_set(self.obj, h_pagesize, v_pagesize) def __get__(self): - return self.page_size_get() + cdef int h_pagesize, v_pagesize + elm_scroller_page_size_get(self.obj, &h_pagesize, &v_pagesize) + return (h_pagesize, v_pagesize) - cpdef page_size_set(self, h_pagesize, v_pagesize): + def page_size_set(self, h_pagesize, v_pagesize): elm_scroller_page_size_set(self.obj, h_pagesize, v_pagesize) - cpdef page_size_get(self): + def page_size_get(self): cdef int h_pagesize, v_pagesize elm_scroller_page_size_get(self.obj, &h_pagesize, &v_pagesize) return (h_pagesize, v_pagesize) @@ -452,15 +494,18 @@ cdef class ScrollableInterface(Object): """ def __set__(self, value): - self.page_scroll_limit_set(*value) + page_limit_h, page_limit_v = value + elm_scroller_page_scroll_limit_set(self.obj, page_limit_h, page_limit_v) def __get__(self): - return self.page_scroll_limit_get() + cdef int page_limit_h, page_limit_v + elm_scroller_page_scroll_limit_get(self.obj, &page_limit_h, &page_limit_v) + return (page_limit_h, page_limit_v) - cpdef page_scroll_limit_set(self, int page_limit_h, int page_limit_v): + def page_scroll_limit_set(self, int page_limit_h, int page_limit_v): elm_scroller_page_scroll_limit_set(self.obj, page_limit_h, page_limit_v) - cpdef page_scroll_limit_get(self): + def page_scroll_limit_get(self): cdef int page_limit_h, page_limit_v elm_scroller_page_scroll_limit_get(self.obj, &page_limit_h, &page_limit_v) return (page_limit_h, page_limit_v) @@ -845,7 +890,7 @@ cdef class ScrollerWidget(LayoutClass): def __init__(self, evasObject parent): self._set_obj(elm_scroller_add(parent.obj)) -class Scroller(ScrollableInterface, ScrollerWidget): +class Scroller(Scrollable, ScrollerWidget): """ diff --git a/examples/elementary/test_conform.py b/examples/elementary/test_conform.py index f7557ec..d41a719 100644 --- a/examples/elementary/test_conform.py +++ b/examples/elementary/test_conform.py @@ -8,9 +8,15 @@ from efl.elementary.naviframe import Naviframe from efl.elementary.frame import Frame from efl.elementary.label import Label from efl.elementary.list import List +from efl.elementary.scroller import Scrollable from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL +class ScrollableEntry(Scrollable, Entry): + def __init__(self, canvas, *args, **kwargs): + Entry.__init__(self, canvas) + self.scrollable = True + def conformant_clicked(obj, item=None): win = StandardWindow("conformant", "Conformant") win.autodel = True @@ -25,8 +31,7 @@ def conformant_clicked(obj, item=None): bx.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND bx.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.single_line = True en.bounce = True, False en.text = "This is the top entry here" @@ -42,8 +47,7 @@ def conformant_clicked(obj, item=None): bx.pack_end(btn) btn.show() - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.single_line = True en.bounce = True, False en.text = "This is the middle entry here" @@ -59,8 +63,7 @@ def conformant_clicked(obj, item=None): bx.pack_end(btn) btn.show() - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.bounce = False, True en.text = "This is a multi-line entry at the bottom<br/>" \ "This can contain more than 1 line of text and be " \ @@ -96,8 +99,7 @@ def conformant2_clicked(obj, item=None): win.resize_object_add(bx) bx.show() - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.single_line = True en.bounce = True, False en.text = "This is the top entry here" @@ -132,8 +134,7 @@ def conformant2_clicked(obj, item=None): bx.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND bx.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.bounce = False, True en.text = "This entry and button below get deleted." en.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND @@ -164,8 +165,7 @@ def conformant2_clicked(obj, item=None): bx.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND bx.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.bounce = False, True en.text = "This entry and button below get deleted." en.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND diff --git a/examples/elementary/test_entry.py b/examples/elementary/test_entry.py index e24da1f..d7f2b80 100644 --- a/examples/elementary/test_entry.py +++ b/examples/elementary/test_entry.py @@ -14,6 +14,12 @@ from efl.elementary.frame import Frame from efl.elementary.label import Label from efl.elementary.separator import Separator from efl.elementary.icon import Icon +from efl.elementary.scroller import Scrollable + +class ScrollableEntry(Scrollable, Entry): + def __init__(self, canvas, *args, **kwargs): + Entry.__init__(self, canvas) + self.scrollable = True from efl.evas import EVAS_HINT_EXPAND, EVAS_HINT_FILL @@ -165,8 +171,7 @@ def entry_scrolled_clicked(obj, item = None): bx.show() # disabled entry - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 en.size_hint_align = EVAS_HINT_FILL, 0.5 en.scrollbar_policy = ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF @@ -177,8 +182,7 @@ def entry_scrolled_clicked(obj, item = None): bx.pack_end(en) # password entry - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 en.size_hint_align = EVAS_HINT_FILL, 0.5 en.scrollbar_policy = ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF @@ -190,8 +194,7 @@ def entry_scrolled_clicked(obj, item = None): bx.pack_end(en) # multi-line disable entry - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND en.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL en.scrollbar_policy = ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON @@ -212,8 +215,7 @@ def entry_scrolled_clicked(obj, item = None): sp.show() # Single line selected entry - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 en.size_hint_align = EVAS_HINT_FILL, 0.5 en.text = "This is a single line" @@ -224,8 +226,7 @@ def entry_scrolled_clicked(obj, item = None): bx.pack_end(en) # Filter test - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 en.size_hint_align = EVAS_HINT_FILL, 0.5 en.text = "Filter test" @@ -237,8 +238,7 @@ def entry_scrolled_clicked(obj, item = None): en.markup_filter_append(my_filter, "test") # # Only digits entry - # en = Entry(win) - # en.scrollable = True + # en = ScrollableEntry(win) # en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 # en.size_hint_align = EVAS_HINT_FILL, 0.5 # en.text = "01234" @@ -252,8 +252,7 @@ def entry_scrolled_clicked(obj, item = None): # en.markup_filter_append(elm_entry_filter_accept_set, digits_filter_data) # # No digits entry - # en = Entry(win) - # en.scrollable = True + # en = ScrollableEntry(win) # en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 # en.size_hint_align = EVAS_HINT_FILL, 0.5 # en.text = "No numbers here" @@ -267,8 +266,7 @@ def entry_scrolled_clicked(obj, item = None): # en.markup_filter_append(elm_entry_filter_accept_set, digits_filter_data2) # # Size limited entry - # en = Entry(win) - # en.scrollable = True + # en = ScrollableEntry(win) # en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 # en.size_hint_align = EVAS_HINT_FILL, 0.5 # en.text = "Just 20 chars" @@ -282,8 +280,7 @@ def entry_scrolled_clicked(obj, item = None): # en.markup_filter_append(elm_entry_filter_limit_size, limit_filter_data) # # Byte size limited entry - # en = Entry(win) - # en.scrollable = True + # en = ScrollableEntry(win) # en.size_hint_weight = EVAS_HINT_EXPAND, 0.0 # en.size_hint_align = EVAS_HINT_FILL, 0.5 # en.text = "And now only 30 bytes" @@ -297,7 +294,7 @@ def entry_scrolled_clicked(obj, item = None): # en.markup_filter_append(elm_entry_filter_limit_size, limit_filter_data2) # Single line password entry - en_p = Entry(win) + en_p = ScrollableEntry(win) en_p.scrollable = True en_p.size_hint_weight = EVAS_HINT_EXPAND, 0.0 en_p.size_hint_align = EVAS_HINT_FILL, 0.5 @@ -309,8 +306,7 @@ def entry_scrolled_clicked(obj, item = None): bx.pack_end(en_p) # entry with icon/end widgets - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.scrollbar_policy = ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF en.single_line = True en.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND @@ -332,8 +328,7 @@ def entry_scrolled_clicked(obj, item = None): bx.pack_end(en) # markup entry - en = Entry(win) - en.scrollable = True + en = ScrollableEntry(win) en.size_hint_weight = EVAS_HINT_EXPAND, EVAS_HINT_EXPAND en.size_hint_align = EVAS_HINT_FILL, EVAS_HINT_FILL en.scrollbar_policy = ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON diff --git a/examples/elementary/test_gengrid.py b/examples/elementary/test_gengrid.py index eaa99ae..ac272f2 100644 --- a/examples/elementary/test_gengrid.py +++ b/examples/elementary/test_gengrid.py @@ -13,6 +13,11 @@ from efl.elementary.image import Image from efl.elementary.gengrid import Gengrid, GengridItemClass from efl.elementary.slider import Slider from efl.elementary.table import Table +from efl.elementary.scroller import Scrollable + +class ScrollableGengrid(Scrollable, Gengrid): + def __init__(self, canvas, *args, **kwargs): + Gengrid.__init__(self, canvas) images = ["panel_01.jpg", "plant_01.jpg", "rock_01.jpg", "rock_02.jpg", @@ -80,7 +85,7 @@ def gengrid_clicked(obj): content_get_func=gg_content_get, state_get_func=gg_state_get, del_func=gg_del) - gg = Gengrid(win) + gg = ScrollableGengrid(win) gg.size_hint_weight_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND) gg.size_hint_align_set(evas.EVAS_HINT_FILL, evas.EVAS_HINT_FILL) gg.horizontal_set(False) --