diff --git a/src/bin/ctxpopup.c b/src/bin/ctxpopup.c index 502c594..c7df192 100644 --- a/src/bin/ctxpopup.c +++ b/src/bin/ctxpopup.c @@ -133,8 +133,7 @@ constant_candidate_set(Evas_Object *ctxpopup, attr_value *attr, void *data) Eina_List *l; Eina_Stringshare *candidate; EINA_LIST_FOREACH(attr->strs, l, candidate) - elm_ctxpopup_item_append(ctxpopup, candidate, NULL, - ctxpopup_it_cb, data); + elm_ctxpopup_item_append(ctxpopup, candidate, NULL, ctxpopup_it_cb, data); } static Eina_Bool @@ -146,8 +145,7 @@ part_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, data); view_string_list_free(parts); return EINA_TRUE; } @@ -161,8 +159,7 @@ 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, data); view_string_list_free(parts); return EINA_TRUE; } @@ -176,20 +173,69 @@ program_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, data); view_string_list_free(parts); return EINA_TRUE; } +static Eina_Bool +state_candidate_set(Evas_Object *ctxpopup, void *data, Eina_Bool prog) +{ + 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) + { + program = edit_cur_prog_name_get(ed); + if (!program) return EINA_FALSE; + targets = view_program_targets_get(vd, program); + target = eina_list_data_get(targets); + if (!target) goto end; + } + //Trace the part name from the part. + else + { + target = edit_cur_part_name_get(ed); + if (!target) goto end; + } + + Eina_List *states = view_part_states_list_get(vd, target); + + /* Since the states have the name + float values, it needs to filterout the + values. */ + Eina_List *converted = parser_states_filtered_name_get(states); + + Eina_List *l; + char *state; + EINA_LIST_FOREACH(converted, l, state) + { + elm_ctxpopup_item_append(ctxpopup, state, NULL, ctxpopup_it_cb, data); + free(state); + } + view_string_list_free(states); + eina_list_free(converted); + ret = EINA_TRUE; +end: + eina_stringshare_del(program); + view_string_list_free(targets); + return ret; +} + Evas_Object * -ctxpopup_candidate_list_create(Evas_Object *parent, attr_value *attr, +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, void *data) + Evas_Smart_Cb ctxpopup_selected_cb) { //create ctxpopup - Evas_Object *ctxpopup = elm_ctxpopup_add(parent); + Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get()); if (!ctxpopup) return NULL; elm_object_style_set(ctxpopup, elm_app_name_get()); @@ -198,51 +244,58 @@ ctxpopup_candidate_list_create(Evas_Object *parent, attr_value *attr, ctxpopup_data *ctxdata = malloc(sizeof(ctxpopup_data)); if (!ctxdata) goto err; ctxdata->selected_cb = ctxpopup_selected_cb; - ctxdata->data = data; + ctxdata->data = ed; evas_object_data_set(ctxpopup, "ctxpopup_data", ctxdata); switch (attr->type) { case ATTR_VALUE_INTEGER: { - slider_layout_set(ctxpopup, attr, slider_val, data, EINA_TRUE); + slider_layout_set(ctxpopup, attr, slider_val, ed, EINA_TRUE); break; } case ATTR_VALUE_FLOAT: { - slider_layout_set(ctxpopup, attr, slider_val, data, EINA_FALSE); + slider_layout_set(ctxpopup, attr, slider_val, ed, EINA_FALSE); break; } case ATTR_VALUE_CONSTANT: { - constant_candidate_set(ctxpopup, attr, data); + constant_candidate_set(ctxpopup, attr, ed); break; } case ATTR_VALUE_PART: { - if (!part_candidate_set(ctxpopup, data)) goto err; + if (!part_candidate_set(ctxpopup, ed)) goto err; + break; + } + case ATTR_VALUE_STATE: + { + if (!state_candidate_set(ctxpopup, ed, attr->program)) goto err; break; } case ATTR_VALUE_IMAGE: { - if (!image_candidate_set(ctxpopup, data)) goto err; + if (!image_candidate_set(ctxpopup, ed)) goto err; break; } case ATTR_VALUE_PROGRAM: { - if (!program_candidate_set(ctxpopup, data)) goto err; + if (!program_candidate_set(ctxpopup, ed)) goto err; break; } } evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, ctxpopup_del_cb, ctxdata); evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismiss_cb, - data); + ed); return ctxpopup; err: free(ctxdata); evas_object_del(ctxpopup); + + return NULL; } static void @@ -259,12 +312,13 @@ ctxpopup_key_down_cb(void *data, Evas *e EINA_UNUSED, } Evas_Object * -ctxpopup_img_preview_create(Evas_Object *parent, const char *imgpath, +ctxpopup_img_preview_create(edit_data *ed, + const char *imgpath, Evas_Smart_Cb ctxpopup_dismiss_cb, - Evas_Smart_Cb ctxpopup_relay_cb, void *data) + Evas_Smart_Cb ctxpopup_relay_cb) { //create ctxpopup - Evas_Object *ctxpopup = elm_ctxpopup_add(parent); + Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get()); if (!ctxpopup) return NULL; elm_object_style_set(ctxpopup, elm_app_name_get()); @@ -276,7 +330,7 @@ ctxpopup_img_preview_create(Evas_Object *parent, const char *imgpath, ctxpopup_data *ctxdata = malloc(sizeof(ctxpopup_data)); if (!ctxdata) return NULL; ctxdata->relay_cb = ctxpopup_relay_cb; - ctxdata->data = data; + ctxdata->data = ed; ctxdata->ctxpopup = ctxpopup; evas_object_data_set(ctxpopup, "ctxpopup_data", ctxdata); @@ -294,7 +348,7 @@ ctxpopup_img_preview_create(Evas_Object *parent, const char *imgpath, elm_object_part_content_set(layout, "elm.swallow.img", img); evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismiss_cb, - data); + ed); evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, ctxpopup_del_cb, ctxdata); evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN, diff --git a/src/bin/edc_editor.c b/src/bin/edc_editor.c index a94f986..758926f 100644 --- a/src/bin/edc_editor.c +++ b/src/bin/edc_editor.c @@ -508,11 +508,9 @@ image_preview_show(edit_data *ed, char *cur, Evas_Coord x, Evas_Coord y) if (found) { Evas_Object *ctxpopup = - ctxpopup_img_preview_create(ed->parent, - fullpath, + ctxpopup_img_preview_create(ed, fullpath, ctxpopup_preview_dismiss_cb, - ctxpopup_preview_relay_cb, - ed); + ctxpopup_preview_relay_cb); if (!ctxpopup) return EINA_FALSE; evas_object_move(ctxpopup, x, y); @@ -543,10 +541,9 @@ candidate_list_show(edit_data *ed, char *text, char *cur, char *selected) //Show up the list of the types Evas_Object *ctxpopup = - ctxpopup_candidate_list_create(ed->parent, attr, - atof(selected), + ctxpopup_candidate_list_create(ed, attr, atof(selected), ctxpopup_candidate_dismiss_cb, - ctxpopup_candidate_selected_cb, ed); + ctxpopup_candidate_selected_cb); if (!ctxpopup) return; int x, y; @@ -962,3 +959,15 @@ edit_edc_reload(edit_data *ed, const char *edc_path) edj_mgr_reload_need_set(EINA_TRUE); config_apply(); } + +Eina_Stringshare * +edit_cur_prog_name_get(edit_data *ed) +{ + return parser_cur_name_fast_get(ed->en_edit, "program"); +} + +Eina_Stringshare * +edit_cur_part_name_get(edit_data *ed) +{ + return parser_cur_name_fast_get(ed->en_edit, "part"); +} diff --git a/src/bin/edc_parser.c b/src/bin/edc_parser.c index f427b53..9775a2f 100644 --- a/src/bin/edc_parser.c +++ b/src/bin/edc_parser.c @@ -213,6 +213,20 @@ parser_type_init(parser_data *pd) attr->value.type = ATTR_VALUE_PART; pd->attrs = eina_inlist_append(pd->attrs, (Eina_Inlist *) attr); + //Type: State + attr = calloc(1, sizeof(parser_attr)); + attr->keyword = eina_stringshare_add("STATE_SET"); + attr->instring = EINA_TRUE; + attr->value.type = ATTR_VALUE_STATE; + attr->value.program = EINA_TRUE; + pd->attrs = eina_inlist_append(pd->attrs, (Eina_Inlist *) attr); + + attr = calloc(1, sizeof(parser_attr)); + attr->keyword = eina_stringshare_add("inherit:"); + attr->instring = EINA_TRUE; + attr->value.type = ATTR_VALUE_STATE; + pd->attrs = eina_inlist_append(pd->attrs, (Eina_Inlist *) attr); + //Type: Image attr = calloc(1, sizeof(parser_attr)); attr->keyword = eina_stringshare_add("normal:"); @@ -366,7 +380,7 @@ group_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) continue; } - //Check whether outside of part or group + //Check whether outside of group if ((*p == '}') && (p < end)) { bracket--; @@ -609,6 +623,80 @@ parser_paragh_name_get(parser_data *pd EINA_UNUSED, Evas_Object *entry) return NULL; } +Eina_Stringshare* +parser_cur_name_fast_get(Evas_Object *entry, const char *scope) +{ + const char *quot = QUOT; + const int quot_len = QUOT_LEN; + const int scope_len = strlen(scope); + + const char *text = elm_entry_entry_get(entry); + if (!text) return NULL; + + char *utf8 = elm_entry_markup_to_utf8(text); + if (!utf8) return NULL; + + int cur_pos = elm_entry_cursor_pos_get(entry); + + char *p = utf8; + char *end = utf8 + cur_pos; + + int bracket = 0; + const char *name = NULL; + int name_len = 0; + + while (p <= end) + { + //Skip "" range + if (*p == *quot) + { + p += quot_len; + p = strstr(p, quot); + if (!p) goto end; + p += quot_len; + } + + if (*p == '{') + { + bracket++; + p++; + continue; + } + + //Check whether outside of scope + if ((*p == '}') && (p < end)) + { + bracket--; + p++; + + if (bracket == 1) name = NULL; + continue; + } + //Check Scope in + if (!strncmp(p, scope, scope_len)) + { + p += scope_len; + char *name_begin = strstr(p, quot); + if (!name_begin) goto end; + name_begin += quot_len; + p = name_begin; + char *name_end = strstr(p, quot); + if (!name_end) goto end; + name = name_begin; + name_len = name_end - name_begin; + p = name_end + quot_len; + bracket++; + continue; + } + p++; + } + if (name) name = eina_stringshare_add_length(name, name_len); + +end: + free(utf8); + return name; +} + void parser_cur_group_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *part_name, @@ -721,3 +809,23 @@ Eina_Stringshare } return NULL; } + +Eina_List * +parser_states_filtered_name_get(Eina_List *states) +{ + Eina_List *ret = NULL; + Eina_List *l; + char *state; + EINA_LIST_FOREACH(states, l, state) + { + char *p = state; + char *pp = state; + while (p = strstr(p, " ")) + { + pp = p; + p++; + } + ret = eina_list_append(ret, strndup(state, pp - state)); + } + return ret; +} diff --git a/src/bin/edj_viewer.c b/src/bin/edj_viewer.c index 4993211..4a2b7b0 100644 --- a/src/bin/edj_viewer.c +++ b/src/bin/edj_viewer.c @@ -404,20 +404,32 @@ view_parts_list_get(view_data *vd) return edje_edit_parts_list_get(vd->layout); } -void -view_string_list_free(Eina_List *list) -{ - edje_edit_string_list_free(list); -} - Eina_List * view_images_list_get(view_data *vd) { - edje_edit_images_list_get(vd->layout); + return edje_edit_images_list_get(vd->layout); } Eina_List * view_programs_list_get(view_data *vd) { - edje_edit_programs_list_get(vd->layout); + return edje_edit_programs_list_get(vd->layout); +} + +Eina_List * +view_part_states_list_get(view_data *vd, const char *part) +{ + return edje_edit_part_states_list_get(vd->layout, part); +} + +Eina_List * +view_program_targets_get(view_data *vd, const char *prog) +{ + return edje_edit_program_targets_get(vd->layout, prog); +} + +void +view_string_list_free(Eina_List *list) +{ + edje_edit_string_list_free(list); }