efl
582 строки · 17.2 Кб
1/*
2* gcc -o entry_example entry_example.c `pkg-config --cflags --libs elementary`
3*/
4#include <Elementary.h>
5
6typedef struct
7{
8Evas_Object *win;
9Evas_Object *edit_buffer;
10} App_Data;
11
12typedef struct
13{
14Evas_Object *inwin;
15Evas_Object *naviframe;
16Evas_Object *grid;
17Evas_Object *settings;
18
19int size;
20int vsize;
21int width, height;
22
23const char *emo;
24
25App_Data *ad;
26} App_Inwin_Data;
27
28static void
29_edit_buffer_insert(Evas_Object *e, const char *text)
30{
31elm_entry_entry_insert(e, text);
32elm_object_focus_set(e, EINA_TRUE);
33}
34
35static void
36_it_sel_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event)
37{
38App_Inwin_Data *aid = data;
39Elm_Object_Item *gg_it = event;
40
41aid->emo = elm_object_item_data_get(gg_it);
42
43elm_naviframe_item_simple_promote(aid->naviframe, aid->settings);
44}
45
46static char *
47_emo_label_get(void *data, Evas_Object *obj EINA_UNUSED,
48const char *part EINA_UNUSED)
49{
50return strdup(data);
51}
52
53static Evas_Object *
54_emo_content_get(void *data, Evas_Object *obj, const char *part)
55{
56Evas_Object *o;
57
58if (strcmp(part, "elm.swallow.icon"))
59return NULL;
60o = elm_layout_add(obj);
61if (!elm_layout_theme_set(o, "entry/emoticon", data, "default"))
62{
63fprintf(stderr, "Failed to set layout");
64return NULL;
65}
66return o;
67}
68
69static void
70_emo_del(void *data, Evas_Object *obj EINA_UNUSED)
71{
72free(data);
73}
74
75static Evas_Object *
76_page_grid_add(Evas_Object *parent, App_Inwin_Data *aid)
77{
78Evas_Object *grid;
79char *theme, *emo;
80Eina_List *emos, *it;
81static Elm_Gengrid_Item_Class *it_class;
82it_class = elm_gengrid_item_class_new();
83it_class->item_style = "default";
84it_class->func.text_get = _emo_label_get;
85it_class->func.content_get = _emo_content_get;
86it_class->func.del = _emo_del;
87
88theme = elm_theme_list_item_path_get("default", NULL);
89if (!theme) return NULL;
90emos = edje_file_collection_list(theme);
91free(theme);
92if (!emos) return NULL;
93
94grid = elm_gengrid_add(parent);
95elm_gengrid_item_size_set(grid, 64, 80);
96evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
97evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
98
99EINA_LIST_FOREACH(emos, it, emo)
100{
101char name[512];
102
103if (strncmp(emo, "elm/entry/emoticon/", 19))
104continue;
105sscanf(emo, "elm/entry/emoticon/%[^/]/default", name);
106elm_gengrid_item_append(grid, it_class, strdup(name), _it_sel_cb, aid);
107}
108edje_file_collection_list_free(emos);
109elm_gengrid_item_class_free(it_class);
110
111return grid;
112}
113
114static void
115_btn_insert_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
116{
117App_Inwin_Data *aid = data;
118const char *size[] = {
119"size",
120"absize",
121"relsize"
122};
123const char *vsize[] = {
124"full",
125"ascent"
126};
127char buf[512];
128
129snprintf(buf, sizeof(buf), "<item %s=%dx%d vsize=%s href=emoticon/%s>"
130"</item>", size[aid->size], aid->width, aid->height,
131vsize[aid->vsize], aid->emo);
132_edit_buffer_insert(aid->ad->edit_buffer, buf);
133
134evas_object_del(aid->inwin);
135}
136
137static void
138_width_changed_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
139{
140App_Inwin_Data *aid = data;
141
142aid->width = atoi(elm_object_text_get(obj));
143}
144
145static void
146_height_changed_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
147{
148App_Inwin_Data *aid = data;
149
150aid->height = atoi(elm_object_text_get(obj));
151}
152
153static Evas_Object *
154_page_settings_add(Evas_Object *parent, App_Inwin_Data *aid)
155{
156Evas_Object *box, *sizeopts, *box2, *sizebox, *vsizebox,
157*rsize, *rabsize, *rrelsize, *rvfull, *rvascent,
158*fwidth, *ewidth, *fheight, *eheight,
159*binsert;
160char buf[100];
161static Elm_Entry_Filter_Accept_Set accept_set = {
162.accepted = "0123456789",
163.rejected = NULL
164};
165static Elm_Entry_Filter_Limit_Size limit_size = {
166.max_char_count = 5,
167.max_byte_count = 0
168};
169
170box = elm_box_add(parent);
171evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
172evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
173
174sizeopts = elm_frame_add(parent);
175elm_object_text_set(sizeopts, "Size");
176evas_object_size_hint_weight_set(sizeopts, EVAS_HINT_EXPAND, 0.0);
177evas_object_size_hint_align_set(sizeopts, EVAS_HINT_FILL, EVAS_HINT_FILL);
178elm_box_pack_end(box, sizeopts);
179evas_object_show(sizeopts);
180
181box2 = elm_box_add(parent);
182evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
183evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
184elm_object_content_set(sizeopts, box2);
185evas_object_show(box2);
186
187sizebox = elm_box_add(parent);
188elm_box_horizontal_set(sizebox, EINA_TRUE);
189evas_object_size_hint_weight_set(sizebox, EVAS_HINT_EXPAND,
190EVAS_HINT_EXPAND);
191evas_object_size_hint_align_set(sizebox, EVAS_HINT_FILL, EVAS_HINT_FILL);
192elm_box_pack_end(box2, sizebox);
193evas_object_show(sizebox);
194
195rsize = elm_radio_add(parent);
196elm_object_text_set(rsize, "Scale adjusted (size)");
197elm_radio_state_value_set(rsize, 0);
198elm_radio_value_pointer_set(rsize, &aid->size);
199elm_box_pack_end(sizebox, rsize);
200evas_object_show(rsize);
201
202rabsize = elm_radio_add(parent);
203elm_object_text_set(rabsize, "Absolute size (absize)");
204elm_radio_state_value_set(rabsize, 1);
205elm_radio_value_pointer_set(rabsize, &aid->size);
206elm_radio_group_add(rabsize, rsize);
207elm_box_pack_end(sizebox, rabsize);
208evas_object_show(rabsize);
209
210rrelsize = elm_radio_add(parent);
211elm_object_text_set(rrelsize, "Relative to line (relsize)");
212elm_radio_state_value_set(rrelsize, 2);
213elm_radio_value_pointer_set(rrelsize, &aid->size);
214elm_radio_group_add(rrelsize, rsize);
215elm_box_pack_end(sizebox, rrelsize);
216evas_object_show(rrelsize);
217
218vsizebox = elm_box_add(parent);
219elm_box_horizontal_set(vsizebox, EINA_TRUE);
220evas_object_size_hint_weight_set(vsizebox, EVAS_HINT_EXPAND,
221EVAS_HINT_EXPAND);
222evas_object_size_hint_align_set(vsizebox, EVAS_HINT_FILL, EVAS_HINT_FILL);
223elm_box_pack_end(box2, vsizebox);
224evas_object_show(vsizebox);
225
226rvfull = elm_radio_add(parent);
227elm_object_text_set(rvfull, "Full height (vsize=full)");
228elm_radio_state_value_set(rvfull, 0);
229elm_radio_value_pointer_set(rvfull, &aid->vsize);
230elm_box_pack_end(vsizebox, rvfull);
231evas_object_show(rvfull);
232
233rvascent = elm_radio_add(parent);
234elm_object_text_set(rvascent, "Ascent only (vsize=ascent)");
235elm_radio_state_value_set(rvascent, 1);
236elm_radio_value_pointer_set(rvascent, &aid->vsize);
237elm_radio_group_add(rvascent, rvfull);
238elm_box_pack_end(vsizebox, rvascent);
239evas_object_show(rvascent);
240
241fwidth = elm_frame_add(parent);
242elm_object_text_set(fwidth, "Width");
243evas_object_size_hint_weight_set(fwidth, EVAS_HINT_EXPAND, 0.0);
244evas_object_size_hint_align_set(fwidth, EVAS_HINT_FILL, EVAS_HINT_FILL);
245elm_box_pack_end(box2, fwidth);
246evas_object_show(fwidth);
247
248snprintf(buf, sizeof(buf), "%d", aid->width);
249ewidth = elm_entry_add(parent);
250elm_entry_single_line_set(ewidth, EINA_TRUE);
251elm_entry_markup_filter_append(ewidth, elm_entry_filter_accept_set,
252&accept_set);
253elm_entry_markup_filter_append(ewidth, elm_entry_filter_limit_size,
254&limit_size);
255elm_object_text_set(ewidth, buf);
256evas_object_size_hint_weight_set(ewidth, EVAS_HINT_EXPAND, 0.0);
257evas_object_size_hint_align_set(ewidth, EVAS_HINT_FILL, EVAS_HINT_FILL);
258elm_object_content_set(fwidth, ewidth);
259evas_object_show(ewidth);
260
261evas_object_smart_callback_add(ewidth, "changed", _width_changed_cb, aid);
262
263fheight = elm_frame_add(parent);
264elm_object_text_set(fheight, "Height");
265evas_object_size_hint_weight_set(fheight, EVAS_HINT_EXPAND, 0.0);
266evas_object_size_hint_align_set(fheight, EVAS_HINT_FILL, EVAS_HINT_FILL);
267elm_box_pack_end(box2, fheight);
268evas_object_show(fheight);
269
270snprintf(buf, sizeof(buf), "%d", aid->height);
271eheight = elm_entry_add(parent);
272elm_entry_single_line_set(eheight, EINA_TRUE);
273elm_entry_markup_filter_append(eheight, elm_entry_filter_accept_set,
274&accept_set);
275elm_entry_markup_filter_append(eheight, elm_entry_filter_limit_size,
276&limit_size);
277elm_object_text_set(eheight, buf);
278evas_object_size_hint_weight_set(eheight, EVAS_HINT_EXPAND, 0.0);
279evas_object_size_hint_align_set(eheight, EVAS_HINT_FILL, EVAS_HINT_FILL);
280elm_object_content_set(fheight, eheight);
281evas_object_show(eheight);
282
283evas_object_smart_callback_add(eheight, "changed", _height_changed_cb, aid);
284
285binsert = elm_button_add(parent);
286elm_object_text_set(binsert, "Insert");
287elm_box_pack_end(box, binsert);
288evas_object_show(binsert);
289
290evas_object_smart_callback_add(binsert, "clicked", _btn_insert_cb, aid);
291
292return box;
293}
294
295static void
296_insert_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED,
297void *event EINA_UNUSED)
298{
299App_Inwin_Data *aid = data;
300
301evas_object_del(aid->inwin);
302}
303
304static void
305_inwin_del_cb(void *data, Evas *e EINA_UNUSED,
306Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
307{
308free(data);
309}
310
311static void
312_image_insert_cb(void *data, Evas_Object *obj EINA_UNUSED,
313void *event EINA_UNUSED)
314{
315App_Data *ad = data;
316App_Inwin_Data *aid;
317Evas_Object *inwin, *box, *box2, *naviframe, *o;
318
319aid = calloc(1, sizeof(App_Inwin_Data));
320if (!aid) return;
321
322aid->ad = ad;
323aid->size = 1;
324aid->vsize = 1;
325aid->width = 64;
326aid->height = 64;
327
328inwin = elm_win_inwin_add(ad->win);
329evas_object_size_hint_weight_set(inwin, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
330evas_object_size_hint_align_set(inwin, EVAS_HINT_FILL, EVAS_HINT_FILL);
331evas_object_show(inwin);
332
333evas_object_event_callback_add(inwin, EVAS_CALLBACK_DEL, _inwin_del_cb,
334aid);
335
336box = elm_box_add(ad->win);
337evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
338evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
339elm_win_inwin_content_set(inwin, box);
340evas_object_show(box);
341
342naviframe = elm_naviframe_add(ad->win);
343evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
344evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
345elm_box_pack_end(box, naviframe);
346evas_object_show(naviframe);
347
348o = _page_grid_add(ad->win, aid);
349elm_naviframe_item_simple_push(naviframe, o);
350aid->grid = o;
351
352o = _page_settings_add(ad->win, aid);
353elm_naviframe_item_simple_push(naviframe, o);
354aid->settings = o;
355
356elm_naviframe_item_simple_promote(naviframe, aid->grid);
357
358box2 = elm_box_add(ad->win);
359elm_box_horizontal_set(box2, EINA_TRUE);
360evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.0);
361evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
362elm_box_pack_end(box, box2);
363evas_object_show(box2);
364
365o = elm_button_add(ad->win);
366elm_object_text_set(o, "Cancel");
367evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
368evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
369elm_box_pack_end(box2, o);
370evas_object_show(o);
371
372evas_object_smart_callback_add(o, "clicked", _insert_cancel_cb, aid);
373
374aid->inwin = inwin;
375aid->naviframe = naviframe;
376}
377
378static void
379_format_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
380{
381App_Data *ad = data;
382char fmt_open[5], fmt_close[6];
383const char *sel;
384int cursor;
385char *s;
386const char *ptr, *what;
387Eina_Strbuf *buf = NULL;
388
389sel = elm_object_text_get(obj);
390snprintf(fmt_open, sizeof(fmt_open), "<%s>", sel);
391snprintf(fmt_close, sizeof(fmt_close), "</%s>", sel);
392
393buf = eina_strbuf_new();
394
395cursor = elm_entry_cursor_pos_get(ad->edit_buffer);
396elm_entry_cursor_begin_set(ad->edit_buffer);
397elm_entry_cursor_selection_begin(ad->edit_buffer);
398elm_entry_cursor_pos_set(ad->edit_buffer, cursor);
399elm_entry_cursor_selection_end(ad->edit_buffer);
400sel = elm_entry_selection_get(ad->edit_buffer);
401if (!sel || !sel[0])
402{
403eina_strbuf_append(buf, fmt_open);
404goto all_done;
405}
406what = fmt_open;
407ptr = sel;
408while ((s = strstr(ptr, what)))
409{
410ptr = s + strlen(what);
411if (what == fmt_open) what = fmt_close;
412else what = fmt_open;
413}
414eina_strbuf_append(buf, what);
415if (what == fmt_close)
416{
417elm_entry_cursor_selection_begin(ad->edit_buffer);
418elm_entry_cursor_end_set(ad->edit_buffer);
419elm_entry_cursor_selection_end(ad->edit_buffer);
420sel = elm_entry_selection_get(ad->edit_buffer);
421if (sel)
422{
423Eina_Strbuf *buf2 = eina_strbuf_new();
424eina_strbuf_append(buf2, sel);
425eina_strbuf_replace_first(buf2, fmt_close, "");
426elm_entry_entry_insert(ad->edit_buffer,
427eina_strbuf_string_get(buf2));
428eina_strbuf_free(buf2);
429}
430}
431elm_entry_select_none(ad->edit_buffer);
432elm_entry_cursor_pos_set(ad->edit_buffer, cursor);
433
434all_done:
435_edit_buffer_insert(ad->edit_buffer, eina_strbuf_string_get(buf));
436eina_strbuf_free(buf);
437}
438
439static void
440_autosave_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED)
441{
442App_Data *ad = data;
443Eina_Bool state = elm_check_state_get(obj);
444
445elm_entry_autosave_set(ad->edit_buffer, state);
446if (state) elm_entry_file_save(ad->edit_buffer);
447}
448
449static void
450_edit_dblclick_cb(void *data EINA_UNUSED, Evas_Object *obj,
451void *event EINA_UNUSED)
452{
453int current_cursor;
454
455current_cursor = elm_entry_cursor_pos_get(obj);
456
457while (elm_entry_cursor_prev(obj))
458{
459const char *content;
460if (elm_entry_cursor_is_visible_format_get(obj))
461break;
462content = elm_entry_cursor_content_get(obj);
463if (content && (content[0] == ' '))
464break;
465}
466
467if (current_cursor == elm_entry_cursor_pos_get(obj))
468return;
469
470elm_entry_cursor_next(obj);
471elm_entry_cursor_selection_begin(obj);
472elm_entry_cursor_pos_set(obj, current_cursor);
473while (elm_entry_cursor_next(obj))
474{
475const char *content;
476if (elm_entry_cursor_is_visible_format_get(obj))
477break;
478content = elm_entry_cursor_content_get(obj);
479if (content && (content[0] == ' '))
480break;
481}
482elm_entry_cursor_selection_end(obj);
483}
484
485static void
486_edit_tplclick_cb(void *data EINA_UNUSED, Evas_Object *obj,
487void *event EINA_UNUSED)
488{
489elm_entry_cursor_line_begin_set(obj);
490elm_entry_cursor_selection_begin(obj);
491elm_entry_cursor_line_end_set(obj);
492elm_entry_cursor_selection_end(obj);
493}
494
495EAPI_MAIN int
496elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
497{
498Evas_Object *win, *box, *tb, *en, *o, *icon;
499App_Data app;
500
501memset(&app, 0, sizeof(app));
502
503elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
504
505win = elm_win_util_standard_add("entry-example", "Emacs Lite");
506elm_win_autodel_set(win, EINA_TRUE);
507
508box = elm_box_add(win);
509evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
510elm_win_resize_object_add(win, box);
511evas_object_show(box);
512
513tb = elm_box_add(win);
514elm_box_horizontal_set(tb, EINA_TRUE);
515evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0);
516evas_object_size_hint_weight_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
517elm_box_pack_end(box, tb);
518evas_object_show(tb);
519
520o = elm_check_add(win);
521elm_check_state_set(o, EINA_FALSE);
522elm_object_text_set(o, "Autosave");
523elm_box_pack_end(tb, o);
524evas_object_show(o);
525
526evas_object_smart_callback_add(o, "changed", _autosave_change_cb, &app);
527
528o = elm_button_add(win);
529elm_object_text_set(o, "b");
530elm_box_pack_end(tb, o);
531evas_object_show(o);
532
533evas_object_smart_callback_add(o, "clicked", _format_change_cb, &app);
534
535o = elm_button_add(win);
536elm_object_text_set(o, "em");
537elm_box_pack_end(tb, o);
538evas_object_show(o);
539
540evas_object_smart_callback_add(o, "clicked", _format_change_cb, &app);
541
542o = elm_button_add(win);
543elm_box_pack_end(tb, o);
544evas_object_show(o);
545
546icon = elm_layout_add(win);
547
548if (!elm_layout_theme_set(
549icon, "entry", "emoticon/haha", "default"))
550fprintf(stderr, "Failed to set layout");
551
552elm_object_part_content_set(o, "icon", icon);
553
554evas_object_smart_callback_add(o, "clicked", _image_insert_cb, &app);
555
556en = elm_entry_add(win);
557elm_entry_autosave_set(en, EINA_FALSE);
558elm_entry_file_set(en, "/tmp/da_test.txt", ELM_TEXT_FORMAT_MARKUP_UTF8);
559evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
560evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
561elm_box_pack_end(box, en);
562evas_object_show(en);
563
564app.win = win;
565app.edit_buffer = en;
566
567evas_object_smart_callback_add(en, "clicked,double", _edit_dblclick_cb,
568NULL);
569evas_object_smart_callback_add(en, "clicked,triple", _edit_tplclick_cb,
570NULL);
571
572elm_object_focus_set(app.edit_buffer, EINA_TRUE);
573
574evas_object_resize(win, 300, 780);
575
576evas_object_show(win);
577
578elm_run();
579
580return 0;
581}
582ELM_MAIN()
583