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;




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to