[Genlist] Stabilization of item decorate mode with fish eye effect
authorgodlytalias14573465 <godly.talias@samsung.com>
Mon, 30 Dec 2019 14:24:19 +0000 (19:54 +0530)
committerJongmin Lee <jm105.lee@samsung.com>
Mon, 6 Jan 2020 11:27:28 +0000 (20:27 +0900)
This patch includes optimization on caching item proxy as well

Change-Id: I1e1fe169ea312abe9466b5cb5ab1fd45958500fd
Signed-off-by: godlytalias14573465 <godly.talias@samsung.com>
src/lib/elementary_tizen/elm_genlist.c
src/lib/elementary_tizen/elm_widget_genlist.h

index 79ce253..47f13ac 100644 (file)
@@ -1774,11 +1774,28 @@ _decorate_item_unrealize(Elm_Gen_Item *it)
 {
    if (!GL_IT(it)->deco_it_view) return;
 
+   ELM_WIDGET_DATA_GET_OR_RETURN(GL_IT(it)->wsd->obj, wsd);
+   //TIZEN_ONLY(20191230): Stabilizations on item decorate mode
+   if (wsd->scroll_item_align_enable)
+     {
+        evas_object_image_source_visible_set(it->item->proxy, EINA_TRUE);
+        evas_object_smart_member_del(it->item->proxy);
+        evas_object_del(it->item->proxy);
+        it->item->proxy = NULL;
+     }
+
    edje_object_part_unswallow(GL_IT(it)->deco_it_view, VIEW(it));
    _view_clear(GL_IT(it)->deco_it_view, &(GL_IT(it)->deco_it_contents));
    evas_object_del(GL_IT(it)->deco_it_view);
    GL_IT(it)->deco_it_view = NULL;
 
+   it->down = EINA_FALSE;
+   it->dragging = EINA_FALSE;
+
+   if (it->long_timer) ecore_timer_del(it->long_timer);
+   it->long_timer = NULL;
+   //
+
    _item_mouse_callbacks_add(it, VIEW(it));
    evas_object_smart_member_add(VIEW(it), GL_IT(it)->wsd->pan_obj);
 }
@@ -1871,6 +1888,15 @@ _item_cache_free(Elm_Genlist_Data *sd, Item_Cache *ic)
    Evas_Object *c;
    if (!ic) return;
 
+   // TIZEN_ONLY (20180315) : Item proxy caching for optimization
+   if (ic->proxy)
+     {
+        evas_object_image_source_visible_set(ic->proxy, EINA_TRUE);
+        evas_object_smart_member_del(ic->proxy);
+        evas_object_del(ic->proxy);
+        ic->proxy = NULL;
+     }
+   //
    if (ic->base_view) efl_del(ic->base_view);
    ic->item_class = NULL;
    EINA_LIST_FREE(ic->contents, c)
