elm genlist/gengrid: Refactoring. Moved global function pointers to
[framework/uifw/elementary.git] / src / lib / elm_genlist.h
index 45951cc..e8432d9 100644 (file)
@@ -1,7 +1,68 @@
+#ifndef ELM_GEN_H_
+# define ELM_GEN_H_
+
 #include <Elementary.h>
 #include <Elementary_Cursor.h>
 #include "elm_priv.h"
 
+#define ELM_GEN_ITEM_FROM_INLIST(it) \
+   ((it) ? EINA_INLIST_CONTAINER_GET(it, Elm_Gen_Item) : NULL)
+
+#define SWIPE_MOVES         12
+
+typedef struct Elm_Gen_Item_Type Elm_Gen_Item_Type;
+typedef struct Elm_Gen_Item_Tooltip Elm_Gen_Item_Tooltip;
+typedef struct _Widget_Data Widget_Data;
+
+struct Elm_Gen_Item_Tooltip
+{
+   const void                 *data;
+   Elm_Tooltip_Item_Content_Cb content_cb;
+   Evas_Smart_Cb               del_cb;
+   const char                 *style;
+   Eina_Bool                   free_size : 1;
+};
+
+struct Elm_Gen_Item
+{
+   ELM_WIDGET_ITEM;
+   EINA_INLIST;
+   Widget_Data                  *wd;
+   Elm_Gen_Item_Type            *item;
+   const Elm_Gen_Item_Class     *itc;
+   Evas_Coord                    x, y, dx, dy;
+   Evas_Object                  *spacer;
+   Elm_Gen_Item                 *parent;
+   Eina_List                    *labels, *contents, *states, *content_objs;
+   Ecore_Timer                  *long_timer;
+   int                           relcount;
+   int                           walking;
+   int                           generation; /* a generation of an item. when the item is created, this value is set to the value of genlist generation. this value will be decreased when the item is going to be deleted */
+   const char                   *mouse_cursor;
+
+   struct
+   {
+      Evas_Smart_Cb func;
+      const void   *data;
+   } func;
+
+   Elm_Gen_Item_Tooltip tooltip;
+   Ecore_Cb    del_cb, sel_cb, highlight_cb;
+   Ecore_Cb    unsel_cb, unhighlight_cb, unrealize_cb;
+
+   Eina_Bool   want_unrealize : 1;
+   Eina_Bool   display_only : 1;
+   Eina_Bool   realized : 1;
+   Eina_Bool   selected : 1;
+   Eina_Bool   highlighted : 1;
+   Eina_Bool   disabled : 1;
+   Eina_Bool   dragging : 1;
+   Eina_Bool   down : 1;
+   Eina_Bool   group : 1;
+   Eina_Bool   reorder : 1;
+   Eina_Bool   mode_set : 1; /* item uses style mode for highlight/select */
+};
+
 typedef struct _Pan Pan;
 struct _Pan
 {
@@ -10,6 +71,96 @@ struct _Pan
    Ecore_Job                     *resize_job;
 };
 
