From a68e18a903ffb0fa14d1b5ebeb3efc3a8db95812 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 10 Jul 2019 17:56:20 -0700 Subject: [PATCH] elementary: Efl.Ui.Image now rely on event to update model binding. Reviewed-by: Marcel Hollerbach Differential Revision: https://phab.enlightenment.org/D9289 --- src/lib/elementary/efl_ui_image.c | 70 +++++++++++++++--------- src/lib/elementary/efl_ui_image.eo | 2 +- src/lib/elementary/efl_ui_widget_image.h | 1 + 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/lib/elementary/efl_ui_image.c b/src/lib/elementary/efl_ui_image.c index 02dd574378..dea9ec1b00 100644 --- a/src/lib/elementary/efl_ui_image.c +++ b/src/lib/elementary/efl_ui_image.c @@ -53,6 +53,7 @@ void _efl_ui_image_sizing_eval(Evas_Object *obj); static void _efl_ui_image_model_properties_changed_cb(void *data, const Efl_Event *event); static void _on_size_hints_changed(void *data, const Efl_Event *e); static Eina_Bool _efl_ui_image_download(Eo *obj, Efl_Ui_Image_Data *sd, const char *url); +static void _update_viewmodel(Eo *obj, Efl_Ui_Image_Data *pd); static const Elm_Action key_actions[] = { {"activate", _key_action_activate}, @@ -848,6 +849,21 @@ _on_size_hints_changed(void *data EINA_UNUSED, const Efl_Event *ev) _efl_ui_image_sizing_eval(ev->object); } +static void +_efl_ui_image_model_changed(void *data, const Efl_Event *event) +{ + Efl_Model_Changed_Event *ev = event->info; + + if (ev->previous) + efl_event_callback_del(ev->previous, EFL_MODEL_EVENT_PROPERTIES_CHANGED, + _efl_ui_image_model_properties_changed_cb, event->object); + if (ev->current) + efl_event_callback_add(ev->current, EFL_MODEL_EVENT_PROPERTIES_CHANGED, + _efl_ui_image_model_properties_changed_cb, event->object); + + _update_viewmodel(event->object, data); +} + EOLIAN static Eo * _efl_ui_image_efl_object_constructor(Eo *obj, Efl_Ui_Image_Data *pd) { @@ -861,6 +877,22 @@ _efl_ui_image_efl_object_constructor(Eo *obj, Efl_Ui_Image_Data *pd) return obj; } +EOLIAN static void +_efl_ui_image_efl_object_invalidate(Eo *obj, Efl_Ui_Image_Data *pd EINA_UNUSED) +{ + Efl_Model *model; + + if (pd->property_watch) + efl_event_callback_del(obj, EFL_UI_VIEW_EVENT_MODEL_CHANGED, + _efl_ui_image_model_changed, pd); + + model = efl_ui_view_model_get(obj); + if (model) + efl_event_callback_del(model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, + _efl_ui_image_model_properties_changed_cb, obj); + efl_invalidate(efl_super(obj, EFL_UI_IMAGE_CLASS)); +} + static const Eina_Slice remote_uri[] = { EINA_SLICE_STR_LITERAL("http://"), EINA_SLICE_STR_LITERAL("https://"), @@ -1829,6 +1861,15 @@ _update_viewmodel(Eo *obj, Efl_Ui_Image_Data *pd) char *key = NULL; Efl_Model *model; + if (!pd->property.file) return ; + + if (!pd->property_watch) + { + efl_event_callback_add(obj, EFL_UI_VIEW_EVENT_MODEL_CHANGED, + _efl_ui_image_model_changed, pd); + pd->property_watch = EINA_TRUE; + } + model = efl_ui_view_model_get(obj); if (!model) return ; @@ -1903,35 +1944,14 @@ _efl_ui_image_model_properties_changed_cb(void *data, const Efl_Event *event) if (refresh) _update_viewmodel(obj, pd); } -EOLIAN static void -_efl_ui_image_efl_ui_view_model_set(Eo *obj, Efl_Ui_Image_Data *pd, Efl_Model *model) -{ - Efl_Model *setted; - - setted = efl_ui_view_model_get(obj); - if (setted) - { - efl_event_callback_del(setted, EFL_MODEL_EVENT_PROPERTIES_CHANGED, - _efl_ui_image_model_properties_changed_cb, obj); - } - - efl_ui_view_model_set(efl_super(obj, EFL_UI_IMAGE_CLASS), model); - - setted = efl_ui_view_model_get(obj); - if (setted) - { - efl_event_callback_add(setted, EFL_MODEL_EVENT_PROPERTIES_CHANGED, - _efl_ui_image_model_properties_changed_cb, obj); - } - - _update_viewmodel(obj, pd); -} - EOLIAN static Eina_Error _efl_ui_image_efl_ui_property_bind_property_bind(Eo *obj, Efl_Ui_Image_Data *pd, const char *key, const char *property) { Eina_Stringshare *sk; + if (efl_ui_property_bind(efl_super(obj, EFL_UI_IMAGE_CLASS), key, property) == 0) + return 0; + if (strcmp(key, "filename") == 0) { pd->property.icon = EINA_FALSE; @@ -1949,7 +1969,7 @@ _efl_ui_image_efl_ui_property_bind_property_bind(Eo *obj, Efl_Ui_Image_Data *pd, } else { - return efl_ui_property_bind(efl_super(obj, EFL_UI_IMAGE_CLASS), key, property); + return EFL_PROPERTY_ERROR_INVALID_KEY; } _update_viewmodel(obj, pd); diff --git a/src/lib/elementary/efl_ui_image.eo b/src/lib/elementary/efl_ui_image.eo index d6db562358..728a6c4cb0 100644 --- a/src/lib/elementary/efl_ui_image.eo +++ b/src/lib/elementary/efl_ui_image.eo @@ -89,6 +89,7 @@ class @beta Efl.Ui.Image extends Efl.Ui.Widget implements Efl.Ui.Clickable, Efl. } implements { Efl.Object.constructor; + Efl.Object.invalidate; Efl.File.load; Efl.File.unload; Efl.Gfx.Color.color { set; } @@ -118,7 +119,6 @@ class @beta Efl.Ui.Image extends Efl.Ui.Widget implements Efl.Ui.Clickable, Efl. Efl.Canvas.Group.group_member_add; Efl.Ui.Draggable.drag_target { get; set; } Efl.Ui.Property_Bind.property_bind; - Efl.Ui.View.model { set; } Efl.Ui.Widget.theme_apply; Efl.Ui.Widget.widget_input_event_handler; Efl.Access.Component.extents { get; } diff --git a/src/lib/elementary/efl_ui_widget_image.h b/src/lib/elementary/efl_ui_widget_image.h index c140c9b7c5..661cca94f2 100644 --- a/src/lib/elementary/efl_ui_widget_image.h +++ b/src/lib/elementary/efl_ui_widget_image.h @@ -103,6 +103,7 @@ struct _Efl_Ui_Image_Data Eina_Bool scale_up : 1; Eina_Bool scale_down : 1; Eina_Bool legacy_align : 1; + Eina_Bool property_watch : 1; }; /**