Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/edje

Dir     : e17/libs/edje/src/lib


Modified Files:
        Edje.h edje_main.c edje_private.h 


Log Message:


Adding code to handle programs, signals, emissions, loops, animation, timers
and the whole lot. it WORKS! :) just re-run the e_logo.sh to rebuild an edje
.eet file that has animation built in... you'll see.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- Edje.h      17 Jun 2003 08:15:06 -0000      1.2
+++ Edje.h      19 Jun 2003 14:43:49 -0000      1.3
@@ -12,6 +12,8 @@
 /***************************************************************************/
    
    void         edje_init(void);
+   void         edje_frametime_set(double t);
+   double       edje_frametime_get(void);
    Evas_Object *edje_add(Evas *evas);
    void         edje_file_set(Evas_Object *o, const char *file, const char *part);
        
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_main.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- edje_main.c 18 Jun 2003 14:20:26 -0000      1.6
+++ edje_main.c 19 Jun 2003 14:43:49 -0000      1.7
@@ -9,6 +9,17 @@
 void       _edje_file_free(Edje_File *edf);
 void       _edje_collection_free(Edje_Part_Collection *ec);
 
+static void _edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void 
*event_info);
+static void _edje_mouse_out_cb(void *data, Evas * e, Evas_Object * obj, void 
*event_info);
+static void _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void 
*event_info);
+static void _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void 
*event_info);
+static void _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void 
*event_info);
+static void _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void 
*event_info);
+static int  _edje_timer_cb(void *data);
+static int  _edje_program_run_iterate(Edje_Running_Program *runp, double tim);
+static void _edje_program_run(Edje *ed, Edje_Program *pr);
+static void _edje_emit(Edje *ed, char *sig, char *src);
+static int  _edje_glob_match(char *str, char *glob);
 static void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos);
 static void _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, char  *d1, 
double v1, char *d2, double v2);
 static void _edje_part_recalc_single(Edje *ed, Edje_Real_Part *ep, 
Edje_Part_Description *desc, Edje_Part_Description *chosen_desc, Edje_Real_Part 
*rel1_to, Edje_Real_Part *rel2_to, Edje_Real_Part *confine_to, Edje_Calc_Params 
*params);
@@ -43,6 +54,11 @@
 Eet_Data_Descriptor *_edje_edd_edje_part_description = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL;
 
+static int          _edje_anim_count = 0;
+static double       _edje_frametime = 1.0 / 60.0;
+static Ecore_Timer *_edje_timer = NULL;
+static Evas_List   *_edje_animators = NULL;
+
 static Evas_Smart *_edje_smart = NULL;
 
 void
@@ -55,6 +71,24 @@
    _edje_edd_setup();
 }
 
+void
+edje_frametime_set(double t)
+{
+   if (t == _edje_frametime) return;
+   _edje_frametime = t;
+   if (_edje_timer)
+     {
+       ecore_timer_del(_edje_timer);
+       _edje_timer = ecore_timer_add(_edje_frametime, _edje_timer_cb, NULL);
+     }
+}
+
+double
+edje_frametime_get(void)
+{
+   return _edje_frametime;
+}
+
 Evas_Object *
 edje_add(Evas *evas)
 {
@@ -120,6 +154,34 @@
               rp->object = evas_object_image_add(ed->evas);
             else if (ep->type == EDJE_PART_TYPE_TEXT)
               rp->object = evas_object_text_add(ed->evas);
+            if (ep->mouse_events)
+              {
+                 evas_object_event_callback_add(rp->object, 
+                                                EVAS_CALLBACK_MOUSE_IN,
+                                                _edje_mouse_in_cb,
+                                                ed);
+                 evas_object_event_callback_add(rp->object, 
+                                                EVAS_CALLBACK_MOUSE_OUT,
+                                                _edje_mouse_out_cb,
+                                                ed);
+                 evas_object_event_callback_add(rp->object, 
+                                                EVAS_CALLBACK_MOUSE_DOWN,
+                                                _edje_mouse_down_cb,
+                                                ed);
+                 evas_object_event_callback_add(rp->object, 
+                                                EVAS_CALLBACK_MOUSE_UP,
+                                                _edje_mouse_up_cb,
+                                                ed);
+                 evas_object_event_callback_add(rp->object, 
+                                                EVAS_CALLBACK_MOUSE_MOVE,
+                                                _edje_mouse_move_cb,
+                                                ed);
+                 evas_object_event_callback_add(rp->object, 
+                                                EVAS_CALLBACK_MOUSE_WHEEL,
+                                                _edje_mouse_wheel_cb,
+                                                ed);
+                 evas_object_data_set(rp->object, "real_part", rp);
+              }
             evas_object_clip_set(rp->object, ed->clipper);
             evas_object_show(rp->object);
             rp->part = ep;
@@ -136,6 +198,7 @@
          }
        ed->dirty = 1;
        _edje_recalc(ed);
