Ok, I followed your recommandations. Here is a new patch, with filter state
using its own keyword.
2010/2/7 Carsten Haitzler <[email protected]>
> On Mon, 1 Feb 2010 14:54:19 -0200 Gustavo Sverzut Barbieri
> <[email protected]> said:
>
> i agreee - he syntax isnt good. if its a filter - make it
>
> program {
> name: "w";
> signal: "x";
> source: "y";
> filter_state: "z";
>
> if anything... :) how about that?
>
> > On Mon, Feb 1, 2010 at 2:19 PM, tristan <[email protected]> wrote:
> > > Hello,
> > >
> > > I was having trouble with the EDC programs that were missing a filter
> for
> > > the current state of source part. This allow for instance to make a
> toggle
> > > button without using any C code.
> > >
> > > I made a patch that add an optional parameter to the "source" keyword
> of an
> > > EDC program : the part state. If this second parameter is omitted, then
> it
> > > behave exactly the same as before, and therefore stay compatible with
> all
> > > other EDC files.
> > >
> > > Here is an example:
> > > program {
> > > name: "set_on"
> > > signal: "mouse,up,*";
> > > source: "button" "is_off"
> > > action: STATE_SET "is_on" 0.0;
> > > target: "button";
> > > }
> > > program {
> > > name: "set_off"
> > > signal: "mouse,up,*";
> > > source: "button" "is_on"
> > > action: STATE_SET "is_off" 0.0;
> > > target: "button";
> > > }
> >
> > dunno if this is good... and you don't need C code to do it, you can
> > use embryo or lua.
> >
> > --
> > Gustavo Sverzut Barbieri
> > http://profusion.mobi embedded systems
> > --------------------------------------
> > MSN: [email protected]
> > Skype: gsbarbieri
> > Mobile: +55 (19) 9225-2202
> >
> >
> ------------------------------------------------------------------------------
> > The Planet: dedicated and managed hosting, cloud storage, colocation
> > Stay online with enterprise data centers and the best network in the
> business
> > Choose flexible plans and management services without long-term contracts
> > Personal 24x7 support from experience hosting pros just a phone call
> away.
> > http://p.sf.net/sfu/theplanet-com
> > _______________________________________________
> > enlightenment-devel mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>
>
> --
> ------------- Codito, ergo sum - "I code, therefore I am" --------------
> The Rasterman (Carsten Haitzler) [email protected]
>
>
--
618FE3EF
diff --git a/src/bin/edje_cc_handlers.c b/src/bin/edje_cc_handlers.c
index ca1cb45..624af10 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_state(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_state", st_collections_group_programs_program_filter_state}, /* 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_state", st_collections_group_programs_program_filter_state}, /* 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_state", st_collections_group_programs_program_filter_state}, /* 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_state: "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,32 @@ st_collections_group_programs_program_source(void)
/**
@page edcref
@property
+ filter_state
+ @parameters
+ [filter_state name]
+ @effect
+ State of the source part that should accept signal. Only one source state
+ keyword per program may be used. ex:state: "default"; (Signals from
+ a part currently in state named "default" are accepted).
+ @endproperty
+*/
+static void
+st_collections_group_programs_program_filter_state(void)
+{
+ Edje_Part_Collection *pc;
+ Edje_Program *ep;
+
+ check_arg_count(1);
+
+ pc = eina_list_data_get(eina_list_last(edje_collections));
+ ep = eina_list_data_get(eina_list_last(pc->programs));
+
+ 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..9bcae93 100644
--- a/src/lib/edje_data.c
+++ b/src/lib/edje_data.c
@@ -214,6 +214,7 @@ _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_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..49db5a9 100644
--- a/src/lib/edje_edit.c
+++ b/src/lib/edje_edit.c
@@ -4762,6 +4762,7 @@ edje_edit_program_add(Evas_Object *obj, const char *name)
epr->name = eina_stringshare_add(name);
epr->signal = NULL;
epr->source = NULL;
+ epr->filter_state = NULL;
epr->in.from = 0.0;
epr->in.range = 0.0;
epr->action = 0;
@@ -4815,6 +4816,7 @@ 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_state);
_edje_if_string_free(ed, epr->state);
_edje_if_string_free(ed, epr->state2);
@@ -4981,6 +4983,32 @@ edje_edit_program_source_set(Evas_Object *obj, const char *prog, const char *sou
}
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;
+ //printf("GET SOURCE for program: %s [%s]\n", prog, epr->source_state);
+ 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;
+
+ //printf("SET SOURCE for program: %s [%s]\n", prog, source);
+
+ _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..a7bbf81 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -1096,6 +1096,7 @@ _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_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..72c4580 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -334,6 +334,7 @@ struct _Edje_Program /* a conditional program to be run */
const char *signal; /* if signal emission name matches the glob here... */
const char *source; /* if part that emitted this (name) matches this glob */
+ const char *filter_state; /* if part state that emitted this (name) matches this */
struct {
double from;
diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c
index ab51431..118e7ba 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, 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
------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel