[Genlist] Optimization for application launch on item show scenario
authorgodlytalias14573465 <godly.talias@samsung.com>
Tue, 31 Dec 2019 08:51:28 +0000 (14:21 +0530)
committerJongmin Lee <jm105.lee@samsung.com>
Mon, 6 Jan 2020 11:27:28 +0000 (20:27 +0900)
Change-Id: Id7f914fff42684bbf52539f991bef258a5803112
Signed-off-by: godlytalias14573465 <godly.talias@samsung.com>
src/lib/elementary_tizen/elm_genlist.c

index 47f13ac..aab5df6 100644 (file)
@@ -1392,14 +1392,19 @@ _calc(void *data)
    Item_Block *itb;
    Evas_Coord minw = 0,  minh = 0, vw = 0, vh = 0, current_minh = 0;
    Evas_Coord processed_size = sd->minh;
-   int cnt = 0;
+   // TIZEN_ONLY(20161230): Optimization for application launch on item show scenario
+   int cnt = 0, stop_cnt = MAX_ITEMS_PER_BLOCK;
+   //
    Evas_Coord bottom_margin;
-
    if (sd->calc_done) return;
 
 // TIZEN_ONLY(20150828) : Calculate item which position on viewport area
+   // TIZEN_ONLY(20161230): Optimization for application launch on item show scenario
+   Eina_Bool count_start = EINA_FALSE;
    while (sd->queue &&
-          ((sd->viewport_h > processed_size) && (cnt < MAX_ITEMS_PER_BLOCK)))
+          ((sd->viewport_h > processed_size) || (sd->show_item && cnt < stop_cnt)))
+   //
+   //
      {
         Elm_Gen_Item *tmp;
         tmp = eina_list_data_get(sd->queue);
@@ -1407,7 +1412,13 @@ _calc(void *data)
         if (!_item_process(sd, tmp)) continue;
         processed_size += GL_IT(tmp)->minh;
         tmp->item->queued = EINA_FALSE;
-        cnt++;
+        // TIZEN_ONLY(20161230): Optimization for application launch on item show scenario
+        if (sd->show_item)
+          {
+             if (sd->show_item == tmp) count_start = EINA_TRUE;
+             if (count_start) cnt++;
+          }
+        //
      }
 //
    elm_interface_scrollable_content_viewport_geometry_get(sd->obj, NULL, NULL, &vw, &vh);
@@ -2781,7 +2792,9 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Pan_Data
 
    evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
    evas_output_viewport_get(evas_object_evas_get(obj), &cvx, &cvy, &cvw, &cvh);
-
+   //TIZEN_ONLY(20190109): Show item in spinner when calc is completed
+   const char* str = edje_object_data_get(elm_layout_edje_get(psd->wsd->obj), "spinner_genlist");
+   //
    //FIXME: This is for optimizing genlist calculation after
    //       genlist sizing eval properly.
    if (ow <= 1) return;
@@ -2819,6 +2832,65 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Pan_Data
      }
 #endif
 
