nikawhite pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=9863ea304ceecd3c9fa5bde7e9058b27df67e9c5
commit 9863ea304ceecd3c9fa5bde7e9058b27df67e9c5 Author: Mykyta Biliavskyi <m.biliavs...@samsung.com> Date: Tue Dec 22 09:25:53 2015 +0900 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 --- src/lib/dummy_obj.c | 18 ++++++++++++- src/lib/edc_editor.c | 61 +++++++++++++++++++++++++++++++++++++++++++ src/lib/edj_viewer.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib/enventor_private.h | 1 + src/lib/enventor_smart.c | 11 ++++++++ 5 files changed, 155 insertions(+), 1 deletion(-) diff --git a/src/lib/dummy_obj.c b/src/lib/dummy_obj.c index 1fcd8b0..11c81d9 100644 --- a/src/lib/dummy_obj.c +++ b/src/lib/dummy_obj.c @@ -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); diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c index bea9119..702ff02 100644 --- a/src/lib/edc_editor.c +++ b/src/lib/edc_editor.c @@ -936,6 +936,67 @@ edit_focused_cb(void *data, Evas_Object *obj EINA_UNUSED, /*****************************************************************************/ 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, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data) diff --git a/src/lib/edj_viewer.c b/src/lib/edj_viewer.c index f65f05f..c53cb37 100644 --- a/src/lib/edj_viewer.c +++ b/src/lib/edj_viewer.c @@ -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); @@ -358,6 +410,14 @@ base_create(Evas_Object *parent) } 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) { Evas *e = evas_object_evas_get(vd->base); @@ -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 diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h index 3e2adc6..30cc449 100644 --- a/src/lib/enventor_private.h +++ b/src/lib/enventor_private.h @@ -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 diff --git a/src/lib/enventor_smart.c b/src/lib/enventor_smart.c index e99fab0..5ab049f 100644 --- a/src/lib/enventor_smart.c +++ b/src/lib/enventor_smart.c @@ -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 --