From: Daniel Juyung Seo Date: Thu, 15 Sep 2011 02:16:37 +0000 (+0000) Subject: elm gengrid: Added page feature to gengrid. Patch by Benjamin Drucker X-Git-Tag: v1.0.0~2057 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=23b2dfe293ce2ce444520292fa165b05ba1964e6;p=platform%2Fupstream%2Felementary.git elm gengrid: Added page feature to gengrid. Patch by Benjamin Drucker . Thanks a lot! On Wed, Aug 31, 2011 at 1:52 PM, Benjamin Drucker wrote: > Earlier this month, there was a svn commit > (http://trac.enlightenment.org/e/changeset/62496) which added a few > page-related APIs to the elm scroller.  These should probably also be > added to gengrid, genlist and maybe even grid and list.  Right now, > though, I need them for gengrid.  So I propose this patch, based > entirely on the change that went in before.  I've built it and I'm > using these new gengrid APIs in my code now. On Fri, Sep 9, 2011 at 4:45 PM, Benjamin Drucker wrote: > Slowly but surely.... > > This version of the gengrid page APIs patch has the following changes: > 1. fixed spacing issues > 2. add const where needed > 3. submitted a gengrid longpressed change in a separate patch > > I really want to try to squeak this in the upcoming release if at all > possible. If I have an extra space in some file, I promise I'll not do > it again for the next patch! > > Thanks!! > Ben SVN revision: 63403 --- diff --git a/src/examples/gengrid_example.c b/src/examples/gengrid_example.c index b3c145e..c68e5e5 100644 --- a/src/examples/gengrid_example.c +++ b/src/examples/gengrid_example.c @@ -365,6 +365,18 @@ _grid_del(void *data, free(it); } +/* scrolling animation stopped callback */ +static void +_grid_scroll_stopped_cb(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + int h_pagenumber = 0, v_pagenumber = 0; + elm_gengrid_current_page_get(obj, &h_pagenumber, &v_pagenumber); + fprintf(stdout, "Grid current horiz page is %d, vert page is %d\n", + h_pagenumber, v_pagenumber); +} + /* items grid horizontal alignment change */ static void _h_align_change_cb(void *data, @@ -551,6 +563,7 @@ elm_main(int argc __UNUSED__, evas_object_show(hbx_3); elm_gengrid_align_get(grid, &h, &v); + evas_object_smart_callback_add(grid, "scroll,anim,stop", _grid_scroll_stopped_cb, NULL); sl = elm_slider_add(win); elm_object_text_set(sl, "Horiz. alignment"); @@ -588,6 +601,7 @@ elm_main(int argc __UNUSED__, elm_box_pack_end(hbx_3, sl); evas_object_show(sl); + _page_change_cb(grid, sl, NULL); evas_object_smart_callback_add(sl, "changed", _page_change_cb, grid); gic.item_style = "default"; diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index 0e0b722..49f7498 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -8414,6 +8414,88 @@ extern "C" { EAPI void elm_gengrid_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize) EINA_ARG_NONNULL(1); /** + * @brief Get gengrid current page number. + * + * @param obj The gengrid object + * @param h_pagenumber The horizontal page number + * @param v_pagenumber The vertical page number + * + * 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. + * + * @see elm_gengrid_last_page_get() + * @see elm_gengrid_page_show() + * @see elm_gengrid_page_brint_in() + */ + EAPI void elm_gengrid_current_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) EINA_ARG_NONNULL(1); + + /** + * @brief Get scroll last page number. + * + * @param obj The gengrid object + * @param h_pagenumber The horizoptal page number + * @param v_pagenumber The vertical page number + * + * The page number starts from 0. 0 is the first page. + * This returns the last page number among the pages. + * + * @see elm_gengrid_current_page_get() + * @see elm_gengrid_page_show() + * @see elm_gengrid_page_brint_in() + */ + EAPI void elm_gengrid_last_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) EINA_ARG_NONNULL(1); + + /** + * Show a specific virtual region within the gengrid content object by page number. + * + * @param obj The gengrid object + * @param h_pagenumber The horizoptal 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: + * + * @code + * sc = elm_gengrid_add(win); + * elm_gengrid_content_set(sc, content); + * elm_gengrid_page_relative_set(sc, 1, 0); + * elm_gengrid_current_page_get(sc, &h_page, &v_page); + * elm_gengrid_page_show(sc, h_page + 1, v_page); + * @endcode + * + * @see elm_gengrid_page_bring_in() + */ + EAPI void elm_gengrid_page_show(const Evas_Object *obj, int h_pagenumber, int v_pagenumber) EINA_ARG_NONNULL(1); + + /** + * Show a specific virtual region within the gengrid content object by page number. + * + * @param obj The gengrid object + * @param h_pagenumber The horizoptal 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: + * + * @code + * sc = elm_gengrid_add(win); + * elm_gengrid_content_set(sc, content); + * elm_gengrid_page_relative_set(sc, 1, 0); + * elm_gengrid_last_page_get(sc, &h_page, &v_page); + * elm_gengrid_page_bring_in(sc, h_page, v_page); + * @endcode + * + * @see elm_gengrid_page_show() + */ + EAPI void elm_gengrid_page_bring_in(const Evas_Object *obj, int h_pagenumber, int v_pagenumber) EINA_ARG_NONNULL(1); + + /** * Set for what direction a given gengrid widget will expand while * placing its items. * diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c index dc7ebb9..af75ee4 100644 --- a/src/lib/elm_gengrid.c +++ b/src/lib/elm_gengrid.c @@ -2750,6 +2750,46 @@ elm_gengrid_page_size_set(Evas_Object *obj, v_pagesize); } +EAPI void +elm_gengrid_current_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_current_page_get(wd->scr, h_pagenumber, v_pagenumber); +} + +EAPI void +elm_gengrid_last_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_last_page_get(wd->scr, h_pagenumber, v_pagenumber); +} + +EAPI void +elm_gengrid_page_show(const Evas_Object *obj, int h_pagenumber, int v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_page_show(wd->scr, h_pagenumber, v_pagenumber); +} + +EAPI void +elm_gengrid_page_bring_in(const Evas_Object *obj, int h_pagenumber, int v_pagenumber) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->scr) + elm_smart_scroller_page_bring_in(wd->scr, h_pagenumber, v_pagenumber); +} + EAPI Elm_Gengrid_Item * elm_gengrid_first_item_get(const Evas_Object *obj) { diff --git a/src/lib/els_scroller.c b/src/lib/els_scroller.c index fc7feb8..ed21c8d 100644 --- a/src/lib/els_scroller.c +++ b/src/lib/els_scroller.c @@ -1339,8 +1339,20 @@ elm_smart_scroller_current_page_get(Evas_Object *obj, int *pagenumber_h, int *pa API_ENTRY return; Evas_Coord x, y; elm_smart_scroller_child_pos_get(sd->smart_obj, &x, &y); - if (pagenumber_h) *pagenumber_h = (x + sd->pagesize_h - 1) / sd->pagesize_h; - if (pagenumber_v) *pagenumber_v = (y + sd->pagesize_v - 1) / sd->pagesize_v; + if (pagenumber_h) + { + if (sd->pagesize_h > 0) + *pagenumber_h = (x + sd->pagesize_h - 1) / sd->pagesize_h; + else + *pagenumber_h = 0; + } + if (pagenumber_v) + { + if (sd->pagesize_v > 0) + *pagenumber_v = (y + sd->pagesize_v - 1) / sd->pagesize_v; + else + *pagenumber_v = 0; + } } void