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;
|
||||
|
||||
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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue