Edje viewer: Jump to code of current clicked part.

When user click a part in the live view,
the entry cursor jumps to the corresponded part line.

Need additional attention for the invisible parts. Swallow
and spacer parts primitives created after edje-layout. And this
causes situation when this primitives is placed above other
parts.

T2179
This commit is contained in:
Mykyta Biliavskyi 2015-12-22 09:25:53 +09:00
parent 3b4a6767a5
commit 9863ea304c
5 changed files with 155 additions and 1 deletions

View File

@ -23,10 +23,19 @@ typedef struct dummy_obj_s
} dummy_obj;
const char *DUMMYOBJ = "dummy_obj";
const char *EDIT_LAYOUT_KEY = "edit_layout";
/*****************************************************************************/
/* Internal method implementation */
/*****************************************************************************/
static void
edje_part_clicked(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj, void *ei EINA_UNUSED)
{
part_obj *po = (part_obj *)data;
Evas_Object *layout = evas_object_data_get(obj, EDIT_LAYOUT_KEY);
evas_object_smart_callback_call(layout, "dummy,clicked", (char *)(po->name));
}
static void
dummy_objs_update(dummy_obj *dummy)
@ -76,7 +85,7 @@ dummy_objs_update(dummy_obj *dummy)
if (type == EDJE_PART_TYPE_SWALLOW)
{
//Check this part is exist
//Check this part is exist
if (edje_object_part_swallow_get(dummy->layout, part_name))
continue;
@ -93,8 +102,11 @@ dummy_objs_update(dummy_obj *dummy)
edje_object_part_swallow(dummy->layout, part_name, obj);
po->obj = obj;
evas_object_data_set(po->obj, EDIT_LAYOUT_KEY, dummy->layout);
po->name = eina_stringshare_add(part_name);
dummy->swallows = eina_list_append(dummy->swallows, po);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
edje_part_clicked, po);
}
else if (type == EDJE_PART_TYPE_SPACER)
{
@ -126,6 +138,10 @@ dummy_objs_update(dummy_obj *dummy)
dummy->spacers = eina_list_append(dummy->spacers, po);
evas_object_show(obj);
evas_object_clip_set(obj, clipper);
evas_object_data_set(obj, EDIT_LAYOUT_KEY, dummy->layout);
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN,
edje_part_clicked, po);
}
evas_object_geometry_get(dummy->layout, &lx, &ly, NULL, NULL);
edje_object_part_geometry_get(dummy->layout, part_name, &x, &y, &w, &h);

View File

