4 #include <Elementary.h>
5 #include <Elementary_Cursor.h>
8 #define ELM_GEN_ITEM_FROM_INLIST(it) \
9 ((it) ? EINA_INLIST_CONTAINER_GET(it, Elm_Gen_Item) : NULL)
11 #define SWIPE_MOVES 12
13 typedef struct Elm_Gen_Item_Type Elm_Gen_Item_Type;
14 typedef struct Elm_Gen_Item_Tooltip Elm_Gen_Item_Tooltip;
15 typedef struct _Widget_Data Widget_Data;
17 struct Elm_Gen_Item_Tooltip
20 Elm_Tooltip_Item_Content_Cb content_cb;
23 Eina_Bool free_size : 1;
31 Elm_Gen_Item_Type *item;
32 const Elm_Gen_Item_Class *itc;
33 Evas_Coord x, y, dx, dy;
34 Evas_Object *spacer, *deco_all_view;
36 Eina_List *texts, *contents, *states, *content_objs;
37 Ecore_Timer *long_timer;
40 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 */
41 const char *mouse_cursor;
49 Elm_Gen_Item_Tooltip tooltip;
50 Ecore_Cb del_cb, sel_cb, highlight_cb;
51 Ecore_Cb unsel_cb, unhighlight_cb, unrealize_cb;
54 Elm_Object_Select_Mode select_mode;
56 Eina_Bool position_update : 1;
57 Eina_Bool want_unrealize : 1;
58 Eina_Bool realized : 1;
59 Eina_Bool selected : 1;
60 Eina_Bool highlighted : 1;
61 Eina_Bool dragging : 1; /**< this is set true when an item is being dragged. this is set false on multidown/mouseup/mousedown. when this is true, the item should not be unrealized. or evas mouse down/up event will be corrupted. */
64 Eina_Bool reorder : 1;
65 Eina_Bool decorate_it_set : 1; /**< item uses style mode for highlight/select */
66 Eina_Bool flipped : 1; /**< a flag that shows the flip status of the item. */
67 Eina_Bool defer_unrealize : 1;
68 Eina_Bool can_focus : 1;
71 typedef struct _Pan Pan;
74 Evas_Object_Smart_Clipped_Data __clipped_data;
76 Ecore_Job *resize_job;
81 ELM_GENLIST_TREE_EFFECT_NONE = 0,
82 ELM_GENLIST_TREE_EFFECT_EXPAND = 1,
83 ELM_GENLIST_TREE_EFFECT_CONTRACT = 2
84 } Elm_Genlist_Item_Move_Effect_Mode;
88 Eina_Inlist_Sorted_State *state;
89 Evas_Object *obj; /**< the genlist object */
90 Evas_Object *scr; /**< a smart scroller object which is used internally in genlist */
91 Evas_Object *pan_smart; /**< "elm_genlist_pan" evas smart object. this is an extern pan of smart scroller(scr). */
92 Eina_List *selected; /**< a list of selected items */
93 Eina_List *group_items; /**< a list of groups index items */
94 Eina_Inlist *items; /**< an inlist of all items */
95 Elm_Gen_Item *reorder_it; /**< item currently being repositioned */
96 Elm_Object_Item *last_selected_item;
97 Pan *pan; /**< pan_smart object's smart data */
100 int item_width, item_height;
101 int group_item_width, group_item_height;
103 unsigned int item_count;
104 Evas_Coord pan_x, pan_y;
105 Elm_Object_Select_Mode select_mode;
106 Eina_Bool reorder_mode : 1; /**< a flag for reorder mode enable/disable */
107 Eina_Bool on_hold : 1;
108 Eina_Bool multi : 1; /**< a flag for item multi selection */
109 Eina_Bool wasselected : 1;
110 Eina_Bool highlight : 1; /**< a flag for items can be highlighted or not. by default this flag is true. */
111 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. */
112 Eina_Bool h_bounce : 1;
113 Eina_Bool v_bounce : 1;
114 Ecore_Cb del_cb, calc_cb, sizing_cb;
116 ////////////////////////////////////
117 Eina_Inlist *blocks; /**< an 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'. */
118 Evas_Coord reorder_old_pan_y, w, h, realminw, prev_viewport_w;
119 Ecore_Job *update_job;
120 Ecore_Idle_Enterer *queue_idle_enterer;
121 Ecore_Idler *must_recalc_idler;
123 Elm_Gen_Item *show_item, *anchor_item, *mode_item, *reorder_rel, *expanded_item;
124 Eina_Inlist *item_cache; /**< an inlist of edje object it cache. */
126 Evas_Coord reorder_start_y; /**< reorder it's initial y coordinate in the pan. */
128 Ecore_Timer *multi_timer, *scr_hold_timer;
129 Ecore_Animator *reorder_move_animator;
130 const char *decorate_it_type;
132 Evas_Coord prev_x, prev_y, prev_mx, prev_my;
133 Evas_Coord cur_x, cur_y, cur_mx, cur_my;
134 Eina_Bool mouse_down : 1;
135 Eina_Bool multi_down : 1;
136 Eina_Bool multi_timeout : 1;
137 Eina_Bool multitouched : 1;
138 Eina_Bool longpressed : 1;
139 Eina_Bool bring_in : 1; /**< a flag to describe the scroll animation. (show, bring in) */
140 Eina_Bool height_for_width : 1;
141 Eina_Bool homogeneous : 1;
143 Eina_Bool decorate_all_mode : 1;
144 Eina_Bool reorder_pan_move : 1;
145 Eina_Bool auto_scroll_enabled : 1;
146 Eina_Bool pan_changed : 1;
147 Eina_Bool requeued : 1; /**< this is set to EINA_TRUE when the item is re-queued. this happens when the item is un-queued but the rel item is still in the queue. this item will be processed later. */
148 Eina_Bool check_scroll : 1; /**< this flag means genlist is supposed to be scrolled. if this flag is set to EINA_TRUE, genlist checks whether it's ok to scroll genlist now or not. */
149 Eina_Bool tree_effect_enabled : 1; /**< tree effect */
150 Eina_Bool reorder_deleted : 1;
151 Eina_Bool drag_started : 1;
155 } history[SWIPE_MOVES];
157 int item_cache_count;
158 int item_cache_max; /**< maximum number of cached items */
160 int max_items_per_block; /**< maximum number of items per block */
161 double longpress_timeout; /**< longpress timeout. this value comes from _elm_config by default. this can be changed by elm_genlist_longpress_timeout_set() */
162 int generation; /**< a generation of genlist. when genlist is cleared, this value will be increased and a new generation will start */
163 Eina_Compare_Cb item_compare_cb;
164 Eina_Compare_Cb item_compare_data_cb;
165 Elm_Genlist_Item_Scrollto_Type scrollto_type; /**< a scrollto type which remembers where to scroll ex) in, top, middle */
166 Evas_Object *alpha_bg; /**< not to receive event when tree effect is not finished */
167 Eina_List *move_items; /**< items move for tree effect */
168 Elm_Gen_Item *expanded_next_item;
169 Ecore_Animator *tree_effect_animator; /**< tree effect animator */
170 Elm_Genlist_Item_Move_Effect_Mode move_effect_mode;
171 Ecore_Job *changed_job;
173 /* The stuff below directly come from gengrid without any thinking */
175 Evas_Coord reorder_item_x, reorder_item_y;
176 Evas_Coord old_pan_x, old_pan_y;
178 double align_x, align_y;
180 Eina_Bool horizontal : 1;
181 Eina_Bool move_effect_enabled : 1;
182 Eina_Bool reorder_item_changed : 1;
183 Eina_Bool filled : 1;
186 Elm_Gen_Item *_elm_genlist_item_new(Widget_Data *wd, const Elm_Gen_Item_Class *itc, const void *data, Elm_Gen_Item *parent, Evas_Smart_Cb func, const void *func_data);
188 Evas_Object *_elm_genlist_item_widget_get(const Elm_Gen_Item *it);
190 void _elm_genlist_page_relative_set(Evas_Object *obj, double h_pagerel, double v_pagerel);
192 void _elm_genlist_page_relative_get(const Evas_Object *obj, double *h_pagerel, double *v_pagerel);
194 void _elm_genlist_page_size_set(Evas_Object *obj, Evas_Coord h_pagesize, Evas_Coord v_pagesize);
196 void _elm_genlist_current_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber);
198 void _elm_genlist_last_page_get(const Evas_Object *obj, int *h_pagenumber, int *v_pagenumber);
200 void _elm_genlist_page_show(const Evas_Object *obj, int h_pagenumber, int v_pagenumber);
202 void _elm_genlist_page_bring_in(const Evas_Object *obj, int h_pagenumber, int v_pagenumber);
204 void _elm_genlist_item_unrealize(Elm_Gen_Item *it, Eina_Bool calc);
205 void _elm_genlist_item_del_serious(Elm_Gen_Item *it);
207 void _elm_genlist_item_del_notserious(Elm_Gen_Item *it);