Enlightenment CVS committal

Author  : urandom
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_shelf.c e_shelf.h 


Log Message:
Shelf hiding based on Hannes Janetzek's patch.
e,state,hidden|visible are still available to themers, to do something 
interesting while the shelf is being moved.

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_shelf.c,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -3 -r1.51 -r1.52
--- e_shelf.c   25 Mar 2007 22:45:00 -0000      1.51
+++ e_shelf.c   6 Apr 2007 19:01:29 -0000       1.52
@@ -20,6 +20,8 @@
 static void _e_shelf_cb_mouse_in(void *data, Evas *evas, Evas_Object *obj, 
void *event_info);
 static void _e_shelf_cb_mouse_out(void *data, Evas *evas, Evas_Object *obj, 
void *event_info);
 static int  _e_shelf_cb_id_sort(void *data1, void *data2);
+static int  _e_shelf_cb_hide_timer(void *data);
+static int  _e_shelf_cb_hide_animator(void *data);
 static void _e_shelf_menu_del_hook(void *data);
 static void _e_shelf_menu_pre_cb(void *data, E_Menu *m);
 
@@ -98,6 +100,7 @@
 e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, 
int layer, int id)
 {
    E_Shelf *es;
+   const char *option;
    char buf[1024];
    
    es = E_OBJECT_ALLOC(E_Shelf, E_SHELF_TYPE, _e_shelf_free);
@@ -134,7 +137,7 @@
    evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_UP, 
_e_shelf_cb_mouse_up, es);
    evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_IN, 
_e_shelf_cb_mouse_in, es);
    evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_OUT, 
_e_shelf_cb_mouse_out, es);
-   
+
    es->o_base = edje_object_add(es->evas);
    es->name = evas_stringshare_add(name);
    snprintf(buf, sizeof(buf), "e/shelf/%s/base", es->style);
@@ -165,6 +168,7 @@
    e_gadcon_min_size_request_callback_set(es->gadcon,
                                          _e_shelf_gadcon_min_size_request,
                                          es);
+
    e_gadcon_size_request_callback_set(es->gadcon,
                                      _e_shelf_gadcon_size_request,
                                      es);
@@ -187,6 +191,19 @@
    
    shelves = evas_list_append(shelves, es);
    shelves = evas_list_sort(shelves, -1, _e_shelf_cb_id_sort);
+   
+   es->hide_step = 0;
+   es->hide_timer = NULL;
+   es->hide_animator = NULL;
+  
+   option =  edje_object_data_get(es->o_base, "hidden_state_size");
+   if (option)
+     es->hidden_state_size = atoi(option);
+   else
+     es->hidden_state_size = 4;
+
+   es->hide_origin = -1;
+   
    return es;
 }
 
@@ -468,12 +485,15 @@
       default:
        break;
      }
+   es->hide_step = 0;
+   
    e_shelf_move_resize(es, es->x, es->y, es->w, es->h);
 }
 
 EAPI void 
 e_shelf_style_set(E_Shelf *es, const char *style) 
 {
+   const char *option;
    char buf[1024];
    
    E_OBJECT_CHECK(es);
@@ -493,6 +513,14 @@
    if (!e_theme_edje_object_set(es->o_base, "base/theme/shelf", buf))
      e_theme_edje_object_set(es->o_base, "base/theme/shelf", 
                             "e/shelf/default/base");
+   
+   option =  edje_object_data_get(es->o_base, "hidden_state_size");
+   if (option)
+     es->hidden_state_size = atoi(option);
+   else
+     es->hidden_state_size = 4;
+   
+   es->hide_origin = -1;
    e_gadcon_unpopulate(es->gadcon);
    e_gadcon_populate(es->gadcon);
 }
@@ -534,6 +562,12 @@
        ecore_timer_del(es->hide_timer);
        es->hide_timer = NULL;
      }
+   if (es->hide_animator)
+     {
+       ecore_animator_del(es->hide_animator);
+       es->hide_animator = NULL;
+     }
+   
    if (es->menu)
      {
        e_menu_post_deactivate_callback_set(es->menu, NULL, NULL);
@@ -689,7 +723,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nh != es->h) ny = (es->zone->h - nh) / 2;
-       nx = 0;
+       // nx = 0;
        break;
       case E_GADCON_ORIENT_RIGHT:
        if (!es->fit_along) nh = es->h;
