From: barbieri Date: Tue, 27 Sep 2011 20:28:36 +0000 (+0000) Subject: elm_box: emit child,removed and child,added, allow smart-recalculate of box. X-Git-Tag: REL_F_I9500_20120323_1~17^2~1750 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=03b16ac14aff4dc1690d20fb5517f5ba1db10690;p=framework%2Fuifw%2Felementary.git elm_box: emit child,removed and child,added, allow smart-recalculate of box. * proxy signals from evas_object_box: child,removed and child,added. Both will carry event_info being the child element. * elm_box_recalculate() to force recalculation of internal box, thus applying the layout to children. Thanks btdrucke for reporting! git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/elementary@63630 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in index 48d15fe..630b620 100644 --- a/src/lib/Elementary.h.in +++ b/src/lib/Elementary.h.in @@ -5857,6 +5857,19 @@ extern "C" { EAPI void elm_box_align_get(const Evas_Object *obj, double *horizontal, double *vertical) EINA_ARG_NONNULL(1); /** + * Force the box to recalculate its children packing. + * + * If any children was added or removed, box will not calculate the + * values immediately rather leaving it to the next main loop + * iteration. While this is great as it would save lots of + * recalculation, whenever you need to get the position of a just + * added item you must force recalculate before doing so. + * + * @param obj The box object. + */ + EAPI void elm_box_recalculate(Evas_Object *obj); + + /** * Set the layout defining function to be used by the box * * Whenever anything changes that requires the box in @p obj to recalculate diff --git a/src/lib/elm_box.c b/src/lib/elm_box.c index 54c67e0..3651363 100644 --- a/src/lib/elm_box.c +++ b/src/lib/elm_box.c @@ -1,8 +1,15 @@ #include #include "elm_priv.h" -#define SIG_CHILD_ADDED "child,added" -#define SIG_CHILD_REMOVED "child,removed" +static const char SIG_CHILD_ADDED[] = "child,added"; +static const char SIG_CHILD_REMOVED[] = "child,removed"; + +static const Evas_Smart_Cb_Description _signals[] = { + {SIG_CHILD_ADDED, ""}, + {SIG_CHILD_REMOVED, ""}, + {NULL, NULL} +}; + typedef struct _Widget_Data Widget_Data; typedef struct _Transition_Animation_Data Transition_Animation_Data; @@ -76,6 +83,22 @@ _elm_box_list_data_get(const Eina_List *list) return opt->obj; } +static void +_cb_proxy_child_added(void *data, Evas_Object *o __UNUSED__, void *event_info) +{ + Evas_Object *box = data; + Evas_Object_Box_Option *opt = event_info; + evas_object_smart_callback_call(box, SIG_CHILD_ADDED, opt->obj); +} + +static void +_cb_proxy_child_removed(void *data, Evas_Object *o __UNUSED__, void *event_info) +{ + Evas_Object *box = data; + Evas_Object *child = event_info; + evas_object_smart_callback_call(box, SIG_CHILD_REMOVED, child); +} + static Eina_Bool _elm_box_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next) { @@ -350,6 +373,12 @@ elm_box_add(Evas_Object *parent) evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); + evas_object_smart_callbacks_descriptions_set(obj, _signals); + evas_object_smart_callback_add + (wd->box, SIG_CHILD_ADDED, _cb_proxy_child_added, obj); + evas_object_smart_callback_add + (wd->box, SIG_CHILD_REMOVED, _cb_proxy_child_removed, obj); + return obj; } @@ -650,3 +679,13 @@ elm_box_align_get(const Evas_Object *obj, double *horizontal, double *vertical) if (!wd) return; evas_object_size_hint_align_get(wd->box, horizontal, vertical); } + +EAPI void +elm_box_recalculate(Evas_Object *obj) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + evas_object_smart_need_recalculate_set(wd->box, EINA_TRUE); + evas_object_smart_calculate(wd->box); +}