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.
This commit is contained in:
Mykyta Biliavskyi 2015-05-13 13:47:11 +00:00 committed by ChunEon Park
parent 4415cdf7a9
commit d18b1afdc2
5 changed files with 251 additions and 26 deletions

View File

@ -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

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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);

View File

@ -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