elm gen/gengrid/genlist: Changed item class's icon_get to content_get.
[framework/uifw/elementary.git] / src / examples / genlist_example_04.c
1 //Compile with:
2 //gcc -g `pkg-config --cflags --libs elementary` genlist_example_04.c -o genlist_example_04
3
4 #include <Elementary.h>
5 #ifdef HAVE_CONFIG_H
6 # include "elementary_config.h"
7 #else
8 # define __UNUSED__
9 #endif
10
11 #define N_ITEMS 300
12
13 static Elm_Genlist_Item_Class _itc;
14 static Elm_Genlist_Item_Class _itc_group;
15 static int nitems = 0;
16
17 static char *
18 _item_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part)
19 {
20    time_t t = (time_t)ecore_time_unix_get();
21    char buf[256];
22    int i = (int)(long)data;
23
24    if (!strcmp(part, "elm.text"))
25      snprintf(buf, sizeof(buf), "Item # %i", i);
26    else
27      {
28         int n;
29         snprintf(buf, sizeof(buf), "realized at %s", ctime(&t));
30         n = strlen(buf);
31         buf[n - 1] = '\0';
32      }
33
34    return strdup(buf);
35 }
36
37 static Evas_Object *
38 _item_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part)
39 {
40    Evas_Object *ic = elm_icon_add(obj);
41
42    if (!strcmp(part, "elm.swallow.icon"))
43      elm_icon_standard_set(ic, "clock");
44
45    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
46    return ic;
47 }
48
49 static void
50 _item_sel_cb(void *data, Evas_Object *obj, void *event_info)
51 {
52    printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n",
53           data, obj, event_info);
54 }
55
56 static char *
57 _group_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
58 {
59    char buf[256];
60    int i = (int)(long)data;
61
62    snprintf(buf, sizeof(buf), "Group %d (item #%d)", i / 7, i);
63
64    return strdup(buf);
65 }
66
67 static Evas_Object *
68 _group_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part __UNUSED__)
69 {
70    Evas_Object *ic = elm_icon_add(obj);
71
72    if (!strcmp(part, "elm.swallow.icon"))
73      elm_icon_standard_set(ic, "home");
74
75    evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
76    return ic;
77 }
78
79 static void
80 _append_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
81 {
82    Evas_Object *list = data;
83
84    elm_genlist_item_append(list, &_itc,
85                            (void *)(long)nitems++, NULL,
86                            ELM_GENLIST_ITEM_NONE,
87                            _item_sel_cb, NULL);
88
89 }
90
91 static void
92 _prepend_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
93 {
94    Evas_Object *list = data;
95
96    elm_genlist_item_prepend(list, &_itc,
97                            (void *)(long)nitems++, NULL,
98                            ELM_GENLIST_ITEM_NONE,
99                            _item_sel_cb, NULL);
100
101 }
102
103 static void
104 _insert_before_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
105 {
106    Evas_Object *list = data;
107    Elm_Genlist_Item *it = elm_genlist_selected_item_get(list);
108
109    if (!it)
110      return;
111
112    elm_genlist_item_insert_before(list, &_itc,
113                                   (void *)(long)nitems++, NULL,
114                                   it, ELM_GENLIST_ITEM_NONE,
115                                   _item_sel_cb, NULL);
116
117 }
118
119 static void
120 _insert_after_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
121 {
122    Evas_Object *list = data;
123    Elm_Genlist_Item *it = elm_genlist_selected_item_get(list);
124
125    if (!it)
126      return;
127
128    elm_genlist_item_insert_after(list, &_itc,
129                                  (void *)(long)nitems++, NULL,
130                                  it, ELM_GENLIST_ITEM_NONE,
131                                  _item_sel_cb, NULL);
132
133 }
134
135 static void
136 _next_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
137 {
138    Evas_Object *list = data;
139    Elm_Genlist_Item *it;
140
141    it = elm_genlist_selected_item_get(list);
142    if (it)
143      it = elm_genlist_item_next_get(it);
144
145    if (!it)
146      it = elm_genlist_first_item_get(list);
147
148    elm_genlist_item_selected_set(it, EINA_TRUE);
149    elm_genlist_item_show(it);
150 }
151
152 static void
153 _prev_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
154 {
155    Evas_Object *list = data;
156    Elm_Genlist_Item *it;
157
158    it = elm_genlist_selected_item_get(list);
159    if (it)
160      it = elm_genlist_item_prev_get(it);
161
162    if (!it)
163      it = elm_genlist_last_item_get(list);
164
165    elm_genlist_item_selected_set(it, EINA_TRUE);
166    elm_genlist_item_show(it);
167 }
168
169 static void
170 _bring_in_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
171 {
172    Elm_Genlist_Item *it = data;
173
174    if (!it)
175      return;
176
177    elm_genlist_item_bring_in(it);
178 }
179
180 static void
181 _show_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
182 {
183    Elm_Genlist_Item *it = data;
184
185    if (!it)
186      return;
187
188    elm_genlist_item_show(it);
189 }
190
191 static void
192 _middle_in_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
193 {
194    Elm_Genlist_Item *it = data;
195
196    if (!it)
197      return;
198
199    elm_genlist_item_middle_bring_in(it);
200 }
201
202 static void
203 _middle_show_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
204 {
205    Elm_Genlist_Item *it = data;
206
207    if (!it)
208      return;
209
210    elm_genlist_item_middle_show(it);
211 }
212
213 static void
214 _top_in_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
215 {
216    Elm_Genlist_Item *it = data;
217
218    if (!it)
219      return;
220
221    elm_genlist_item_top_bring_in(it);
222 }
223
224 static void
225 _top_show_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
226 {
227    Elm_Genlist_Item *it = data;
228
229    if (!it)
230      return;
231
232    elm_genlist_item_top_show(it);
233 }
234
235 static void
236 _realize_cb(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
237 {
238    Evas_Object *list = data;
239    Elm_Genlist_Item *it = elm_genlist_selected_item_get(list);
240
241    if (!it)
242      return;
243
244    elm_genlist_item_update(it);
245 }
246
247 static Evas_Object *
248 _button_add(Evas_Object *list, Evas_Object *box, const char *label, Evas_Smart_Cb cb)
249 {
250    Evas_Object *bt;
251
252    bt = elm_button_add(elm_object_parent_widget_get(list));
253    elm_object_text_set(bt, label);
254    elm_box_pack_end(box, bt);
255    evas_object_show(bt);
256
257    if (cb)
258      evas_object_smart_callback_add(bt, "clicked", cb, list);
259
260    return bt;
261 }
262
263 int
264 elm_main(int argc __UNUSED__, char **argv __UNUSED__)
265 {
266    Evas_Object *win, *bg, *box, *fbox;
267    Evas_Object *list;
268    Evas_Object *bt_bring_in, *bt_show;
269    Evas_Object *bt_middle_in, *bt_middle_show;
270    Evas_Object *bt_top_in, *bt_top_show;
271    int i;
272
273    win = elm_win_add(NULL, "icon", ELM_WIN_BASIC);
274    elm_win_title_set(win, "Icon");
275    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
276    elm_win_autodel_set(win, EINA_TRUE);
277
278    bg = elm_bg_add(win);
279    elm_bg_color_set(bg, 255,255 ,255);
280    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
281    elm_win_resize_object_add(win, bg);
282    evas_object_show(bg);
283
284    box = elm_box_add(win);
285    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
286    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
287    elm_win_resize_object_add(win, box);
288    evas_object_show(box);
289
290    _itc.item_style = "double_label";
291    _itc.func.label_get = _item_label_get;
292    _itc.func.content_get = _item_icon_get;
293    _itc.func.state_get = NULL;
294    _itc.func.del = NULL;
295
296    _itc_group.item_style = "group_index";
297    _itc_group.func.label_get = _group_label_get;
298    _itc_group.func.content_get = _group_icon_get;
299    _itc_group.func.state_get = NULL;
300    _itc_group.func.del = NULL;
301
302    list = elm_genlist_add(win);
303
304    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
305    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
306    elm_box_pack_end(box, list);
307    evas_object_show(list);
308
309    fbox = elm_box_add(win);
310    elm_box_layout_set(fbox, evas_object_box_layout_flow_horizontal,
311                       NULL, NULL);
312    evas_object_size_hint_weight_set(fbox, EVAS_HINT_EXPAND, 0);
313    evas_object_size_hint_align_set(fbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
314    elm_box_pack_end(box, fbox);
315    evas_object_show(fbox);
316
317    _button_add(list, fbox, "prepend", _prepend_cb);
318    _button_add(list, fbox, "append", _append_cb);
319    _button_add(list, fbox, "insert before", _insert_before_cb);
320    _button_add(list, fbox, "insert after", _insert_after_cb);
321    _button_add(list, fbox, "prev", _prev_cb);
322    _button_add(list, fbox, "next", _next_cb);
323    _button_add(list, fbox, "realize", _realize_cb);
324    bt_bring_in = _button_add(list, fbox, "bring #50", NULL);
325    bt_show = _button_add(list, fbox, "show #50", NULL);
326    bt_middle_in = _button_add(list, fbox, "bring to middle #200", NULL);
327    bt_middle_show = _button_add(list, fbox, "show in middle #200", NULL);
328    bt_top_in = _button_add(list, fbox, "bring to top #250", NULL);
329    bt_top_show = _button_add(list, fbox, "show in top #250", NULL);
330
331    for (i = 0; i < N_ITEMS; i++)
332      {
333         Elm_Genlist_Item *gli, *glg;
334
335         if (i % 7 == 0)
336           {
337              glg = gli = elm_genlist_item_append(list, &_itc_group,
338                                                  (void *)(long)nitems++, NULL,
339                                                  ELM_GENLIST_ITEM_GROUP,
340                                                  _item_sel_cb, NULL);
341              elm_genlist_item_display_only_set(glg, EINA_TRUE);
342           }
343         else
344           {
345              gli = elm_genlist_item_append(list, &_itc,
346                                            (void *)(long)nitems++, glg,
347                                            ELM_GENLIST_ITEM_NONE,
348                                            _item_sel_cb, NULL);
349           }
350
351         switch (i)
352           {
353            case 3:
354               elm_genlist_item_disabled_set(gli, EINA_TRUE);
355               break;
356            case 50:
357               evas_object_smart_callback_add(
358                  bt_bring_in, "clicked", _bring_in_cb, gli);
359               evas_object_smart_callback_add(
360                  bt_show, "clicked", _show_cb, gli);
361               break;
362            case 200:
363               evas_object_smart_callback_add(
364                  bt_middle_in, "clicked", _middle_in_cb, gli);
365               evas_object_smart_callback_add(
366                  bt_middle_show, "clicked", _middle_show_cb, gli);
367               break;
368            case 250:
369               evas_object_smart_callback_add(
370                  bt_top_in, "clicked", _top_in_cb, gli);
371               evas_object_smart_callback_add(
372                  bt_top_show, "clicked", _top_show_cb, gli);
373           }
374      }
375
376    evas_object_size_hint_min_set(bg, 160, 160);
377    evas_object_size_hint_max_set(bg, 640, 640);
378    evas_object_resize(win, 420, 320);
379    evas_object_show(win);
380
381    elm_run();
382
383    return 0;
384 }
385
386 ELM_MAIN()