Edje_Edit: target can be insert into different place in program's target list

Here is API for that:
> edje_edit_program_target_insert_at
This commit is contained in:
Vitalii Vorobiov 2016-02-19 14:06:31 +00:00
parent 5c0c87cbe8
commit dcbb62739c
2 changed files with 71 additions and 42 deletions

View File

@ -5981,6 +5981,25 @@ EAPI Eina_List * edje_edit_program_targets_get(Evas_Object *obj, const char *pro
*/
EAPI Eina_Bool edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *target);
/** Add a new target program to certain place in list of 'targets' in the given program.
*
* If program action is @c EDJE_ACTION_TYPE_ACTION_STOP, then 'target'
* must be an existing program name. If it's @c
* EDJE_ACTION_TYPE_STATE_SET, then 'target' must be an existing part
* name.
*
* @param obj Object being edited.
* @param prog The name of the program to add a new target.
* @param target The name of the new target itself.
* @param place Specific play for target to be inserted into.
*
* @return @c EINA_TRUE in case of success, @c EINA_FALSE otherwise.
*
* @since 1.18
*/
EAPI Eina_Bool
edje_edit_program_target_insert_at(Evas_Object *obj, const char *prog, const char *target, int place);
/** Deletes a target from the list of 'targets' in the given program.
*
* If program action is EDJE_ACTION_TYPE_ACTION_STOP then 'target' must be an existing program name.

View File

@ -9789,18 +9789,14 @@ edje_edit_program_targets_clear(Evas_Object *obj, const char *prog)
return EINA_TRUE;
}
EAPI Eina_Bool
edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *target)
static int
_program_target_id_get(Evas_Object *obj, Edje *ed, Edje_Action_Type action, const char *target)
{
int id;
Edje_Program_Target *t;
int id = -1;
Edje_Program *tar;
Edje_Real_Part *rp;
GET_ED_OR_RETURN(EINA_FALSE);
GET_EPR_OR_RETURN(EINA_FALSE);
switch (epr->action)
switch (action)
{
case EDJE_ACTION_TYPE_STATE_SET:
case EDJE_ACTION_TYPE_SIGNAL_EMIT:
@ -9816,21 +9812,36 @@ edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *tar
#endif
/* the target is a part */
rp = _edje_real_part_get(ed, target);
if (!rp) return EINA_FALSE;
if (!rp) return -1;
id = rp->part->id;
break;
case EDJE_ACTION_TYPE_ACTION_STOP:
/* the target is a program */
tar = _edje_program_get_byname(obj, target);
if (!tar) return EINA_FALSE;
if (!tar) return -1;
id = tar->id;
break;
default:
return EINA_FALSE;
return -1;
}
return id;
}
EAPI Eina_Bool
edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *target)
{
int id;
Edje_Program_Target *t;
GET_ED_OR_RETURN(EINA_FALSE);
GET_EPR_OR_RETURN(EINA_FALSE);
id = _program_target_id_get(obj, ed, epr->action, target);
if (id == -1) return EINA_FALSE;
t = _alloc(sizeof(Edje_Program_Target));
if (!t) return EINA_FALSE;
@ -9840,48 +9851,47 @@ edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *tar
return EINA_TRUE;
}
EAPI Eina_Bool
edje_edit_program_target_insert_at(Evas_Object *obj, const char *prog, const char *target, int place)
{
int id;
Edje_Program_Target *t;
Eina_List *l;
GET_ED_OR_RETURN(EINA_FALSE);
GET_EPR_OR_RETURN(EINA_FALSE);
id = _program_target_id_get(obj, ed, epr->action, target);
if (id == -1) return EINA_FALSE;
t = _alloc(sizeof(Edje_Program_Target));
if (!t) return EINA_FALSE;
t->id = id;
if ((unsigned)place >= eina_list_count(epr->targets))
epr->targets = eina_list_append(epr->targets, t);
else
{
l = eina_list_nth_list(epr->targets, place);
epr->targets = eina_list_prepend_relative_list(epr->targets, t, l);
}
return EINA_TRUE;
}
EAPI Eina_Bool
edje_edit_program_target_del(Evas_Object *obj, const char *prog, const char *target)
{
int id;
Eina_List *l;
Edje_Real_Part *rp;
Edje_Program *tar;
Edje_Program_Target *t;
GET_ED_OR_RETURN(EINA_FALSE);
GET_EPR_OR_RETURN(EINA_FALSE);
switch (epr->action)
{
case EDJE_ACTION_TYPE_STATE_SET:
case EDJE_ACTION_TYPE_SIGNAL_EMIT:
case EDJE_ACTION_TYPE_DRAG_VAL_SET:
case EDJE_ACTION_TYPE_DRAG_VAL_STEP:
case EDJE_ACTION_TYPE_DRAG_VAL_PAGE:
case EDJE_ACTION_TYPE_FOCUS_SET:
case EDJE_ACTION_TYPE_FOCUS_OBJECT:
#ifdef HAVE_EPHYSICS
case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
case EDJE_ACTION_TYPE_PHYSICS_STOP:
case EDJE_ACTION_TYPE_PHYSICS_ROT_SET:
#endif
/* the target is a part */
rp = _edje_real_part_get(ed, target);
if (!rp) return EINA_FALSE;
id = rp->part->id;
break;
id = _program_target_id_get(obj, ed, epr->action, target);
if (id == -1) return EINA_FALSE;
case EDJE_ACTION_TYPE_ACTION_STOP:
/* the target is a program */
tar = _edje_program_get_byname(obj, target);
if (!tar) return EINA_FALSE;
id = tar->id;
break;
default:
return EINA_FALSE;
}
EINA_LIST_FOREACH(epr->targets, l, t)
if (t->id == id)
break;