2012/5/8 Daniel Juyung Seo <seojuyu...@gmail.com>

> Oh my god. Sorry to say this too late but this is wrong :(
> +   item->is_group = !strcmp(item->gic->item_style, "group_index");
>
> Group has to be another type of item which introduces item type enum.
> Parsing item style name is not good. We can't have another group index
> style...
> We can't fix this now (after elm 1.0 release) because the right way is
> to fix gengrid item append/prepend apis like genlist.
> Or we need to add nasty api which breaks consistency.
>
> Daniel Juyung Seo (SeoZ)
>
>
> On Fri, Sep 9, 2011 at 9:43 PM, Enlightenment SVN
> <no-re...@enlightenment.org> wrote:
> > Log:
> > elementary: welcome to group in gengrid. Still need some work with
> reorder...
> >
> > Author:       yoz
> > Date:         2011-09-09 05:43:34 -0700 (Fri, 09 Sep 2011)
> > New Revision: 63306
> > Trac:         http://trac.enlightenment.org/e/changeset/63306
> >
> > Modified:
> >  trunk/elementary/data/themes/widgets/gengrid.edc
> trunk/elementary/src/bin/test_gengrid.c trunk/elementary/src/lib/
> Elementary.h.in trunk/elementary/src/lib/elm_gengrid.c
> >
> > Modified: trunk/elementary/data/themes/widgets/gengrid.edc
> > ===================================================================
> > --- trunk/elementary/data/themes/widgets/gengrid.edc    2011-09-09
> 02:56:03 UTC (rev 63305)
> > +++ trunk/elementary/data/themes/widgets/gengrid.edc    2011-09-09
> 12:43:34 UTC (rev 63306)
> > @@ -1199,5 +1199,276 @@
> >       }
> >    }
> >  }
> > -
> >
> -///////////////////////////////////////////////////////////////////////////////
> > +group { name: "elm/gengrid/item/group_index/default";
> > +   data.item: "selectraise" "on";
> > +   data.item: "labels" "elm.text";
> > +   data.item: "icons" "elm.swallow.icon elm.swallow.end";
> > +   //      data.item: "states" "";
> > +   images {
> > +      image: "bt_sm_base1.png" COMP;
> > +      image: "bt_sm_shine.png" COMP;
> > +      image: "bt_sm_hilight.png" COMP;
> > +      image: "ilist_item_shadow.png" COMP;
> > +      image: "group_index.png" COMP;
> > +   }
> > +   parts {
> > +      part {
> > +         name: "event";
> > +         type: RECT;
> > +         repeat_events: 0;
> > +         description {
> > +            state: "default" 0.0;
> > +            color: 0 0 0 0;
> > +         }
> > +      }
> > +      part {
> > +         name: "base_sh";
> > +         mouse_events: 0;
> > +         description {
> > +            state: "default" 0.0;
> > +            align: 0.0 0.0;
> > +            min: 0 10;
> > +            fixed: 1 1;
> > +            rel1 {
> > +               to: "base";
> > +               relative: 0.0 1.0;
> > +               offset: 0 0;
> > +            }
> > +            rel2 {
> > +               to: "base";
> > +               relative: 1.0 1.0;
> > +               offset: -1 0;
> > +            }
> > +            image {
> > +               normal: "ilist_item_shadow.png";
> > +            }
> > +            fill.smooth: 0;
> > +         }
> > +      }
> > +      part {
> > +         name: "base";
> > +         mouse_events: 0;
> > +         description {
> > +            state: "default" 0.0;
> > +            image {
> > +               normal: "group_index.png";
> > +               border: 2 2 2 2;
> > +            }
> > +            fill.smooth: 0;
> > +         }
> > +      }
> > +      part { name: "bg";
> > +         clip_to: "disclip";
> > +         mouse_events: 0;
> > +         description { state: "default" 0.0;
> > +            visible: 0;
> > +            color: 255 255 255 0;
> > +            rel1 {
> > +               relative: 0.0 0.0;
> > +               offset: -5 -5;
> > +            }
> > +            rel2 {
> > +               relative: 1.0 1.0;
> > +               offset: 4 4;
> > +            }
> > +            image {
> > +               normal: "bt_sm_base1.png";
> > +               border: 6 6 6 6;
> > +            }
> > +            image.middle: SOLID;
> > +         }
> > +         description { state: "selected" 0.0;
> > +            inherit: "default" 0.0;
> > +            visible: 1;
> > +            color: 255 255 255 255;
> > +            rel1 {
> > +               relative: 0.0 0.0;
> > +               offset: -2 -2;
> > +            }
> > +            rel2 {
> > +               relative: 1.0 1.0;
> > +               offset: 1 1;
> > +            }
> > +         }
> > +      }
> > +      part { name: "elm.swallow.pad";
> > +         type: SWALLOW;
> > +         description { state: "default" 0.0;
> > +            fixed: 1 0;
> > +            align: 0.0 0.5;
> > +            rel1 {
> > +               relative: 0.0  0.0;
> > +               offset: 4 4;
> > +            }
> > +            rel2 {
> > +               relative: 0.0  1.0;
> > +               offset: 4 -5;
> > +            }
> > +         }
> > +      }
> > +      part { name: "elm.swallow.icon";
> > +         clip_to: "disclip";
> > +         type: SWALLOW;
> > +         description { state: "default" 0.0;
> > +            fixed: 1 0;
> > +            align: 0.0 0.5;
> > +            rel1 {
> > +               to_x: "elm.swallow.pad";
> > +               relative: 1.0 0.0;
> > +               offset: -1 4;
> > +            }
> > +            rel2 {
> > +               to_x: "elm.swallow.pad";
> > +               relative: 1.0 1.0;
> > +               offset: -1 -5;
> > +            }
> > +         }
> > +      }
> > +      part { name: "elm.swallow.end";
> > +         clip_to: "disclip";
> > +         type: SWALLOW;
> > +         description { state: "default" 0.0;
> > +            fixed: 1 0;
> > +            align: 1.0 0.5;
> > +            aspect: 1.0 1.0;
> > +            aspect_preference: VERTICAL;
> > +            rel1 {
> > +               relative: 1.0 0.0;
> > +               offset: -5 4;
> > +            }
> > +            rel2 {
> > +               relative: 1.0 1.0;
> > +               offset: -5 -5;
> > +            }
> > +         }
> > +      }
> > +      part { name: "elm.text";
> > +         clip_to: "disclip";
> > +         type: TEXT;
> > +         effect: SOFT_SHADOW;
> > +         mouse_events: 0;
> > +         scale: 1;
> > +         description {
> > +            state: "default" 0.0;
> > +                   //               min: 16 16;
> > +            rel1 {
> > +               to_x: "elm.swallow.icon";
> > +               relative: 1.0  0.0;
> > +               offset: 0 4;
> > +            }
> > +            rel2 {
> > +               to_x: "elm.swallow.end";
> > +               relative: 0.0  1.0;
> > +               offset: -1 -5;
> > +            }
> > +            color: 0 0 0 255;
> > +            color3: 0 0 0 0;
> > +            text {
> > +               font: "Sans";
> > +               size: 10;
> > +               min: 1 1;
> > +                    //                  min: 0 1;
> > +               align: -1.0 0.5;
> > +               text_class: "list_item";
> > +            }
> > +         }
> > +         description { state: "selected" 0.0;
> > +            inherit: "default" 0.0;
> > +            color: 224 224 224 255;
> > +            color3: 0 0 0 64;
> > +         }
> > +      }
> > +      part { name: "fg1";
> > +         clip_to: "disclip";
> > +         mouse_events: 0;
> > +         description { state: "default" 0.0;
> > +            visible: 0;
> > +            color: 255 255 255 0;
> > +            rel1.to: "bg";
> > +            rel2.relative: 1.0 0.5;
> > +            rel2.to: "bg";
> > +            image {
> > +               normal: "bt_sm_hilight.png";
> > +               border: 6 6 6 0;
> > +            }
> > +         }
> > +         description { state: "selected" 0.0;
> > +            inherit: "default" 0.0;
> > +            visible: 1;
> > +            color: 255 255 255 255;
> > +         }
> > +      }
> > +      part { name: "fg2";
> > +         clip_to: "disclip";
> > +         mouse_events: 0;
> > +         description { state: "default" 0.0;
> > +            visible: 0;
> > +            color: 255 255 255 0;
> > +            rel1.to: "bg";
> > +            rel2.to: "bg";
> > +            image {
> > +               normal: "bt_sm_shine.png";
> > +               border: 6 6 6 0;
> > +            }
> > +         }
> > +         description { state: "selected" 0.0;
> > +            inherit: "default" 0.0;
> > +            visible: 1;
> > +            color: 255 255 255 255;
> > +         }
> > +      }
> > +      part { name: "disclip";
> > +         type: RECT;
> > +         description { state: "default" 0.0;
> > +            rel1.to: "bg";
> > +            rel2.to: "bg";
> > +         }
> > +         description { state: "disabled" 0.0;
> > +            inherit: "default" 0.0;
> > +            color: 255 255 255 64;
> > +         }
> > +      }
> > +   }
> > +   programs {
> > +        // signal: elm,state,%s,active
> > +        //   a "check" item named %s went active
> > +        // signal: elm,state,%s,passive
> > +        //   a "check" item named %s went passive
> > +        // default is passive
> > +      program {
> > +         name:    "go_active";
> > +         signal:  "elm,state,selected";
> > +         source:  "elm";
> > +         action:  STATE_SET "selected" 0.0;
> > +         target:  "bg";
> > +         target:  "fg1";
> > +         target:  "fg2";
> > +         target:  "elm.text";
> > +      }
> > +      program {
> > +         name:    "go_passive";
> > +         signal:  "elm,state,unselected";
> > +         source:  "elm";
> > +         action:  STATE_SET "default" 0.0;
> > +         target:  "bg";
> > +         target:  "fg1";
> > +         target:  "fg2";
> > +         target:  "elm.text";
> > +         transition: LINEAR 0.1;
> > +      }
> > +      program {
> > +         name:    "go_disabled";
> > +         signal:  "elm,state,disabled";
> > +         source:  "elm";
> > +         action:  STATE_SET "disabled" 0.0;
> > +         target:  "disclip";
> > +      }
> > +      program {
> > +         name:    "go_enabled";
> > +         signal:  "elm,state,enabled";
> > +         source:  "elm";
> > +         action:  STATE_SET "default" 0.0;
> > +         target:  "disclip";
> > +      }
> > +   }
> > +}
> >
> > Modified: trunk/elementary/src/bin/test_gengrid.c
> > ===================================================================
> > --- trunk/elementary/src/bin/test_gengrid.c     2011-09-09 02:56:03 UTC
> (rev 63305)
> > +++ trunk/elementary/src/bin/test_gengrid.c     2011-09-09 12:43:34 UTC
> (rev 63306)
> > @@ -24,7 +24,7 @@
> >    "wood_01.jpg",
> >  };
> >
> > -static Elm_Gengrid_Item_Class gic;
> > +static Elm_Gengrid_Item_Class gic, ggic;
> >
> >  static void
> >  _horizontal_grid(void *data, Evas_Object *obj, void *event_info
> __UNUSED__)
> > @@ -362,4 +362,76 @@
> >    evas_object_resize(win, 600, 600);
> >    evas_object_show(win);
> >  }
> > +
> > +void
> > +test_gengrid3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void
> *event_info __UNUSED__)
> > +{
> > +   Evas_Object *win, *bg, *grid;
> > +   static Testitem ti[144];
> > +   int i, n;
> > +   char buf[PATH_MAX];
> > +
> > +   win = elm_win_add(NULL, "gengrid_group", ELM_WIN_BASIC);
> > +   elm_win_title_set(win, "GenGrid Group");
> > +   elm_win_autodel_set(win, EINA_TRUE);
> > +
> > +   bg = elm_bg_add(win);
> > +   evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
> EVAS_HINT_EXPAND);
> > +   elm_win_resize_object_add(win, bg);
> > +   evas_object_show(bg);
> > +
> > +   grid = elm_gengrid_add(win);
> > +   elm_gengrid_item_size_set(grid, 150, 150);
> > +   elm_gengrid_group_item_size_set(grid, 31, 31);
> > +   //elm_gengrid_horizontal_set(grid, EINA_TRUE);
> > +   elm_gengrid_horizontal_set(grid, EINA_FALSE);
> > +   elm_gengrid_multi_select_set(grid, EINA_TRUE);
> > +   elm_gengrid_reorder_mode_set(grid, EINA_TRUE);
> > +   evas_object_smart_callback_add(grid, "selected", grid_selected,
> NULL);
> > +   evas_object_smart_callback_add(grid, "clicked,double",
> grid_double_clicked, NULL);
> > +   evas_object_smart_callback_add(grid, "longpressed", grid_longpress,
> NULL);
> > +   evas_object_smart_callback_add(grid, "moved", grid_moved, NULL);
> > +   evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up,
> NULL);
> > +   evas_object_smart_callback_add(grid, "drag,start,right",
> grid_drag_right, NULL);
> > +   evas_object_smart_callback_add(grid, "drag,start,down",
> grid_drag_down, NULL);
> > +   evas_object_smart_callback_add(grid, "drag,start,left",
> grid_drag_left, NULL);
> > +   evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop,
> NULL);
> > +   evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
> EVAS_HINT_EXPAND);
> > +
> > +   gic.item_style = "default";
> > +   gic.func.label_get = grid_label_get;
> > +   gic.func.icon_get = grid_icon_get;
> > +   gic.func.state_get = grid_state_get;
> > +   gic.func.del = grid_del;
> > +
> > +   ggic.item_style = "group_index";
> > +   ggic.func.label_get = grid_label_get;
> > +   ggic.func.icon_get = NULL;
> > +   ggic.func.state_get = NULL;
> > +   ggic.func.del = NULL;
> > +
> > +
> > +   n = 0;
> > +   for (i = 0; i < 12 * 12; i++)
> > +     {
> > +       snprintf(buf, sizeof(buf), "%s/images/%s",
> elm_app_data_dir_get(), img[n]);
> > +       n = (n + 1) % 9;
> > +       ti[i].mode = i;
> > +       ti[i].path = eina_stringshare_add(buf);
> > +        if (i == 0 || i == 18 || i == 53 || i == 100)
> > +        //if (i == 0 || i == 18)
> > +          ti[i].item = elm_gengrid_item_append(grid, &ggic, &(ti[i]),
> grid_sel, NULL);
> > +        else
> > +          ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]),
> grid_sel, NULL);
> > +       if (!(i % 5))
> > +         elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE);
> > +     }
> > +
> > +   evas_object_show(grid);
> > +   elm_win_resize_object_add(win, grid);
> > +
> > +   evas_object_resize(win, 600, 600);
> > +   evas_object_show(win);
> > +}
> > +
> >  #endif
> >
> > Modified: trunk/elementary/src/lib/Elementary.h.in
> > ===================================================================
> > --- trunk/elementary/src/lib/Elementary.h.in    2011-09-09 02:56:03 UTC
> (rev 63305)
> > +++ trunk/elementary/src/lib/Elementary.h.in    2011-09-09 12:43:34 UTC
> (rev 63306)
> > @@ -7907,6 +7907,7 @@
> >     * This function inserts a new gengrid widget on the canvas.
> >     *
> >     * @see elm_gengrid_item_size_set()
> > +    * @see elm_gengrid_group_item_size_set()
> >     * @see elm_gengrid_horizontal_set()
> >     * @see elm_gengrid_item_append()
> >     * @see elm_gengrid_item_del()
> > @@ -7952,6 +7953,41 @@
> >    EAPI void               elm_gengrid_item_size_get(const Evas_Object
> *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
> >
> >    /**
> > +    * Set the size for the group items of a given gengrid widget
> > +    *
> > +    * @param obj The gengrid object.
> > +    * @param w The group items' width.
> > +    * @param h The group items' height;
> > +    *
> > +    * A gengrid, after creation, has still no information on the size
> > +    * to give to each of its cells. So, you most probably will end up
> > +    * with squares one @ref Fingers "finger" wide, the default
> > +    * size. Use this function to force a custom size for you group
> items,
> > +    * making them as big as you wish.
> > +    *
> > +    * @see elm_gengrid_group_item_size_get()
> > +    *
> > +    * @ingroup Gengrid
> > +    */
> > +   EAPI void               elm_gengrid_group_item_size_set(Evas_Object
> *obj, Evas_Coord w, Evas_Coord h) EINA_ARG_NONNULL(1);
> > +
> > +   /**
> > +    * Get the size set for the group items of a given gengrid widget
> > +    *
> > +    * @param obj The gengrid object.
> > +    * @param w Pointer to a variable where to store the group items'
> width.
> > +    * @param h Pointer to a variable where to store the group items'
> height.
> > +    *
> > +    * @note Use @c NULL pointers on the size values you're not
> > +    * interested in: they'll be ignored by the function.
> > +    *
> > +    * @see elm_gengrid_group_item_size_get() for more details
> > +    *
> > +    * @ingroup Gengrid
> > +    */
> > +   EAPI void               elm_gengrid_group_item_size_get(const
> Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
> > +
> > +   /**
> >     * Set the items grid's alignment within a given gengrid widget
> >     *
> >     * @param obj The gengrid object.
> >
> > Modified: trunk/elementary/src/lib/elm_gengrid.c
> > ===================================================================
> > --- trunk/elementary/src/lib/elm_gengrid.c      2011-09-09 02:56:03 UTC
> (rev 63305)
> > +++ trunk/elementary/src/lib/elm_gengrid.c      2011-09-09 12:43:34 UTC
> (rev 63306)
> > @@ -19,6 +19,7 @@
> >    EINA_INLIST;
> >    Evas_Object                  *spacer;
> >    const Elm_Gengrid_Item_Class *gic;
> > +   Elm_Gengrid_Item             *parent_group_item;
> >    Ecore_Timer                  *long_timer;
> >    Ecore_Animator               *item_moving_effect_timer;
> >    Widget_Data                  *wd;
> > @@ -29,10 +30,11 @@
> >         const void   *data;
> >      } func;
> >
> > -   Evas_Coord   x, y, dx, dy, ox, oy, tx, ty, rx, ry;
> > +   Evas_Coord   x, y, gx, gy, dx, dy, ox, oy, tx, ty, rx, ry;
> >    unsigned int moving_effect_start_time;
> >    int          relcount;
> >    int          walking;
> > +   int          prev_group;
> >
> >    struct
> >      {
> > @@ -45,7 +47,9 @@
> >
> >    const char *mouse_cursor;
> >
> > +   Eina_Bool   is_group : 1;
> >    Eina_Bool   want_unrealize : 1;
> > +   Eina_Bool   group_realized : 1;
> >    Eina_Bool   realized : 1;
> >    Eina_Bool   dragging : 1;
> >    Eina_Bool   down : 1;
> > @@ -64,6 +68,7 @@
> >    Evas_Object      *pan_smart;
> >    Pan              *pan;
> >    Eina_Inlist      *items;
> > +   Eina_List        *group_items;
> >    Ecore_Job        *calc_job;
> >    Eina_List        *selected;
> >    Elm_Gengrid_Item *last_selected_item, *reorder_item;
> > @@ -71,10 +76,12 @@
> >
> >    Evas_Coord        pan_x, pan_y, old_pan_x, old_pan_y;
> >    Evas_Coord        item_width, item_height; /* Each item size */
> > +   Evas_Coord        group_item_width, group_item_height; /* Each group
> item size */
> >    Evas_Coord        minw, minh; /* Total obj size */
> >    Evas_Coord        reorder_item_x, reorder_item_y;
> >    unsigned int      nmax;
> >    long              count;
> > +   long              items_lost;
> >    int               walking;
> >
> >    Eina_Bool         horizontal : 1;
> > @@ -978,29 +985,42 @@
> >           }
> >      }
> >
> > -   if ((!item->wd->item_width) && (!item->wd->item_height))
> > +   if (item->is_group)
> >      {
> > -        edje_object_size_min_restricted_calc(item->base.view,
> > -                                             &item->wd->item_width,
> > -                                             &item->wd->item_height,
> > -                                             item->wd->item_width,
> > -                                             item->wd->item_height);
> > -        elm_coords_finger_size_adjust(1, &item->wd->item_width,
> > -                                      1, &item->wd->item_height);
> > +        if ((!item->wd->group_item_width) &&
> (!item->wd->group_item_height))
> > +          {
> > +             edje_object_size_min_restricted_calc(item->base.view,
> > +
>  &item->wd->group_item_width,
> > +
>  &item->wd->group_item_height,
> > +
>  item->wd->group_item_width,
> > +
>  item->wd->group_item_height);
> > +          }
> >      }
> > +   else
> > +     {
> > +        if ((!item->wd->item_width) && (!item->wd->item_height))
> > +          {
> > +             edje_object_size_min_restricted_calc(item->base.view,
> > +                                                  &item->wd->item_width,
> > +
>  &item->wd->item_height,
> > +                                                  item->wd->item_width,
> > +
>  item->wd->item_height);
> > +             elm_coords_finger_size_adjust(1, &item->wd->item_width,
> > +                                           1, &item->wd->item_height);
> > +          }
> >
> > -   evas_object_event_callback_add(item->base.view,
> EVAS_CALLBACK_MOUSE_DOWN,
> > -                                  _mouse_down, item);
> > -   evas_object_event_callback_add(item->base.view,
> EVAS_CALLBACK_MOUSE_UP,
> > -                                  _mouse_up, item);
> > -   evas_object_event_callback_add(item->base.view,
> EVAS_CALLBACK_MOUSE_MOVE,
> > -                                  _mouse_move, item);
> > +        evas_object_event_callback_add(item->base.view,
> EVAS_CALLBACK_MOUSE_DOWN,
> > +                                       _mouse_down, item);
> > +        evas_object_event_callback_add(item->base.view,
> EVAS_CALLBACK_MOUSE_UP,
> > +                                       _mouse_up, item);
> > +        evas_object_event_callback_add(item->base.view,
> EVAS_CALLBACK_MOUSE_MOVE,
> > +                                       _mouse_move, item);
> >
> > -   if (item->selected)
> > -     edje_object_signal_emit(item->base.view, "elm,state,selected",
> "elm");
> > -   if (item->disabled)
> > -     edje_object_signal_emit(item->base.view, "elm,state,disabled",
> "elm");
> > -
> > +        if (item->selected)
> > +          edje_object_signal_emit(item->base.view,
> "elm,state,selected", "elm");
> > +        if (item->disabled)
> > +          edje_object_signal_emit(item->base.view,
> "elm,state,disabled", "elm");
> > +     }
> >    evas_object_show(item->base.view);
> >
> >    if (item->tooltip.content_cb)
> > @@ -1075,26 +1095,87 @@
> >        (((dy > 0) && (item->ry >= item->ty)) || ((dy <= 0) && (item->ry
> <= item->ty))))
> >      {
> >         evas_object_move(item->base.view, item->tx, item->ty);
> > -        evas_object_resize(item->base.view, item->wd->item_width,
> item->wd->item_height);
> > +        if (item->is_group)
> > +          {
> > +             Evas_Coord vw, vh;
> > +             evas_object_geometry_get(item->wd->pan_smart, NULL, NULL,
> &vw, &vh);
> > +             if (item->wd->horizontal)
> > +               evas_object_resize(item->base.view,
> item->wd->group_item_width, vh);
> > +             else
> > +               evas_object_resize(item->base.view, vw,
> item->wd->group_item_height);
> > +          }
> > +        else
> > +          evas_object_resize(item->base.view, item->wd->item_width,
> item->wd->item_height);
> >         item->moving = EINA_FALSE;
> >         item->item_moving_effect_timer = NULL;
> >         return ECORE_CALLBACK_CANCEL;
> >      }
> >
> >    evas_object_move(item->base.view, item->rx, item->ry);
> > -   evas_object_resize(item->base.view, item->wd->item_width,
> item->wd->item_height);
> > +   if (item->is_group)
> > +     {
> > +        Evas_Coord vw, vh;
> > +        evas_object_geometry_get(item->wd->pan_smart, NULL, NULL, &vw,
> &vh);
> > +        if (item->wd->horizontal)
> > +          evas_object_resize(item->base.view,
> item->wd->group_item_width, vh);
> > +        else
> > +          evas_object_resize(item->base.view, vw,
> item->wd->group_item_height);
> > +     }
> > +   else
> > +     evas_object_resize(item->base.view, item->wd->item_width,
> item->wd->item_height);
> >
> >    return ECORE_CALLBACK_RENEW;
> >  }
> >
> >  static void
> > +_group_item_place(Pan *sd)
> > +{
> > +   Evas_Coord iw, ih, vw, vh;
> > +   Eina_List *l;
> > +   Eina_Bool was_realized;
> > +   Elm_Gengrid_Item *it;
> > +   evas_object_geometry_get(sd->wd->pan_smart, NULL, NULL, &vw, &vh);
> > +   if (sd->wd->horizontal)
> > +     {
> > +        iw = sd->wd->group_item_width;
> > +        ih = vh;
> > +     }
> > +   else
> > +     {
> > +        iw = vw;
> > +        ih = sd->wd->group_item_height;
> > +     }
> > +   EINA_LIST_FOREACH(sd->wd->group_items, l, it)
> > +     {
> > +        was_realized = it->realized;
> > +        if (it->group_realized)
> > +          {
> > +             _item_realize(it);
> > +             if (!was_realized)
> > +               evas_object_smart_callback_call(it->wd->self,
> SIG_REALIZED, it);
> > +             evas_object_move(it->base.view, it->gx, it->gy);
> > +             evas_object_resize(it->base.view, iw, ih);
> > +             evas_object_raise(it->base.view);
> > +          }
> > +        else
> > +          {
> > +             _item_unrealize(it);
> > +             if (was_realized)
> > +               evas_object_smart_callback_call(it->wd->self,
> SIG_UNREALIZED, it);
> > +          }
> > +     }
> > +}
> > +
> > +
> > +static void
> >  _item_place(Elm_Gengrid_Item *item,
> >             Evas_Coord        cx,
> >             Evas_Coord        cy)
> >  {
> > -   Evas_Coord x, y, ox, oy, cvx, cvy, cvw, cvh;
> > +   Evas_Coord x, y, ox, oy, cvx, cvy, cvw, cvh, iw, ih, ww;
> >    Evas_Coord tch, tcw, alignw = 0, alignh = 0, vw, vh;
> >    Eina_Bool reorder_item_move_forward = EINA_FALSE;
> > +   long items_count;
> >    item->x = cx;
> >    item->y = cy;
> >    evas_object_geometry_get(item->wd->pan_smart, &ox, &oy, &vw, &vh);
> > @@ -1108,6 +1189,7 @@
> >    alignh = 0;
> >    alignw = 0;
> >
> > +   items_count = item->wd->count -
> eina_list_count(item->wd->group_items) + item->wd->items_lost;
> >    if (item->wd->horizontal)
> >      {
> >         int columns, items_visible = 0, items_row;
> > @@ -1117,11 +1199,11 @@
> >         if (items_visible < 1)
> >           items_visible = 1;
> >
> > -        columns = item->wd->count / items_visible;
> > -        if (item->wd->count % items_visible)
> > +        columns = items_count / items_visible;
> > +        if (items_count % items_visible)
> >           columns++;
> >
> > -        tcw = item->wd->item_width * columns;
> > +        tcw = (item->wd->item_width * columns) +
> (item->wd->group_item_width * eina_list_count(item->wd->group_items));
> >         alignw = (vw - tcw) * item->wd->align_x;
> >
> >         items_row = items_visible;
> > @@ -1139,11 +1221,11 @@
> >         if (items_visible < 1)
> >           items_visible = 1;
> >
> > -        rows = item->wd->count / items_visible;
> > -        if (item->wd->count % items_visible)
> > +        rows = items_count / items_visible;
> > +        if (items_count % items_visible)
> >           rows++;
> >
> > -        tch = item->wd->item_height * rows;
> > +        tch = (item->wd->item_height * rows) +
> (item->wd->group_item_height * eina_list_count(item->wd->group_items));
> >         alignh = (vh - tch) * item->wd->align_y;
> >
> >         items_col = items_visible;
> > @@ -1153,23 +1235,74 @@
> >         alignw = (vw - tcw) * item->wd->align_x;
> >      }
> >
> > -   x = cx * item->wd->item_width - item->wd->pan_x + ox + alignw;
> > -   if (elm_widget_mirrored_get(item->wd->self))
> > -     {  /* Switch items side and componsate for pan_x when in RTL mode
> */
> > -        Evas_Coord ww;
> > -        evas_object_geometry_get(item->wd->self, NULL, NULL, &ww, NULL);
> > -        x = ww - x - item->wd->item_width - item->wd->pan_x -
> item->wd->pan_x;
> > +   if (item->is_group)
> > +     {
> > +        if (item->wd->horizontal)
> > +          {
> > +             x = (((cx - item->prev_group) * item->wd->item_width) +
> (item->prev_group * item->wd->group_item_width)) - item->wd->pan_x + ox +
> alignw;
> > +             y = 0;
> > +             iw = item->wd->group_item_width;
> > +             ih = vh;
> > +          }
> > +        else
> > +          {
> > +             x = 0;
> > +             y = (((cy - item->prev_group) * item->wd->item_height) +
> (item->prev_group * item->wd->group_item_height)) - item->wd->pan_y + oy +
> alignh;
> > +             iw = vw;
> > +             ih = item->wd->group_item_height;
> > +          }
> > +        item->gx = x;
> > +        item->gy = y;
> >      }
> > +   else
> > +     {
> > +        if (item->wd->horizontal)
> > +          {
> > +             x = (((cx - item->prev_group) * item->wd->item_width) +
> (item->prev_group * item->wd->group_item_width)) - item->wd->pan_x + ox +
> alignw;
> > +             y = (cy * item->wd->item_height) - item->wd->pan_y + oy +
> alignh;
> > +          }
> > +        else
> > +          {
> > +             x = (cx * item->wd->item_height) - item->wd->pan_x + ox +
> alignw;
> > +             y = (((cy - item->prev_group) * item->wd->item_height) +
> (item->prev_group * item->wd->group_item_height)) - item->wd->pan_y + oy +
> alignh;
> > +          }
> > +        if (elm_widget_mirrored_get(item->wd->self))
> > +          {  /* Switch items side and componsate for pan_x when in RTL
> mode */
> > +             evas_object_geometry_get(item->wd->self, NULL, NULL, &ww,
> NULL);
> > +             x = ww - x - item->wd->item_width - item->wd->pan_x -
> item->wd->pan_x;
> > +          }
> > +        iw = item->wd->item_width;
> > +        ih = item->wd->item_height;
> > +     }
> >
> > -   y = cy * item->wd->item_height - item->wd->pan_y + oy + alignh;
> > -
> >    Eina_Bool was_realized = item->realized;
> > -   if (ELM_RECTS_INTERSECT(x, y, item->wd->item_width,
> item->wd->item_height,
> > -                           cvx, cvy, cvw, cvh))
> > +   if (ELM_RECTS_INTERSECT(x, y, iw, ih, cvx, cvy, cvw, cvh))
> >      {
> >         _item_realize(item);
> >         if (!was_realized)
> >           evas_object_smart_callback_call(item->wd->self, SIG_REALIZED,
> item);
> > +        if (item->parent_group_item)
> > +          {
> > +             if (item->wd->horizontal)
> > +               {
> > +                  if (item->parent_group_item->gx < 0)
> > +                    {
> > +                       item->parent_group_item->gx = x +
> item->wd->item_width - item->wd->group_item_width;
> > +                       if (item->parent_group_item->gx > 0)
> > +                         item->parent_group_item->gx = 0;
> > +                    }
> > +               }
> > +             else
> > +               {
> > +                  if (item->parent_group_item->gy < 0)
> > +                    {
> > +                       item->parent_group_item->gy = y +
> item->wd->item_height - item->wd->group_item_height;
> > +                       if (item->parent_group_item->gy > 0)
> > +                         item->parent_group_item->gy = 0;
> > +                    }
> > +                  item->parent_group_item->group_realized = EINA_TRUE;
> > +               }
> > +          }
> >         if ((item->wd->reorder_mode) && (item->wd->reorder_item))
> >           {
> >              if (item->moving) return;
> > @@ -1183,8 +1316,7 @@
> >                {
> >                   evas_object_move(item->base.view,
> >                                    item->wd->reorder_item_x,
> item->wd->reorder_item_y);
> > -                  evas_object_resize(item->base.view,
> > -                                     item->wd->item_width,
> item->wd->item_height);
> > +                  evas_object_resize(item->base.view, iw, ih);
> >                   return;
> >                }
> >              else
> > @@ -1209,13 +1341,39 @@
> >                          }
> >                     }
> >
> > -                  if (ELM_RECTS_INTERSECT(item->wd->reorder_item_x,
> item->wd->reorder_item_y,
> > -                                          item->wd->item_width,
> item->wd->item_height,
> > -                                          x+(item->wd->item_width/2),
> y+(item->wd->item_height/2),
> > -                                          1, 1))
> > +                  /* need fix here */
> > +                  Evas_Coord nx, ny, nw, nh;
> > +                  if (item->is_group)
> >                     {
> >                        if (item->wd->horizontal)
> >                          {
> > +                            nx = x + (item->wd->group_item_width / 2);
> > +                            ny = y;
> > +                            nw = 1;
> > +                            nh = vh;
> > +                         }
> > +                       else
> > +                         {
> > +                            nx = x;
> > +                            ny = y + (item->wd->group_item_height / 2);
> > +                            nw = vw;
> > +                            nh = 1;
> > +                         }
> > +                    }
> > +                  else
> > +                    {
> > +                       nx = x + (item->wd->item_width / 2);
> > +                       ny = y + (item->wd->item_height / 2);
> > +                       nw = 1;
> > +                       nh = 1;
> > +                    }
> > +
> > +                  if ( ELM_RECTS_INTERSECT(item->wd->reorder_item_x,
> item->wd->reorder_item_y,
> > +                                           item->wd->item_width,
> item->wd->item_height,
> > +                                           nx, ny, nw, nh))
> > +                    {
> > +                       if (item->wd->horizontal)
> > +                         {
> >                             if ((item->wd->nmax *
> item->wd->reorder_item->x + item->wd->reorder_item->y) >
> >                                 (item->wd->nmax * item->x + item->y))
> >                               reorder_item_move_forward = EINA_TRUE;
> > @@ -1243,19 +1401,28 @@
> >                        if (item->wd->calc_job)
> ecore_job_del(item->wd->calc_job);
> >                          item->wd->calc_job = ecore_job_add(_calc_job,
> item->wd);
> >
> > -                       return;
> > +                         return;
> >                     }
> >                }
> >           }
> > -        evas_object_move(item->base.view, x, y);
> > -        evas_object_resize(item->base.view, item->wd->item_width,
> > -                           item->wd->item_height);
> > +        if (!item->is_group)
> > +          {
> > +             evas_object_move(item->base.view, x, y);
> > +             evas_object_resize(item->base.view, iw, ih);
> > +          }
> > +        else
> > +          item->group_realized = EINA_TRUE;
> >      }
> >    else
> >      {
> > -        _item_unrealize(item);
> > -        if (was_realized)
> > -          evas_object_smart_callback_call(item->wd->self,
> SIG_UNREALIZED, item);
> > +        if (!item->is_group)
> > +          {
> > +             _item_unrealize(item);
> > +             if (was_realized)
> > +               evas_object_smart_callback_call(item->wd->self,
> SIG_UNREALIZED, item);
> > +          }
> > +        else
> > +          item->group_realized = EINA_FALSE;
> >      }
> >  }
> >
> > @@ -1284,7 +1451,9 @@
> >    item->func.func = func;
> >    item->func.data = func_data;
> >    item->mouse_cursor = NULL;
> > +   item->is_group = !strcmp(item->gic->item_style, "group_index");
> >    elm_widget_item_text_get_hook_set(item, _item_label_hook);
> > +
> >    return item;
> >  }
> >
> > @@ -1304,6 +1473,8 @@
> >      item->tooltip.del_cb((void *)item->tooltip.data, item->base.widget,
> item);
> >    item->wd->walking -= item->walking;
> >    item->wd->count--;
> > +   if (item->is_group)
> > +     item->wd->group_items = eina_list_remove(item->wd->group_items,
> item);
> >    if (item->wd->calc_job) ecore_job_del(item->wd->calc_job);
> >    item->wd->calc_job = ecore_job_add(_calc_job, item->wd);
> >    elm_widget_item_del(item);
> > @@ -1358,7 +1529,10 @@
> >  {
> >    Widget_Data *wd = data;
> >    Evas_Coord minw = 0, minh = 0, nmax = 0, cvw, cvh;
> > -   int count;
> > +   Elm_Gengrid_Item *item, *group_item = NULL;
> > +   int count_group = 0;
> > +   long count = 0;
> > +   wd->items_lost = 0;
> >
> >    evas_object_geometry_get(wd->pan_smart, NULL, NULL, &cvw, &cvh);
> >    if ((cvw != 0) || (cvh != 0))
> > @@ -1371,16 +1545,37 @@
> >         if (nmax < 1)
> >           nmax = 1;
> >
> > -        count = wd->count;
> > +        EINA_INLIST_FOREACH(wd->items, item)
> > +          {
> > +             if (item->prev_group != count_group)
> > +               item->prev_group = count_group;
> > +             if (item->is_group)
> > +               {
> > +                  count = count % nmax;
> > +                  if (count)
> > +                    wd->items_lost += nmax - count;
> > +                  //printf("%d items and I lost %d\n", count,
> wd->items_lost);
> > +                  count_group++;
> > +                  if (count) count = 0;
> > +                  group_item = item;
> > +               }
> > +             else
> > +               {
> > +                  if (item->parent_group_item != group_item)
> > +                    item->parent_group_item = group_item;
> > +                  count++;
> > +               }
> > +          }
> > +        count = wd->count + wd->items_lost - count_group;
> >         if (wd->horizontal)
> >           {
> > -             minw = ceil(count / (float)nmax) * wd->item_width;
> > +             minw = (ceil(count / (float)nmax) * wd->item_width) +
> (count_group * wd->group_item_height);
> >              minh = nmax * wd->item_height;
> >           }
> >         else
> >           {
> >              minw = nmax * wd->item_width;
> > -             minh = ceil(count / (float)nmax) * wd->item_height;
> > +             minh = (ceil(count / (float)nmax) * wd->item_height) +
> (count_group * wd->group_item_height);
> >           }
> >
> >         if ((minw != wd->minw) || (minh != wd->minh))
> > @@ -1512,20 +1707,57 @@
> >
> >    EINA_INLIST_FOREACH(sd->wd->items, item)
> >      {
> > +        if (item->is_group)
> > +          {
> > +             if (sd->wd->horizontal)
> > +               {
> > +                  if (cy)
> > +                    {
> > +                       cx++;
> > +                       cy = 0;
> > +                    }
> > +               }
> > +             else
> > +               {
> > +                  if (cx)
> > +                    {
> > +                       cx = 0;
> > +                       cy++;
> > +                    }
> > +               }
> > +          }
> >         _item_place(item, cx, cy);
> >         if (sd->wd->reorder_item_changed) return;
> > -        if (sd->wd->horizontal)
> > +        if (item->is_group)
> >           {
> > -             cy = (cy + 1) % sd->wd->nmax;
> > -             if (!cy) cx++;
> > +             if (sd->wd->horizontal)
> > +               {
> > +                  cx++;
> > +                  cy = 0;
> > +               }
> > +             else
> > +               {
> > +                  cx = 0;
> > +                  cy++;
> > +               }
> >           }
> >         else
> >           {
> > -             cx = (cx + 1) % sd->wd->nmax;
> > -             if (!cx) cy++;
> > +             if (sd->wd->horizontal)
> > +               {
> > +                  cy = (cy + 1) % sd->wd->nmax;
> > +                  if (!cy) cx++;
> > +               }
> > +             else
> > +               {
> > +                  cx = (cx + 1) % sd->wd->nmax;
> > +                  if (!cx) cy++;
> > +               }
> >           }
> >      }
> > +   _group_item_place(sd);
> >
> > +
> >    if ((sd->wd->reorder_mode) && (sd->wd->reorder_item))
> >      {
> >         if (!sd->wd->reorder_item_changed)
> > @@ -1756,6 +1988,33 @@
> >  }
> >
> >  EAPI void
> > +elm_gengrid_group_item_size_set(Evas_Object *obj,
> > +                          Evas_Coord   w,
> > +                          Evas_Coord   h)
> > +{
> > +   ELM_CHECK_WIDTYPE(obj, widtype);
> > +   Widget_Data *wd = elm_widget_data_get(obj);
> > +   if (!wd) return;
> > +   if ((wd->group_item_width == w) && (wd->group_item_height == h))
> return;
> > +   wd->group_item_width = w;
> > +   wd->group_item_height = h;
> > +   if (wd->calc_job) ecore_job_del(wd->calc_job);
> > +   wd->calc_job = ecore_job_add(_calc_job, wd);
> > +}
> > +
> > +EAPI void
> > +elm_gengrid_group_item_size_get(const Evas_Object *obj,
> > +                          Evas_Coord        *w,
> > +                          Evas_Coord        *h)
> > +{
> > +   ELM_CHECK_WIDTYPE(obj, widtype);
> > +   Widget_Data *wd = elm_widget_data_get(obj);
> > +   if (!wd) return;
> > +   if (w) *w = wd->group_item_width;
> > +   if (h) *h = wd->group_item_height;
> > +}
> > +
> > +EAPI void
> >  elm_gengrid_align_set(Evas_Object *obj,
> >                       double       align_x,
> >                       double       align_y)
> > @@ -1808,6 +2067,9 @@
> >    if (!item) return NULL;
> >    wd->items = eina_inlist_append(wd->items, EINA_INLIST_GET(item));
> >
> > +   if (item->is_group)
> > +     wd->group_items = eina_list_prepend(wd->group_items, item);
> > +
> >    if (wd->calc_job) ecore_job_del(wd->calc_job);
> >    wd->calc_job = ecore_job_add(_calc_job, wd);
> >
> > @@ -1829,6 +2091,8 @@
> >    item = _item_create(wd, gic, data, func, func_data);
> >    if (!item) return NULL;
> >    wd->items = eina_inlist_prepend(wd->items, EINA_INLIST_GET(item));
> > +   if (item->is_group)
> > +     wd->group_items = eina_list_append(wd->group_items, item);
> >
> >    if (wd->calc_job) ecore_job_del(wd->calc_job);
> >    wd->calc_job = ecore_job_add(_calc_job, wd);
> > @@ -1854,6 +2118,8 @@
> >    if (!item) return NULL;
> >    wd->items = eina_inlist_prepend_relative
> >       (wd->items, EINA_INLIST_GET(item), EINA_INLIST_GET(relative));
> > +   if (item->is_group)
> > +     wd->group_items = eina_list_append_relative(wd->group_items, item,
> relative->parent_group_item);
> >
> >    if (wd->calc_job) ecore_job_del(wd->calc_job);
> >    wd->calc_job = ecore_job_add(_calc_job, wd);
> > @@ -1879,6 +2145,8 @@
> >    if (!item) return NULL;
> >    wd->items = eina_inlist_append_relative
> >       (wd->items, EINA_INLIST_GET(item), EINA_INLIST_GET(relative));
> > +   if (item->is_group)
> > +     wd->group_items = eina_list_prepend_relative(wd->group_items,
> item, relative->parent_group_item);
> >
> >    if (wd->calc_job) ecore_job_del(wd->calc_job);
> >    wd->calc_job = ecore_job_add(_calc_job, wd);
> > @@ -2548,11 +2816,18 @@
> >    if ((!item) || (item->delete_me)) return;
> >    _pan_min_get(wd->pan_smart, &minx, &miny);
> >
> > -   elm_smart_scroller_child_region_show(item->wd->scr,
> > -                                        item->x * wd->item_width + minx,
> > +   if (wd->horizontal)
> > +     elm_smart_scroller_region_bring_in(item->wd->scr,
> > +                                        ((item->x - item->prev_group) *
> wd->item_width) + (item->prev_group * item->wd->group_item_width) + minx,
> >                                         item->y * wd->item_height + miny,
> >                                         item->wd->item_width,
> >                                         item->wd->item_height);
> > +   else
> > +     elm_smart_scroller_region_bring_in(item->wd->scr,
> > +                                        item->x * wd->item_width + minx,
> > +                                        ((item->y - item->prev_group)*
> wd->item_height) + (item->prev_group * item->wd->group_item_height) + miny,
> > +                                        item->wd->item_width,
> > +                                        item->wd->item_height);
> >  }
> >
> >  EAPI void
> > @@ -2566,9 +2841,16 @@
> >    if (!wd) return;
> >    _pan_min_get(wd->pan_smart, &minx, &miny);
> >
> > -   elm_smart_scroller_region_bring_in(item->wd->scr,
> > -                                      item->x * wd->item_width + minx,
> > -                                      item->y * wd->item_height + miny,
> > -                                      item->wd->item_width,
> > -                                      item->wd->item_height);
> > +   if (wd->horizontal)
> > +     elm_smart_scroller_region_bring_in(item->wd->scr,
> > +                                        ((item->x - item->prev_group) *
> wd->item_width) + (item->prev_group * item->wd->group_item_width) + minx,
> > +                                        item->y * wd->item_height +
> miny,
> > +                                        item->wd->item_width,
> > +                                        item->wd->item_height);
> > +   else
> > +     elm_smart_scroller_region_bring_in(item->wd->scr,
> > +                                        item->x * wd->item_width + minx,
> > +                                        ((item->y - item->prev_group)*
> wd->item_height) + (item->prev_group * item->wd->group_item_height) + miny,
> > +                                        item->wd->item_width,
> > +                                        item->wd->item_height);
> >  }
> >
> >
> >
> ------------------------------------------------------------------------------
> > Why Cloud-Based Security and Archiving Make Sense
> > Osterman Research conducted this study that outlines how and why cloud
> > computing security and archiving is rapidly being adopted across the IT
> > space for its ease of implementation, lower cost, and increased
> > reliability. Learn more.
> http://www.accelacomm.com/jaw/sfnl/114/51425301/
> > _______________________________________________
> > enlightenment-svn mailing list
> > enlightenment-...@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>
>
> ------------------------------------------------------------------------------
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security and
> threat landscape has changed and how IT managers can respond. Discussions
> will include endpoint security, mobile security and the latest in malware
> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>

Ho damn !
I had in mind, that you will merge genlist and gengrid when I wrote this
patch.
As you said, we need to fix it with an item type enum. And use the same api
like genlist does for append/preppend funcs. And here you can name your
item_class "group_index" again.
I could provide a patch soon, if you want. Thats my mess :D

-- 
Michaël Bouchaud (yoz) <y...@efl.so>
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to