From 685fadf86953b69888a48b072ee5b7c73afe2ca5 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 26 Apr 2010 14:55:45 +0000 Subject: [PATCH] item provider callback... add! SVN revision: 48329 --- legacy/edje/src/lib/Edje.h | 3 ++ legacy/edje/src/lib/edje_entry.c | 63 ++++++++++++++++++++++- legacy/edje/src/lib/edje_private.h | 7 +++ legacy/edje/src/lib/edje_util.c | 81 +++++++++++++++++++++++++++++- 4 files changed, 152 insertions(+), 2 deletions(-) diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index efc2399cca..bdd4bf8711 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -495,8 +495,11 @@ extern "C" { EAPI void edje_object_part_text_select_none (const Evas_Object *obj, const char *part); EAPI void edje_object_part_text_select_all (const Evas_Object *obj, const char *part); EAPI void edje_object_part_text_insert (Evas_Object *obj, const char *part, const char *text); + EAPI void edje_object_item_provider_set (Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item), void *data); EAPI const Eina_List *edje_object_part_text_anchor_list_get (const Evas_Object *obj, const char *part); EAPI const Eina_List *edje_object_part_text_anchor_geometry_get (const Evas_Object *obj, const char *part, const char *anchor); + EAPI const Eina_List *edje_object_part_text_item_list_get (const Evas_Object *obj, const char *part); + EAPI Eina_Bool edje_object_part_text_item_geometry_get (const Evas_Object *obj, const char *part, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); EAPI void edje_object_part_text_cursor_geometry_get (const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); EAPI void edje_object_part_text_select_allow_set (const Evas_Object *obj, const char *part, Eina_Bool allow); EAPI void edje_object_part_text_select_abort (const Evas_Object *obj, const char *part); diff --git a/legacy/edje/src/lib/edje_entry.c b/legacy/edje/src/lib/edje_entry.c index e4b721f97e..d5e95d9889 100644 --- a/legacy/edje/src/lib/edje_entry.c +++ b/legacy/edje/src/lib/edje_entry.c @@ -49,6 +49,7 @@ struct _Entry Eina_List *sel; Eina_List *anchors; Eina_List *anchorlist; + Eina_List *itemlist; char *selection; Eina_Bool selecting : 1; Eina_Bool have_selection : 1; @@ -740,6 +741,7 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en) sel = calloc(1, sizeof(Sel)); an->sel = eina_list_append(an->sel, sel); +/* ob = evas_object_rectangle_add(en->rp->edje->evas); evas_object_color_set(ob, 0, 0, 0, 0); evas_object_smart_member_add(ob, smart); @@ -747,7 +749,19 @@ _anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en) evas_object_clip_set(ob, clip); evas_object_pass_events_set(ob, 1); evas_object_show(ob); - sel->obj = ob; + */ + if (en->rp->edje->item_provider.func) + { + ob = en->rp->edje->item_provider.func + (en->rp->edje->item_provider.data, smart, + en->rp->part->name, an->name); + evas_object_smart_member_add(ob, smart); + evas_object_stack_above(ob, o); + evas_object_clip_set(ob, clip); + evas_object_pass_events_set(ob, 1); + evas_object_show(ob); + sel->obj = ob; + } } // for link anchors else @@ -854,6 +868,11 @@ _anchors_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, E free(en->anchorlist->data); en->anchorlist = eina_list_remove_list(en->anchorlist, en->anchorlist); } + while (en->itemlist) + { + free(en->itemlist->data); + en->itemlist = eina_list_remove_list(en->itemlist, en->itemlist); + } while (en->anchors) { Anchor *an = en->anchors->data; @@ -2191,6 +2210,48 @@ _edje_entry_anchors_list(Edje_Real_Part *rp) return en->anchorlist; } +Eina_Bool +_edje_entry_item_geometry_get(Edje_Real_Part *rp, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Entry *en = rp->entry_data; + Eina_List *l; + Anchor *an; + + if (!en) return 0; + EINA_LIST_FOREACH(en->anchors, l, an) + { + if (an->item) continue; + if (!strcmp(item, an->name)) + { + evas_textblock_cursor_format_item_geometry_get(an->start, cx, cy, cw, ch); + return 1; + } + } + return 0; +} + +const Eina_List * +_edje_entry_items_list(Edje_Real_Part *rp) +{ + Entry *en = rp->entry_data; + Eina_List *l, *items = NULL; + Anchor *an; + + if (!en) return NULL; + if (!en->itemlist) + { + EINA_LIST_FOREACH(en->anchors, l, an) + { + const char *n = an->name; + if (an->item) continue; + if (!n) n = ""; + items = eina_list_append(items, strdup(n)); + } + en->itemlist = items; + } + return en->itemlist; +} + void _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 3d1d3f2cea..46d0c991ee 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -869,6 +869,11 @@ struct _Edje lua_State *L; Eina_Inlist *lua_objs; int lua_ref; + + struct { + Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item); + void *data; + } item_provider; }; struct _Edje_Calc_Params @@ -1550,6 +1555,8 @@ void _edje_entry_select_begin(Edje_Real_Part *rp); void _edje_entry_select_extend(Edje_Real_Part *rp); const Eina_List *_edje_entry_anchor_geometry_get(Edje_Real_Part *rp, const char *anchor); const Eina_List *_edje_entry_anchors_list(Edje_Real_Part *rp); +Eina_Bool _edje_entry_item_geometry_get(Edje_Real_Part *rp, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); +const Eina_List *_edje_entry_items_list(Edje_Real_Part *rp); void _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); void _edje_entry_select_allow_set(Edje_Real_Part *rp, Eina_Bool allow); Eina_Bool _edje_entry_select_allow_get(const Edje_Real_Part *rp); diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 7ccb156d19..c7469339c2 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -1603,6 +1603,27 @@ edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *tex rp->edje->text_change.func(rp->edje->text_change.data, obj, part); } +/** + * @brief Set the function that provides item objects for named items in an edje entry text + * + * @param obj A valid Evas Object handle + * @param func The function to call (or NULL to disable) to get item objects + * @param data The data pointer to pass to the @p func callback + * + * Item objects may be deleted any time by Edje, and will be deleted when the + * Edje object is deleted (or file is set to a new file). + */ +EAPI void +edje_object_item_provider_set(Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item), void *data) +{ + Edje *ed; + + ed = _edje_fetch(obj); + if (!ed) return; + ed->item_provider.func = func; + ed->item_provider.data = data; +} + /** * @brief Return a list of char anchor names. * @@ -1637,7 +1658,7 @@ edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part) * @param anchor The anchor name * * @return The list of anchor rects (const Evas_Textblock_Rectangle - * *), do not modify! + * *), do not modify! Geometry is relative to entry part. * * This function return a list of Evas_Textblock_Rectangle anchor * rectangles. @@ -1658,6 +1679,64 @@ edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *pa return NULL; } +/** + * @brief Return a list of char item names. + * + * @param obj A valid Evas_Object handle + * @param part The part name + * + * @return The list of items (const char *), do not modify! + * + * This function returns a list of char item names. + * + */ +EAPI const Eina_List * +edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part) +{ + Edje *ed; + Edje_Real_Part *rp; + + ed = _edje_fetch(obj); + if ((!ed) || (!part)) return NULL; + rp = _edje_real_part_recursive_get(ed, (char *)part); + if (!rp) return NULL; + if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) + return _edje_entry_items_list(rp); + return NULL; +} + +/** + * @brief Return item geometry. + * + * @param obj A valid Evas_Object handle + * @param part The part name + * @param item The item name + * @param cx Item x return (relative to entry part) + * @param cy Item y return (relative to entry part) + * @param cw Item width return + * @param ch Item height return + * + * @return 1 if item exists, 0 if not + * + * This function return a list of Evas_Textblock_Rectangle item + * rectangles. + * + */ +EAPI Eina_Bool +edje_object_part_text_item_geometry_get(const Evas_Object *obj, const char *part, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Edje *ed; + Edje_Real_Part *rp; + + ed = _edje_fetch(obj); + if ((!ed) || (!part)) return 0; + rp = _edje_real_part_recursive_get(ed, (char *)part); + if (!rp) return 0; + if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) + return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch); + return 0; +} + /** * @brief Returns the cursor geometry of the part relative to the edje * object.