I modified the previous patch to use keyword "filter" instead of
"filter_state". It can take up to 2 arguments :

filter: partname statename;

- If both are present: it will check if state of partname matches statename.
If partname doesn't exist, program won't be called.
- if only statename is present: it will uses the source part as part to
check state from.


2010/2/10 Cedric BAIL <[email protected]>

> On Mon, Feb 8, 2010 at 11:20 AM, tristan <[email protected]> wrote:
> > Ok, I followed your recommandations. Here is a new patch, with filter
> state
> > using its own keyword.
>
> in svn, with few modification.
>
> --
> Cedric BAIL
>



-- 
618FE3EF
diff --git a/src/bin/edje_cc_handlers.c b/src/bin/edje_cc_handlers.c
index ca1cb45..2e3945f 100644
--- a/src/bin/edje_cc_handlers.c
+++ b/src/bin/edje_cc_handlers.c
@@ -210,7 +210,8 @@ static void st_collections_group_parts_part_description_params_double(void);
 static void st_collections_group_programs_program_name(void);
 static void st_collections_group_parts_part_description_params_string(void);
 static void st_collections_group_programs_program_signal(void);
- static void st_collections_group_programs_program_source(void);
+static void st_collections_group_programs_program_source(void);
+static void st_collections_group_programs_program_filter(void);
 static void st_collections_group_programs_program_in(void);
 static void st_collections_group_programs_program_action(void);
 static void st_collections_group_programs_program_transition(void);
@@ -477,6 +478,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.program.name", st_collections_group_programs_program_name}, /* dup */
      {"collections.group.parts.program.signal", st_collections_group_programs_program_signal}, /* dup */
      {"collections.group.parts.program.source", st_collections_group_programs_program_source}, /* dup */
+     {"collections.group.parts.program.filter", st_collections_group_programs_program_filter}, /* dup */
      {"collections.group.parts.program.in", st_collections_group_programs_program_in}, /* dup */
      {"collections.group.parts.program.action", st_collections_group_programs_program_action}, /* dup */
      {"collections.group.parts.program.transition", st_collections_group_programs_program_transition}, /* dup */
@@ -485,6 +487,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.program.name", st_collections_group_programs_program_name}, /* dup */
      {"collections.group.program.signal", st_collections_group_programs_program_signal}, /* dup */
      {"collections.group.program.source", st_collections_group_programs_program_source}, /* dup */
+     {"collections.group.program.filter", st_collections_group_programs_program_filter}, /* dup */
      {"collections.group.program.in", st_collections_group_programs_program_in}, /* dup */
      {"collections.group.program.action", st_collections_group_programs_program_action}, /* dup */
      {"collections.group.program.transition", st_collections_group_programs_program_transition}, /* dup */
@@ -493,6 +496,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.programs.program.name", st_collections_group_programs_program_name},
      {"collections.group.programs.program.signal", st_collections_group_programs_program_signal},
      {"collections.group.programs.program.source", st_collections_group_programs_program_source},
+     {"collections.group.programs.program.filter", st_collections_group_programs_program_filter}, /* dup */
      {"collections.group.programs.program.in", st_collections_group_programs_program_in},
      {"collections.group.programs.program.action", st_collections_group_programs_program_action},
      {"collections.group.programs.program.transition", st_collections_group_programs_program_transition},
@@ -5698,6 +5702,7 @@ st_collections_group_parts_part_description_params_string(void)
                      name: "programname";
                      signal: "signalname";
                      source: "partname";
+                     filter: "partname" "statename";
                      in: 0.3 0.0;
                      action: STATE_SET "statename" state_value;
                      transition: LINEAR 0.5;
@@ -5802,7 +5807,7 @@ st_collections_group_programs_program_signal(void)
     @effect
         Source of accepted signal. Sources may be globbed, but only one source
         keyword per program may be used. ex:source: "button-*"; (Signals from
-        any part or program named "button-*" are accepted)
+        any part or program named "button-*" are accepted).
     @endproperty
 */
 static void
