diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index 47313fa388..853a11295c 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -1107,12 +1107,15 @@ extern "C" { typedef struct _Evas_Object_Box_Option Evas_Object_Box_Option; typedef void (*Evas_Object_Box_Layout)(Evas_Object *o, Evas_Object_Box_Data *priv, void *user_data); +#define EVAS_OBJECT_BOX_API_VERSION 1 struct _Evas_Object_Box_Api { Evas_Smart_Class base; + int version; Evas_Object_Box_Option *(*append)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child); Evas_Object_Box_Option *(*prepend)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child); Evas_Object_Box_Option *(*insert_before)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference); + Evas_Object_Box_Option *(*insert_after)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference); Evas_Object_Box_Option *(*insert_at)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, unsigned int pos); Evas_Object *(*remove)(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child); Evas_Object *(*remove_at)(Evas_Object *o, Evas_Object_Box_Data *priv, unsigned int pos); @@ -1137,7 +1140,7 @@ extern "C" { * @see EVAS_OBJECT_BOX_API_INIT_VERSION * @see EVAS_OBJECT_BOX_API_INIT_NAME_VERSION */ -#define EVAS_OBJECT_BOX_API_INIT(smart_class_init) {smart_class_init, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} +#define EVAS_OBJECT_BOX_API_INIT(smart_class_init) {smart_class_init, EVAS_OBJECT_BOX_API_VERSION, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} /** * Initializer to zero a whole Evas_Object_Box_Api structure. @@ -1225,6 +1228,7 @@ extern "C" { EAPI Evas_Object_Box_Option *evas_object_box_append(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2); EAPI Evas_Object_Box_Option *evas_object_box_prepend(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2); EAPI Evas_Object_Box_Option *evas_object_box_insert_before(Evas_Object *o, Evas_Object *child, const Evas_Object *reference) EINA_ARG_NONNULL(1, 2, 3); + EAPI Evas_Object_Box_Option *evas_object_box_insert_after(Evas_Object *o, Evas_Object *child, const Evas_Object *referente) EINA_ARG_NONNULL(1, 2, 3); EAPI Evas_Object_Box_Option *evas_object_box_insert_at(Evas_Object *o, Evas_Object *child, unsigned int pos) EINA_ARG_NONNULL(1, 2); EAPI Eina_Bool evas_object_box_remove(Evas_Object *o, Evas_Object *child) EINA_ARG_NONNULL(1, 2); EAPI Eina_Bool evas_object_box_remove_at(Evas_Object *o, unsigned int pos) EINA_ARG_NONNULL(1); diff --git a/legacy/evas/src/lib/canvas/evas_object_box.c b/legacy/evas/src/lib/canvas/evas_object_box.c index de4489bff0..8bf66a9e63 100644 --- a/legacy/evas/src/lib/canvas/evas_object_box.c +++ b/legacy/evas/src/lib/canvas/evas_object_box.c @@ -266,6 +266,31 @@ _evas_object_box_insert_before_default(Evas_Object *o, Evas_Object_Box_Data *pri return NULL; } +static Evas_Object_Box_Option * +_evas_object_box_insert_after_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, const Evas_Object *reference) +{ + Eina_List *l; + Evas_Object_Box_Option *opt; + + EINA_LIST_FOREACH(priv->children, l, opt) + { + if (opt->obj == reference) + { + Evas_Object_Box_Option *new_opt; + + new_opt = _evas_object_box_option_new(o, priv, child); + if (!new_opt) + return NULL; + + priv->children = eina_list_append_relative + (priv->children, new_opt, opt); + return new_opt; + } + } + + return NULL; +} + static Evas_Object_Box_Option * _evas_object_box_insert_at_default(Evas_Object *o, Evas_Object_Box_Data *priv, Evas_Object *child, unsigned int pos) { @@ -534,6 +559,7 @@ evas_object_box_smart_set(Evas_Object_Box_Api *api) api->append = _evas_object_box_append_default; api->prepend = _evas_object_box_prepend_default; api->insert_before = _evas_object_box_insert_before_default; + api->insert_after = _evas_object_box_insert_after_default; api->insert_at = _evas_object_box_insert_at_default; api->remove = _evas_object_box_remove_default; api->remove_at = _evas_object_box_remove_at_default; @@ -2022,6 +2048,37 @@ evas_object_box_insert_before(Evas_Object *o, Evas_Object *child, const Evas_Obj return NULL; } +/** + * Append a new object @a child to the box @c o relative to element @a + * reference. If @a reference is not contained in the box or any other + * error occurs, @c NULL is returend. + */ +Evas_Object_Box_Option * +evas_object_box_insert_after(Evas_Object *o, Evas_Object *child, const Evas_Object *reference) +{ + Evas_Object_Box_Option *opt; + const Evas_Object_Box_Api *api; + + EVAS_OBJECT_BOX_DATA_GET_OR_RETURN_VAL(o, priv, NULL); + if (!child) + return NULL; + + api = priv->api; + if ((!api) || (!api->insert_after)) + return NULL; + + opt = api->insert_after(o, priv, child, reference); + + if (opt) + { + evas_object_smart_member_add(child, o); + evas_object_smart_changed(o); + return _evas_object_box_option_callbacks_register(o, priv, opt); + } + + return NULL; +} + /** * Insert a new object @a child to the box @a o at position @a pos. On * error, @c NULL is returned.