diff options
author | Larry Jr <larry.olj@gmail.com> | 2017-10-25 16:17:31 -0200 |
---|---|---|
committer | SangHyeon Jade Lee <dltkdgus1764@gmail.com> | 2017-11-15 17:06:45 +0900 |
commit | b278a69711d0b02c60f6955c33cdd1fb072115bf (patch) | |
tree | 1c30bac2539edf8cd383416a12f5b56f1015ae14 | |
parent | 8588c531874fb7482dfba14c52b67a4519d22297 (diff) | |
download | efl-b278a69711d0b02c60f6955c33cdd1fb072115bf.tar.gz |
elm: fixed scroll size
-rw-r--r-- | src/lib/elementary/efl_ui_list.c | 5 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_list_precise_layouter.c | 103 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_list_precise_layouter.eo | 1 | ||||
-rw-r--r-- | src/lib/elementary/efl_ui_list_relayout.eo | 7 |
4 files changed, 87 insertions, 29 deletions
diff --git a/src/lib/elementary/efl_ui_list.c b/src/lib/elementary/efl_ui_list.c index 78746bc81d..7075ef985f 100644 --- a/src/lib/elementary/efl_ui_list.c +++ b/src/lib/elementary/efl_ui_list.c @@ -1094,6 +1094,9 @@ _efl_ui_list_layout_factory_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Data *pd, Efl_U EOLIAN static void _efl_ui_list_efl_ui_view_model_set(Eo *obj, Efl_Ui_List_Data *pd, Efl_Model *model) { + if (pd->relayout) + efl_ui_list_relayout_model_set(pd->relayout, model); + if (pd->model == model) return; @@ -1502,7 +1505,7 @@ _efl_ui_list_efl_ui_list_model_min_size_set(Eo *obj, Efl_Ui_List_Data *pd, Eina_ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); pd->min.w = min.w; - pd->min.h = min.h; + pd->min.h = min.h;// + 200; evas_object_size_hint_min_set(wd->resize_obj, pd->min.w, pd->min.h); DBG("min_size_set w:%d h:%d", pd->min.w, pd->min.h); diff --git a/src/lib/elementary/efl_ui_list_precise_layouter.c b/src/lib/elementary/efl_ui_list_precise_layouter.c index e1660bb65c..13aee83afd 100644 --- a/src/lib/elementary/efl_ui_list_precise_layouter.c +++ b/src/lib/elementary/efl_ui_list_precise_layouter.c @@ -22,6 +22,9 @@ typedef struct _Efl_Ui_List_Precise_Layouter_Data Eina_Bool initialized; Eina_Hash* size_information; Eina_Size2D min; + Efl_Model* model; + unsigned int count_total; + Efl_Future *count_future; } Efl_Ui_List_Precise_Layouter_Data; typedef struct _Efl_Ui_List_Precise_Layouter_Size @@ -85,17 +88,64 @@ _item_min_calc(Efl_Ui_List_Precise_Layouter_Data *pd, Efl_Ui_List_Precise_Layout size->min.h = new_h; } +static void +_count_then(void * data, Efl_Event const* event) +{ + Efl_Ui_List_Precise_Layouter_Data *pd = data; + EINA_SAFETY_ON_NULL_RETURN(pd); + pd->count_future = NULL; + + pd->count_total = *(int*)((Efl_Future_Event_Success*)event->info)->value; +} + +static void +_count_error(void * data, Efl_Event const* event EINA_UNUSED) +{ + Efl_Ui_List_Precise_Layouter_Data *pd = data; + EINA_SAFETY_ON_NULL_RETURN(pd); + pd->count_future = NULL; +} EOLIAN static Efl_Object * _efl_ui_list_precise_layouter_efl_object_constructor(Eo *obj EINA_UNUSED, Efl_Ui_List_Precise_Layouter_Data *pd) { obj = efl_constructor(efl_super(obj, MY_CLASS)); pd->initialized = EINA_FALSE; + pd->count_future = NULL; return obj; } EOLIAN static void +_efl_ui_list_precise_layouter_efl_ui_list_relayout_model_set(Eo *obj EINA_UNUSED, Efl_Ui_List_Precise_Layouter_Data *pd, Efl_Model *model) +{ + if (pd->model == model) + return; + + pd->count_total = 0; + + if (pd->count_future) + { + efl_future_cancel(pd->count_future); + pd->count_future = NULL; + } + + if (pd->model) + { + efl_unref(pd->model); + pd->model = NULL; + } + + if (model) + { + pd->model = model; + efl_ref(pd->model); + pd->count_future = efl_model_children_count_get(pd->model); + efl_future_then(pd->count_future, &_count_then, &_count_error, NULL, pd); + } +} + +EOLIAN static void _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do (Eo *obj EINA_UNUSED, Efl_Ui_List_Precise_Layouter_Data *pd , Efl_Ui_List_Model *modeler, int first, int count, Eina_Accessor *items) @@ -109,7 +159,6 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do int boxl = 0, boxr = 0, boxt = 0, boxb = 0; double cur_pos = 0, scale, box_align[2], weight[2] = { 0, 0 }; Eina_Bool box_fill[2] = { EINA_FALSE, EINA_FALSE }; - Eina_List *order = NULL; int pad[4]; DBG("layout_do first %d count %d", first, count); @@ -122,7 +171,6 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do pd->initialized = EINA_TRUE; pd->min.w = 0; pd->min.h = 0; - DBG("************ w:%d h:%d", pd->min.w, pd->min.h); } // cache size of new items @@ -183,20 +231,19 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do scale = evas_object_scale_get(modeler); /* // Box align: used if "item has max size and fill" or "no item has a weight" */ /* // Note: cells always expand on the orthogonal direction */ -// box_align[0] = 0;/*pd->align.h;*/ -// box_align[1] = 0;/*pd->align.v;*/ -// if (box_align[0] < 0) -// { -// box_fill[0] = EINA_TRUE; -// box_align[0] = 0.5; -// } -// if (box_align[1] < 0) -// { -// box_fill[1] = EINA_TRUE; -// box_align[1] = 0.5; -// } -// - //count = 1; + box_align[0] = 0;/*pd->align.h;*/ + box_align[1] = 0;/*pd->align.v;*/ + if (box_align[0] < 0) + { + box_fill[0] = EINA_TRUE; + box_align[0] = 0.5; + } + if (box_align[1] < 0) + { + box_fill[1] = EINA_TRUE; + box_align[1] = 0.5; + } + /* count = eina_inarray_count(&pd->items.array); */ // box outer margin @@ -216,7 +263,7 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do length = boxw; want = 100;//pd->realized.w; //pad = pd->pad.scalable ? (pd->pad.h * scale) : pd->pad.h; - pad = 1; + pad = 0; // padding can not be squeezed (note: could make it an option) length -= pad * (count - 1); @@ -233,17 +280,19 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do int pad; length = boxh; want = pd->min.h; - pad = 1;//pd->pad.scalable ? (pd->pad.v * scale) : pd->pad.v; + pad = 0;//pd->pad.scalable ? (pd->pad.v * scale) : pd->pad.v; + //FIXME?? use eina_hash_population(pd->size_information) or count + int population = eina_hash_population(pd->size_information); // padding can not be squeezed (note: could make it an option) - length -= pad * (count - 1); + length -= pad * (population - 1); //(count - 1); // available space. if <0 we overflow extra = length - want; minw = pd->min.w + boxl + boxr; - minh = pd->min.h + pad * (count - 1) + boxt + boxb; - /* if (pd->item_count > count) */ - /* minh = pd->item_count * average_item_size; */ + minh = pd->min.h + pad * (/*count*/ population - 1) + boxt + boxb; + if (pd->count_total > population) //count) + minh *= (pd->count_total / population); //count); } // if (pd->min.h != minh || pd->min.w != minw) @@ -252,9 +301,7 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do // pd->min.h = minh; // } - DBG("min_size_set w:%d h:%d", pd->min.w, pd->min.h); efl_ui_list_model_min_size_set(modeler, pd->min); - if (extra < 0) extra = 0; weight[0] = 1;//pd->weight.x; @@ -287,7 +334,7 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do double align[2]; int item_pad[4]; Eina_Size2D max; - int pad = 1; + int pad = 0; size = eina_hash_find(pd->size_information, &layout_item); @@ -311,8 +358,8 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do if (max.h < size->min.h) max.h = size->min.h; /* // extra rounding up (compensate cumulative error) */ - /* if ((id == (count - 1)) && (cur_pos - floor(cur_pos) >= 0.5)) */ - /* rounding = 1; */ + if ((i == (count - 1)) && (cur_pos - floor(cur_pos) >= 0.5)) + rounding = 1; if (horiz) { @@ -390,11 +437,11 @@ _efl_ui_list_precise_layouter_efl_ui_list_relayout_layout_do if (w > ow) w = ow; } +// DBG("------- size_h:%d -- h:%.2f --- ", size->min.h, h); evas_object_geometry_set(layout_item->layout, (x + 0 - scr_x), (y + 0 - scr_y), w, h); /* layout_item->x = x; */ /* layout_item->y = y; */ -/* order = eina_list_append(order, litem->layout); */ /* // fprintf(stderr, "x: %.2f y: %.2f w: %.2f h: %.2f old x: %.2f old y: %.2f old w: %.2f old h: %.2f\n" */ /* // , (x + 0 - pd->pan.x), (y + 0 - pd->pan.y), (float)w, (float)h */ diff --git a/src/lib/elementary/efl_ui_list_precise_layouter.eo b/src/lib/elementary/efl_ui_list_precise_layouter.eo index dc49c8d85e..d6d276e4a4 100644 --- a/src/lib/elementary/efl_ui_list_precise_layouter.eo +++ b/src/lib/elementary/efl_ui_list_precise_layouter.eo @@ -3,5 +3,6 @@ class Efl.Ui.List.Precise_Layouter (Efl.Object, Efl.Ui.List.Relayout) implements { Efl.Object.constructor; Efl.Ui.List.Relayout.layout_do; + Efl.Ui.List.Relayout.model { set; } } } diff --git a/src/lib/elementary/efl_ui_list_relayout.eo b/src/lib/elementary/efl_ui_list_relayout.eo index 5e9b834084..b9d86d1c2c 100644 --- a/src/lib/elementary/efl_ui_list_relayout.eo +++ b/src/lib/elementary/efl_ui_list_relayout.eo @@ -11,5 +11,12 @@ interface Efl.Ui.List.Relayout (Efl.Interface) children: accessor<Efl.Ui.List.LayoutItem>; } } + @property model { + [[Model that is/will be ]] + set {} + values { + model: Efl.Model; [[Efl model]] + } + } } } |