diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index a2c18b9ff1..e0f4320327 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -7121,7 +7121,7 @@ st_collections_group_programs_program_action(void) @property transition @parameters - [type] [length] [[interp val 1]] [[interp val 2]] + [type] [length] [[interp val 1]] [[interp val 2]] [[option]] @effect Defines how transitions occur using STATE_SET action.\n Where 'type' is the style of the transition and 'length' is a double @@ -7157,6 +7157,11 @@ st_collections_group_programs_program_action(void) spring "swings" and val 1 specifies the decay, but it can exceed 1.0 on the outer swings. + Valid option is CURRENT. + + CURRENT is the option which the edje object moves from current position. + It can be used as the last parameter of the every type. + @endproperty */ static void @@ -7190,15 +7195,30 @@ st_collections_group_programs_program_transition(void) "SPRING", EDJE_TWEEN_MODE_SPRING, NULL); current_program->tween.time = FROM_DOUBLE(parse_float_range(1, 0.0, 999999999.0)); + if ((current_program->tween.mode >= EDJE_TWEEN_MODE_LINEAR) && + (current_program->tween.mode <= EDJE_TWEEN_MODE_DECELERATE)) + { + if ((get_arg_count() == 3) && (!strcmp(parse_str(2), "CURRENT"))) + current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT; + else if (get_arg_count() != 2) + { + ERR("%s: Error. parse error %s:%i. " + "Need 2rd parameter to set time", + progname, file_in, line - 1); + exit(-1); + } + } // the following need v1 // EDJE_TWEEN_MODE_ACCELERATE_FACTOR // EDJE_TWEEN_MODE_DECELERATE_FACTOR // EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR // current_program->tween.v1 - if ((current_program->tween.mode >= EDJE_TWEEN_MODE_ACCELERATE_FACTOR) && + else if ((current_program->tween.mode >= EDJE_TWEEN_MODE_ACCELERATE_FACTOR) && (current_program->tween.mode <= EDJE_TWEEN_MODE_SINUSOIDAL_FACTOR)) { - if (get_arg_count() != 3) + if ((get_arg_count() == 4) && (!strcmp(parse_str(3), "CURRENT"))) + current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT; + else if (get_arg_count() != 3) { ERR("%s: Error. parse error %s:%i. " "Need 3rd parameter to set factor", @@ -7215,7 +7235,9 @@ st_collections_group_programs_program_transition(void) else if ((current_program->tween.mode >= EDJE_TWEEN_MODE_DIVISOR_INTERP) && (current_program->tween.mode <= EDJE_TWEEN_MODE_SPRING)) { - if (get_arg_count() != 4) + if ((get_arg_count() == 5) && (!strcmp(parse_str(4), "CURRENT"))) + current_program->tween.mode |= EDJE_TWEEN_MODE_OPT_FROM_CURRENT; + else if (get_arg_count() != 4) { ERR("%s: Error. parse error %s:%i. " "Need 3rd and 4th parameters to set factor and counts", diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 030615b24f..ba6706d839 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -631,7 +631,9 @@ typedef enum _Edje_Tween_Mode EDJE_TWEEN_MODE_DIVISOR_INTERP = 8, EDJE_TWEEN_MODE_BOUNCE = 9, EDJE_TWEEN_MODE_SPRING = 10, - EDJE_TWEEN_MODE_LAST = 11 + EDJE_TWEEN_MODE_LAST = 11, + EDJE_TWEEN_MODE_MASK = 0xff, + EDJE_TWEEN_MODE_OPT_FROM_CURRENT = (1 << 31) } Edje_Tween_Mode; typedef enum _Edje_Cursor diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 2ee6180344..b8fac215c5 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -56,7 +56,7 @@ _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T break; } #else - switch (mode) + switch (mode & EDJE_TWEEN_MODE_MASK) { case EDJE_TWEEN_MODE_SINUSOIDAL: npos = FROM_DOUBLE(ecore_animator_pos_map(TO_DOUBLE(pos), @@ -2212,11 +2212,32 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags) #endif } } - if (ep->param2 && ep->description_pos != ZERO) + if (ep->param2) { int beginning_pos, part_type; Edje_Calc_Params *p2, *p3; + if (ep->current) + { + p1->x = ep->current->x - ed->x; + p1->y = ep->current->y - ed->y; + p1->w = ep->current->w; + p1->h = ep->current->h; + p1->color.r = ep->current->color.r; + p1->color.g = ep->current->color.g; + p1->color.b = ep->current->color.b; + p1->color.a = ep->current->color.a; + p1->type.text.size = ep->current->type.text.size; + p1->type.text.color2.r = ep->current->type.text.color2.r; + p1->type.text.color2.g = ep->current->type.text.color2.g; + p1->type.text.color2.b = ep->current->type.text.color2.b; + p1->type.text.color2.a = ep->current->type.text.color2.a; + p1->type.text.color3.r = ep->current->type.text.color3.r; + p1->type.text.color3.g = ep->current->type.text.color3.g; + p1->type.text.color3.b = ep->current->type.text.color3.b; + p1->type.text.color3.a = ep->current->type.text.color3.a; + } + p3 = &lp3; #ifndef EDJE_CALC_CACHE diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index e044e660a7..ead0382dfd 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -1212,6 +1212,7 @@ struct _Edje_Real_Part Edje_Real_Part_State param1; // 20 // WITH EDJE_CALC_CACHE: 140 Edje_Real_Part_State *param2, *custom; // 8 + Edje_Calc_Params *current; // 4 #ifdef EDJE_CALC_CACHE int state; // 4 @@ -1230,8 +1231,8 @@ struct _Edje_Real_Part #ifdef EDJE_CALC_CACHE unsigned char invalidate : 1; // 0 #endif -}; // 260 -// WITH EDJE_CALC_CACHE: 400 +}; // 264 +// WITH EDJE_CALC_CACHE: 404 struct _Edje_Running_Program { diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index 26160c87a1..48ff6efea0 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -478,6 +478,35 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig, rp = ed->table_parts[pt->id % ed->table_parts_size]; if (rp) { + if ((rp->object) && (pr->tween.mode & EDJE_TWEEN_MODE_OPT_FROM_CURRENT)) + { + rp->current = calloc(1, sizeof(Edje_Calc_Params)); + evas_object_geometry_get(rp->object, &(rp->current->x), + &(rp->current->y), + &(rp->current->w), + &(rp->current->h)); + evas_object_color_get(rp->object, (int *)&(rp->current->color.r), + (int *)&(rp->current->color.g), + (int *)&(rp->current->color.b), + (int *)&(rp->current->color.a)); + evas_object_text_font_get(rp->object, NULL, &(rp->current->type.text.size)); + evas_object_text_outline_color_get(rp->object, + (int *)&(rp->current->type.text.color2.r), + (int *)&(rp->current->type.text.color2.g), + (int *)&(rp->current->type.text.color2.b), + (int *)&(rp->current->type.text.color2.a)); + evas_object_text_shadow_color_get(rp->object, + (int *)&(rp->current->type.text.color3.r), + (int *)&(rp->current->type.text.color3.g), + (int *)&(rp->current->type.text.color3.b), + (int *)&(rp->current->type.text.color3.a)); + } + else + { + if (rp->current) free(rp->current); + rp->current = NULL; + } + if (rp->program) _edje_program_end(ed, rp->program); _edje_part_description_apply(ed, rp,