@@ -697,7 +731,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nh != es->h) ny = (es->zone->h - nh) / 2;
-       nx = es->zone->w - nw;
+       // nx = es->zone->w - nw;
        break;
       case E_GADCON_ORIENT_TOP:
        if (!es->fit_along) nw = es->w;
@@ -705,7 +739,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nw != es->w) nx = (es->zone->w - nw) / 2;
-       ny = 0;
+       // ny = 0;
        break;
       case E_GADCON_ORIENT_BOTTOM:
        if (!es->fit_along) nw = es->w;
@@ -713,7 +747,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nw != es->w) nx = (es->zone->w - nw) / 2;
-       ny = es->zone->h - nh;
+       //ny = es->zone->h - nh;
        break;
       case E_GADCON_ORIENT_CORNER_TL:
        if (!es->fit_along) nw = es->w;
@@ -721,7 +755,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nw != es->w) nx = 0;
-       ny = 0;
+       // ny = 0;
        break;
       case E_GADCON_ORIENT_CORNER_TR:
        if (!es->fit_along) nw = es->w;
@@ -729,7 +763,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        nx = es->zone->w - nw;
-       ny = 0;
+       // ny = 0;
        break;
       case E_GADCON_ORIENT_CORNER_BL:
        if (!es->fit_along) nw = es->w;
@@ -737,7 +771,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nw != es->w) nx = 0;
-       ny = es->zone->h - nh;
+       // ny = es->zone->h - nh;
        break;
       case E_GADCON_ORIENT_CORNER_BR:
        if (!es->fit_along) nw = es->w;
@@ -745,7 +779,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        nx = es->zone->w - nw;
-       ny = es->zone->h - nh;
+       //ny = es->zone->h - nh;
        break;
       case E_GADCON_ORIENT_CORNER_LT:
        if (!es->fit_along) nh = es->h;
@@ -753,7 +787,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nh != es->h) ny = 0;
-       nx = 0;
+       // nx = 0;
        break;
       case E_GADCON_ORIENT_CORNER_RT:
        if (!es->fit_along) nh = es->h;
@@ -761,7 +795,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nh != es->h) ny = 0;
-       nx = es->zone->w - nw;
+       // nx = es->zone->w - nw;
        break;
       case E_GADCON_ORIENT_CORNER_LB:
        if (!es->fit_along) nh = es->h;
@@ -769,7 +803,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nh != es->h) ny = es->zone->h - nh;
-       nx = 0;
+       // nx = 0;
        break;
       case E_GADCON_ORIENT_CORNER_RB:
        if (!es->fit_along) nh = es->h;
@@ -777,7 +811,7 @@
        if (nw > es->zone->w) nw = es->zone->w;
        if (nh > es->zone->h) nh = es->zone->h;
        if (nh != es->h) ny = es->zone->h - nh;
-       nx = es->zone->w - nw;
+       // nx = es->zone->w - nw;
        break;
       default:
        break;
