hermet pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=f05dca3a22e538458d195913e73e67b512e41745
commit f05dca3a22e538458d195913e73e67b512e41745 Author: Jaehyun Cho <[email protected]> Date: Tue Dec 9 11:09:36 2014 +0900 Change the way of activating candidate ctxpopup. Summary: Change the way of activating candidate ctxpopup. @feature Reviewers: Hermet Differential Revision: https://phab.enlightenment.org/D1729 --- src/lib/ctxpopup.c | 170 ++++++++++++++++++++++++++------------- src/lib/edc_editor.c | 31 +++++++- src/lib/edc_parser.c | 194 ++++++++++++++++++++++++++++++++------------- src/lib/enventor_private.h | 10 ++- 4 files changed, 295 insertions(+), 110 deletions(-) diff --git a/src/lib/ctxpopup.c b/src/lib/ctxpopup.c index 980da82..2fc61e3 100644 --- a/src/lib/ctxpopup.c +++ b/src/lib/ctxpopup.c @@ -43,44 +43,66 @@ btn_minus_cb(void *data, Evas_Object *obj EINA_UNUSED, } static void -ctxpopup_it_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +ctxpopup_it_cb(void *data, Evas_Object *obj, void *event_info) { + attr_value *attr = data; Elm_Object_Item *it = event_info; ctxpopup_data *ctxdata = evas_object_data_get(obj, "ctxpopup_data"); - ctxdata->selected_cb(ctxdata->data, obj, - (void *) elm_object_item_text_get(it)); + const char *text = elm_object_item_text_get(it); + char candidate[128]; + + snprintf(candidate, sizeof(candidate), "%s%s%s", attr->prepend_str, text, + attr->append_str); + + ctxdata->selected_cb(ctxdata->data, obj, (void *) candidate); } static void -slider_dismiss_cb(void *data EINA_UNUSED, Evas_Object *obj, - void *event_info EINA_UNUSED) +slider_dismiss_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { - Evas_Object *layout = elm_object_content_get(obj); - Evas_Object *slider = elm_object_part_content_get(layout, - "elm.swallow.slider"); + attr_value *attr = data; + Evas_Object *box = elm_object_content_get(obj); + Evas_Object *layout; + Evas_Object *slider; + Eina_List *box_children = elm_box_children_get(box); + Eina_List *l; + char candidate[512]; char buf[128]; - attr_value *attr = evas_object_data_get(slider, "attr"); - if (attr->type & ATTR_VALUE_INTEGER) - { - snprintf(buf, sizeof(buf), "%d", - (int) roundf(elm_slider_value_get(slider))); - } - else + + if (eina_list_count(box_children) == 0) return; + + snprintf(candidate, sizeof(candidate), "%s", attr->prepend_str); + + EINA_LIST_FOREACH(box_children, l, layout) { - //if the last digit number is 0 then round up. - double val = elm_slider_value_get(slider); - snprintf(buf, sizeof(buf), "%0.2f", val); - double round_down = atof(buf); - snprintf(buf, sizeof(buf), "%0.1f", val); - double round_down2 = atof(buf); - if (fabs(round_down - round_down2) < 0.0005) - snprintf(buf, sizeof(buf), "%0.1f", val); + slider = elm_object_part_content_get(layout, + "elm.swallow.slider"); + if (attr->type & ATTR_VALUE_INTEGER) + { + snprintf(buf, sizeof(buf), "%d", + (int) roundf(elm_slider_value_get(slider))); + } else - snprintf(buf, sizeof(buf), "%0.2f", val); + { + //if the last digit number is 0 then round up. + double val = elm_slider_value_get(slider); + snprintf(buf, sizeof(buf), "%0.2f", val); + double round_down = atof(buf); + snprintf(buf, sizeof(buf), "%0.1f", val); + double round_down2 = atof(buf); + if (fabs(round_down - round_down2) < 0.0005) + snprintf(buf, sizeof(buf), "%0.1f", val); + else + snprintf(buf, sizeof(buf), "%0.2f", val); + } + strcat(candidate, buf); + strcat(candidate, " "); } + candidate[strlen(candidate) - 1] = '\0'; //Remove last appended " ". + strcat(candidate, attr->append_str); ctxpopup_data *ctxdata = evas_object_data_get(obj, "ctxpopup_data"); - ctxdata->selected_cb(ctxdata->data, obj, buf); + ctxdata->selected_cb(ctxdata->data, obj, candidate); } static void @@ -90,14 +112,14 @@ ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, free(data); } -static void -slider_layout_set(Evas_Object *ctxpopup, attr_value *attr, double slider_val, - void *data, Eina_Bool integer) +static Evas_Object * +slider_layout_create(Evas_Object *parent, attr_value *attr, + double slider_val, Eina_Bool integer) { //Layout - Evas_Object *layout = elm_layout_add(ctxpopup); + Evas_Object *layout = elm_layout_add(parent); elm_layout_file_set(layout, EDJE_PATH, "slider_layout"); - elm_object_content_set(ctxpopup, layout); + evas_object_show(layout); /* FIXME: Disable slider and it's button's focus since scroller has weired focus region show from this. Actually we don't need focus from here @@ -140,37 +162,69 @@ slider_layout_set(Evas_Object *ctxpopup, attr_value *attr, double slider_val, elm_image_file_set(img, EDJE_PATH, "plus"); elm_object_content_set(btn, img); + return layout; +} + +static void +slider_layout_set(Evas_Object *ctxpopup, attr_value *attr, Eina_Bool integer) +{ + Eina_Stringshare *type; + Eina_Array_Iterator itr; + int i; + + //Box + Evas_Object *box = elm_box_add(ctxpopup); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + //Layout + Evas_Object *layout; + for (i = 0; i < attr->cnt; i++) + { + layout = slider_layout_create(box, attr, attr->val[i], integer); + elm_box_pack_end(box, layout); + } + + elm_object_content_set(ctxpopup, box); evas_object_smart_callback_add(ctxpopup, "dismissed", slider_dismiss_cb, - data); + (void *) attr); } static void -constant_candidate_set(Evas_Object *ctxpopup, attr_value *attr, void *data) +constant_candidate_set(Evas_Object *ctxpopup, attr_value *attr) { Eina_Stringshare *candidate; Eina_Array_Iterator itr; unsigned int i; EINA_ARRAY_ITER_NEXT(attr->strs, i, candidate, itr) - elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, data); + elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, + (void *) attr); } static Eina_Bool -part_candidate_set(Evas_Object *ctxpopup, void *data) +part_candidate_set(Evas_Object *ctxpopup, attr_value *attr) { view_data *vd = edj_mgr_view_get(NULL); if (!vd) return EINA_FALSE; Eina_List *parts = view_parts_list_get(vd); Eina_List *l; char *part; + char candidate[128]; EINA_LIST_FOREACH(parts, l, part) - elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, data); + { + snprintf(candidate, sizeof(candidate), "\"%s\"", part); + elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, + (void *) attr); + } view_string_list_free(parts); return EINA_TRUE; } static Eina_Bool -image_candidate_set(Evas_Object *ctxpopup, void *data) +image_candidate_set(Evas_Object *ctxpopup, attr_value *attr) { view_data *vd = edj_mgr_view_get(NULL); if (!vd) return EINA_FALSE; @@ -178,39 +232,44 @@ image_candidate_set(Evas_Object *ctxpopup, void *data) Eina_List *l; char *part; EINA_LIST_FOREACH(parts, l, part) - elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, data); + elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, + (void *) attr); view_string_list_free(parts); return EINA_TRUE; } static Eina_Bool -program_candidate_set(Evas_Object *ctxpopup, void *data) +program_candidate_set(Evas_Object *ctxpopup, attr_value *attr) { view_data *vd = edj_mgr_view_get(NULL); if (!vd) return EINA_FALSE; Eina_List *parts = view_programs_list_get(vd); Eina_List *l; char *part; + char candidate[128]; EINA_LIST_FOREACH(parts, l, part) - elm_ctxpopup_item_append(ctxpopup, part, NULL, ctxpopup_it_cb, data); + { + snprintf(candidate, sizeof(candidate), "\"%s\"", part); + elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, + (void *) attr); + } view_string_list_free(parts); return EINA_TRUE; } static Eina_Bool -state_candidate_set(Evas_Object *ctxpopup, void *data, Eina_Bool prog) +state_candidate_set(Evas_Object *ctxpopup, attr_value *attr, edit_data *ed) { view_data *vd = edj_mgr_view_get(NULL); if (!vd) return EINA_FALSE; - edit_data *ed = data; Eina_Stringshare *program = NULL; Eina_List *targets = NULL; Eina_Stringshare *target = NULL; Eina_Bool ret = EINA_FALSE; //Trace the part name from the program. - if (prog) + if (attr->program) { program = edit_cur_prog_name_get(ed); if (!program) return EINA_FALSE; @@ -233,9 +292,12 @@ state_candidate_set(Evas_Object *ctxpopup, void *data, Eina_Bool prog) Eina_List *l; char *state; + char candidate[128]; EINA_LIST_FOREACH(converted, l, state) { - elm_ctxpopup_item_append(ctxpopup, state, NULL, ctxpopup_it_cb, data); + snprintf(candidate, sizeof(candidate), "\"%s\"", state); + elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, + (void *) attr); free(state); } view_string_list_free(states); @@ -244,7 +306,7 @@ state_candidate_set(Evas_Object *ctxpopup, void *data, Eina_Bool prog) end: eina_stringshare_del(program); view_string_list_free(targets); - if (!prog && target) eina_stringshare_del(target); + if (!attr->program && target) eina_stringshare_del(target); return ret; } @@ -338,7 +400,6 @@ ctxpopup_img_preview_create(edit_data *ed, Evas_Object * ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, - double slider_val, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_selected_cb) { @@ -347,7 +408,10 @@ ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, if (!ctxpopup) return NULL; elm_object_style_set(ctxpopup, "enventor"); - + elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_RIGHT, + ELM_CTXPOPUP_DIRECTION_LEFT, + ELM_CTXPOPUP_DIRECTION_UP, + ELM_CTXPOPUP_DIRECTION_DOWN); //ctxpopup data ctxpopup_data *ctxdata = malloc(sizeof(ctxpopup_data)); if (!ctxdata) @@ -363,37 +427,37 @@ ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, { case ATTR_VALUE_INTEGER: { - slider_layout_set(ctxpopup, attr, slider_val, ed, EINA_TRUE); + slider_layout_set(ctxpopup, attr, EINA_TRUE); break; } case ATTR_VALUE_FLOAT: { - slider_layout_set(ctxpopup, attr, slider_val, ed, EINA_FALSE); + slider_layout_set(ctxpopup, attr, EINA_FALSE); break; } case ATTR_VALUE_CONSTANT: { - constant_candidate_set(ctxpopup, attr, ed); + constant_candidate_set(ctxpopup, attr); break; } case ATTR_VALUE_PART: { - if (!part_candidate_set(ctxpopup, ed)) goto err; + if (!part_candidate_set(ctxpopup, attr)) goto err; break; } case ATTR_VALUE_STATE: { - if (!state_candidate_set(ctxpopup, ed, attr->program)) goto err; + if (!state_candidate_set(ctxpopup, attr, ed)) goto err; break; } case ATTR_VALUE_IMAGE: { - if (!image_candidate_set(ctxpopup, ed)) goto err; + if (!image_candidate_set(ctxpopup, attr)) goto err; break; } case ATTR_VALUE_PROGRAM: { - if (!program_candidate_set(ctxpopup, ed)) goto err; + if (!program_candidate_set(ctxpopup, attr)) goto err; break; } } diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c index e551ac4..764915f 100644 --- a/src/lib/edc_editor.c +++ b/src/lib/edc_editor.c @@ -276,6 +276,31 @@ ctxpopup_candidate_selected_cb(void *data, Evas_Object *obj, void *event_info) { edit_data *ed = data; const char *text = event_info; + char *ch; + int cur_pos, end_pos; + int i; + + cur_pos = elm_entry_cursor_pos_get(ed->en_edit); + elm_entry_cursor_line_end_set(ed->en_edit); + end_pos = elm_entry_cursor_pos_get(ed->en_edit); + + for (i = cur_pos; i <= end_pos; i++) + { + elm_entry_cursor_pos_set(ed->en_edit, i); + ch = elm_entry_cursor_content_get(ed->en_edit); + if (!strcmp(ch, ";")) + { + //1 more space for end_pos to replace until ';'. + end_pos = elm_entry_cursor_pos_get(ed->en_edit) + 1; + break; + } + } + + elm_entry_cursor_pos_set(ed->en_edit, cur_pos); + elm_entry_cursor_selection_begin(ed->en_edit); + elm_entry_cursor_pos_set(ed->en_edit, end_pos); + elm_entry_cursor_selection_end(ed->en_edit); + redoundo_text_relative_push(ed->rd, text); elm_entry_entry_insert(ed->en_edit, text); elm_ctxpopup_dismiss(obj); @@ -438,12 +463,14 @@ image_preview_show(edit_data *ed, char *cur, Evas_Coord x, Evas_Coord y) static void candidate_list_show(edit_data *ed, char *text, char *cur, char *selected) { - attr_value * attr = parser_attribute_get(ed->pd, text, cur); + attr_value * attr = parser_attribute_get(ed->pd, text, cur, selected); if (!attr) return; + parser_attribute_value_set(attr, cur); + //Show up the list of the types Evas_Object *ctxpopup = - ctxpopup_candidate_list_create(ed, attr, atof(selected), + ctxpopup_candidate_list_create(ed, attr, ctxpopup_candidate_dismiss_cb, ctxpopup_candidate_selected_cb); if (!ctxpopup) return; diff --git a/src/lib/edc_parser.c b/src/lib/edc_parser.c index 1ca4d58..77059f3 100644 --- a/src/lib/edc_parser.c +++ b/src/lib/edc_parser.c @@ -7,6 +7,11 @@ #include <Enventor.h> #include "enventor_private.h" +const char ATTR_PREPEND_COLON[] = ": "; +const char ATTR_PREPEND_NONE[] = " "; +const char ATTR_APPEND_SEMICOLON[] = ";"; +const char ATTR_APPEND_STATE_VAL[] = " 0.0;"; + struct parser_s { Eina_Inarray *attrs; @@ -18,7 +23,6 @@ typedef struct parser_attr_s { Eina_Stringshare *keyword; attr_value value; - Eina_Bool instring : 1; } parser_attr; typedef struct cur_name_thread_data_s @@ -263,9 +267,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(types, eina_stringshare_add("SPACER")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("type:"); + attr.keyword = eina_stringshare_add("type"); attr.value.strs = types; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); Eina_Array *comps = eina_array_new(4); @@ -275,9 +281,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(comps, eina_stringshare_add("LOSSY")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("image:"); + attr.keyword = eina_stringshare_add("image"); attr.value.strs = comps; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); Eina_Array *trans = eina_array_new(11); @@ -294,9 +302,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(trans, eina_stringshare_add("CUBIC_BEZIER")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("transition:"); + attr.keyword = eina_stringshare_add("transition"); attr.value.strs = trans; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); Eina_Array *aspect_mode = eina_array_new(5); @@ -307,9 +317,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(aspect_mode, eina_stringshare_add("BOTH")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("aspect_mode:"); + attr.keyword = eina_stringshare_add("aspect_mode"); attr.value.strs = aspect_mode; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); Eina_Array *aspect_prefer = eina_array_new(4); @@ -319,9 +331,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(aspect_prefer, eina_stringshare_add("BOTH")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("aspect_preference:"); + attr.keyword = eina_stringshare_add("aspect_preference"); attr.value.strs = aspect_prefer; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); Eina_Array *effect = eina_array_new(11); @@ -338,9 +352,11 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(effect, eina_stringshare_add("GLOW")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("effect:"); + attr.keyword = eina_stringshare_add("effect"); attr.value.strs = effect; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); Eina_Array *action = eina_array_new(23); @@ -369,148 +385,194 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) eina_array_push(action, eina_stringshare_add("PHYSICS_ROT_SET")); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("action:"); + attr.keyword = eina_stringshare_add("action"); attr.value.strs = action; attr.value.type = ATTR_VALUE_CONSTANT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); //Type: Integer memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("color:"); + attr.keyword = eina_stringshare_add("color"); + attr.value.cnt = 4; attr.value.min = 0; attr.value.max = 255; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("color2:"); + attr.keyword = eina_stringshare_add("color2"); + attr.value.cnt = 4; attr.value.min = 0; attr.value.max = 255; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("color3:"); + attr.keyword = eina_stringshare_add("color3"); + attr.value.cnt = 4; attr.value.min = 0; attr.value.max = 255; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("scale:"); + attr.keyword = eina_stringshare_add("scale"); + attr.value.cnt = 1; attr.value.min = 0; attr.value.max = 1; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("fixed:"); + attr.keyword = eina_stringshare_add("fixed"); + attr.value.cnt = 2; attr.value.min = 0; attr.value.max = 1; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("size:"); + attr.keyword = eina_stringshare_add("size"); + attr.value.cnt = 1; attr.value.min = 1; attr.value.max = 255; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("min:"); + attr.keyword = eina_stringshare_add("min"); + attr.value.cnt = 2; attr.value.min = 0; attr.value.max = 1000; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("max:"); + attr.keyword = eina_stringshare_add("max"); + attr.value.cnt = 2; attr.value.min = 0; attr.value.max = 1000; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("mouse_events:"); + attr.keyword = eina_stringshare_add("mouse_events"); + attr.value.cnt = 1; attr.value.min = 0; attr.value.max = 1; attr.value.type = ATTR_VALUE_INTEGER; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); //Type: Float memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("relative:"); + attr.keyword = eina_stringshare_add("relative"); + attr.value.cnt = 2; attr.value.min = 0.0; attr.value.max = 1; attr.value.type = ATTR_VALUE_FLOAT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("aspect:"); + attr.keyword = eina_stringshare_add("aspect"); + attr.value.cnt = 2; attr.value.min = 0.0; attr.value.max = 1.0; attr.value.type = ATTR_VALUE_FLOAT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("align:"); + attr.keyword = eina_stringshare_add("align"); + attr.value.cnt = 2; attr.value.min = 0.0; attr.value.max = 1.0; attr.value.type = ATTR_VALUE_FLOAT; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); //Type: Part memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("target:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("target"); attr.value.type = ATTR_VALUE_PART; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("to:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("to"); attr.value.type = ATTR_VALUE_PART; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("source:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("source"); attr.value.type = ATTR_VALUE_PART; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); //Type: State memset(&attr, 0x00, sizeof(parser_attr)); attr.keyword = eina_stringshare_add("STATE_SET"); - attr.instring = EINA_TRUE; attr.value.type = ATTR_VALUE_STATE; + attr.value.prepend_str = ATTR_PREPEND_NONE; + attr.value.append_str = ATTR_APPEND_STATE_VAL; attr.value.program = EINA_TRUE; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("inherit:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("inherit"); attr.value.type = ATTR_VALUE_STATE; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_STATE_VAL; eina_inarray_push(td->attrs, &attr); //Type: Image memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("normal:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("normal"); attr.value.type = ATTR_VALUE_IMAGE; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("tween:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("tween"); attr.value.type = ATTR_VALUE_IMAGE; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); //Type: Program memset(&attr, 0x00, sizeof(parser_attr)); - attr.keyword = eina_stringshare_add("after:"); - attr.instring = EINA_TRUE; + attr.keyword = eina_stringshare_add("after"); attr.value.type = ATTR_VALUE_PROGRAM; + attr.value.prepend_str = ATTR_PREPEND_COLON; + attr.value.append_str = ATTR_APPEND_SEMICOLON; eina_inarray_push(td->attrs, &attr); } @@ -646,45 +708,71 @@ parser_colon_pos_get(parser_data *pd EINA_UNUSED, const char *cur) } attr_value * -parser_attribute_get(parser_data *pd, const char *text, const char *cur) +parser_attribute_get(parser_data *pd, const char *text, const char *cur, + const char *selected) { if (!text || !cur) return NULL; if ((*cur == ';') || (*cur == ':')) return NULL; parser_attr *attr; Eina_Bool instring = EINA_FALSE; - Eina_Bool necessary = EINA_FALSE; char *p = (char *) cur; while (p >= text) { - if (*p == ':') - { - necessary = EINA_TRUE; - break; - } if (*p == '\"') instring = !instring; p--; } - if (!p || !necessary) return NULL; + if (instring) return NULL; - while (p > text) + EINA_INARRAY_FOREACH(pd->attrs, attr) { - if ((*p == ';') || (*p == '.') || (*p == ' ')) break; - p--; + if (!strcmp(selected, attr->keyword)) + return &attr->value; } - if (!p) return NULL; - if (p != text) p++; + return NULL; +} - EINA_INARRAY_FOREACH(pd->attrs, attr) +/* Function is_numberic is refer to the following url. + http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#C */ +static Eina_Bool +is_numberic(const char *str) +{ + Eina_Bool ret = EINA_FALSE; + char *p; + + if (!str || (*str == '\0') || isspace(*str)) + return EINA_FALSE; + + strtod(str, &p); + if (*p == '\0') ret = EINA_TRUE; + + return ret; +} + +void +parser_attribute_value_set(attr_value *value, char *cur) +{ + const char token[4] = " ;:"; + char *str = strtok(cur, token); + int i; + + if (!str) return; + str = strtok(NULL, token); //Skip the keyword + + //Initialize attribute values + for (i = 0; i < value->cnt; i++) + value->val[i] = 0; + + for (i = 0; str && (i < value->cnt); str = strtok(NULL, token)) { - if ((instring == attr->instring) && strstr(p, attr->keyword)) - return &attr->value; - } + if (!is_numberic(str)) continue; - return NULL; + value->val[i] = atof(str); + i++; + } } Eina_Stringshare * diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h index ee46b78..6787e9d 100644 --- a/src/lib/enventor_private.h +++ b/src/lib/enventor_private.h @@ -14,6 +14,7 @@ #define REL2_X 0.75f #define REL2_Y 0.75f #define VIEW_DATA edj_mgr_view_get(NULL) +#define ATTR_VALUE_MAX_CNT 4 extern char EDJE_PATH[PATH_MAX]; extern const char SIG_CURSOR_LINE_CHANGED[]; @@ -51,9 +52,13 @@ typedef enum attr_value_type struct attr_value_s { Eina_Array *strs; + int cnt; + float val[ATTR_VALUE_MAX_CNT]; float min; float max; attr_value_type type; + const char *prepend_str; + const char *append_str; Eina_Bool program : 1; }; @@ -82,7 +87,8 @@ void parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *d void parser_cur_group_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data); Eina_Stringshare *parser_cur_name_fast_get(Evas_Object *entry, const char *scope); Eina_Bool parser_type_name_compare(parser_data *pd, const char *str); -attr_value *parser_attribute_get(parser_data *pd, const char *text, const char *cur); +attr_value *parser_attribute_get(parser_data *pd, const char *text, const char *cur, const char *selected); +void parser_attribute_value_set(attr_value *attr, char *cur); Eina_Stringshare *parser_paragh_name_get(parser_data *pd, Evas_Object *entry); char *parser_name_get(parser_data *pd, const char *cur); void parser_cancel(parser_data *pd); @@ -179,7 +185,7 @@ Eina_Bool template_insert(edit_data *ed, Enventor_Template_Insert_Type insert_ty /* ctxpopup */ -Evas_Object *ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, double slider_val, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_selected_cb); +Evas_Object *ctxpopup_candidate_list_create(edit_data *ed, attr_value *attr, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_selected_cb); Evas_Object *ctxpopup_img_preview_create(edit_data*ed, const char *imgpath, Evas_Smart_Cb ctxpopup_dismiss_cb, Evas_Smart_Cb ctxpopup_relay_cb); --