@@ -5821,6 +5826,37 @@ st_collections_group_programs_program_source(void)
 /**
     @page edcref
     @property
+        filter
+    @parameters
+        [filter part state]
+    @effect
+        The part [part] should be in state [state] for the signal to be accepted. Only one source state
+        keyword per program may be used. ex:state: "button" "default"; (Signals are accepted
+        if part button is currently in state named "default").
+    @endproperty
+*/
+static void
+st_collections_group_programs_program_filter(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Program *ep;
+
+   check_min_arg_count(1);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->programs));
+
+   if(is_param(1)) {
+	   ep->filter.part = parse_str(0);
+	   ep->filter.state = parse_str(1);
+   } else {
+	   ep->filter.state = parse_str(0);
+   }
+}
+
+/**
+    @page edcref
+    @property
         in
     @parameters
         [from] [range]
diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c
index 11c4e9f..53250c3 100644
--- a/src/lib/edje_data.c
+++ b/src/lib/edje_data.c
@@ -214,6 +214,8 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "name", name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "signal", signal, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "source", source, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "filter.part", filter.part, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "filter.state", filter.state, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "in.from", in.from, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "in.range", in.range, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "action", action, EET_T_INT);
diff --git a/src/lib/edje_edit.c b/src/lib/edje_edit.c
index 36a34f0..86b8575 100644
--- a/src/lib/edje_edit.c
+++ b/src/lib/edje_edit.c
@@ -4762,6 +4762,8 @@ edje_edit_program_add(Evas_Object *obj, const char *name)
    epr->name = eina_stringshare_add(name);
    epr->signal = NULL;
    epr->source = NULL;
+   epr->filter.part = NULL;
+   epr->filter.state = NULL;
    epr->in.from = 0.0;
    epr->in.range = 0.0;
    epr->action = 0;
@@ -4815,6 +4817,8 @@ edje_edit_program_del(Evas_Object *obj, const char *prog)
    _edje_if_string_free(ed, epr->name);
    _edje_if_string_free(ed, epr->signal);
    _edje_if_string_free(ed, epr->source);
+   _edje_if_string_free(ed, epr->filter.part);
+   _edje_if_string_free(ed, epr->filter.state);
    _edje_if_string_free(ed, epr->state);
    _edje_if_string_free(ed, epr->state2);
 
@@ -4981,6 +4985,52 @@ edje_edit_program_source_set(Evas_Object *obj, const char *prog, const char *sou
 }
 
 EAPI const char *
+edje_edit_program_filter_part_get(Evas_Object *obj, const char *prog)
+{
+   GET_EPR_OR_RETURN(NULL);
+
+   if (!epr->filter.part) return NULL;
+   return eina_stringshare_add(epr->filter.part);
+}
+
+EAPI Eina_Bool
+edje_edit_program_filter_part_set(Evas_Object *obj, const char *prog, const char *filter_part)
+{
+   GET_ED_OR_RETURN(0);
+   GET_EPR_OR_RETURN(0);
+
+   if (!filter_part) return 0;
+
+   _edje_if_string_free(ed, epr->filter.part);
+   epr->filter.part = eina_stringshare_add(filter_part);
+
+   return 1;
+}
+
+EAPI const char *
+edje_edit_program_filter_state_get(Evas_Object *obj, const char *prog)
+{
+   GET_EPR_OR_RETURN(NULL);
+
+   if (!epr->filter.state) return NULL;
+   return eina_stringshare_add(epr->filter.state);
+}
+
+EAPI Eina_Bool
+edje_edit_program_filter_state_set(Evas_Object *obj, const char *prog, const char *filter_state)
+{
+   GET_ED_OR_RETURN(0);
+   GET_EPR_OR_RETURN(0);
+
+   if (!filter_state) return 0;
+
+   _edje_if_string_free(ed, epr->filter.state);
+   epr->filter.state = eina_stringshare_add(filter_state);
+
+   return 1;
+}
+
+EAPI const char *
 edje_edit_program_signal_get(Evas_Object *obj, const char *prog)
 {
    GET_EPR_OR_RETURN(NULL);
diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c
index 5710467..df05e10 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -1096,6 +1096,8 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
              if (pr->name) eina_stringshare_del(pr->name);
              if (pr->signal) eina_stringshare_del(pr->signal);
              if (pr->source) eina_stringshare_del(pr->source);
+             if (pr->filter.part) eina_stringshare_del(pr->filter.part);
+             if (pr->filter.state) eina_stringshare_del(pr->filter.state);
              if (pr->state) eina_stringshare_del(pr->state);
              if (pr->state2) eina_stringshare_del(pr->state2);
           }
diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h
index 5fd2566..0372fc7 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -336,6 +336,11 @@ struct _Edje_Program /* a conditional program to be run */
    const char *source; /* if part that emitted this (name) matches this glob */
 
    struct {
+      const char *part; 
+      const char *state; 
+   } filter; /* the part filter.part should be in state filter.state for signal to be accepted */
+
+   struct {
       double   from;
       double   range;
    } in;
diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c
index ab51431..129c353 100644
--- a/src/lib/edje_program.c
+++ b/src/lib/edje_program.c
@@ -1015,13 +1015,24 @@ struct _Edje_Program_Data
 
 static int _edje_glob_callback(Edje_Program *pr, void *dt)
 {
+   char exec = 0;
    struct _Edje_Program_Data    *data = dt;
+   Edje_Real_Part *rp = NULL;
 
 #ifdef EDJE_PROGRAM_CACHE
    data->matched++;
 #endif
 
-   _edje_program_run(data->ed, pr, 0, data->signal, data->source);
+   if (pr->filter.state)
+   {
+     rp = _edje_real_part_get(data->ed, pr->filter.part?pr->filter.part:data->source);
+     if (rp)
+       exec = (rp->chosen_description->state.name == pr->filter.state);
+   }
+
+   if (exec)
+     _edje_program_run(data->ed, pr, 0, data->signal, data->source);
+ 
    if (_edje_block_break(data->ed))
      {
 #ifdef EDJE_PROGRAM_CACHE
------------------------------------------------------------------------------
Download Intel&reg; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs 
proactively, and fine-tune applications for parallel performance. 
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to