2012/5/8 Daniel Juyung Seo <[email protected]>

> 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
> <[email protected]> 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
> > [email protected]
> > 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
> [email protected]
> 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) <[email protected]>
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to