From d18b1afdc29f87edb39a6125c6a8fa57107f2198 Mon Sep 17 00:00:00 2001 From: Mykyta Biliavskyi Date: Wed, 13 May 2015 13:47:11 +0000 Subject: [PATCH] Update part state in dependence of the cursor position. Added ability to switch part state on live view, when cursor located inside the "description" subblock of part. In case when cursor move out from "description" block, default state of part will be displayed. --- src/lib/edc_editor.c | 22 ++-- src/lib/edc_parser.c | 204 +++++++++++++++++++++++++++++++++++-- src/lib/edj_viewer.c | 7 ++ src/lib/enventor_private.h | 17 +++- src/lib/enventor_smart.c | 27 ++++- 5 files changed, 251 insertions(+), 26 deletions(-) diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c index 56953d5..6572689 100644 --- a/src/lib/edc_editor.c +++ b/src/lib/edc_editor.c @@ -42,8 +42,8 @@ struct editor_s Ecore_Timer *syntax_color_timer; Ecore_Thread *syntax_color_thread; - void (*view_sync_cb)(void *data, Eina_Stringshare *part_name, - Eina_Stringshare *group_name); + void (*view_sync_cb)(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name); void *view_sync_cb_data; int select_pos; double font_scale; @@ -559,13 +559,14 @@ edit_cursor_double_clicked_cb(void *data, Evas_Object *obj, } static void -cur_name_get_cb(void *data, Eina_Stringshare *part_name, - Eina_Stringshare *group_name) +cur_name_get_cb(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name) { edit_data *ed = data; if (ed->view_sync_cb) - ed->view_sync_cb(ed->view_sync_cb_data, part_name, group_name); + ed->view_sync_cb(ed->view_sync_cb_data, state_name, state_value, + part_name, group_name); } static void @@ -815,7 +816,7 @@ err: &max_line); if (ed->view_sync_cb) - ed->view_sync_cb(ed->view_sync_cb_data, NULL, group_name); + ed->view_sync_cb(ed->view_sync_cb_data, NULL, 0.0, NULL, group_name); return ret; } @@ -834,8 +835,8 @@ edit_focused_cb(void *data, Evas_Object *obj EINA_UNUSED, void edit_view_sync_cb_set(edit_data *ed, - void (*cb)(void *data, Eina_Stringshare *part_name, - Eina_Stringshare *group_name), void *data) + void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data) { ed->view_sync_cb = cb; ed->view_sync_cb_data = data; @@ -918,10 +919,7 @@ edit_syntax_color_partial_apply(edit_data *ed, double interval) void edit_view_sync(edit_data *ed) { - if (!ed->part_highlight) - parser_cur_group_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed); - else - parser_cur_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed); + parser_cur_state_get(ed->pd, ed->en_edit, cur_name_get_cb, ed); } void diff --git a/src/lib/edc_parser.c b/src/lib/edc_parser.c index 7903338..c4a932c 100644 --- a/src/lib/edc_parser.c +++ b/src/lib/edc_parser.c @@ -23,8 +23,10 @@ typedef struct cur_name_thread_data_s int cur_pos; const char *group_name; const char *part_name; - void (*cb)(void *data, Eina_Stringshare *part_name, - Eina_Stringshare *group_name); + const char *state_name; + double state_value; + void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name); void *cb_data; parser_data *pd; } cur_name_td; @@ -222,11 +224,163 @@ end: td->group_name = group_name; } +static void +cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) +{ + const char *quot = QUOT_UTF8; + const char *description = "description"; + const char *part = "part"; + const char *parts = "parts"; + const char *group = "group"; + const int quot_len = QUOT_UTF8_LEN; + const int description_len = 11; //strlen("description"); + const int part_len = 4; //strlen("part"); + const int parts_len = 5; //strlen("parts"); + const int group_len = 5; //strlen("group"); + + cur_name_td *td = data; + char *utf8 = td->utf8; + int cur_pos = td->cur_pos; + char *p = utf8; + char *end = utf8 + cur_pos; + + int bracket = 0; + const char *group_name = NULL; + const char *part_name = NULL; + int group_name_len = 0; + int part_name_len = 0; + + const char *description_name = NULL; + int description_name_len = 0; + const char *value = NULL; + int value_len = 0; + double value_convert = 0.0; + + td->part_name = NULL; + td->group_name = NULL; + td->state_name = NULL; + + while (p <= end) + { + //Skip "" range + if (!strncmp(p, quot, quot_len)) + { + p += quot_len; + p = strstr(p, quot); + if (!p) goto end; + p += quot_len; + } + + if (*p == '{') + { + bracket++; + p++; + continue; + } + + //Check whether outside of part or group + if ((*p == '}') && (p < end)) + { + bracket--; + p++; + + if (bracket == 1) group_name = NULL; + else if (bracket == 3) part_name = NULL; + + continue; + } + //Check Part in + if (strncmp(p, parts, parts_len)) + { + if (!strncmp(p, part, part_len)) + { + p += part_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; + part_name = name_begin; + part_name_len = name_end - name_begin; + p = name_end + quot_len; + bracket++; + continue; + } + } + if (!strncmp(p, description, description_len)) + { + p += description_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; + description_name = name_begin; + description_name_len = name_end - name_begin; + p = name_end + quot_len; + value = p; + bracket++; + + char *value_end = strchr(value, ';'); + char *value_buf = NULL; + while (value < value_end) + { + if (isdigit(*value) || *value == '.') + { + value_len = value_end - value; + value_buf = (char *)calloc(1, value_len); + memcpy(value_buf, value, value_len); + break; + } + value++; + } + value_convert = atof(value_buf); + free(value_buf); + continue; + } + //Check Group in + if (!strncmp(p, group, group_len)) + { + p += group_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; + group_name = name_begin; + group_name_len = name_end - name_begin; + p = name_end + quot_len; + bracket++; + continue; + } + p++; + } + + if (part_name) + part_name = eina_stringshare_add_length(part_name, part_name_len); + if (group_name) + group_name = eina_stringshare_add_length(group_name, group_name_len); + if (description_name) + description_name = eina_stringshare_add_length(description_name, description_name_len); + + td->part_name = part_name; + td->group_name = group_name; + td->state_name = description_name; + td->state_value = value_convert; + +end: + free(utf8); + td->utf8 = NULL; +} + static void cur_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED) { cur_name_td *td = data; - td->cb(td->cb_data, td->part_name, td->group_name); + td->cb(td->cb_data,td->state_name, td->state_value, td->part_name, td->group_name); td->pd->cntd = NULL; free(td); } @@ -1172,8 +1326,8 @@ end: 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) + void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data) { if (pd->cntd) ecore_thread_cancel(pd->cntd->thread); @@ -1205,9 +1359,9 @@ parser_cur_group_name_get(parser_data *pd, Evas_Object *entry, } void -parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, - Eina_Stringshare *part_name, Eina_Stringshare *group_name), - void *data) +parser_cur_name_get(parser_data *pd, Evas_Object *entry, + void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data) { if (pd->cntd) ecore_thread_cancel(pd->cntd->thread); @@ -1238,6 +1392,40 @@ parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, td); } +void +parser_cur_state_get(parser_data *pd, Evas_Object *entry, + void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data) +{ + if (pd->cntd) ecore_thread_cancel(pd->cntd->thread); + + const char *text = elm_entry_entry_get(entry); + if (!text) return; + + char *utf8 = elm_entry_markup_to_utf8(text); + if (!utf8) return; + + cur_name_td *td = calloc(1, sizeof(cur_name_td)); + if (!td) + { + free(utf8); + EINA_LOG_ERR("Failed to allocate Memory!"); + return; + } + + td->pd = pd; + pd->cntd = td; + td->utf8 = utf8; + td->cur_pos = elm_entry_cursor_pos_get(entry); + td->cb = cb; + td->cb_data = data; + + td->thread = ecore_thread_run(cur_state_thread_blocking, + cur_name_thread_end, + cur_name_thread_cancel, + td); +} + int parser_line_cnt_get(parser_data *pd EINA_UNUSED, const char *src) { diff --git a/src/lib/edj_viewer.c b/src/lib/edj_viewer.c index 9f15689..c9c8ad7 100644 --- a/src/lib/edj_viewer.c +++ b/src/lib/edj_viewer.c @@ -558,3 +558,10 @@ view_string_list_free(Eina_List *list) { edje_edit_string_list_free(list); } + +void +view_part_state_set(view_data *vd, const char *part, const char *description, const double state) +{ + if (!vd) return; + edje_edit_part_selected_state_set(vd->layout, part, description, state); +} diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h index 07291fb..f030e4a 100644 --- a/src/lib/enventor_private.h +++ b/src/lib/enventor_private.h @@ -39,6 +39,7 @@ typedef struct syntax_helper_s syntax_helper; typedef struct indent_s indent_data; typedef struct redoundo_s redoundo_data; typedef struct editor_s edit_data; +typedef struct state_info_s state_info; typedef enum attr_value_type { @@ -65,6 +66,13 @@ struct attr_value_s Eina_Bool program : 1; }; +struct state_info_s +{ + double value; + const char *part; + const char *state; +}; + /* auto_comp */ void autocomp_init(void); void autocomp_term(void); @@ -88,8 +96,9 @@ Eina_Bool color_ready(color_data *cd); parser_data *parser_init(void); void parser_term(parser_data *pd); Eina_Stringshare *parser_first_group_name_get(parser_data *pd, Evas_Object *entry); -void parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data); -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); +void parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data); +void parser_cur_group_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data); +void parser_cur_state_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, 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, const char *selected); @@ -103,6 +112,7 @@ int parser_end_of_parts_block_pos_get(const Evas_Object *entry, const char *grou Eina_Bool parser_images_pos_get(const Evas_Object *entry, int *ret); Eina_Bool parser_styles_pos_get(const Evas_Object *entry, int *ret); const char *parser_colon_pos_get(parser_data *pd EINA_UNUSED, const char *cur); +Eina_Bool parser_state_info_get(Evas_Object *entry, state_info *info); /* syntax helper */ @@ -182,6 +192,7 @@ Eina_List *view_programs_list_get(view_data *vd); Eina_List *view_part_states_list_get(view_data *vd, const char *part); Eina_List *view_program_targets_get(view_data *vd, const char *prog); void view_string_list_free(Eina_List *list); +void view_part_state_set(view_data *vd, const char *part, const char *description, const double state); /* template */ @@ -206,7 +217,7 @@ Eina_Bool edit_saved_get(edit_data *ed); void edit_saved_set(edit_data *ed, Eina_Bool saved); Eina_Bool edit_save(edit_data *ed, const char *file); void edit_new(edit_data* ed); -void edit_view_sync_cb_set(edit_data *ed, void (*cb)(void *data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data); +void edit_view_sync_cb_set(edit_data *ed, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data); void edit_view_sync(edit_data *ed); void edit_font_scale_set(edit_data *ed, double font_scale); double edit_font_scale_get(edit_data *ed); diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c index 8c109e6..a23dc97 100644 --- a/src/lib/enventor_smart.c +++ b/src/lib/enventor_smart.c @@ -76,10 +76,12 @@ file_modified_cb(void *data, int type EINA_UNUSED, void *event) } static void -edit_view_sync_cb(void *data, Eina_Stringshare *part_name, - Eina_Stringshare *group_name) +edit_view_sync_cb(void *data, Eina_Stringshare *state_name, double state_value, + Eina_Stringshare *part_name, Eina_Stringshare *group_name) { Enventor_Object_Data *pd = data; + static Eina_Stringshare *prev_part_name = NULL; + if (pd->group_name != group_name) { view_data *vd = edj_mgr_view_get(group_name); @@ -94,7 +96,26 @@ edit_view_sync_cb(void *data, Eina_Stringshare *part_name, evas_object_smart_callback_call(pd->obj, SIG_CURSOR_GROUP_CHANGED, (void *) group_name); } - view_part_highlight_set(VIEW_DATA, part_name); + if (edit_part_highlight_get(pd->ed)) + view_part_highlight_set(VIEW_DATA, part_name); + + if (!state_name) + { + view_part_state_set(VIEW_DATA, prev_part_name, "default", 0.0); + eina_stringshare_del(prev_part_name); + prev_part_name = NULL; + return; + } + + if ((part_name) && (part_name != prev_part_name)) + { + view_part_state_set(VIEW_DATA, prev_part_name, "default", 0.0); + eina_stringshare_del(prev_part_name); + prev_part_name = NULL; + } + + view_part_state_set(VIEW_DATA, part_name, state_name, state_value); + prev_part_name = part_name; } static void