@ -935,6 +935,67 @@ edit_focused_cb(void *data, Evas_Object *obj EINA_UNUSED,
/* Externally accessible calls */
/*****************************************************************************/
void
edit_part_cursor_set(edit_data *ed,
const char *group_name,
const char *part_name)
{
if (!group_name || !part_name) return;
const char *text = elm_entry_entry_get(ed->en_edit);
char *utf8 = elm_entry_markup_to_utf8(text);
int part_name_size = strlen(part_name) + 2; // 2 - is quotes.
char *part_name_search = calloc(part_name_size, sizeof(char));
snprintf(part_name_search, part_name_size, "\"%s\"", part_name);
int group_name_size = strlen(group_name) + 2; // 2 - is quotes.
char *group_name_search = calloc(group_name_size, sizeof(char));
snprintf(group_name_search, group_name_size, "\"%s\"", group_name);
const char *group_pos = strstr(utf8, group_name_search);
char *itr = strstr(group_pos, part_name_search);
const char *part_pos = itr;
Eina_Bool word_present = EINA_FALSE;
Eina_Bool found_part = EINA_FALSE;
/* Search entry of '{ "part_name" ' or '{ name: "part_name"' patternsd*/
for (; (itr != NULL) && (itr > utf8); itr--)
{
if (isalnum(*itr))
word_present = EINA_TRUE;
else if (*itr == '{')
{
if (word_present)
{
char *name_keyword = strstr(itr, "name");
if (name_keyword && name_keyword < part_pos)
{
found_part = EINA_TRUE;
break;
}
}
else
{
found_part = EINA_TRUE;
break;
}
itr = strstr(part_pos + 1, part_name_search);
part_pos = itr;
}
}
if (found_part)
{
int cur_pos = part_pos - utf8 + strlen(part_name);
elm_entry_select_none(ed->en_edit);
elm_entry_cursor_pos_set(ed->en_edit, cur_pos);
}
free(utf8);
free(part_name_search);
free(group_name_search);
}
void
edit_view_sync_cb_set(edit_data *ed,
void (*cb)(void *data, Eina_Stringshare *state_name, double state_value,

View File

@ -28,6 +28,7 @@ struct viewer_s
Ecore_Timer *timer;
Eio_Monitor *edj_monitor;
Eina_List *img_monitors;
Eina_List *part_names;
Eio_Monitor *img_monitor;
Ecore_Event_Handler *edj_monitor_event;
Ecore_Event_Handler *img_monitor_event;
@ -41,6 +42,8 @@ struct viewer_s
Eina_Bool edj_reload_need : 1;
};
const char *PART_NAME = "part_name";
/*****************************************************************************/
/* Internal method implementation */
/*****************************************************************************/
@ -270,6 +273,53 @@ view_scroller_create(Evas_Object *parent)
return scroller;
}
static void
edje_part_clicked(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
void *ei EINA_UNUSED)
{
view_data *vd = (view_data *)data;
char *part_name = evas_object_data_get(obj, PART_NAME);
evas_object_smart_callback_call(vd->enventor, "part,clicked", part_name);
}
inline static void
view_obj_parts_names_free(view_data *vd)
{
Eina_Stringshare *part_name = NULL;
EINA_LIST_FREE(vd->part_names, part_name)
eina_stringshare_del(part_name);
vd->part_names = NULL;
}
static void
view_obj_parts_callbacks_set(view_data *vd)
{
if (vd->part_names)
view_obj_parts_names_free(vd);
Eina_List *l = NULL;
Eina_Stringshare *part_name = NULL;
Eina_List *parts = edje_edit_parts_list_get(vd->layout);
EINA_LIST_FOREACH(parts, l, part_name)
{
Evas_Object *edje_part =
(Evas_Object *)edje_object_part_object_get(vd->layout, part_name);
if (edje_part)
{
Eina_Stringshare *name = eina_stringshare_add(part_name);
vd->part_names = eina_list_append(vd->part_names, name);
evas_object_data_set(edje_part, PART_NAME, name);
evas_object_event_callback_add(edje_part, EVAS_CALLBACK_MOUSE_DOWN,
edje_part_clicked, vd);
}
}
edje_edit_string_list_free(parts);
}
static Eina_Bool
exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
{
@ -290,6 +340,7 @@ exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
view_part_highlight_set(vd, vd->part_name);
dummy_obj_update(vd->layout);
view_obj_parts_callbacks_set(vd);
vd->edj_reload_need = EINA_FALSE;
evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_UPDATED,
@ -305,6 +356,7 @@ edj_changed_cb(void *data, int type EINA_UNUSED, void *event)
Eio_Monitor_Event *ev = event;
if (vd->edj_monitor != ev->monitor) return ECORE_CALLBACK_PASS_ON;
view_obj_parts_names_free(vd);
//FIXME: why it need to add monitor again??
eio_monitor_del(vd->edj_monitor);
@ -357,6 +409,14 @@ base_create(Evas_Object *parent)
return base;
}
static void
dummy_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ei)
{
char *part_name = (char *)ei;
view_data *vd = (view_data *)data;
evas_object_smart_callback_call(vd->enventor, "part,clicked", part_name);
}
static void
view_obj_create(view_data *vd)
{
@ -371,6 +431,11 @@ view_obj_create(view_data *vd)
EVAS_HINT_EXPAND);
evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
layout_resize_cb, vd);
evas_object_smart_callback_add(vd->layout, "dummy,clicked",
dummy_clicked_cb, vd);
view_obj_parts_callbacks_set(vd);
}
static void

View File

@ -281,5 +281,6 @@ Eina_Bool edit_redoundo(edit_data *ed, Eina_Bool undo);
void edit_disabled_set(edit_data *ed, Eina_Bool disabled);
void edit_error_set(edit_data *ed, int line, const char *target);
void edit_text_insert(edit_data *ed, const char *text);
void edit_part_cursor_set(edit_data *ed, const char *group_name, const char *part_name);
#endif

View File

@ -166,6 +166,15 @@ call_error:
}
static void
_enventor_part_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ei)
{
Enventor_Object_Data *pd = (Enventor_Object_Data *)data;
const char *part_name = (const char *)ei;
edit_part_cursor_set(pd->ed, view_group_name_get(VIEW_DATA), part_name);
}
/*****************************************************************************/
/* Internal Eo object required routines */
/*****************************************************************************/
@ -198,6 +207,8 @@ _enventor_object_evas_object_smart_add(Eo *obj, Enventor_Object_Data *pd)
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_down_cb, pd);
pd->key_up_handler =
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_up_cb, pd);
evas_object_smart_callback_add(pd->obj, "part,clicked", _enventor_part_clicked_cb, pd);
}
EOLIAN static void