From: Enlightenment S. <no-...@en...> - 2009-11-17 16:32:59
|
Log: elm_layout: deferred sizing_eval to calculate (pre-render) phase. This plays well with edje's own deferred calculations. Usually size hints are set on children and edje will flag itself as dirty, but real calculations are deferred to "calculate" phase before rendering. For now this unbreaks elm_layout with contents... but other types such as GROUP, BOX and TABLE remain broken: when they change their internal state (ie: child object is packed into box or table), this will not trigger elm_layout. That said, we need a better solution. Maybe ask edje to emit signals when one of its children change hints (it already listen to this anyway), in this case elm_layout should listen to those instead of connecting directly to objects given through elm_layout_content_set(). Author: barbieri Date: 2009-11-17 08:32:45 -0800 (Tue, 17 Nov 2009) New Revision: 43752 Modified: trunk/TMP/st/elementary/src/lib/elm_layout.c trunk/TMP/st/elementary/src/lib/elm_priv.h trunk/TMP/st/elementary/src/lib/elm_widget.c Modified: trunk/TMP/st/elementary/src/lib/elm_layout.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_layout.c 2009-11-17 15:55:59 UTC (rev 43751) +++ trunk/TMP/st/elementary/src/lib/elm_layout.c 2009-11-17 16:32:45 UTC (rev 43752) @@ -17,6 +17,7 @@ { Evas_Object *lay; Eina_List *subs; + Eina_Bool needs_size_calc:1; }; struct _Subinfo @@ -56,6 +57,17 @@ } static void +_changed_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (wd->needs_size_calc) + { + _sizing_eval(obj); + wd->needs_size_calc = 0; + } +} + +static void _sizing_eval(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); @@ -67,9 +79,18 @@ } static void +_request_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (wd->needs_size_calc) return; + wd->needs_size_calc = 1; + evas_object_smart_changed(obj); +} + +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { - _sizing_eval(data); + _request_sizing_eval(data); } static void @@ -119,13 +140,14 @@ elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); + elm_widget_changed_hook_set(obj, _changed_hook); wd->lay = edje_object_add(e); elm_widget_resize_object_set(obj, wd->lay); evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); - _sizing_eval(obj); + _request_sizing_eval(obj); return obj; } @@ -146,7 +168,7 @@ Widget_Data *wd = elm_widget_data_get(obj); Eina_Bool ret = edje_object_file_set(wd->lay, file, group); - if (ret) _sizing_eval(obj); + if (ret) _request_sizing_eval(obj); return ret; } @@ -186,7 +208,7 @@ si->swallow = eina_stringshare_add(swallow); si->obj = content; wd->subs = eina_list_append(wd->subs, si); - _sizing_eval(obj); + _request_sizing_eval(obj); } } Modified: trunk/TMP/st/elementary/src/lib/elm_priv.h =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_priv.h 2009-11-17 15:55:59 UTC (rev 43751) +++ trunk/TMP/st/elementary/src/lib/elm_priv.h 2009-11-17 16:32:45 UTC (rev 43752) @@ -98,6 +98,7 @@ EAPI void elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); EAPI void elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); EAPI void elm_widget_theme_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); EAPI void elm_widget_theme(Evas_Object *obj); EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); EAPI void elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); Modified: trunk/TMP/st/elementary/src/lib/elm_widget.c =================================================================== --- trunk/TMP/st/elementary/src/lib/elm_widget.c 2009-11-17 15:55:59 UTC (rev 43751) +++ trunk/TMP/st/elementary/src/lib/elm_widget.c 2009-11-17 16:32:45 UTC (rev 43752) @@ -28,6 +28,7 @@ void (*activate_func) (Evas_Object *obj); void (*disable_func) (Evas_Object *obj); void (*theme_func) (Evas_Object *obj); + void (*changed_func) (Evas_Object *obj); void (*on_focus_func) (void *data, Evas_Object *obj); void *on_focus_data; void (*on_change_func) (void *data, Evas_Object *obj); @@ -57,6 +58,7 @@ static void _smart_color_set(Evas_Object *obj, int r, int g, int b, int a); static void _smart_clip_set(Evas_Object *obj, Evas_Object * clip); static void _smart_clip_unset(Evas_Object *obj); +static void _smart_calculate(Evas_Object *obj); static void _smart_init(void); /* local subsystem globals */ @@ -146,6 +148,13 @@ } EAPI void +elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->changed_func = func; +} + +EAPI void elm_widget_theme(Evas_Object *obj) { const Eina_List *l; @@ -961,6 +970,13 @@ evas_object_clip_unset(sd->resize_obj); } +static void +_smart_calculate(Evas_Object *obj) +{ + INTERNAL_ENTRY; + if (sd->changed_func) sd->changed_func(obj); +} + /* never need to touch this */ static void @@ -981,9 +997,9 @@ _smart_color_set, _smart_clip_set, _smart_clip_unset, + _smart_calculate, NULL, NULL, - NULL, NULL }; _e_smart = evas_smart_class_new(&sc); |