elementary: Efl.Ui.Image now rely on event to update model binding.
authorCedric BAIL <cedric.bail@free.fr>
Thu, 11 Jul 2019 00:56:20 +0000 (17:56 -0700)
committerSangHyeon Jade Lee <sh10233.lee@samsung.com>
Tue, 23 Jul 2019 05:02:34 +0000 (14:02 +0900)
Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D9289

src/lib/elementary/efl_ui_image.c
src/lib/elementary/efl_ui_image.eo
src/lib/elementary/efl_ui_widget_image.h

index 92fbb45..f351e31 100644 (file)
@@ -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},
@@ -864,6 +865,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)
 {
@@ -877,6 +893,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://"),
@@ -1845,6 +1877,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 ;
 
@@ -1919,35 +1960,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;
@@ -1965,7 +1985,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);
index d6db562..728a6c4 100644 (file)
@@ -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; }
index f9c51aa..0b9c03d 100644 (file)
@@ -104,6 +104,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;
 };
 
 /**