elementary/menu, ctxpopup, index, segment_control, diskselector, multibuttonentry...
[framework/uifw/elementary.git] / src / bin / test_index.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6 static Elm_Genlist_Item_Class itci;
7 char *gli_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__)
8 {
9    char buf[256];
10    int j = (long)data;
11    snprintf(buf, sizeof(buf), "%c%c",
12             'A' + ((j >> 4) & 0xf),
13             'a' + ((j     ) & 0xf)
14             );
15    return strdup(buf);
16 }
17
18 void
19 index_changed2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
20 {
21    // called on a change but delayed in case multiple changes happen in a
22    // short timespan
23    elm_genlist_item_top_bring_in(elm_object_item_data_get(event_info));
24 }
25
26 void
27 index_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
28 {
29    // this is calld on every change, no matter how often
30    // elm_genlist_item_bring_in(event_info);
31 }
32
33 void
34 index_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
35 {
36    // called on final select
37    elm_genlist_item_top_bring_in(elm_object_item_data_get(event_info));
38 }
39
40 void
41 test_index(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
42 {
43    Evas_Object *win, *bg, *gl, *id;
44    Elm_Genlist_Item *it;
45    int i, j;
46
47    win = elm_win_add(NULL, "index", ELM_WIN_BASIC);
48    elm_win_title_set(win, "Index");
49    elm_win_autodel_set(win, EINA_TRUE);
50
51    bg = elm_bg_add(win);
52    elm_win_resize_object_add(win, bg);
53    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
54    evas_object_show(bg);
55
56    gl = elm_genlist_add(win);
57    evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
58    elm_win_resize_object_add(win, gl);
59    evas_object_show(gl);
60
61    id = elm_index_add(win);
62    evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
63    elm_win_resize_object_add(win, id);
64
65    evas_object_show(id);
66
67    itci.item_style     = "default";
68    itci.func.text_get = gli_text_get;
69    itci.func.content_get  = NULL;
70    itci.func.state_get = NULL;
71    itci.func.del       = NULL;
72
73    j = 0;
74    for (i = 0; i < 100; i++)
75      {
76         it = elm_genlist_item_append(gl, &itci,
77                                      (void *)(long)j/* item data */,
78                                      NULL/* parent */, ELM_GENLIST_ITEM_NONE,
79                                      NULL/* func */, NULL/* func data */);
80         if (!(j & 0xf))
81           {
82              char buf[32];
83
84              snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf));
85              elm_index_item_append(id, buf, it);
86           }
87         j += 2;
88      }
89    evas_object_smart_callback_add(id, "delay,changed", index_changed2, NULL);
90    evas_object_smart_callback_add(id, "changed", index_changed, NULL);
91    evas_object_smart_callback_add(id, "selected", index_selected, NULL);
92    elm_index_item_go(id, 0);
93
94    evas_object_resize(win, 320, 480);
95    evas_object_show(win);
96 }
97
98 /***********/
99
100 typedef struct _Test_Index2_Elements
101 {
102    Evas_Object *entry, *lst, *id;
103 } Test_Index2_Elements;
104
105 void
106 test_index2_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
107 {
108    /* FIXME it won't be called if elm_test main window is closed */
109    free(data);
110 }
111
112 int
113 test_index2_cmp(const void *data1, const void *data2)
114 {
115    const char *label1, *label2;
116    const Elm_Object_Item *li_it1 = data1;
117    const Elm_Object_Item *li_it2 = data2;
118
119    label1 = elm_object_item_text_get(li_it1);
120    label2 = elm_object_item_text_get(li_it2);
121
122    return strcasecmp(label1, label2);
123 }
124
125 int
126 test_index2_icmp(const void *data1, const void *data2)
127 {
128    const char *label1, *label2;
129    const Elm_Object_Item *index_it1 = data1;
130    const Elm_Object_Item *index_it2 = data2;
131
132    label1 = elm_index_item_letter_get(index_it1);
133    label2 = elm_index_item_letter_get(index_it2);
134
135    return strcasecmp(label1, label2);
136 }
137
138 void
139 test_index2_it_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
140 {
141    Test_Index2_Elements *gui = data;
142    Elm_List_Item *it;
143    const char *label;
144    char letter[2];
145
146    label = elm_object_text_get(gui->entry);
147    snprintf(letter, sizeof(letter), "%c", label[0]);
148    it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL, NULL,
149                                     test_index2_cmp);
150    elm_index_item_sorted_insert(gui->id, letter, it, test_index2_icmp,
151                                 test_index2_cmp);
152    elm_list_go(gui->lst);
153    /* FIXME it's not showing the recently added item */
154    elm_list_item_show(it);
155 }
156
157 void
158 test_index2_it_del(void *data, Evas_Object *obj, void *event_info __UNUSED__)
159 {
160    Test_Index2_Elements *gui = data;
161    const char *label, *label_next;
162    Elm_List_Item *it, *it_next;
163    Elm_Object_Item *iit;
164
165    it = elm_list_selected_item_get(obj);
166    it_next = elm_list_item_next(it);
167
168    if (!it_next)
169      {
170         iit = elm_index_item_find(gui->id, it);
171         if (iit) elm_object_item_del(iit);
172         elm_list_item_del(it);
173         return;
174      }
175
176    label = elm_object_item_text_get((Elm_Object_Item *)it);
177    label_next = elm_object_item_text_get((Elm_Object_Item *)it_next);
178
179    iit = elm_index_item_find(gui->id, it);
180    if (label[0] == label_next[0])
181      elm_object_item_data_set(iit, it_next);
182    else
183      elm_object_item_del(iit);
184
185    elm_list_item_del(it);
186 }
187
188 void
189 test_index2_id_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
190 {
191    elm_list_item_show(elm_object_item_data_get(event_info));
192 }
193
194 void
195 test_index2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
196 {
197    Evas_Object *win, *bg, *box, *bt;
198    Test_Index2_Elements *gui;
199
200    gui = malloc(sizeof(*gui));
201
202    win = elm_win_add(NULL, "sorted-index-list", ELM_WIN_BASIC);
203    elm_win_title_set(win, "Sorted Index and List");
204    evas_object_smart_callback_add(win, "delete,request", test_index2_del, gui);
205    elm_win_autodel_set(win, EINA_TRUE);
206
207    bg = elm_bg_add(win);
208    elm_win_resize_object_add(win, bg);
209    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
210    evas_object_show(bg);
211
212    box = elm_box_add(win);
213    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
214    elm_win_resize_object_add(win, box);
215    evas_object_show(box);
216
217    gui->id = elm_index_add(win);
218    evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND,
219          EVAS_HINT_EXPAND);
220    elm_win_resize_object_add(win, gui->id);
221    evas_object_smart_callback_add(gui->id, "delay,changed",
222          test_index2_id_changed, NULL);
223    evas_object_show(gui->id);
224
225    gui->entry = elm_entry_add(win);
226    elm_entry_scrollable_set(gui->entry, EINA_TRUE);
227    elm_object_text_set(gui->entry, "Label");
228    elm_entry_single_line_set(gui->entry, EINA_TRUE);
229    evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0);
230    evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
231    elm_box_pack_end(box, gui->entry);
232    evas_object_show(gui->entry);
233
234    bt = elm_button_add(win);
235    elm_object_text_set(bt, "Add");
236    evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0);
237    evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
238    elm_box_pack_end(box, bt);
239    evas_object_smart_callback_add(bt, "clicked", test_index2_it_add, gui);
240    evas_object_show(bt);
241
242    gui->lst = elm_list_add(win);
243    elm_box_pack_end(box, gui->lst);
244    evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND,
245          EVAS_HINT_EXPAND);
246    evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL);
247    evas_object_smart_callback_add(gui->lst, "selected", test_index2_it_del,
248          gui);
249    elm_list_go(gui->lst);
250    evas_object_show(gui->lst);
251
252    evas_object_resize(win, 320, 480);
253    evas_object_show(win);
254 }
255 #endif