@@ -1908,6 +1934,13 @@ _item_cache_push(Elm_Gen_Item *it, Eina_List *contents)
 
    if (sd->no_cache)
      {
+        //TIZEN_ONLY (20180315) : Item proxy caching for optimization
+        evas_object_image_source_visible_set(it->item->proxy, EINA_TRUE);
+        evas_object_smart_member_del(it->item->proxy);
+        evas_object_del(it->item->proxy);
+        it->item->proxy = NULL;
+        //
+
         if (VIEW(it)) evas_object_del(VIEW(it));
         VIEW(it) = NULL;
         EINA_LIST_FREE(contents, content)
@@ -1926,6 +1959,13 @@ _item_cache_push(Elm_Gen_Item *it, Eina_List *contents)
    ic = eina_mempool_calloc(sd->_genlist_itemcache_mp, sizeof(Item_Cache));
    if (!ic)
      {
+        //TIZEN_ONLY (20180315) : Item proxy caching for optimization
+        evas_object_image_source_visible_set(it->item->proxy, EINA_TRUE);
+        evas_object_smart_member_del(it->item->proxy);
+        evas_object_del(it->item->proxy);
+        it->item->proxy = NULL;
+        //
+
         if (VIEW(it)) evas_object_del(VIEW(it));
         VIEW(it) = NULL;
         EINA_LIST_FREE(contents, content)
@@ -1945,8 +1985,20 @@ _item_cache_push(Elm_Gen_Item *it, Eina_List *contents)
 
    ic->base_view = VIEW(it);
    ic->multiline = GL_IT(it)->multiline;
+   //TIZEN_ONLY (20180315) : Item proxy caching for optimization
+   ic->proxy = it->item->proxy;
+   //
    ic->item_class = it->itc;
    ic->contents = contents;
+
+   //TIZEN_ONLY (20180315) : Item proxy caching for optimization
+   if (it->item->proxy)
+     {
+        evas_object_hide(it->item->proxy);
+        evas_object_move(it->item->proxy, -9999, -9999);
+     }
+   //
+
    evas_object_hide(ic->base_view);
    evas_object_move(ic->base_view, -9999, -9999);
 
@@ -1954,6 +2006,9 @@ _item_cache_push(Elm_Gen_Item *it, Eina_List *contents)
    sd->item_cache_count++;
 
    VIEW(it) = NULL;
+   //TIZEN_ONLY (20180315) : Item proxy caching for optimization
+   it->item->proxy = NULL;
+   //
 }
 
 static Eina_Bool
@@ -1977,6 +2032,11 @@ _item_cache_pop(Elm_Gen_Item *it)
              VIEW(it) = ic->base_view;
              GL_IT(it)->multiline = ic->multiline;
 
+             //TIZEN_ONLY (20180315) : Item proxy caching for optimization
+             it->item->proxy = ic->proxy;
+             ic->proxy = NULL;
+             //
+
              eina_list_free(ic->contents);
              ic->contents = NULL;
              //TIZEN_ONLY(20191211): Mempool for genlist
@@ -6561,6 +6621,35 @@ _decorate_item_finished_signal_cb(void *data,
    if ((!it->realized)) return;
 
    _decorate_item_unrealize(it);
+
+   // TIZEN_ONLY(20190530) : Stabilizations for item decorate mode
+   Elm_Genlist_Data *sd = GL_IT(it)->wsd;
+   ELM_WIDGET_DATA_GET_OR_RETURN(sd->obj, wsd);
+
+   const char *vi_effect = edje_object_data_get(VIEW(it), "vi_effect");
+   if (wsd->scroll_item_align_enable && vi_effect && !strcmp(vi_effect, "on"))
+     {
+        Evas_Object *clip = evas_object_clip_get(VIEW(it));
+        if (clip) evas_object_data_set(VIEW(it), "view,clip", clip);
+        else clip = evas_object_data_get(VIEW(it), "view,clip");
+
+        it->item->proxy = evas_object_image_filled_add(evas_object_evas_get(sd->obj));
+        evas_object_smart_member_add(it->item->proxy, sd->pan_obj);
+        evas_object_clip_set(it->item->proxy, clip);
+        if (evas_object_clip_get(VIEW(it))) evas_object_clip_unset(VIEW(it));
+#ifdef GENLIST_FX_SUPPORT
+        if (it->clip) evas_object_del(it->clip);
+        it->clip = NULL;
+#endif
+        evas_object_image_source_set(it->item->proxy, VIEW(it));
+        evas_object_image_source_visible_set(it->item->proxy, EINA_FALSE);
+        evas_object_image_source_events_set(it->item->proxy, EINA_TRUE);
+        evas_object_image_source_clip_set(it->item->proxy, EINA_FALSE);
+        evas_object_size_hint_min_set(it->item->proxy, GL_IT(it)->w, GL_IT(it)->h);
+        evas_object_repeat_events_set(it->item->proxy, EINA_TRUE);
+        _changed(sd->pan_obj);
+     }
+   //
 }
 
 static void
@@ -6836,9 +6925,14 @@ _decorate_item_realize(Elm_Gen_Item *it)
 {
    char buf[1024];
    if (GL_IT(it)->deco_it_view || !it->itc->decorate_item_style) return;
+   ELM_WIDGET_DATA_GET_OR_RETURN(GL_IT(it)->wsd->obj, wsd);
 
    // Before adding & swallowing, delete it from smart member
    evas_object_smart_member_del(VIEW(it));
+   //TIZEN_ONLY(20191230): Stabilizations for item decorate mode
+   if (wsd->scroll_item_align_enable)
+     evas_object_del(GL_IT(it)->proxy);
+   //
 
    GL_IT(it)->deco_it_view = _view_create(it, it->itc->decorate_item_style);
    edje_object_part_swallow
@@ -6851,9 +6945,32 @@ _decorate_item_realize(Elm_Gen_Item *it)
    edje_object_signal_emit(GL_IT(it)->deco_it_view, buf, "elm");
    edje_object_signal_emit(VIEW(it), buf, "elm");
 
+   //TIZEN_ONLY(20191230): Stabilizations for item decorate mode
+   if (wsd->scroll_item_align_enable)
+     {
+        Evas_Object *clip = evas_object_clip_get(GL_IT(it)->deco_it_view);
+        if (clip) evas_object_data_set(GL_IT(it)->deco_it_view, "view,clip", clip);
+        else clip = evas_object_data_get(GL_IT(it)->deco_it_view, "view,clip");
+
+        GL_IT(it)->proxy = evas_object_image_filled_add(evas_object_evas_get(GL_IT(it)->wsd->obj));
+        evas_object_smart_member_add(GL_IT(it)->proxy, GL_IT(it)->wsd->pan_obj);
+        evas_object_clip_set(GL_IT(it)->proxy, clip);
+        if (evas_object_clip_get(GL_IT(it)->deco_it_view)) evas_object_clip_unset(GL_IT(it)->deco_it_view);
+        evas_object_image_source_set(GL_IT(it)->proxy, GL_IT(it)->deco_it_view);
+        evas_object_image_source_visible_set(GL_IT(it)->proxy, EINA_FALSE);
+        evas_object_image_source_events_set(GL_IT(it)->proxy, EINA_TRUE);
+        evas_object_image_source_clip_set(GL_IT(it)->proxy, EINA_FALSE);
+        evas_object_size_hint_min_set(GL_IT(it)->proxy, GL_IT(it)->w, GL_IT(it)->h);
+        evas_object_repeat_events_set(GL_IT(it)->proxy, EINA_TRUE);
+     }
+   //
+
    _item_mouse_callbacks_add(it, GL_IT(it)->deco_it_view);
    // Redwood Only
    _item_mouse_callbacks_del(it, VIEW(it));
+   // TIZEN_ONLY(20191230): Stabilizations for item decorate mode
+   _changed(GL_IT(it)->wsd->pan_obj);
+   //
 }
 
 #if 0
@@ -7576,6 +7693,8 @@ _item_free(Elm_Gen_Item *it)
    sd->del_fx.items = eina_list_remove(sd->del_fx.items, it);
    sd->del_fx.pending_items = eina_list_remove(sd->del_fx.pending_items, it);
    sd->add_fx.items = eina_list_remove(sd->add_fx.items, it);
+   if (it->clip) evas_object_del(it->clip);
+   it->clip = NULL;
 #endif
 
    if (GL_IT(it)->rel)
index bb97841..ec72ff7 100644 (file)
@@ -428,6 +428,9 @@ struct _Item_Cache
 
    const Elm_Genlist_Item_Class  *item_class; // it->itc
    Eina_List   *contents; // content objects for reusing
+   //TIZEN_ONLY(20191230): Proxy caching for optimization
+   Evas_Object *proxy;
+   //
    Eina_Bool    multiline;
    Eina_Bool    selected : 1; // it->selected
    Eina_Bool    disabled : 1; // it->disabled