From 2eee18b46fe7fad36452f7e6e9ec3780af6c0458 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 7 Oct 2008 06:55:11 +0000 Subject: [PATCH] fix sub object tracking. add layout object (untested) SVN revision: 36491 --- legacy/elementary/src/bin/test.c | 4 +- legacy/elementary/src/lib/Elementary.h | 16 ++- legacy/elementary/src/lib/Makefile.am | 1 + legacy/elementary/src/lib/elm_box.c | 23 ++- legacy/elementary/src/lib/elm_button.c | 39 +++++- legacy/elementary/src/lib/elm_frame.c | 169 ++++------------------- legacy/elementary/src/lib/elm_layout.c | 147 ++++++++++++++++++++ legacy/elementary/src/lib/elm_scroller.c | 47 +++++-- legacy/elementary/src/lib/elm_table.c | 16 ++- legacy/elementary/src/lib/elm_toggle.c | 39 +++++- legacy/elementary/src/lib/elm_widget.c | 3 + 11 files changed, 325 insertions(+), 179 deletions(-) create mode 100644 legacy/elementary/src/lib/elm_layout.c diff --git a/legacy/elementary/src/bin/test.c b/legacy/elementary/src/bin/test.c index 64d42fce0f..9c99feabbe 100644 --- a/legacy/elementary/src/bin/test.c +++ b/legacy/elementary/src/bin/test.c @@ -506,8 +506,8 @@ my_win_main(void) /* set weight to 1.0 x 1.0 == expand in x and y) */ evas_object_size_hint_weight_set(bx, 1.0, 0.0); - /* set the box ad the child int he scrolled view*/ - elm_scroller_child_set(sc, bx); + /* set the box ad the content in the scrolled view*/ + elm_scroller_content_set(sc, bx); /* show the box, scroller and main box */ evas_object_show(bx); diff --git a/legacy/elementary/src/lib/Elementary.h b/legacy/elementary/src/lib/Elementary.h index edb6291fa8..0136e90535 100644 --- a/legacy/elementary/src/lib/Elementary.h +++ b/legacy/elementary/src/lib/Elementary.h @@ -123,7 +123,7 @@ extern "C" { */ EAPI Evas_Object *elm_scroller_add(Evas_Object *parent); - EAPI void elm_scroller_child_set(Evas_Object *obj, Evas_Object *child); + EAPI void elm_scroller_content_set(Evas_Object *obj, Evas_Object *child); /* smart callbacks elm_win objects will call: */ @@ -164,4 +164,18 @@ extern "C" { * "changed" - the user changed the time */ +// FIXME: fixes to do +// * current sizing inefficient +// * scroller could do with page up/down/left/right buttons and and idea of +// a page size +// +// FIXME: immediate hitlist for widgets: +// HOVER: select a widget (any) and attach a hover to it - the over will hover +// on top of the hover target and accept child widgets. haver may +// optionally place something to cover the window (under the hover +// widget, above everything else) +// POPSEL: a buttont that when pressed uses a hover to display a h/v box or +// a table of options surrounding the button with scroll butons at +// the end and the ability to drag and scroll + #endif diff --git a/legacy/elementary/src/lib/Makefile.am b/legacy/elementary/src/lib/Makefile.am index ac5234cc95..e75a4703a3 100644 --- a/legacy/elementary/src/lib/Makefile.am +++ b/legacy/elementary/src/lib/Makefile.am @@ -30,6 +30,7 @@ elm_toggle.c \ elm_frame.c \ elm_table.c \ elm_clock.c \ +elm_layout.c \ \ els_pan.c \ els_pan.h \ diff --git a/legacy/elementary/src/lib/elm_box.c b/legacy/elementary/src/lib/elm_box.c index c6d3c3074e..16447527de 100644 --- a/legacy/elementary/src/lib/elm_box.c +++ b/legacy/elementary/src/lib/elm_box.c @@ -10,6 +10,8 @@ struct _Widget_Data static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _del_hook(Evas_Object *obj) @@ -42,7 +44,17 @@ _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { _sizing_eval(data); } - + +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + _sizing_eval(obj); +} + EAPI Evas_Object * elm_box_add(Evas_Object *parent) { @@ -60,7 +72,10 @@ elm_box_add(Evas_Object *parent) elm_widget_sub_object_add(obj, wd->box); evas_object_event_callback_add(wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); - elm_widget_resize_object_set(obj, wd->box); + elm_widget_resize_object_set(obj, wd->box); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); + return obj; } @@ -84,7 +99,6 @@ elm_box_pack_start(Evas_Object *obj, Evas_Object *subobj) Widget_Data *wd = elm_widget_data_get(obj); _els_smart_box_pack_start(wd->box, subobj); elm_widget_sub_object_add(obj, subobj); - // FIXME: track new sub obj... } EAPI void @@ -93,7 +107,6 @@ elm_box_pack_end(Evas_Object *obj, Evas_Object *subobj) Widget_Data *wd = elm_widget_data_get(obj); _els_smart_box_pack_end(wd->box, subobj); elm_widget_sub_object_add(obj, subobj); - // FIXME: track new sub obj... } EAPI void @@ -102,7 +115,6 @@ elm_box_pack_before(Evas_Object *obj, Evas_Object *subobj, Evas_Object *before) Widget_Data *wd = elm_widget_data_get(obj); _els_smart_box_pack_before(wd->box, subobj, before); elm_widget_sub_object_add(obj, subobj); - // FIXME: track new sub obj... } EAPI void @@ -111,5 +123,4 @@ elm_box_pack_after(Evas_Object *obj, Evas_Object *subobj, Evas_Object *after) Widget_Data *wd = elm_widget_data_get(obj); _els_smart_box_pack_after(wd->box, subobj, after); elm_widget_sub_object_add(obj, subobj); - // FIXME: track new sub obj... } diff --git a/legacy/elementary/src/lib/elm_button.c b/legacy/elementary/src/lib/elm_button.c index 7aa1a2677d..58b7b9bfd7 100644 --- a/legacy/elementary/src/lib/elm_button.c +++ b/legacy/elementary/src/lib/elm_button.c @@ -6,11 +6,13 @@ typedef struct _Widget_Data Widget_Data; struct _Widget_Data { Evas_Object *btn; + Evas_Object *icon; }; static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source); static void @@ -35,10 +37,26 @@ static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); + if (obj != wd->icon) return; edje_object_part_swallow(wd->btn, "elm.swallow.content", obj); _sizing_eval(data); } +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + if (sub == wd->icon) + { + edje_object_signal_emit(wd->btn, "elm,state,icon,hidden", "elm"); + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->icon = NULL; + _sizing_eval(obj); + } +} + static void _signal_clicked(void *data, Evas_Object *obj, const char *emission, const char *source) { @@ -63,6 +81,8 @@ elm_button_add(Evas_Object *parent) _elm_theme_set(wd->btn, "button", "button"); edje_object_signal_callback_add(wd->btn, "elm,action,click", "", _signal_clicked, obj); elm_widget_resize_object_set(obj, wd->btn); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); _sizing_eval(obj); return obj; @@ -92,11 +112,16 @@ EAPI void elm_button_icon_set(Evas_Object *obj, Evas_Object *icon) { Widget_Data *wd = elm_widget_data_get(obj); - edje_object_part_swallow(wd->btn, "elm.swallow.content", icon); - edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm"); - elm_widget_sub_object_add(obj, icon); - evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - // FIXME: track new sub obj... - _sizing_eval(obj); + if ((wd->icon != icon) && (wd->icon)) + elm_widget_sub_object_del(obj, wd->icon); + wd->icon = icon; + if (icon) + { + edje_object_part_swallow(wd->btn, "elm.swallow.content", icon); + edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm"); + elm_widget_sub_object_add(obj, icon); + evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + _sizing_eval(obj); + } } diff --git a/legacy/elementary/src/lib/elm_frame.c b/legacy/elementary/src/lib/elm_frame.c index 1653731c0e..3bcda47924 100644 --- a/legacy/elementary/src/lib/elm_frame.c +++ b/legacy/elementary/src/lib/elm_frame.c @@ -6,11 +6,13 @@ typedef struct _Widget_Data Widget_Data; struct _Widget_Data { Evas_Object *frm; + Evas_Object *content; }; static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _del_hook(Evas_Object *obj) @@ -38,6 +40,20 @@ _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) _sizing_eval(data); } +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + if (sub == wd->content) + { + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->content = NULL; + _sizing_eval(obj); + } +} + EAPI Evas_Object * elm_frame_add(Evas_Object *parent) { @@ -54,6 +70,8 @@ elm_frame_add(Evas_Object *parent) wd->frm = edje_object_add(e); _elm_theme_set(wd->frm, "frame", "frame"); elm_widget_resize_object_set(obj, wd->frm); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); _sizing_eval(obj); return obj; @@ -71,148 +89,15 @@ EAPI void elm_frame_content_set(Evas_Object *obj, Evas_Object *content) { Widget_Data *wd = elm_widget_data_get(obj); - edje_object_part_swallow(wd->frm, "elm.swallow.content", content); - elm_widget_sub_object_add(obj, content); - evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - // FIXME: track new sub obj... - _sizing_eval(obj); -} - -/* -static void _elm_frame_text_set(Elm_Frame *fr, const char *text); - -Elm_Frame_Class _elm_frame_class = -{ - &_elm_widget_class, - ELM_OBJ_FRAME, - _elm_frame_text_set -}; - -static void -_elm_frame_text_set(Elm_Frame *fr, const char *text) -{ - Evas_Coord mw, mh; - - edje_object_part_text_set(fr->base, "elm.text", text); - edje_object_size_min_calc(fr->base, &mw, &mh); - if ((fr->minw != mw) || (fr->minh != mh)) + if ((wd->content != content) && (wd->content)) + elm_widget_sub_object_del(obj, wd->content); + wd->content = content; + if (content) { - fr->minw = mw; - fr->minh = mh; - ((Elm_Widget *)(fr->parent))->size_req(fr->parent, fr, fr->minw, fr->minh); - fr->geom_set(fr, fr->x, fr->y, fr->minw, fr->minh); + edje_object_part_swallow(wd->frm, "elm.swallow.content", content); + elm_widget_sub_object_add(obj, content); + evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + _sizing_eval(obj); } } - -static void -_elm_frame_size_alloc(Elm_Frame *fr, int w, int h) -{ - if (w < fr->minw) w = fr->minw; - if (h < fr->minh) h = fr->minh; - fr->req.w = w; - fr->req.h = h; -} - -static void -_elm_frame_size_req(Elm_Frame *fr, Elm_Widget *child, int w, int h) -{ - Evas_Coord mw, mh; - - if (child) - { - Evas_Coord maxx, maxy; - - child->size_alloc(child, 0, 0); - maxx = child->req.w; - maxy = child->req.h; - if (child->expand_x) maxx = 32767; - if (child->expand_y) maxy = 32767; - edje_extern_object_min_size_set(child->base, - child->req.w, - child->req.h); - edje_object_part_swallow(fr->base , "elm.swallow.content", - child->base); - edje_object_size_min_calc(fr->base, &mw, &mh); - if ((fr->minw != mw) || (fr->minh != mh)) - { - fr->minw = mw; - fr->minh = mh; - ((Elm_Widget *)(fr->parent))->size_req(fr->parent, fr, mw, mh); - fr->geom_set(fr, fr->x, fr->y, mw, mh); - } - } - else - { - // FIXME: handle - } -} - -static void -_elm_on_child_add(void *data, Elm_Frame *fr, Elm_Cb_Type type, Elm_Obj *obj) -{ - Evas_Coord mw, mh; - - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - ((Elm_Widget *)(obj))->size_alloc(obj, 0, 0); - ((Elm_Widget *)(obj))->geom_set(obj, - ((Elm_Widget *)(obj))->x, - ((Elm_Widget *)(obj))->y, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_extern_object_min_size_set(((Elm_Widget *)(obj))->base, - ((Elm_Widget *)(obj))->req.w, - ((Elm_Widget *)(obj))->req.h); - edje_object_part_swallow(fr->base , "elm.swallow.content", - ((Elm_Widget *)(obj))->base); - edje_object_size_min_calc(fr->base, &mw, &mh); - if ((fr->minw != mw) || (fr->minh != mh)) - { - fr->minw = mw; - fr->minh = mh; - ((Elm_Widget *)(fr->parent))->size_req(fr->parent, fr, mw, mh); - fr->geom_set(fr, fr->x, fr->y, mw, mh); - } -} - -static void -_elm_on_child_del(void *data, Elm_Frame *fr, Elm_Cb_Type type, Elm_Obj *obj) -{ - if (!(obj->hastype(obj, ELM_OBJ_WIDGET))) return; - // FIXME: allow for removal of child - size down -} - -static void -_elm_frame_del(Elm_Frame *fr) -{ - if (fr->text) evas_stringshare_del(fr->text); - ((Elm_Obj_Class *)(((Elm_Frame_Class *)(fr->clas))->parent))->del(ELM_OBJ(fr)); -} - -EAPI Elm_Frame * -elm_frame_new(Elm_Win *win) -{ - Elm_Frame *fr; - - fr = ELM_NEW(Elm_Frame); - - _elm_widget_init(fr); - fr->clas = &_elm_frame_class; - fr->type = ELM_OBJ_FRAME; - - fr->del = _elm_frame_del; - - fr->size_alloc = _elm_frame_size_alloc; - fr->size_req = _elm_frame_size_req; - - fr->text_set = _elm_frame_text_set; - - fr->base = edje_object_add(win->evas); - _elm_theme_set(fr->base, "frame", "frame"); - fr->cb_add(fr, ELM_CB_CHILD_ADD, _elm_on_child_add, NULL); - fr->cb_add(fr, ELM_CB_CHILD_DEL, _elm_on_child_del, NULL); - _elm_widget_post_init(fr); - win->child_add(win, fr); - return fr; -} -*/ diff --git a/legacy/elementary/src/lib/elm_layout.c b/legacy/elementary/src/lib/elm_layout.c new file mode 100644 index 0000000000..25ac80aec6 --- /dev/null +++ b/legacy/elementary/src/lib/elm_layout.c @@ -0,0 +1,147 @@ +#include +#include "elm_priv.h" + +typedef struct _Widget_Data Widget_Data; +typedef struct _Subinfo Subinfo; + +struct _Widget_Data +{ + Evas_Object *lay; + Evas_List *subs; +}; + +struct _Subinfo +{ + const char *swallow; + Evas_Object *obj; +}; + +static void _del_hook(Evas_Object *obj); +static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); + +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + while (wd->subs) + { + Subinfo *si = wd->subs->data; + wd->subs = evas_list_remove_list(wd->subs, wd->subs); + evas_stringshare_del(si->swallow); + free(si); + } + free(wd); +} + +static void +_sizing_eval(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; + + edje_object_size_min_calc(wd->lay, &minw, &minh); + evas_object_size_hint_min_set(obj, minw, minh); + evas_object_size_hint_max_set(obj, maxw, maxh); +} + +static void +_changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(data); + Evas_List *l; + for (l = wd->subs; l; l = l->next) + { + Subinfo *si = l->data; + if (si->obj == obj) + { + edje_object_part_swallow(wd->lay, si->swallow, obj); + _sizing_eval(obj); + break; + } + } +} + +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + Evas_List *l; + + for (l = wd->subs; l; l = l->next) + { + Subinfo *si = l->data; + if (si->obj == sub) + { + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->subs = evas_list_remove_list(wd->subs, l); + evas_stringshare_del(si->swallow); + free(si); + break; + } + } +} + +EAPI Evas_Object * +elm_layout_add(Evas_Object *parent) +{ + Evas_Object *obj; + Evas *e; + Widget_Data *wd; + + wd = ELM_NEW(Widget_Data); + e = evas_object_evas_get(parent); + obj = elm_widget_add(e); + elm_widget_data_set(obj, wd); + elm_widget_del_hook_set(obj, _del_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); + return obj; +} + +EAPI void +elm_layout_file_set(Evas_Object *obj, const char *file, const char *group) +{ + Widget_Data *wd = elm_widget_data_get(obj); + _elm_theme_set(wd->lay, file, group); + _sizing_eval(obj); +} + +EAPI void +elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Subinfo *si; + Evas_List *l; + + for (l = wd->subs; l; l = l->next) + { + si = l->data; + if (!strcmp(swallow, si->swallow)) + { + if (content == si->obj) return; + elm_widget_sub_object_del(obj, si->obj); + break; + } + } + if (content) + { + edje_object_part_swallow(wd->lay, swallow, content); + elm_widget_sub_object_add(obj, content); + evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + si = ELM_NEW(Subinfo); + si->swallow = evas_stringshare_add(swallow); + si->obj = content; + wd->subs = evas_list_append(wd->subs, si); + _sizing_eval(obj); + } +} diff --git a/legacy/elementary/src/lib/elm_scroller.c b/legacy/elementary/src/lib/elm_scroller.c index b214bd9ee9..d019a982b8 100644 --- a/legacy/elementary/src/lib/elm_scroller.c +++ b/legacy/elementary/src/lib/elm_scroller.c @@ -6,11 +6,12 @@ typedef struct _Widget_Data Widget_Data; struct _Widget_Data { Evas_Object *scr; - Evas_Object *child; + Evas_Object *content; }; static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _del_hook(Evas_Object *obj) @@ -26,9 +27,9 @@ _sizing_eval(Evas_Object *obj) Evas_Coord vw, vh, minw, minh, maxw, maxh; double xw, xy; - evas_object_size_hint_min_get(wd->child, &minw, &minh); - evas_object_size_hint_max_get(wd->child, &maxw, &maxh); - evas_object_size_hint_weight_get(wd->child, &xw, &xy); + evas_object_size_hint_min_get(wd->content, &minw, &minh); + evas_object_size_hint_max_get(wd->content, &maxw, &maxh); + evas_object_size_hint_weight_get(wd->content, &xw, &xy); elm_smart_scroller_child_viewport_size_get(wd->scr, &vw, &vh); if (xw > 0.0) { @@ -42,7 +43,7 @@ _sizing_eval(Evas_Object *obj) else if ((maxh > 0) && (vh > maxh)) vh = maxh; } else if (minh > 0) vh = minh; - evas_object_resize(wd->child, vw, vh); + evas_object_resize(wd->content, vw, vh); } static void @@ -51,6 +52,20 @@ _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) _sizing_eval(data); } +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + if (sub == wd->content) + { + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->content = NULL; + _sizing_eval(obj); + } +} + static void _resize(void *data, Evas *e, Evas_Object *obj, void *event_info) { @@ -77,20 +92,26 @@ elm_scroller_add(Evas_Object *parent) edje_object_size_min_calc(wd->scr, &minw, &minh); evas_object_size_hint_min_set(obj, minw, minh); evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize, obj); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); _sizing_eval(obj); return obj; } EAPI void -elm_scroller_child_set(Evas_Object *obj, Evas_Object *child) +elm_scroller_content_set(Evas_Object *obj, Evas_Object *content) { Widget_Data *wd = elm_widget_data_get(obj); - wd->child = child; - elm_smart_scroller_child_set(wd->scr, child); - evas_object_event_callback_add(child, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - elm_widget_sub_object_add(obj, child); - // FIXME: track new sub obj... - _sizing_eval(obj); + if ((wd->content != content) && (wd->content)) + elm_widget_sub_object_del(obj, wd->content); + wd->content = content; + if (content) + { + elm_smart_scroller_child_set(wd->scr, content); + evas_object_event_callback_add(content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + elm_widget_sub_object_add(obj, content); + _sizing_eval(obj); + } } diff --git a/legacy/elementary/src/lib/elm_table.c b/legacy/elementary/src/lib/elm_table.c index 4776ea6cc2..4771d7a21f 100644 --- a/legacy/elementary/src/lib/elm_table.c +++ b/legacy/elementary/src/lib/elm_table.c @@ -10,6 +10,8 @@ struct _Widget_Data static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _del_hook(Evas_Object *obj) @@ -43,6 +45,16 @@ _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) _sizing_eval(data); } +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + _sizing_eval(obj); +} + EAPI Evas_Object * elm_table_add(Evas_Object *parent) { @@ -61,6 +73,9 @@ elm_table_add(Evas_Object *parent) evas_object_event_callback_add(wd->tbl, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); elm_widget_resize_object_set(obj, wd->tbl); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); + return obj; } @@ -77,5 +92,4 @@ elm_table_pack(Evas_Object *obj, Evas_Object *subobj, int x, int y, int w, int h Widget_Data *wd = elm_widget_data_get(obj); _els_smart_table_pack(wd->tbl, subobj, x, y, w, h); elm_widget_sub_object_add(obj, subobj); - // FIXME: track new sub obj... } diff --git a/legacy/elementary/src/lib/elm_toggle.c b/legacy/elementary/src/lib/elm_toggle.c index 1cc2aa553b..7456acb8b6 100644 --- a/legacy/elementary/src/lib/elm_toggle.c +++ b/legacy/elementary/src/lib/elm_toggle.c @@ -6,6 +6,7 @@ typedef struct _Widget_Data Widget_Data; struct _Widget_Data { Evas_Object *tgl; + Evas_Object *icon; Evas_Bool state; Evas_Bool *statep; }; @@ -13,6 +14,7 @@ struct _Widget_Data static void _del_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _signal_toggle_off(void *data, Evas_Object *obj, const char *emission, const char *source); static void _signal_toggle_on(void *data, Evas_Object *obj, const char *emission, const char *source); @@ -38,10 +40,26 @@ static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info) { Widget_Data *wd = elm_widget_data_get(data); + if (obj != wd->icon) return; edje_object_part_swallow(wd->tgl, "elm.swallow.content", obj); _sizing_eval(data); } +static void +_sub_del(void *data, Evas_Object *obj, void *event_info) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *sub = event_info; + if (sub == wd->icon) + { + edje_object_signal_emit(wd->tgl, "elm,state,icon,hidden", "elm"); + evas_object_event_callback_del + (sub, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints); + wd->icon = NULL; + _sizing_eval(obj); + } +} + static void _signal_toggle_off(void *data, Evas_Object *obj, const char *emission, const char *source) { @@ -78,6 +96,8 @@ elm_toggle_add(Evas_Object *parent) edje_object_signal_callback_add(wd->tgl, "elm,action,toggle,on", "", _signal_toggle_on, obj); edje_object_signal_callback_add(wd->tgl, "elm,action,toggle,off", "", _signal_toggle_off, obj); elm_widget_resize_object_set(obj, wd->tgl); + + evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj); _sizing_eval(obj); return obj; @@ -107,13 +127,18 @@ EAPI void elm_toggle_icon_set(Evas_Object *obj, Evas_Object *icon) { Widget_Data *wd = elm_widget_data_get(obj); - edje_object_part_swallow(wd->tgl, "elm.swallow.content", icon); - edje_object_signal_emit(wd->tgl, "elm,state,icon,visible", "elm"); - elm_widget_sub_object_add(obj, icon); - evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - // FIXME: track new sub obj... - _sizing_eval(obj); + if ((wd->icon != icon) && (wd->icon)) + elm_widget_sub_object_del(obj, wd->icon); + wd->icon = icon; + if (icon) + { + edje_object_part_swallow(wd->tgl, "elm.swallow.content", icon); + edje_object_signal_emit(wd->tgl, "elm,state,icon,visible", "elm"); + elm_widget_sub_object_add(obj, icon); + evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + _sizing_eval(obj); + } } EAPI void diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index a80d1b8fb9..ea5acc0241 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/src/lib/elm_widget.c @@ -146,6 +146,7 @@ elm_widget_sub_object_add(Evas_Object *obj, Evas_Object *sobj) sd->parent_obj = obj; } } + evas_object_smart_callback_call(obj, "sub-object-add", sobj); } EAPI void @@ -157,6 +158,7 @@ elm_widget_sub_object_del(Evas_Object *obj, Evas_Object *sobj) { if (elm_widget_can_focus_get(sobj)) sd->child_can_focus = 0; } + evas_object_smart_callback_call(obj, "sub-object-del", sobj); } EAPI void @@ -167,6 +169,7 @@ elm_widget_resize_object_set(Evas_Object *obj, Evas_Object *sobj) sd->resize_obj = sobj; evas_object_smart_member_add(sobj, obj); _smart_reconfigure(sd); + evas_object_smart_callback_call(obj, "sub-object-add", sobj); } EAPI void