forked from enlightenment/enventor
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:
parent
3b4a6767a5
commit
9863ea304c
|
@ -23,10 +23,19 @@ typedef struct dummy_obj_s
|
||||||
} dummy_obj;
|
} dummy_obj;
|
||||||
|
|
||||||
const char *DUMMYOBJ = "dummy_obj";
|
const char *DUMMYOBJ = "dummy_obj";
|
||||||
|
const char *EDIT_LAYOUT_KEY = "edit_layout";
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Internal method implementation */
|
/* 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
|
static void
|
||||||
dummy_objs_update(dummy_obj *dummy)
|
dummy_objs_update(dummy_obj *dummy)
|
||||||
|
@ -93,8 +102,11 @@ dummy_objs_update(dummy_obj *dummy)
|
||||||
edje_object_part_swallow(dummy->layout, part_name, obj);
|
edje_object_part_swallow(dummy->layout, part_name, obj);
|
||||||
|
|
||||||
po->obj = obj;
|
po->obj = obj;
|
||||||
|
evas_object_data_set(po->obj, EDIT_LAYOUT_KEY, dummy->layout);
|
||||||
po->name = eina_stringshare_add(part_name);
|
po->name = eina_stringshare_add(part_name);
|
||||||
dummy->swallows = eina_list_append(dummy->swallows, po);
|
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)
|
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);
|
dummy->spacers = eina_list_append(dummy->spacers, po);
|
||||||
evas_object_show(obj);
|
evas_object_show(obj);
|
||||||
evas_object_clip_set(obj, clipper);
|
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);
|
evas_object_geometry_get(dummy->layout, &lx, &ly, NULL, NULL);
|
||||||
edje_object_part_geometry_get(dummy->layout, part_name, &x, &y, &w, &h);
|
edje_object_part_geometry_get(dummy->layout, part_name, &x, &y, &w, &h);
|
||||||
|
|
|
@ -935,6 +935,67 @@ edit_focused_cb(void *data, Evas_Object *obj EINA_UNUSED,
|
||||||
/* Externally accessible calls */
|
/* 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
|
void
|
||||||
edit_view_sync_cb_set(edit_data *ed,
|
edit_view_sync_cb_set(edit_data *ed,
|
||||||
void (*cb)(void *data, Eina_Stringshare *state_name, double state_value,
|
void (*cb)(void *data, Eina_Stringshare *state_name, double state_value,
|
||||||
|
|
|
@ -28,6 +28,7 @@ struct viewer_s
|
||||||
Ecore_Timer *timer;
|
Ecore_Timer *timer;
|
||||||
Eio_Monitor *edj_monitor;
|
Eio_Monitor *edj_monitor;
|
||||||
Eina_List *img_monitors;
|
Eina_List *img_monitors;
|
||||||
|
Eina_List *part_names;
|
||||||
Eio_Monitor *img_monitor;
|
Eio_Monitor *img_monitor;
|
||||||
Ecore_Event_Handler *edj_monitor_event;
|
Ecore_Event_Handler *edj_monitor_event;
|
||||||
Ecore_Event_Handler *img_monitor_event;
|
Ecore_Event_Handler *img_monitor_event;
|
||||||
|
@ -41,6 +42,8 @@ struct viewer_s
|
||||||
Eina_Bool edj_reload_need : 1;
|
Eina_Bool edj_reload_need : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const char *PART_NAME = "part_name";
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Internal method implementation */
|
/* Internal method implementation */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -270,6 +273,53 @@ view_scroller_create(Evas_Object *parent)
|
||||||
return scroller;
|
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
|
static Eina_Bool
|
||||||
exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
|
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);
|
view_part_highlight_set(vd, vd->part_name);
|
||||||
dummy_obj_update(vd->layout);
|
dummy_obj_update(vd->layout);
|
||||||
|
|
||||||
|
view_obj_parts_callbacks_set(vd);
|
||||||
vd->edj_reload_need = EINA_FALSE;
|
vd->edj_reload_need = EINA_FALSE;
|
||||||
|
|
||||||
evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_UPDATED,
|
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;
|
Eio_Monitor_Event *ev = event;
|
||||||
|
|
||||||
if (vd->edj_monitor != ev->monitor) return ECORE_CALLBACK_PASS_ON;
|
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??
|
//FIXME: why it need to add monitor again??
|
||||||
eio_monitor_del(vd->edj_monitor);
|
eio_monitor_del(vd->edj_monitor);
|
||||||
|
@ -357,6 +409,14 @@ base_create(Evas_Object *parent)
|
||||||
return base;
|
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
|
static void
|
||||||
view_obj_create(view_data *vd)
|
view_obj_create(view_data *vd)
|
||||||
{
|
{
|
||||||
|
@ -371,6 +431,11 @@ view_obj_create(view_data *vd)
|
||||||
EVAS_HINT_EXPAND);
|
EVAS_HINT_EXPAND);
|
||||||
evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
|
evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE,
|
||||||
layout_resize_cb, vd);
|
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
|
static void
|
||||||
|
|
|
@ -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_disabled_set(edit_data *ed, Eina_Bool disabled);
|
||||||
void edit_error_set(edit_data *ed, int line, const char *target);
|
void edit_error_set(edit_data *ed, int line, const char *target);
|
||||||
void edit_text_insert(edit_data *ed, const char *text);
|
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
|
#endif
|
||||||
|
|
|
@ -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 */
|
/* 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);
|
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_down_cb, pd);
|
||||||
pd->key_up_handler =
|
pd->key_up_handler =
|
||||||
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, key_up_cb, pd);
|
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
|
EOLIAN static void
|
||||||
|
|
Loading…
Reference in New Issue