+       _edje_emit(ed, "load", ed->part);
      }
 }
 
@@ -175,6 +238,9 @@
 void
 _edje_del(Edje *ed)
 {
+   _edje_file_del(ed);
+   if (ed->path) free(ed->path);
+   if (ed->part) free(ed->part);
    evas_object_del(ed->clipper);
    free(ed);
 }
@@ -305,6 +371,254 @@
 /* manipulation calls */
 
 static void
+_edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
+{
+   Evas_Event_Mouse_In *ev;
+   Edje *ed;
+   Edje_Real_Part *rp;
+   
+   ev = event_info;
+   ed = data;
+   rp = evas_object_data_get(obj, "real_part");
+   if (!rp) return;
+   _edje_emit(ed, "mouse,in", rp->part->name);
+}
+
+static void
+_edje_mouse_out_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
+{
+   Evas_Event_Mouse_Out *ev;
+   Edje *ed;
+   Edje_Real_Part *rp;
+   
+   ev = event_info;
+   ed = data;
+   rp = evas_object_data_get(obj, "real_part");
+   if (!rp) return;
+   _edje_emit(ed, "mouse,out", rp->part->name);
+}
+
+static void
+_edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
+{
+   Evas_Event_Mouse_Down *ev;
+   Edje *ed;
+   Edje_Real_Part *rp;
+   char buf[256];
+   
+   ev = event_info;
+   ed = data;
+   rp = evas_object_data_get(obj, "real_part");
+   if (!rp) return;
+   snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
+   _edje_emit(ed, buf, rp->part->name);
+}
+
+static void
+_edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
+{
+   Evas_Event_Mouse_Up *ev;
+   Edje *ed;
+   Edje_Real_Part *rp;
+   char buf[256];
+   
+   ev = event_info;
+   ed = data;
+   rp = evas_object_data_get(obj, "real_part");
+   if (!rp) return;
+   snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button);
+   _edje_emit(ed, buf, rp->part->name);
+}
+
+static void
+_edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev;
+   Edje *ed;
+   Edje_Real_Part *rp;
+   
+   ev = event_info;
+   ed = data;
+   rp = evas_object_data_get(obj, "real_part");
+   if (!rp) return;
+   _edje_emit(ed, "mouse,move", rp->part->name);
+}
+
+static void
+_edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
+{
+   Evas_Event_Mouse_Wheel *ev;
+   Edje *ed;
+   Edje_Real_Part *rp;
+   char buf[256];
+   
+   ev = event_info;
+   ed = data;
+   rp = evas_object_data_get(obj, "real_part");
+   if (!rp) return;
+   snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0) ? (-1) 
: (1));
+   _edje_emit(ed, buf, rp->part->name);
+}
+
+static int
+_edje_timer_cb(void *data)
+{
+   double t;
+   Evas_List *l;
+   Evas_List *animl = NULL;
+   
+   t = ecore_time_get();
+   for (l = _edje_animators; l; l = l->next)
+     animl = evas_list_append(animl, l->data);
+   while (animl)
+     {
+       Edje *ed;
+       Evas_List *ll, *newl = NULL;
+       
+       ed = animl->data;
+       animl = evas_list_remove(animl, animl->data);
+       for (ll = ed->actions; ll; ll = ll->next)
+         newl = evas_list_append(newl, ll->data);
+       while (newl)
+         {
+            Edje_Running_Program *runp;
+            
+            runp = newl->data;
+            newl = evas_list_remove(newl, newl->data);
+            _edje_program_run_iterate(runp, t);
+         }
+     }
+   if (_edje_anim_count > 0) return 1;
+   _edje_timer = NULL;
+   return 0;
+}
+
+static int
+_edje_program_run_iterate(Edje_Running_Program *runp, double tim)
+{
+   double t, total;
+   Evas_List *l;
+   
+   t = tim - runp->start_time;
+   total = runp->program->tween.time;
+   t /= total;
+   if (t > 1.0) t = 1.0;
+   for (l = runp->program->targets; l; l = l->next)
+     {
+       Edje_Real_Part *rp;
+       Edje_Program_Target *pt;
+       
+       pt = l->data;
+       rp = evas_list_nth(runp->edje->parts, pt->id);
+       if (rp) _edje_part_pos_set(runp->edje, rp, 
+                                  runp->program->tween.mode, t);
+     }
+   if (t >= 1.0)
+     {
+       for (l = runp->program->targets; l; l = l->next)
+         {
+            Edje_Real_Part *rp;
+            Edje_Program_Target *pt;
+            
+            pt = l->data;
+            rp = evas_list_nth(runp->edje->parts, pt->id);
+            if (rp)
+              {
+                 _edje_part_description_apply(runp->edje, rp, 
+                                              runp->program->state, 
+                                              runp->program->value,
+                                              NULL,
+                                              0.0);
+                 _edje_part_pos_set(runp->edje, rp, 
+                                    runp->program->tween.mode, 0.0);
+              }
+         }
+       _edje_recalc(runp->edje);
+       _edje_anim_count--;
+       runp->edje->actions = evas_list_remove(runp->edje->actions, runp);
+       if (!runp->edje->actions)
+         _edje_animators = evas_list_remove(_edje_animators, runp->edje);
+       _edje_emit(runp->edje, "anim,stop", runp->program->name);
+       if (runp->program->after >= 0)
+         {
+            Edje_Program *pr;
+            
+            pr = evas_list_nth(runp->edje->collection->programs, 
+                               runp->program->after);
+            if (pr) _edje_program_run(runp->edje, pr);
+         }
+       free(runp);
+       return  0;
+     }
+   _edje_recalc(runp->edje);
+   return 1;
+}
+
+static void
+_edje_program_run(Edje *ed, Edje_Program *pr)
+{
+   Evas_List *l;
+
+   for (l = pr->targets; l; l = l->next)
+     {
+       Edje_Real_Part *rp;
+       Edje_Program_Target *pt;
+       
+       pt = l->data;
+       rp = evas_list_nth(ed->parts, pt->id);
+       if (rp)
+         {
+            _edje_part_description_apply(ed, rp, 
+                                         rp->param1.description->state.name,
+                                         rp->param1.description->state.value, 
+                                         pr->state, 
+                                         pr->value);
+            _edje_part_pos_set(ed, rp, pr->tween.mode, 0.0);
+         }
+     }
+   _edje_emit(ed, "anim,start", pr->name);
+   if (pr->tween.time > 0.0)
+     {
+       Edje_Running_Program *runp;
+       
+       runp = calloc(1, sizeof(Edje_Running_Program));
+       if (!ed->actions)
+         _edje_animators = evas_list_append(_edje_animators, ed);
+       ed->actions = evas_list_append(ed->actions, runp);
+       runp->start_time = ecore_time_get();
+       runp->edje = ed;
+       runp->program = pr;
+       if (!_edje_timer)
+         _edje_timer = ecore_timer_add(_edje_frametime, _edje_timer_cb, NULL);
+       _edje_anim_count++;
+     }
+}
+
+static void
+_edje_emit(Edje *ed, char *sig, char *src)
+{
+   Evas_List *l;
+   
+   printf("EMIT %s %s\n", sig, src);
+   for (l = ed->collection->programs; l; l = l->next)
+     {
+       Edje_Program *pr;
+       
+       pr = l->data;
+       if ((_edje_glob_match(sig, pr->signal)) &&
+           (_edje_glob_match(src, pr->source)))
+         _edje_program_run(ed, pr);
+     }
+}
+
+static int
+_edje_glob_match(char *str, char *glob)
+{
+   if (!fnmatch(glob, str, 0)) return 1;
+   return 0;
+}
+
+static void
 _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos)
 {
    double npos;
@@ -325,16 +639,17 @@
        npos = sin(pos * PI / 2.0);
        break;
       case EDJE_TWEEN_MODE_LINEAR:
+       npos = pos;
+       break;
       default:
-       npos = ep->description_pos;
        break;
      }
    if (npos == ep->description_pos) return;
