From: <enl...@li...> - 2003-10-12 01:43:57
|
Enlightenment CVS committal Author : rephorm Project : e17 Module : proto Dir : e17/proto/esmart/src/container Modified Files: container.c container.h container_smart.c Log Message: updates to scrolling: don't scroll if all of the elements fit inside the container. don't scroll the last element above the bottom or the first element below the top. stop getting magic errors when quickly clicking on the scroll arrows eventually i should add options to allow the first two behaviors. that way we can be as flexible as possible. but i think this is a better default behavior. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/esmart/src/container/container.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- container.c 14 Sep 2003 21:43:15 -0000 1.2 +++ container.c 12 Oct 2003 01:43:54 -0000 1.3 @@ -237,13 +237,24 @@ { Container *cont; Scroll_Data *data; + double length, size; cont = _container_fetch(container); + length = e_container_elements_length_get(container); + size = cont->direction ? cont->h : cont->w; + /* don't scroll unless the elements exceed the size of the container */ + if (length <= size) + { + printf(" length smaller than size\n"); + return; + } + printf("continue\n"); data = calloc(1, sizeof(Scroll_Data)); data->velocity = velocity; data->start_time = ecore_time_get(); data->cont = cont; + data->length = length; cont->scroll_timer = ecore_timer_add(.02, _container_scroll_timer, data); } @@ -257,7 +268,10 @@ /* FIXME: decelerate on stop? */ if (cont->scroll_timer) + { ecore_timer_del(cont->scroll_timer); + cont->scroll_timer = NULL; + } } @@ -710,12 +724,23 @@ _container_scroll_timer(void *data) { Scroll_Data *sd = data; - double dt, dx; - + double dt, dx, size, pad, max_scroll; + dt = ecore_time_get() - sd->start_time; dx = 10 * (1 - exp(-dt)); sd->cont->scroll_offset += dx * sd->velocity; + + size = sd->cont->direction ? sd->cont->h : sd->cont->w; + pad = sd->cont->direction ? sd->cont->padding.t + sd->cont->padding.b : + sd->cont->padding.l + sd->cont->padding.r; + max_scroll = size - sd->length - pad; + + if (sd->cont->scroll_offset < max_scroll) + sd->cont->scroll_offset = max_scroll; + + else if (sd->cont->scroll_offset > 0) + sd->cont->scroll_offset = 0; _container_elements_fix(sd->cont); return 1; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/esmart/src/container/container.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- container.h 14 Sep 2003 21:43:15 -0000 1.2 +++ container.h 12 Oct 2003 01:43:54 -0000 1.3 @@ -92,6 +92,7 @@ Container *cont; double start_time; double velocity; + double length; }; Evas_Object *e_container_new(Evas *evas); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/esmart/src/container/container_smart.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- container_smart.c 11 Oct 2003 06:39:39 -0000 1.3 +++ container_smart.c 12 Oct 2003 01:43:54 -0000 1.4 @@ -74,7 +74,6 @@ data->clipper = evas_object_rectangle_add(data->evas); evas_object_smart_member_add(obj, data->clipper); - //evas_object_color_set(data->clipper, 255, 40, 40, 20); evas_object_repeat_events_set(data->clipper, 1); data->grabber = evas_object_rectangle_add(data->evas); @@ -214,8 +213,6 @@ if((data->x == x) && (data->y == y)) return; -// evas_object_move(data->clipper, x+ data->padding.l, -// y + data->padding.t); evas_object_move(data->clipper, x, y); evas_object_move(data->grabber, x, y); @@ -232,10 +229,12 @@ data = evas_object_smart_data_get(obj); -// evas_object_resize(data->clipper, w - (data->padding.l + data->padding.r), -// h - (data->padding.t + data->padding.b)); + if (w == data->w && h == data->h) return; + evas_object_resize(data->clipper, w, h); evas_object_resize(data->grabber, w, h); + + data->scroll_offset = 0; data->w = w; data->h = h; |