1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 #include <Elementary.h>
5 #include <Efl_Ui.h>
6 
7 
8 static Evas_Object *
_gl_content_get(void * data,Evas_Object * obj,const char * part)9 _gl_content_get(void *data, Evas_Object *obj, const char *part)
10 {
11    const int size = ELM_SCALE_SIZE(48);
12 
13    Evas_Object *content, *ly;
14    int num = (int)(uintptr_t)data;
15    char buf[PATH_MAX], bufimg[PATH_MAX], buftxt[256];
16 
17    snprintf(buf, sizeof(buf), "%s/objects/test_masking.edj", elm_app_data_dir_get());
18 
19    ly = elm_layout_add(obj);
20    elm_layout_file_set(ly, buf, "masking");
21    if (!strcmp(part, "elm.swallow.icon"))
22      {
23         content = elm_icon_add(ly);
24         //elm_image_async_open_set(icon, 1);
25         snprintf(bufimg, sizeof(bufimg), "%s/images/%s",
26                  elm_app_data_dir_get(), (num&1) ? "sky_01.jpg" : "rock_01.jpg");
27         elm_image_file_set(content, bufimg, NULL);
28         evas_object_size_hint_min_set(content, size, size);
29         evas_object_size_hint_max_set(content, size, size);
30      }
31    else // if (!strcmp(part, "elm.swallow.end"))
32      {
33         content = elm_layout_add(obj);
34         elm_layout_file_set(content, buf, "text");
35         sprintf(buftxt, "# %d #", num);
36         elm_layout_text_set(content, "text", buftxt);
37      }
38    elm_object_part_content_set(ly, "content", content);
39 
40    return ly;
41 }
42 
43 static char *
_gl_text_get(void * data,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)44 _gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
45 {
46    char buf[64];
47    sprintf(buf, "Genlist item %u", (unsigned)(uintptr_t)data);
48    return strdup(buf);
49 }
50 
51 static Eina_Bool
_gl_state_get(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,const char * part EINA_UNUSED)52 _gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED)
53 {
54    return EINA_FALSE;
55 }
56 
57 static void
_gl_del(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED)58 _gl_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
59 {
60 
61 }
62 
63 static void
_toggle_mask(void * data,const Efl_Event * ev)64 _toggle_mask(void *data, const Efl_Event *ev)
65 {
66    Eo *ly = data;
67    const char *clip = efl_key_data_get(ly, "clip");
68    const char *text;
69 
70    if (eina_streq(clip, "image"))
71      {
72         elm_layout_signal_emit(ly, "unclip", "elm_test");
73         efl_key_data_set(ly, "clip", NULL);
74         text = "Toggle mask (none)";
75      }
76    else if (eina_streq(clip, "smart"))
77      {
78         elm_layout_signal_emit(ly, "clip", "elm_test");
79         efl_key_data_set(ly, "clip", "image");
80         text = "Toggle mask (image)";
81      }
82    else if (eina_streq(clip, "text"))
83      {
84         elm_layout_signal_emit(ly, "smartclip", "elm_test");
85         efl_key_data_set(ly, "clip", "smart");
86         text = "Toggle mask (smart)";
87      }
88    else
89      {
90         elm_layout_signal_emit(ly, "textclip", "elm_test");
91         efl_key_data_set(ly, "clip", "text");
92         text = "Toggle mask (text)";
93      }
94    efl_text_set(ev->object, text);
95 }
96 
97 static void
_toggle_map(void * data,const Efl_Event * ev EINA_UNUSED)98 _toggle_map(void *data, const Efl_Event *ev EINA_UNUSED)
99 {
100    Eo *ly = data;
101 
102    if (!efl_gfx_mapping_has(ly))
103      {
104         efl_gfx_mapping_zoom(ly, 0.8, 0.8, NULL, 0.5, 0.5);
105         efl_gfx_mapping_rotate(ly, 45, NULL, 0.5, 0.5);
106      }
107    else efl_gfx_mapping_reset(ly);
108 }
109 
110 static void
_rotate_win(void * data,const Efl_Event * ev EINA_UNUSED)111 _rotate_win(void *data, const Efl_Event *ev EINA_UNUSED)
112 {
113    Eo *win = data;
114 
115    elm_win_rotation_set(win, (elm_win_rotation_get(win) + 90) % 360);
116 }
117 
118 void
test_evas_mask(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)119 test_evas_mask(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
120 {
121    Eo *win, *box, *o, *gl, *ly, *smart_mask, *box2;
122    Elm_Genlist_Item_Class *itc;
123    char buf[PATH_MAX];
124 
125    win = efl_add(EFL_UI_WIN_CLASS, efl_main_loop_get(),
126                  efl_text_set(efl_added, "Evas masking demo"),
127                  efl_ui_win_autodel_set(efl_added, 1));
128 
129    box = efl_add(EFL_UI_BOX_CLASS, win,
130                  efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL));
131    efl_content_set(win, box);
132 
133    // FIXME: No API to set background as "tile" :(
134    snprintf(buf, sizeof(buf), "%s/images/pm_fill.png", elm_app_data_dir_get());
135    efl_file_simple_load(efl_part(win, "background"), buf, NULL);
136 
137    // FIXME: layout EO API
138    snprintf(buf, sizeof(buf), "%s/objects/test_masking.edj", elm_app_data_dir_get());
139    ly = efl_add(EFL_UI_LAYOUT_CLASS, win,
140                 efl_file_set(efl_added, buf),
141                 efl_file_key_set(efl_added, "masking"),
142                 efl_key_data_set(efl_added, "clip", "image"));
143    efl_pack(box, ly);
144 
145    // FIXME: layout EO API
146    smart_mask = efl_add(EFL_UI_LAYOUT_CLASS, win,
147                 efl_file_set(efl_added, buf),
148                 efl_file_key_set(efl_added, "image"));
149    elm_object_part_content_set(ly, "mask2", smart_mask);
150 
151    // FIXME: No genlist in EO API
152    o = gl = elm_genlist_add(win);
153    elm_genlist_homogeneous_set(gl, 1);
154    efl_gfx_hint_align_set(o, -1, -1);
155    efl_gfx_hint_weight_set(o, 1, 1);
156 
157    itc = elm_genlist_item_class_new();
158    itc->item_style = "default";
159    itc->func.content_get = _gl_content_get;
160    itc->func.text_get = _gl_text_get;
161    itc->func.state_get = _gl_state_get;
162    itc->func.del = _gl_del;
163 
164    for (int i = 0; i < 64; i++)
165      {
166         elm_genlist_item_append(gl, itc,
167                                 (void *)(uintptr_t)i,
168                                 NULL, // parent
169                                 ELM_GENLIST_ITEM_NONE,
170                                 NULL, // func
171                                 NULL); // data
172      }
173 
174    elm_genlist_item_class_free(itc);
175    efl_content_set(efl_part(ly, "content"), gl);
176 
177    box2 = efl_add(EFL_UI_BOX_CLASS, win,
178                   efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL),
179                   efl_gfx_hint_weight_set(efl_added, 1.0, 0.0),
180                   efl_pack(box, efl_added));
181 
182    // FIXME: button EO API
183    efl_add(EFL_UI_BUTTON_CLASS, win,
184            efl_text_set(efl_added, "Toggle mask (image)"),
185            efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _toggle_mask, ly),
186            efl_gfx_hint_weight_set(efl_added, 0.0, 0.0),
187            efl_pack(box2, efl_added));
188 
189    efl_add(EFL_UI_BUTTON_CLASS, win,
190            efl_text_set(efl_added, "Toggle map"),
191            efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _toggle_map, ly),
192            efl_gfx_hint_weight_set(efl_added, 0.0, 0.0),
193            efl_pack(box2, efl_added));
194 
195    efl_add(EFL_UI_BUTTON_CLASS, win,
196            efl_text_set(efl_added, "Rotate Window"),
197            efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _rotate_win, win),
198            efl_gfx_hint_weight_set(efl_added, 0.0, 0.0),
199            efl_pack(box2, efl_added));
200 
201    efl_gfx_entity_size_set(win, EINA_SIZE2D(500, 600));
202 }
203