+struct _Widget_Data
+{
+   Eina_Inlist_Sorted_State *state;
+   Evas_Object      *obj; /* the genlist object */
+   Evas_Object      *scr; /* a smart scroller object which is used internally in genlist */
+   Evas_Object      *pan_smart; /* "elm_genlist_pan" evas smart object. this is an extern pan of smart scroller(scr). */
+   Eina_List        *selected;
+   Eina_List        *group_items; /* list of groups index items */
+   Eina_Inlist      *items; /* inlist of all items */
+   Elm_Gen_Item     *reorder_it; /* item currently being repositioned */
+   Elm_Gen_Item     *last_selected_item;
+   Pan              *pan; /* pan_smart object's smart data */
+   Ecore_Job        *calc_job;
+   int               walking;
+   int               item_width, item_height;
+   int               group_item_width, group_item_height;
+   int               minw, minh;
+   long              count;
+   Evas_Coord        pan_x, pan_y;
+   Eina_Bool         reorder_mode : 1; /* a flag for reorder mode enable/disable */
+   Eina_Bool         on_hold : 1;
+   Eina_Bool         multi : 1; /* a flag for item multi selection */
+   Eina_Bool         no_select : 1;
+   Eina_Bool         wasselected : 1;
+   Eina_Bool         always_select : 1;
+   Eina_Bool         clear_me : 1; /* a flag whether genlist is marked as to be cleared or not. if this flag is true, genlist clear was already deferred.  */
+   Eina_Bool         h_bounce : 1;
+   Eina_Bool         v_bounce : 1;
+   Ecore_Cb          del_cb, calc_cb, sizing_cb;
+   Ecore_Cb          clear_cb;
+   ////////////////////////////////////
+   Eina_Inlist      *blocks; /* inlist of all blocks. a block consists of a certain number of items. maximum number of items in a block is 'max_items_per_block'. */
+   Evas_Coord        reorder_old_pan_y, w, h, realminw, prev_viewport_w;
+   Ecore_Job        *update_job;
+   Ecore_Idle_Enterer *queue_idle_enterer;
+   Ecore_Idler        *must_recalc_idler;
+   Eina_List        *queue;
+   Elm_Gen_Item *show_item, *anchor_item, *mode_item, *reorder_rel, *expanded_item;
+   Eina_Inlist      *item_cache; /* an inlist of edje object it cache. */
+   Evas_Coord        anchor_y;
+   Evas_Coord        reorder_start_y; /* reorder it's initial y coordinate in the pan. */
+   Elm_List_Mode     mode;
+   Ecore_Timer      *multi_timer, *scr_hold_timer;
+   Ecore_Animator   *reorder_move_animator;
+   const char       *mode_type;
+   const char       *mode_item_style;
+   unsigned int      start_time;
+   Evas_Coord        prev_x, prev_y, prev_mx, prev_my;
+   Evas_Coord        cur_x, cur_y, cur_mx, cur_my;
+   Eina_Bool         mouse_down : 1;
+   Eina_Bool         multi_down : 1;
+   Eina_Bool         multi_timeout : 1;
+   Eina_Bool         multitouched : 1;
+   Eina_Bool         longpressed : 1;
+   Eina_Bool         bring_in : 1;
+   Eina_Bool         compress : 1;
+   Eina_Bool         height_for_width : 1;
+   Eina_Bool         homogeneous : 1;
+   Eina_Bool         swipe : 1;
+   Eina_Bool         reorder_pan_move : 1;
+   Eina_Bool         auto_scroll_enabled : 1;
+   Eina_Bool         pan_resized : 1;
+   struct
+   {
+      Evas_Coord x, y;
+   } history[SWIPE_MOVES];
+   int               multi_device;
+   int               item_cache_count;
+   int               item_cache_max; /* maximum number of cached items */
+   int               movements;
+   int               max_items_per_block; /* maximum number of items per block */
+   double            longpress_timeout; /* longpress timeout. this value comes from _elm_config by default. this can be changed by elm_genlist_longpress_timeout_set() */
+   int               generation; /* a generation of genlist. when genlist is cleared, this value will be increased and a new generation will start */
+
+   Eina_Compare_Cb   item_compare_cb;
+   Eina_Compare_Cb   item_compare_data_cb;
+   Eina_Bool         requeue : 1;
+
+   /* The stuff below directly come from gengrid without any thinking */
+   unsigned int      nmax;
+   Evas_Coord        reorder_item_x, reorder_item_y;
+   Evas_Coord        old_pan_x, old_pan_y;
+   long              items_lost;
+   double            align_x, align_y;
+
+   Eina_Bool         horizontal : 1;
+   Eina_Bool         move_effect_enabled : 1;
+   Eina_Bool         reorder_item_changed : 1;
+};
+
 Elm_Gen_Item *
 _elm_genlist_item_new(Widget_Data              *wd,
                       const Elm_Gen_Item_Class *itc,
@@ -64,3 +215,5 @@ _elm_genlist_item_del_serious(Elm_Gen_Item *it);
 
 void
 _elm_genlist_item_del_notserious(Elm_Gen_Item *it);
+
+#endif