1 #include <Elementary.h>
5 * @defgroup Gridbox Gridbox
8 * This is a gridbox widget to show multiple objects in a grid
11 typedef struct _Widget_Data Widget_Data;
15 Evas_Object *tbl, *scr;
16 Evas_Coord itemsize_h, itemsize_v;
17 Evas_Coord minw, minh;
18 Evas_Coord horizontal, vertical;
20 Eina_Bool homogeneous:1;
23 static void _del_hook(Evas_Object * obj);
25 static void _sizing_eval(Evas_Object * obj, int mode);
27 static void _changed_size_hints(void *data, Evas * e, Evas_Object * obj,
29 static void _changed_size_min(void *data, Evas * e, Evas_Object * obj,
31 static void _sub_del(void *data, Evas_Object * obj, void *event_info);
33 static void _show_event(void *data, Evas_Object * obj, void *event_info);
36 _del_pre_hook(Evas_Object * obj)
38 Widget_Data *wd = elm_widget_data_get(obj);
40 evas_object_event_callback_del_full(wd->tbl,
41 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
42 _changed_size_hints, obj);
43 evas_object_event_callback_del_full(wd->tbl, EVAS_CALLBACK_RESIZE,
44 _changed_size_min, obj);
45 evas_object_del(wd->tbl);
47 evas_object_del(wd->scr);
52 _del_hook(Evas_Object * obj)
54 Widget_Data *wd = elm_widget_data_get(obj);
60 _arrange_table(Evas_Object * obj)
62 Widget_Data *wd = elm_widget_data_get(obj);
64 Eina_List *l, *l_temp = NULL;
75 eina_list_count(evas_object_table_children_get(wd->tbl));
79 elm_gridbox_item_size_set(obj, wd->itemsize_h, wd->itemsize_v);
80 l = evas_object_table_children_get(wd->tbl);
82 EINA_LIST_FOREACH(l, l_temp, item)
84 evas_object_table_unpack(wd->tbl, item);
85 elm_widget_sub_object_del(wd->tbl, item);
86 evas_object_table_pack(wd->tbl, item, i % wd->x, i / wd->x, 1,
97 _sizing_eval(Evas_Object * obj, int mode)
99 Widget_Data *wd = elm_widget_data_get(obj);
101 Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
105 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
106 evas_object_size_hint_max_get(wd->scr, &maxw, &maxh);
107 evas_object_size_hint_min_set(obj, minw, minh);
108 evas_object_size_hint_max_set(obj, maxw, maxh);
109 evas_object_geometry_get(wd->scr, NULL, NULL, &w, &h);
115 if ((maxw >= 0) && (w > maxw))
117 if ((maxh >= 0) && (h > maxh))
119 evas_object_resize(obj, w, h);
123 if (w < wd->itemsize_h || h < wd->itemsize_v)
127 wd->x = w / wd->itemsize_h;
128 wd->y = h / wd->itemsize_v;
129 wd->horizontal = (wd->minw - wd->x * wd->itemsize_h) / wd->x;
130 wd->vertical = (wd->minh - wd->y * wd->itemsize_v) / wd->y;
131 elm_gridbox_padding_set(obj, wd->horizontal, wd->vertical);
139 _changed_size_hints(void *data, Evas * e, Evas_Object * obj, void *event_info)
141 _sizing_eval(data, 0);
145 _changed_size_min(void *data, Evas * e, Evas_Object * obj, void *event_info)
147 _sizing_eval(data, 0);
151 _sub_del(void *data, Evas_Object * obj, void *event_info)
153 _sizing_eval(obj, 1);
157 _show_event(void *data, Evas_Object * obj, void *event_info)
159 _sizing_eval(data, 0);
163 _freeze_on(void *data, Evas_Object * obj, void *event_info)
165 Widget_Data *wd = elm_widget_data_get(obj);
169 evas_object_smart_callback_call(wd->scr, "scroll-freeze-on", NULL);
173 _freeze_off(void *data, Evas_Object * obj, void *event_info)
175 Widget_Data *wd = elm_widget_data_get(obj);
179 evas_object_smart_callback_call(wd->scr, "scroll-freeze-off", NULL);
183 * Add a new gridbox to the parent
185 * @param parent The parent object
186 * @return The new object or NULL if it cannot be created
191 elm_gridbox_add(Evas_Object * parent)
199 wd = ELM_NEW(Widget_Data);
200 e = evas_object_evas_get(parent);
201 obj = elm_widget_add(e);
202 elm_widget_type_set(obj, "gridbox");
203 elm_widget_sub_object_add(parent, obj);
204 elm_widget_data_set(obj, wd);
205 elm_widget_del_hook_set(obj, _del_hook);
206 elm_widget_del_pre_hook_set(obj, _del_pre_hook);
208 wd->scr = elm_scroller_add(parent);
209 elm_widget_resize_object_set(obj, wd->scr);
210 elm_scroller_bounce_set(wd->scr, 0, 1);
212 wd->tbl = evas_object_table_add(e);
213 evas_object_size_hint_weight_set(wd->tbl, 0.0, 0.0);
214 elm_scroller_content_set(wd->scr, wd->tbl);
215 evas_object_show(wd->tbl);
217 evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
218 _changed_size_hints, obj);
219 evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_RESIZE,
220 _changed_size_min, obj);
221 evas_object_event_callback_add(wd->scr, EVAS_CALLBACK_SHOW, _show_event,
224 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
225 evas_object_smart_callback_add(obj, "scroll-freeze-on", _freeze_on, obj);
226 evas_object_smart_callback_add(obj, "scroll-freeze-off", _freeze_off, obj);
228 _sizing_eval(obj, 0);
234 * Set padding between cells.
236 * @param obj The layout object.
237 * @param horizontal set the horizontal padding.
238 * @param vertical set the vertical padding.
243 elm_gridbox_padding_set(Evas_Object * obj, Evas_Coord horizontal,
246 Widget_Data *wd = elm_widget_data_get(obj);
251 wd->horizontal = horizontal;
252 wd->vertical = vertical;
254 evas_object_table_padding_set(wd->tbl, horizontal, vertical);
258 * Set gridbox item size
260 * @param obj The gridbox object
261 * @param h_pagesize The horizontal item size
262 * @param v_pagesize The vertical item size
267 elm_gridbox_item_size_set(Evas_Object * obj, Evas_Coord h_itemsize,
268 Evas_Coord v_itemsize)
270 Widget_Data *wd = elm_widget_data_get(obj);
272 Evas_Coord minw = -1, minh = -1;
279 wd->itemsize_h = h_itemsize;
280 wd->itemsize_v = v_itemsize;
281 evas_object_size_hint_min_get(wd->scr, &minw, &minh);
282 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
287 wd->x = w / h_itemsize;
288 wd->y = h / v_itemsize;
294 _sizing_eval(obj, 1);
298 * Add a subobject on the gridbox
300 * @param obj The table object
301 * @param subobj The subobject to be added to the gridbox
306 elm_gridbox_pack(Evas_Object * obj, Evas_Object * subobj)
308 Widget_Data *wd = elm_widget_data_get(obj);
310 int index = eina_list_count(evas_object_table_children_get(wd->tbl));
312 evas_object_size_hint_min_set(subobj, wd->itemsize_h, wd->itemsize_v);
313 evas_object_size_hint_max_set(subobj, wd->itemsize_h, wd->itemsize_v);
314 elm_widget_sub_object_add(obj, subobj);
315 evas_object_table_pack(wd->tbl, subobj, index % wd->x, index / wd->x, 1, 1);
319 * Unpack a subobject on the gridbox
321 * @param obj The gribox object
322 * @param subobj The subobject to be removed to the gridbox
327 elm_gridbox_unpack(Evas_Object * obj, Evas_Object * subobj)
329 Widget_Data *wd = elm_widget_data_get(obj);
333 elm_widget_sub_object_del(wd->tbl, subobj);
334 ret = evas_object_table_unpack(wd->tbl, subobj);
342 * Get the list of children for the gridbox.
344 * @param obj The gribox object
349 elm_gridbox_children_get(Evas_Object * obj)
351 Widget_Data *wd = elm_widget_data_get(obj);
353 Eina_List *new_list = NULL;
355 new_list = evas_object_table_children_get(wd->tbl);
361 * Set homogenous paddding layout
363 * @param obj The gribox object
364 * @param homogenous The homogenous flag (1 = on, 0 = off)
369 elm_gridbox_homogenous_padding_set(Evas_Object * obj, Eina_Bool homogenous)
371 Widget_Data *wd = elm_widget_data_get(obj);
373 wd->homogeneous = homogenous;