elm gengrid: Added page feature to gengrid. Patch by Benjamin Drucker
authorDaniel Juyung Seo <seojuyung2@gmail.com>
Thu, 15 Sep 2011 02:16:37 +0000 (02:16 +0000)
committerDaniel Juyung Seo <seojuyung2@gmail.com>
Thu, 15 Sep 2011 02:16:37 +0000 (02:16 +0000)
<benjamin.t.drucker@alum.mit.edu>. Thanks a lot!

On Wed, Aug 31, 2011 at 1:52 PM, Benjamin Drucker
<benjamin.t.drucker@alum.mit.edu> 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
<benjamin.t.drucker@alum.mit.edu> 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

src/examples/gengrid_example.c
src/lib/Elementary.h.in
src/lib/elm_gengrid.c
src/lib/els_scroller.c

index b3c145e..c68e5e5 100644 (file)
@@ -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";
index 0e0b722..49f7498 100644 (file)
@@ -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.
     *
index dc7ebb9..af75ee4 100644 (file)
@@ -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)
 {
index fc7feb8..ed21c8d 100644 (file)
@@ -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