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
This commit is contained in:
Jaehyun Cho 2014-12-09 11:09:36 +09:00 committed by ChunEon Park
parent 20e1f20e6f
commit f05dca3a22
4 changed files with 297 additions and 112 deletions

View File

@ -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)
if (eina_list_count(box_children) == 0) return;
snprintf(candidate, sizeof(candidate), "%s", attr->prepend_str);
EINA_LIST_FOREACH(box_children, l, layout)
{
snprintf(buf, sizeof(buf), "%d",
(int) roundf(elm_slider_value_get(slider)));
}
else
{
//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);
evas_object_smart_callback_add(ctxpopup, "dismissed", slider_dismiss_cb,
data);
return layout;
}
static void
constant_candidate_set(Evas_Object *ctxpopup, attr_value *attr, void *data)
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,
(void *) attr);
}
static void
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;
}
}

View File

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

View File

@ -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,47 +708,73 @@ 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;
while (p > text)
{
if ((*p == ';') || (*p == '.') || (*p == ' ')) break;
p--;
}
if (!p) return NULL;
if (p != text) p++;
if (instring) return NULL;
EINA_INARRAY_FOREACH(pd->attrs, attr)
{
if ((instring == attr->instring) && strstr(p, attr->keyword))
return &attr->value;
if (!strcmp(selected, attr->keyword))
return &attr->value;
}
return NULL;
}
/* 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 (!is_numberic(str)) continue;
value->val[i] = atof(str);
i++;
}
}
Eina_Stringshare *
parser_paragh_name_get(parser_data *pd EINA_UNUSED, Evas_Object *entry)
{

View File

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