@@ -971,41 +1005,25 @@
 {
    Evas_Event_Mouse_In *ev;
    E_Shelf *es;
-   
+
    es = data;
    ev = event_info;
    edje_object_signal_emit(es->o_base, "e,state,focused", "e");
    if (es->cfg->autohide)
      {
-       if (es->hidden)
-         {
+       if (es->hidden) 
+         {  
             es->hidden = 0;
             edje_object_signal_emit(es->o_base, "e,state,visible", "e");
+            if(!es->hide_animator)
+              es->hide_animator = 
ecore_animator_add(_e_shelf_cb_hide_animator, es);
+            if (es->hide_timer)
+              {    
+                 ecore_timer_del(es->hide_timer);
+                 es->hide_timer = NULL;
+              }
          }
      }
-   if (es->hide_timer)
-     {
-       ecore_timer_del(es->hide_timer);
-       es->hide_timer = NULL;
-     }
-}
-
-static int
-_e_shelf_cb_hide_timer(void *data)
-{
-   E_Shelf *es;
-   
-   es = data;
-   if (!e_menu_grab_window_get())
-     {
-       if (!es->hidden)
-         {
-            edje_object_signal_emit(es->o_base, "e,state,hidden", "e");
-         }
-     }
-   es->hide_timer = NULL;
-   es->hidden = 1;
-   return 0;
 }
 
 static void
@@ -1013,18 +1031,22 @@
 {
    Evas_Event_Mouse_Out *ev;
    E_Shelf *es;
-   
+
    es = data;
    ev = event_info;
    if (es->cfg->autohide)
      {
        Evas_Coord x, y, w, h;
-       
+
        evas_object_geometry_get(es->o_base, &x, &y, &w, &h);
        if (!E_INSIDE(ev->canvas.x, ev->canvas.y, x, y, w, h))
          {
-            if (es->hide_timer) ecore_timer_del(es->hide_timer);
-            es->hide_timer = ecore_timer_add(0.25, _e_shelf_cb_hide_timer, es);
+            if(!es->hidden)
+              {        
+                 es->hidden = 1; 
+                 if(!es->hide_timer)
+                   es->hide_timer = ecore_timer_add(1.0, 
_e_shelf_cb_hide_timer, es);
+              }
          }
      }
    edje_object_signal_emit(es->o_base, "e,state,unfocused", "e");
@@ -1038,6 +1060,217 @@
    es1 = data1;
    es2 = data2;
    return (es1->id) > (es2->id);
+}
+
+static int
+_e_shelf_cb_hide_timer(void *data)
+{
+   E_Shelf *es;
+
+   es = data;
+
+   if(!es->hide_animator)
+     es->hide_animator = ecore_animator_add(_e_shelf_cb_hide_animator, es);
+
+   edje_object_signal_emit(es->o_base, "e,state,hidden", "e");
+   if(es->hide_timer)
+     {    
+       ecore_timer_del(es->hide_timer);
+       es->hide_timer = NULL;
+     }
+   return 1;
+}
+
+static int
+_e_shelf_cb_hide_animator(void *data)
+{
+   E_Shelf *es;
+   int step = 2, move = 0;
+
+   es = data;
+
+   switch(es->gadcon->orient)
+     {
+      case E_GADCON_ORIENT_TOP:
+      case E_GADCON_ORIENT_CORNER_TL:
+      case E_GADCON_ORIENT_CORNER_TR:
+        /* TODO: step coefficient needs to be configurable */
+        step = ((es->h - es->hidden_state_size) / e_config->framerate) * 2;
+        if(es->hidden)
+          {
+             if (es->hide_origin == -1) es->hide_origin = es->y;
+             if (es->hide_step < es->h - es->hidden_state_size)
+               {
+                  if (es->hide_step + step > es->h - es->hidden_state_size)
+                    {
+                       move = es->hide_origin - es->h + es->hidden_state_size;
+                       es->hide_step = es->h - es->hidden_state_size;
+                    }
+                  else
+                    {
+                       move = es->y - step;
+                       es->hide_step += step;
+                    }
+                  e_shelf_move(es, es->x, move);
+               }
+             else goto end;
+          }
+        else
+          {
+             if(es->hide_step > 0)
+               {
+                  if (es->hide_step < step)
+                    {
+                       move = es->hide_origin;
+                       es->hide_step = 0;
+                    }
+                  else
+                    {
+                       move = es->y + step;
+                       es->hide_step -= step;         
+                    }
+                  e_shelf_move(es, es->x, move);
+               }
+             else goto end;
+          }
+        break;
+      case E_GADCON_ORIENT_BOTTOM:
+      case E_GADCON_ORIENT_CORNER_BL:
+      case E_GADCON_ORIENT_CORNER_BR:
+        step = ((es->h - es->hidden_state_size) / e_config->framerate) * 2;
+        if(es->hidden)
+          {
+             if (es->hide_origin == -1) es->hide_origin = es->y;
+             if (es->hide_step < es->h - es->hidden_state_size)
+               {
+                  if (es->hide_step + step > es->h - es->hidden_state_size)
+                    {
+                       move = es->hide_origin + es->h - es->hidden_state_size;
+                       es->hide_step = es->h - es->hidden_state_size;
+                    }
+                  else
+                    {
+                       move = es->y + step;
+                       es->hide_step += step;
+                    }
+                  e_shelf_move(es, es->x, move);
+               }
+             else goto end;
+          }
+        else
+          {
+             if(es->hide_step > 0)
+               {
+                  if (es->hide_step < step)
+                    {
+                       move = es->hide_origin;
+                       es->hide_step = 0;
+                    }
+                  else
+                    {
+                       move = es->y - step;
+                       es->hide_step -= step;         
+                    }
+                  e_shelf_move(es, es->x, move);
+               }
+             else goto end;
+          }
+
+        break;
+      case E_GADCON_ORIENT_LEFT:
+      case E_GADCON_ORIENT_CORNER_LB:
+      case E_GADCON_ORIENT_CORNER_LT:
+        step = ((es->w - es->hidden_state_size) / e_config->framerate) * 2;
+        if(es->hidden)
+          {
+             if (es->hide_origin == -1) es->hide_origin = es->x;
+             if (es->hide_step < es->w - es->hidden_state_size)
+               {
+                  if (es->hide_step + step > es->w - es->hidden_state_size)
+                    {
+                       move = es->hide_origin - es->w + es->hidden_state_size;
+                       es->hide_step = es->w - es->hidden_state_size;
+                    }
+                  else
+                    {
+                       move = es->x - step;
+                       es->hide_step += step;
+                    }
+                  e_shelf_move(es, move, es->y);
+               }
+             else goto end;
+          }
+        else
+          {
+             if (es->hide_step > 0)
+               {
+                  if (es->hide_step < step)
+                    {
+                       move = es->hide_origin;
+                       es->hide_step = 0;
+                    }
+                  else
+                    {
+                       move = es->x + step;
+                       es->hide_step -= step;         
+                    }
+                  e_shelf_move(es, move, es->y);
+               }
+             else goto end;
+          }
+
+        break; 
+      case E_GADCON_ORIENT_RIGHT:
+      case E_GADCON_ORIENT_CORNER_RB:
+      case E_GADCON_ORIENT_CORNER_RT:
+        step = ((es->w - es->hidden_state_size) / e_config->framerate) * 2;
+        if(es->hidden)
+          {
+             if (es->hide_origin == -1) es->hide_origin = es->x;
+             if (es->hide_step < es->w - es->hidden_state_size)
+               {
+                  if (es->hide_step + step > es->w - es->hidden_state_size)
+                    {
+                       move = es->hide_origin + es->w - es->hidden_state_size;
+                       es->hide_step = es->w - es->hidden_state_size;
+                    }
+                  else
+                    {
+                       move = es->x + step;
+                       es->hide_step += step;
+                    }
+                  e_shelf_move(es, move, es->y);
+               }
+             else goto end;
+          }
+        else
+          {
+             if (es->hide_step > 0)
+               {
+                  if (es->hide_step < step)
+                    {
+                       move = es->hide_origin;
+                       es->hide_step = 0;
+                    }
+                  else
+                    {
+                       move = es->x - step;
+                       es->hide_step -= step;         
+                    }
+                  e_shelf_move(es, move, es->y);
+               }
+             else goto end;
+          }
+        break; 
+      default:
+        break;
+     }
+   return 1;
+
+end:
+   ecore_animator_del(es->hide_animator);
+   es->hide_animator = NULL;
+   return 1;
 }
 
 static void 
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_shelf.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -3 -r1.17 -r1.18
--- e_shelf.h   2 Mar 2007 17:00:20 -0000       1.17
+++ e_shelf.h   6 Apr 2007 19:01:29 -0000       1.18
@@ -28,12 +28,16 @@
    const char          *style;
    E_Config_Shelf      *cfg;
    unsigned char        fit_along : 1;
-   unsigned char        fit_size : 1;
-   unsigned char        hidden : 1;
+   unsigned char        fit_size  : 1;
+   unsigned char        hidden    : 1;
    int                  size;
    E_Config_Dialog     *config_dialog;
    E_Menu              *menu;
    Ecore_Timer         *hide_timer;
+   Ecore_Animator      *hide_animator;
+   int                  hide_step;
+   int                  hidden_state_size;
+   int                 hide_origin;
 };
 
 EAPI int              e_shelf_init(void);



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to