and improve factory massively.. no more "hangs" while scrolling massiv
[framework/uifw/elementary.git] / src / bin / test_factory.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 // 64 ^ 5 = 1 billion (or so)
8 //#define BLOK 64
9 // homogenous layout
10 //#define HOMOG 1
11
12 // 32 ^ 5 = 33mil
13 #define BLOK 32
14 // homogenous layout
15 //#define HOMOG 1
16
17 static void
18 fac_unrealize(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
19 {
20    // setting factory content to null deletes it
21    printf("--------DELETE for factory %p [f: %p]\n", elm_factory_content_get(obj), obj);
22    elm_factory_content_set(obj, NULL);
23 }
24
25 static void
26 fac_realize_end(void *data, Evas_Object *obj, void *event_info __UNUSED__)
27 {
28    Evas_Object *win = data;
29    Evas_Object *bx, *bt;
30    int i;
31
32    bx = elm_box_add(win);
33    printf("    ADD lv 4 = %p [%i]\n", bx, (BLOK * (int)evas_object_data_get(obj, "num")));
34 #ifdef HOMOG   
35    elm_box_homogeneous_set(bx, EINA_TRUE);
36 #endif
37    
38    for (i = 0; i < BLOK; i++)
39      {
40         char buf[32];
41
42         snprintf(buf, sizeof(buf), "%i",
43                  (i + (BLOK * (int)evas_object_data_get(obj, "num"))));
44
45         bt = elm_button_add(win);
46         evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
47         evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
48         elm_object_text_set(bt, buf);
49         elm_box_pack_end(bx, bt);
50         evas_object_show(bt);
51      }
52
53    elm_factory_content_set(obj, bx);
54    evas_object_show(bx);
55 }
56
57 static void
58 fac_realize3(void *data, Evas_Object *obj, void *event_info __UNUSED__)
59 {
60    Evas_Object *win = data;
61    Evas_Object *bx, *fc;
62    int i;
63
64    bx = elm_box_add(win);
65    printf("   ADD lv 3 = %p [%i]\n", bx, (BLOK * (int)evas_object_data_get(obj, "num")));
66 #ifdef HOMOG   
67    elm_box_homogeneous_set(bx, EINA_TRUE);
68 #endif
69    
70    for (i = 0; i < BLOK; i++)
71      {
72         fc = elm_factory_add(win);
73         // initial height per factory of 1000
74         // scrollbar will be wrong until enough
75         // children have been realized and the
76         // real size is known
77         evas_object_data_set(fc, "num", (void *)(i + (BLOK * (int)evas_object_data_get(obj, "num"))));
78         evas_object_size_hint_min_set(fc, 0, 1000);
79         evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
80         evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
81         evas_object_smart_callback_add(fc, "realize", fac_realize_end, win);
82         evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
83         elm_box_pack_end(bx, fc);
84         evas_object_show(fc);
85      }
86
87    elm_factory_content_set(obj, bx);
88    evas_object_show(bx);
89 }
90
91 static void
92 fac_realize2(void *data, Evas_Object *obj, void *event_info __UNUSED__)
93 {
94    Evas_Object *win = data;
95    Evas_Object *bx, *fc;
96    int i;
97
98    bx = elm_box_add(win);
99    printf("  ADD lv 2 = %p [%i]\n", bx, (BLOK * (int)evas_object_data_get(obj, "num")));
100 #ifdef HOMOG   
101    elm_box_homogeneous_set(bx, EINA_TRUE);
102 #endif
103    
104    for (i = 0; i < BLOK; i++)
105      {
106         fc = elm_factory_add(win);
107         // initial height per factory of 1000
108         // scrollbar will be wrong until enough
109         // children have been realized and the
110         // real size is known
111         evas_object_data_set(fc, "num", (void *)(i + (BLOK * (int)evas_object_data_get(obj, "num"))));
112         evas_object_size_hint_min_set(fc, 0, 1000);
113         evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
114         evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
115         evas_object_smart_callback_add(fc, "realize", fac_realize3, win);
116         evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
117         elm_box_pack_end(bx, fc);
118         evas_object_show(fc);
119      }
120
121    elm_factory_content_set(obj, bx);
122    evas_object_show(bx);
123 }
124
125 static void
126 fac_realize1(void *data, Evas_Object *obj, void *event_info __UNUSED__)
127 {
128    Evas_Object *win = data;
129    Evas_Object *bx, *fc;
130    int i;
131
132    bx = elm_box_add(win);
133    printf(" ADD lv 1 = %p [%i]\n", bx, (BLOK * (int)evas_object_data_get(obj, "num")));
134 #ifdef HOMOG   
135    elm_box_homogeneous_set(bx, EINA_TRUE);
136 #endif
137    
138    for (i = 0; i < BLOK; i++)
139      {
140         fc = elm_factory_add(win);
141         // initial height per factory of 1000
142         // scrollbar will be wrong until enough
143         // children have been realized and the
144         // real size is known
145         evas_object_data_set(fc, "num", (void *)(i + (BLOK * (int)evas_object_data_get(obj, "num"))));
146         evas_object_size_hint_min_set(fc, 0, 1000);
147         evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
148         evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
149         evas_object_smart_callback_add(fc, "realize", fac_realize2, win);
150         evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
151         elm_box_pack_end(bx, fc);
152         evas_object_show(fc);
153      }
154
155    elm_factory_content_set(obj, bx);
156    evas_object_show(bx);
157 }
158
159 void
160 test_factory(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
161 {
162    Evas_Object *win, *bg, *bx, *sc, *fc;
163    int i;
164
165    win = elm_win_add(NULL, "factory", ELM_WIN_BASIC);
166    elm_win_title_set(win, "Factory");
167    elm_win_autodel_set(win, EINA_TRUE);
168
169    bg = elm_bg_add(win);
170    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
171    elm_win_resize_object_add(win, bg);
172    evas_object_show(bg);
173
174    bx = elm_box_add(win);
175 #ifdef HOMOG   
176    elm_box_homogeneous_set(bx, EINA_TRUE);
177 #endif   
178    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
179
180    for (i = 0; i < BLOK; i++)
181      {
182         fc = elm_factory_add(win);
183         // initial height per factory of 1000
184         // scrollbar will be wrong until enough
185         // children have been realized and the
186         // real size is known
187         evas_object_data_set(fc, "num", (void *)i);
188         evas_object_size_hint_min_set(fc, 0, 1000);
189         evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
190         evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL);
191         evas_object_smart_callback_add(fc, "realize", fac_realize1, win);
192         evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win);
193         elm_box_pack_end(bx, fc);
194         evas_object_show(fc);
195      }
196
197    sc = elm_scroller_add(win);
198    elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
199    evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
200    elm_win_resize_object_add(win, sc);
201
202    elm_scroller_content_set(sc, bx);
203    evas_object_show(bx);
204
205    evas_object_show(sc);
206
207    evas_object_resize(win, 320, 480);
208    evas_object_show(win);
209 }
210 #endif