diff options
Diffstat (limited to 'src/entry.c')
-rw-r--r-- | src/entry.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/src/entry.c b/src/entry.c new file mode 100644 index 0000000..600fb4f --- /dev/null +++ b/src/entry.c @@ -0,0 +1,269 @@ +#include "main.h" +#include "util.h" + + +static Evas_Object *entry, *table, *check, *icon = NULL; +static Eina_Bool ck1; +static Eina_Bool is_pin_style; + +char *_en_styles[] = +{ + "default", + "vcenter_align", + "editfield", + NULL +}; + +static void _preedit_cb(void *data, Evas_Object *obj, void *event_info) +{ + int x; + Ecore_IMF_Context *imf_context = data; + char im_data[30] = "entrylimit=20&entrycharlen=0"; + + x = eina_unicode_utf8_get_len(elm_object_text_get(obj)); + sprintf(im_data, "entrylimit=20&entrycharlen=%d",x); + ecore_imf_context_input_panel_imdata_set(imf_context, im_data, eina_unicode_utf8_get_len(im_data)+1); +} + +static void _preedit_pin_cb(void *data, Evas_Object *obj, void *event_info) +{ + int x; + Ecore_IMF_Context *imf_context = data; + char im_data[30] = "entrylimit=1&entrycharlen=0"; + + x = eina_unicode_utf8_get_len(elm_object_text_get(obj)); + sprintf(im_data, "entrylimit=1&entrycharlen=%d",x); + ecore_imf_context_input_panel_imdata_set(imf_context, im_data, eina_unicode_utf8_get_len(im_data)+1); +} + +static void +pin_style() +{ + Evas_Object *en, *rect; + static Elm_Entry_Filter_Limit_Size limit_filter_data; + Ecore_IMF_Context *imf_context; + + elm_table_clear(table, EINA_TRUE); + elm_table_padding_set(table, 50, 0); + elm_table_homogeneous_set(table, EINA_TRUE); + + rect = evas_object_rectangle_add(evas_object_evas_get(table)); + evas_object_size_hint_min_set(rect, 240, 0); + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rect, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, rect, 0, 0, 4, 1); + + en = elm_entry_add(table); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_style_set(en, "input.field.pin"); + elm_object_text_set(en, ""); + elm_entry_password_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_table_pack(table, en, 0, 0, 1, 1); + evas_object_show(en); + + imf_context = elm_entry_imf_context_get(en); + limit_filter_data.max_char_count = 1; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_add(en, "preedit,changed", _preedit_pin_cb, imf_context); + evas_object_smart_callback_add(en, "changed", _preedit_pin_cb, imf_context); + + en = elm_entry_add(table); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_style_set(en, "input.field.pin"); + elm_object_text_set(en, ""); + elm_entry_password_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_table_pack(table, en, 1, 0, 1, 1); + evas_object_show(en); + + imf_context = elm_entry_imf_context_get(en); + limit_filter_data.max_char_count = 1; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_add(en, "preedit,changed", _preedit_pin_cb, imf_context); + evas_object_smart_callback_add(en, "changed", _preedit_pin_cb, imf_context); + + en = elm_entry_add(table); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_style_set(en, "input.field.pin"); + elm_object_text_set(en, ""); + elm_entry_password_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_table_pack(table, en, 2, 0, 1, 1); + evas_object_show(en); + + imf_context = elm_entry_imf_context_get(en); + limit_filter_data.max_char_count = 1; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_add(en, "preedit,changed", _preedit_pin_cb, imf_context); + evas_object_smart_callback_add(en, "changed", _preedit_pin_cb, imf_context); + + en = elm_entry_add(table); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_style_set(en, "input.field.pin"); + elm_object_text_set(en, ""); + elm_entry_password_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_table_pack(table, en, 3, 0, 1, 1); + evas_object_show(en); + + imf_context = elm_entry_imf_context_get(en); + limit_filter_data.max_char_count = 1; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_add(en, "preedit,changed", _preedit_pin_cb, imf_context); + evas_object_smart_callback_add(en, "changed", _preedit_pin_cb, imf_context); +} + +static void +_en_selected(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *en, *rect; + const char *txt = elm_object_item_text_get(event_info); + + if (!strcmp(txt, elm_object_text_get(obj))) return; + + // 1. pin style -> normal style + if (is_pin_style) + { + elm_table_clear(table, EINA_TRUE); + is_pin_style = EINA_FALSE; + + entry = en = elm_entry_add(table); + elm_object_text_set(en, "Input Field"); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_table_pack(table, en, 0, 0, 1, 1); + evas_object_show(en); + + rect = evas_object_rectangle_add(evas_object_evas_get(table)); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(rect, 400, 0); + elm_table_pack(table, rect, 0, 0, 1, 1); + + elm_object_style_set(en, txt); + elm_object_disabled_set(check, EINA_FALSE); + } + // 2. normal style -> pin style + else if (!is_pin_style && !strcmp(txt, "input.field.pin")) + { + elm_table_clear(table, EINA_TRUE); + if (icon) + { + evas_object_del(icon); + icon = NULL; + } + pin_style(); + is_pin_style = EINA_TRUE; + elm_object_disabled_set(check, EINA_TRUE); + } + // 3. normal style -> normal style + else + { + elm_object_style_set(entry, txt); + } + + // icon set + if (!strcmp(txt, "input.field.icon") || !strcmp(txt, "input.field.small.icon")) + { + if (!icon) + { + icon = elm_icon_add(entry); + elm_image_file_set(icon, IMAGE_DIR"ico_lock_nor.png", NULL); + evas_object_color_set(icon, 0, 0, 0, 255); + } + elm_object_part_content_set(entry, "icon", icon); + } + else + { + if (icon) + { + evas_object_del(icon); + icon = NULL; + } + } +} + +static void _ck_changed(void *data, Evas_Object *obj, void *event_info) +{ + int val = (int) data; + static Elm_Entry_Filter_Limit_Size limit_filter_data; + Ecore_IMF_Context *imf_context; + + if (val == 1) + { + if (ck1) + { + imf_context = elm_entry_imf_context_get(entry); + + limit_filter_data.max_char_count = 20; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_add(entry, "preedit,changed", _preedit_cb, imf_context); + evas_object_smart_callback_add(entry, "changed", _preedit_cb, imf_context); + } + else + { + imf_context = elm_entry_imf_context_get(entry); + elm_entry_markup_filter_remove(entry, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_smart_callback_del_full(entry, "preedit,changed", _preedit_cb, imf_context); + evas_object_smart_callback_del_full(entry, "changed", _preedit_cb, imf_context); + } + } +} + +void entry_del_cb(void *data) +{ + appdata *ad = data; + evas_object_smart_callback_del(ad->style_hov, "selected", _en_selected); + if (icon) + { + evas_object_del(icon); + icon = NULL; + } +} + +Evas_Object *entry_cb(void *data) +{ + Evas_Object *wbox, *obox, *en, *tb, *ck; + appdata *ad = data; + + wbox = ad->widget_box; + obox = ad->option_box; + + // widget box + en = elm_entry_add(wbox); + tb = widget_min_set(en, wbox, ELM_SCALE_SIZE(400), 0); + evas_object_event_callback_add(tb, EVAS_CALLBACK_DEL, table_del_cb, NULL); + elm_object_text_set(en, "Input Field"); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_box_pack_end(wbox, tb); + evas_object_show(tb); + evas_object_show(en); + + table = tb; + entry = en; + is_pin_style = EINA_FALSE; + evas_object_smart_callback_add(ad->style_hov, "selected", _en_selected, NULL); + + // option box + ck = elm_check_add(obox); + elm_object_text_set(ck, " Limit # of Characters to 20"); + elm_check_state_pointer_set(ck, &ck1); + evas_object_smart_callback_add(ck, "changed", _ck_changed, (void *)1); + evas_object_show(ck); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(obox, ck); + check = ck; + + return table; +} |