cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=f6cdbc2d43cd643af4a54eb3a3338ac5c4442dc5
commit f6cdbc2d43cd643af4a54eb3a3338ac5c4442dc5 Author: Cedric BAIL <cedric.b...@free.fr> Date: Fri Aug 16 11:40:38 2019 -0700 elementary: allow Efl.Ui.Factory to have a chance to call constructor function. Reviewed-by: Lauro Neto <Lauro Moura <lauromo...@expertisesolutions.com.br>> Reviewed-by: Marcel Hollerbach <m...@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D9599 --- src/lib/efl/interfaces/efl_ui_factory.eo | 8 ++++++ src/lib/elementary/efl_ui_caching_factory.c | 1 + src/lib/elementary/efl_ui_layout_factory.c | 10 +++++-- src/lib/elementary/efl_ui_layout_factory.eo | 1 + src/lib/elementary/efl_ui_widget_factory.c | 43 +++++++++++++++++++++-------- src/lib/elementary/efl_ui_widget_factory.eo | 1 + 6 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/lib/efl/interfaces/efl_ui_factory.eo b/src/lib/efl/interfaces/efl_ui_factory.eo index 38bb51455a..9b98ece447 100644 --- a/src/lib/efl/interfaces/efl_ui_factory.eo +++ b/src/lib/efl/interfaces/efl_ui_factory.eo @@ -22,6 +22,14 @@ interface @beta Efl.Ui.Factory extends Efl.Ui.Property_Bind, Efl.Ui.Factory_Bind ui_view: Efl.Gfx.Entity; [[Efl canvas]] } } + building @const { + [[This function is called during the creation of an UI object between the @Efl.Object.constructor and @Efl.Object.finalize call. + + Note: if the @Efl.Ui.Factory does keep a cache of object, this won't be called when object are pulled out of the cache.]] + params { + ui_view: Efl.Gfx.Entity; [[The UI object being created.]] + } + } } events { created: Efl.Ui.Factory_Item_Created_Event; [[Event triggered when an item has been successfully created.]] diff --git a/src/lib/elementary/efl_ui_caching_factory.c b/src/lib/elementary/efl_ui_caching_factory.c index a7fb277356..2d32572cee 100644 --- a/src/lib/elementary/efl_ui_caching_factory.c +++ b/src/lib/elementary/efl_ui_caching_factory.c @@ -244,6 +244,7 @@ _efl_ui_caching_factory_efl_ui_factory_create(Eo *obj, EINA_ITERATOR_FOREACH(models, model) { w = efl_add(pd->klass, parent, + efl_ui_factory_building(obj, efl_added), efl_ui_view_model_set(efl_added, model)); eina_value_array_append(&gr->done, w); } diff --git a/src/lib/elementary/efl_ui_layout_factory.c b/src/lib/elementary/efl_ui_layout_factory.c index 4ab6d19fe9..bc3a5d19f3 100644 --- a/src/lib/elementary/efl_ui_layout_factory.c +++ b/src/lib/elementary/efl_ui_layout_factory.c @@ -77,8 +77,6 @@ _efl_ui_layout_factory_bind(Eo *obj EINA_UNUSED, void *data, const Eina_Value va EINA_VALUE_ARRAY_FOREACH(&value, len, i, layout) { - efl_ui_layout_theme_set(layout, pd->klass, pd->group, pd->style); - eina_hash_foreach(pd->bind.properties, _property_bind, layout); eina_hash_foreach(pd->bind.factories, _factory_bind, layout); @@ -89,6 +87,14 @@ _efl_ui_layout_factory_bind(Eo *obj EINA_UNUSED, void *data, const Eina_Value va return value; } +static void +_efl_ui_layout_factory_efl_ui_factory_building(const Eo *obj, Efl_Ui_Layout_Factory_Data *pd, Efl_Gfx_Entity *ui_view) +{ + efl_ui_layout_theme_set(ui_view, pd->klass, pd->group, pd->style); + + efl_ui_factory_building(efl_super(obj, EFL_UI_LAYOUT_FACTORY_CLASS), ui_view); +} + EOLIAN static Eina_Future * _efl_ui_layout_factory_efl_ui_factory_create(Eo *obj, Efl_Ui_Layout_Factory_Data *pd, Eina_Iterator *models, Efl_Gfx_Entity *parent) diff --git a/src/lib/elementary/efl_ui_layout_factory.eo b/src/lib/elementary/efl_ui_layout_factory.eo index b31486db02..d6d473e655 100644 --- a/src/lib/elementary/efl_ui_layout_factory.eo +++ b/src/lib/elementary/efl_ui_layout_factory.eo @@ -16,6 +16,7 @@ class @beta Efl.Ui.Layout_Factory extends Efl.Ui.Caching_Factory Efl.Object.constructor; Efl.Object.destructor; Efl.Ui.Factory.create; + Efl.Ui.Factory.building; Efl.Ui.Property_Bind.property_bind; Efl.Ui.Factory_Bind.factory_bind; } diff --git a/src/lib/elementary/efl_ui_widget_factory.c b/src/lib/elementary/efl_ui_widget_factory.c index 1ae33b2cf2..3e325e11fe 100644 --- a/src/lib/elementary/efl_ui_widget_factory.c +++ b/src/lib/elementary/efl_ui_widget_factory.c @@ -39,6 +39,7 @@ struct _Efl_Ui_Widget_Factory_Data struct _Efl_Ui_Widget_Factory_Request { Efl_Ui_Widget_Factory_Data *pd; + Efl_Ui_Factory *factory; Eo *parent; }; @@ -66,9 +67,31 @@ _efl_ui_widget_factory_item_class_get(const Eo *obj EINA_UNUSED, return pd->klass; } +static void +_efl_ui_widget_factory_efl_ui_factory_building(const Eo *obj EINA_UNUSED, Efl_Ui_Widget_Factory_Data *pd EINA_UNUSED, Efl_Gfx_Entity *ui_view) +{ + const Efl_Model *model; + Eina_Value *property; + char *style; + + if (!pd->style) return ; + + model = efl_ui_view_model_get(ui_view); + // As we have already waited for the property to be ready, we should get the right style now + property = efl_model_property_get(model, pd->style); + if (!property) return ; + + style = eina_value_to_string(property); + if (style) efl_ui_widget_style_set(ui_view, style); + free(style); + + eina_value_free(property); +} + static Efl_Ui_Widget * -_efl_ui_widget_create(const Efl_Class *klass, Eo *parent, - const char *style, Efl_Model *model, +_efl_ui_widget_create(const Efl_Ui_Factory *factory, + const Efl_Class *klass, Eo *parent, + Efl_Model *model, const Eina_Hash *parts) { Efl_Ui_Bind_Part_Data *bpd; @@ -76,8 +99,8 @@ _efl_ui_widget_create(const Efl_Class *klass, Eo *parent, Efl_Ui_Widget *w; w = efl_add(klass, parent, - style ? efl_ui_widget_style_set(efl_added, style) : (void) 0, - efl_ui_view_model_set(efl_added, model)); + efl_ui_view_model_set(efl_added, model), + efl_ui_factory_building(factory, efl_added)); if (!parts) return w; it = eina_hash_iterator_data_new(parts); @@ -97,16 +120,12 @@ _efl_ui_widget_create(const Efl_Class *klass, Eo *parent, } static Eina_Value -_efl_ui_widget_factory_create_then(Eo *model, void *data, const Eina_Value v) +_efl_ui_widget_factory_create_then(Eo *model, void *data, const Eina_Value v EINA_UNUSED) { Efl_Ui_Widget_Factory_Request *r = data; Efl_Ui_Widget *w; - const char *string = NULL; - - if (!eina_value_string_get(&v, &string)) - return eina_value_error_init(EFL_MODEL_ERROR_NOT_SUPPORTED); - w = _efl_ui_widget_create(r->pd->klass, r->parent, string, model, r->pd->parts); + w = _efl_ui_widget_create(r->factory, r->pd->klass, r->parent, model, r->pd->parts); if (!w) return eina_value_error_init(ENOMEM); return eina_value_object_init(w); } @@ -122,6 +141,7 @@ _efl_ui_widget_factory_create_cleanup(Eo *o EINA_UNUSED, void *data, const Eina_ { Efl_Ui_Widget_Factory_Request *r = data; + efl_unref(r->factory); efl_unref(r->parent); free(r); } @@ -147,7 +167,7 @@ _efl_ui_widget_factory_efl_ui_factory_create(Eo *obj, Efl_Ui_Widget_Factory_Data EINA_ITERATOR_FOREACH(models, model) { - w = _efl_ui_widget_create(pd->klass, parent, NULL, model, pd->parts); + w = _efl_ui_widget_create(obj, pd->klass, parent, model, pd->parts); if (!w) return efl_loop_future_rejected(obj, ENOMEM); eina_value_array_append(&r, w); @@ -162,6 +182,7 @@ _efl_ui_widget_factory_efl_ui_factory_create(Eo *obj, Efl_Ui_Widget_Factory_Data r->pd = pd; r->parent = efl_ref(parent); + r->factory = efl_ref(obj); f = calloc(count + 1, sizeof (Eina_Future *)); if (!f) return efl_loop_future_rejected(obj, ENOMEM); diff --git a/src/lib/elementary/efl_ui_widget_factory.eo b/src/lib/elementary/efl_ui_widget_factory.eo index d439c5bd96..fdf537c1a7 100644 --- a/src/lib/elementary/efl_ui_widget_factory.eo +++ b/src/lib/elementary/efl_ui_widget_factory.eo @@ -20,6 +20,7 @@ class @beta Efl.Ui.Widget_Factory extends Efl.Loop_Consumer implements Efl.Ui.Fa implements { Efl.Ui.Factory.create; Efl.Ui.Factory.release; + Efl.Ui.Factory.building; Efl.Ui.Property_Bind.property_bind; Efl.Part.part_get; } --