+   // TIZEN_ONLY(20161230): Optimization for application launch on item show scenario
+    if (psd->wsd->show_item &&
+       !psd->wsd->show_item->item->queued &&
+       psd->wsd->show_item->item->calc_done &&
+       psd->wsd->show_item->item->block->calc_done &&
+       psd->wsd->calc_done &&
+       (oh > 0) &&
+       (!psd->wsd->loop_v || (psd->wsd->loop_v && !psd->wsd->queue)) && //psd->wsd->loop_v indicates if looping is enabled in vertical dir
+       (!str || (str && !psd->wsd->queue)))
+     {
+        Evas_Coord x, y, w, h;
+        Elm_Gen_Item *it = psd->wsd->show_item;
+        psd->wsd->show_item = NULL;
+        psd->wsd->comp_y = 0;
+        x = it->x + GL_IT(it)->block->x + psd->wsd->pan_x;
+        y = it->y + GL_IT(it)->block->y;
+        w = ow;
+        h = oh;
+
+        switch (psd->wsd->scroll_to_type)
+          {
+           case ELM_GENLIST_ITEM_SCROLLTO_IN:
+              h = GL_IT(it)->h;
+              break;
+           case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
+              y = y - (oh / 2) + (GL_IT(it)->h / 2);
+              break;
+// tizen_feature
+           case ELM_GENLIST_ITEM_SCROLLTO_BOTTOM:
+              y = y - oh + GL_IT(it)->h;
+              break;
+///
+           default:
+              break;
+          }
+        if (psd->wsd->bring_in)
+          {
+             if (y != psd->wsd->pan_y)
+               elm_interface_scrollable_region_bring_in(psd->wsd->obj, x, y, w, h);
+             else
+               psd->wsd->adjusted_item = NULL;
+          }
+        else
+          {
+             if (psd->wsd->aligned_item && (psd->wsd->aligned_item != psd->wsd->adjusted_item))
+               {
+                  edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
+                  edje_object_signal_emit(VIEW(psd->wsd->aligned_item), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
+               }
+             psd->wsd->aligned_item = NULL;
+             psd->wsd->unhighlight_skip = EINA_TRUE;
+
+             elm_interface_scrollable_content_region_show(WIDGET(it), x, y, ow, oh);
+
+             psd->wsd->unhighlight_skip = EINA_FALSE;
+          }
+        _changed(psd->wsd->pan_obj);
+     }
+
    // Belows are tweaks for performance
    // Block is not needed anymore because of below algorithm..
    // later, we should remove dirty block algorithm
@@ -3016,6 +3088,15 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Pan_Data
 
    if (psd->wsd->comp_y)
      {
+        // TIZEN_ONLY(20161230): Optimization for application launch on item show scenario
+        if (psd->wsd->aligned_item)
+          {
+             evas_object_smart_callback_call(WIDGET(psd->wsd->aligned_item), SIG_ALIGNED_ITEM_DETECTED, NULL);
+             edje_object_signal_emit(VIEW(psd->wsd->aligned_item), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
+             psd->wsd->aligned_item = NULL;
+             _changed(psd->wsd->pan_obj);
+          }
+        //
         psd->wsd->unhighlight_skip = EINA_TRUE;
         elm_interface_scrollable_content_region_show((psd->wsd)->obj, psd->wsd->pan_x,
                                                                             psd->wsd->pan_y + psd->wsd->comp_y, ow, oh);
@@ -3048,52 +3129,6 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo *obj, Elm_Genlist_Pan_Data
           }
         psd->wsd->expanded_item = NULL;
      }
-   if (psd->wsd->show_item &&
-       !psd->wsd->show_item->item->queued &&
-       psd->wsd->show_item->item->calc_done &&
-       psd->wsd->show_item->item->block->calc_done &&
-       psd->wsd->calc_done)
-     {
-        Evas_Coord x, y, w, h;
-        Elm_Gen_Item *it = psd->wsd->show_item;
-        psd->wsd->show_item = NULL;
-        x = it->x + GL_IT(it)->block->x + psd->wsd->pan_x;
-        y = it->y + GL_IT(it)->block->y;
-        w = ow;
-        h = oh;
-
-        switch (psd->wsd->scroll_to_type)
-          {
-           case ELM_GENLIST_ITEM_SCROLLTO_IN:
-              h = GL_IT(it)->h;
-              break;
-
-           case ELM_GENLIST_ITEM_SCROLLTO_MIDDLE:
-              y = y - (oh / 2) + (GL_IT(it)->h / 2);
-              break;
-// tizen_feature
-           case ELM_GENLIST_ITEM_SCROLLTO_BOTTOM:
-              y = y - oh + GL_IT(it)->h;
-              break;
-///
-           default:
-              break;
-          }
-        if (psd->wsd->bring_in)
-          elm_interface_scrollable_region_bring_in(WIDGET(it), x, y, w, h);
-        else
-          {
-             if (psd->wsd->aligned_item && (psd->wsd->aligned_item != psd->wsd->adjusted_item))
-               edje_object_signal_emit(VIEW(psd->wsd->aligned_item), SIGNAL_ITEM_UNHIGHLIGHTED, "elm");
-             edje_object_signal_emit(wd->resize_obj, SIGNAL_FOCUS_BG_HIDE, "elm");
-             psd->wsd->aligned_item = NULL;
-             psd->wsd->unhighlight_skip = EINA_TRUE;
-             elm_interface_scrollable_content_region_show(WIDGET(it), x, y, ow, oh);
-             psd->wsd->unhighlight_skip = EINA_FALSE;
-          }
-
-        _changed(psd->wsd->pan_obj);
-     }
 #ifdef GENLIST_FX_SUPPORT
    if (psd->wsd->add_fx.anim)
      {
@@ -6137,7 +6172,7 @@ static Eina_Bool
 _queue_idle_enter(void *data)
 {
    Elm_Genlist_Data *sd = data;
-   Evas_Coord vw = 0;
+   Evas_Coord vw = 0, vh = 0;
    int n;
    double ft, t0;
 
@@ -6167,8 +6202,13 @@ _queue_idle_enter(void *data)
         GL_IT(it)->resized = EINA_FALSE;
         if (!_item_process(sd, it)) continue;
         t = ecore_time_get();
+        // TIZEN_ONLY(20161230): Optimization for application launch
+        sd->processed_sizes += GL_IT(it)->minh;
+        Item_Block *itb = (Item_Block*) sd->blocks;
         /* same as eina_inlist_count > 1 */
-        if (sd->blocks && sd->blocks->next)
+        if ((sd->blocks && sd->blocks->next) || (sd->processed_sizes > vh) ||
+            (itb->minh > vh))
+        //
           {
              if ((t - t0) > ft) break;
           }
@@ -6733,6 +6773,12 @@ _item_block_calc(Item_Block *itb, Evas_Coord vw EINA_UNUSED, Evas_Coord vh)
                     {
                        if (eo_prev == elm_genlist_first_item_get(itb->sd->obj))
                          {
+                            if (GL_IT(prev)->block && GL_IT(prev)->block != itb)
+                              {
+                                 int diff = GL_IT(prev)->minh - first_item_height;
+                                 GL_IT(prev)->block->minh -= diff;
+                                 if (itb) itb->y -= diff;
+                              }
                             GL_IT(prev)->h = GL_IT(prev)->minh = first_item_height;
                             break;
                          }