[elm_index] bug fix: eina_list null check
[framework/uifw/elementary.git] / src / examples / index_example_01.c
1 /**
2  * Simple Elementary's <b>index widget</b> example, illustrating its
3  * usage and API.
4  *
5  * See stdout/stderr for output. Compile with:
6  *
7  * @verbatim
8  * gcc -g index_example.c -o index_example `pkg-config --cflags --libs elementary`
9  * @endverbatim
10  */
11
12 #include <Elementary.h>
13 #include <assert.h>
14
15 struct example_data
16 {
17    Evas_Object *list, *index;
18 };
19
20 struct example_data d = {NULL, NULL};
21
22 static const char *dict[] = \
23 {
24 #include "dict.txt"
25 };
26
27 static void
28 _index_item_del(void *data,
29                 Evas_Object *obj,
30                 void *event_info)
31 {
32    fprintf(stdout, "Deleting index node (%s). Comparing index "
33                    "item data reported via callback with the one returned by "
34                    "index's API on items: %s.\n",
35            elm_index_item_letter_get(event_info),
36            data == elm_object_item_data_get(event_info) ? "OK" :
37            "FAIL, something went wrong");
38 }
39
40 /* delete an index item */
41 static void
42 _item_del(void *data,
43           Evas_Object *obj,
44           void *event_info)
45 {
46    Elm_Object_Item *iit = elm_index_selected_item_get(d.index, 0);
47
48    if (!iit) return;
49
50    fprintf(stdout, "Deleting last selected index item, which had letter"
51                    " %s (pointing to %p)\n", elm_index_item_letter_get(iit),
52            elm_object_item_data_get(iit));
53
54    elm_object_item_del(iit);
55 }
56
57 static void
58 _item_del_all(void *data,
59               Evas_Object *obj,
60               void *event_info)
61 {
62    elm_index_item_clear(d.index);
63 }
64
65 static void
66 _active_set(void *data,
67             Evas_Object *obj,
68             void *event_info)
69 {
70    elm_index_autohide_disabled_set
71      (d.index, !elm_index_autohide_disabled_get(d.index));
72
73    fprintf(stdout, "Toggling index programmatically.\n");
74 }
75
76 /* "delay,changed" hook */
77 static void
78 _index_changed(void *data,
79                Evas_Object *obj,
80                void *event_info)
81 {
82    elm_list_item_bring_in(elm_object_item_data_get(event_info));
83 }
84
85 static void
86 _index_selected(void *data,
87                 Evas_Object *obj,
88                 void *event_info)
89 {
90    Elm_Object_Item *lit = event_info;
91
92    fprintf(stdout, "New index item selected. Comparing item reported"
93                    " via callback with the selection returned by the API: "
94                    "%s.\n", lit == elm_index_selected_item_get(obj, 0) ? "OK" :
95            "FAIL, something went wrong");
96 }
97
98 static void
99 _on_done(void *data,
100          Evas_Object *obj,
101          void *event_info)
102 {
103    elm_exit();
104 }
105
106 EAPI_MAIN int
107 elm_main(int argc,
108          char **argv)
109 {
110    Evas_Object *win, *bg, *hbox, *vbox, *bt, *sep;
111    Elm_Object_Item *lit;
112    unsigned int i;
113    char curr = 0;
114
115    win = elm_win_add(NULL, "index", ELM_WIN_BASIC);
116    elm_win_title_set(win, "Index Example");
117    evas_object_smart_callback_add(win, "delete,request", _on_done, NULL);
118
119    bg = elm_bg_add(win);
120    elm_win_resize_object_add(win, bg);
121    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
122    evas_object_show(bg);
123
124    vbox = elm_box_add(win);
125    elm_win_resize_object_add(win, vbox);
126    evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
127    evas_object_show(vbox);
128
129    d.list = elm_list_add(win);
130    evas_object_size_hint_weight_set(d.list, EVAS_HINT_EXPAND,
131                                     EVAS_HINT_EXPAND);
132    evas_object_size_hint_align_set(d.list, EVAS_HINT_FILL, EVAS_HINT_FILL);
133    evas_object_show(d.list);
134    elm_box_pack_end(vbox, d.list);
135
136    d.index = elm_index_add(win);
137    elm_win_resize_object_add(win, d.index);
138    evas_object_size_hint_weight_set(d.index, EVAS_HINT_EXPAND,
139                                     EVAS_HINT_EXPAND);
140    evas_object_size_hint_align_set(d.list, EVAS_HINT_FILL, EVAS_HINT_FILL);
141    evas_object_show(d.index);
142
143    for (i = 0; i < (sizeof(dict) / sizeof(dict[0])); i++)
144      {
145         lit = elm_list_item_append(d.list, dict[i], NULL, NULL, NULL, NULL);
146
147         if (curr != dict[i][0])
148           {
149              Elm_Object_Item *index_it, *it;
150              char buf[32];
151
152              curr = dict[i][0];
153              /* indexing by first letters */
154
155              snprintf(buf, sizeof(buf), "%c", curr);
156              index_it = elm_index_item_append(d.index, buf, NULL, lit);
157
158              /* this is here just to demostrate the API call */
159              it = elm_index_item_find(d.index, lit);
160              assert(it == index_it);
161
162              elm_object_item_del_cb_set(index_it, _index_item_del);
163           }
164      }
165
166    evas_object_smart_callback_add(d.index, "delay,changed", _index_changed,
167                                   NULL);
168    evas_object_smart_callback_add(d.index, "selected", _index_selected, NULL);
169
170    /* attribute setting knobs */
171    sep = elm_separator_add(win);
172    elm_separator_horizontal_set(sep, EINA_TRUE);
173    elm_box_pack_end(vbox, sep);
174    evas_object_show(sep);
175
176    hbox = elm_box_add(win);
177    elm_box_horizontal_set(hbox, EINA_TRUE);
178    evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0);
179    evas_object_size_hint_fill_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
180    elm_box_pack_end(vbox, hbox);
181    evas_object_show(hbox);
182
183    bt = elm_button_add(win);
184    elm_object_text_set(bt, "bring in index");
185    evas_object_smart_callback_add(bt, "clicked", _active_set, NULL);
186    elm_box_pack_end(hbox, bt);
187    evas_object_show(bt);
188
189    bt = elm_button_add(win);
190    elm_object_text_set(bt, "delete last selected item");
191    evas_object_smart_callback_add(bt, "clicked", _item_del, NULL);
192    elm_box_pack_end(hbox, bt);
193    evas_object_show(bt);
194
195    bt = elm_button_add(win);
196    elm_object_text_set(bt, "delete all items");
197    evas_object_smart_callback_add(bt, "clicked", _item_del_all, NULL);
198    elm_box_pack_end(hbox, bt);
199    evas_object_show(bt);
200
201    evas_object_resize(win, 320, 600);
202    evas_object_show(win);
203
204    elm_run();
205    elm_shutdown();
206
207    return 0;
208 }
209
210 ELM_MAIN()