-   
+
    ep->description_pos = npos;
    
    ed->dirty = 1;
-   ep->dirty = 1;   
+   ep->dirty = 1;
 }
 
 static void
@@ -357,10 +672,12 @@
        cd2 = ep->param2.description->state.name;
        cv2 = ep->param2.description->state.value;
      }
+   d1_change = 1;
+   d2_change = 1;
    if ((v1 != cv1) || (strcmp(d1, cd1))) d1_change = 1;
    if ((v2 != cv2) || (strcmp(d2, cd2))) d2_change = 1;
    if ((!d1_change) && (!d2_change)) return;
-   
+
    if (d1_change)
      {
        if (!strcmp(d1, "default") && (v1 == 0.0))
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- edje_private.h      18 Jun 2003 14:20:26 -0000      1.8
+++ edje_private.h      19 Jun 2003 14:43:49 -0000      1.9
@@ -8,6 +8,7 @@
 #include <Eet.h>
 
 #include <math.h>
+#include <fnmatch.h>
 
 /* HOW THIS ALL WORKS:
  * -------------------
@@ -290,6 +291,7 @@
 
 typedef struct _Edje Edje;
 typedef struct _Edje_Real_Part Edje_Real_Part;
+typedef struct _Edje_Running_Program Edje_Running_Program;
 
 struct _Edje
 {
@@ -329,6 +331,13 @@
       Edje_Real_Part        *rel2_to;
       Edje_Real_Part        *confine_to;
    } param1, param2;
+};
+
+struct _Edje_Running_Program
+{
+   Edje           *edje;
+   Edje_Program   *program;
+   double          start_time;
 };
 
 typedef struct _Edje_Calc_Params Edje_Calc_Params;




-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to