diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index f8ddf1cee6..7a4a37134c 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -1489,11 +1489,15 @@ _style_string_split(const char *str, char* part1, char* part2) *temp = 0; } -#define FORMAT_SHADOW_SET(evas, efl) {fmt->style = evas; if (set_default) _FMT_INFO(effect) = efl;} +#define FORMAT_SHADOW_SET(evas, efl) { \ + if (fmt->style != evas) { fmt->style = evas; changed = EINA_TRUE; } \ + if (set_default && (_FMT_INFO(effect) != efl)) {_FMT_INFO(effect) = efl; changed = EINA_TRUE;}} -void +Eina_Bool _format_shadow_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_Bool set_default, Efl_Canvas_Textblock_Data *o) { + Eina_Bool changed = EINA_FALSE; + if (!strcmp(str, "shadow")) FORMAT_SHADOW_SET(EVAS_TEXT_STYLE_SHADOW, EFL_TEXT_STYLE_EFFECT_TYPE_SHADOW) else if (!strcmp(str, "outline")) @@ -1514,13 +1518,22 @@ _format_shadow_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_Bool set_d FORMAT_SHADOW_SET(EVAS_TEXT_STYLE_FAR_SOFT_SHADOW, EFL_TEXT_STYLE_EFFECT_TYPE_FAR_SOFT_SHADOW) else /*off none plain */ FORMAT_SHADOW_SET(EVAS_TEXT_STYLE_PLAIN, EFL_TEXT_STYLE_EFFECT_TYPE_NONE) + + return changed; } -#define FORMAT_SHADOW_DIRECTION_SET(direction) {EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_##direction); if (set_default) _FMT_INFO(shadow_direction) = EFL_TEXT_STYLE_SHADOW_DIRECTION_##direction;} +#define FORMAT_SHADOW_DIRECTION_SET(direction) { \ + unsigned char temp = fmt->style; \ + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(fmt->style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_##direction); \ + changed = (fmt->style != temp); \ + if (set_default && (_FMT_INFO(shadow_direction) != EFL_TEXT_STYLE_SHADOW_DIRECTION_##direction)) \ + {_FMT_INFO(shadow_direction) = EFL_TEXT_STYLE_SHADOW_DIRECTION_##direction; changed = EINA_TRUE;}} -void +Eina_Bool _format_shadow_direction_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_Bool set_default, Efl_Canvas_Textblock_Data *o) { + Eina_Bool changed = EINA_FALSE; + if (!strcmp(str, "bottom_right")) FORMAT_SHADOW_DIRECTION_SET(BOTTOM_RIGHT) else if (!strcmp(str, "bottom")) @@ -1539,6 +1552,8 @@ _format_shadow_direction_set(Evas_Object_Textblock_Format *fmt, char *str, Eina_ FORMAT_SHADOW_DIRECTION_SET(RIGHT) else FORMAT_SHADOW_DIRECTION_SET(BOTTOM_RIGHT) + + return changed; } /** @@ -3169,10 +3184,10 @@ _default_format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, *part2 = 0; _style_string_split(param, part1, part2); - _format_shadow_set(fmt, part1, EINA_TRUE, o); + changed = _format_shadow_set(fmt, part1, EINA_TRUE, o); if (*part2) - _format_shadow_direction_set(fmt, part2, EINA_TRUE, o); + changed = _format_shadow_direction_set(fmt, part2, EINA_TRUE, o) || changed; } else { diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 2b44e3fdff..a05f30af37 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -5012,12 +5012,17 @@ EFL_START_TEST(efl_canvas_textblock_style) const char *style; Eina_Size2D size1, size2; + int changed_emit = 0; + efl_event_callback_add(txt, EFL_CANVAS_TEXTBLOCK_EVENT_CHANGED, _increment_int_changed, &changed_emit); + efl_text_password_set(txt, EINA_FALSE); efl_text_underline_type_set(txt, EFL_TEXT_STYLE_UNDERLINE_TYPE_DOUBLE); efl_text_font_weight_set(txt, EFL_TEXT_FONT_WEIGHT_EXTRABOLD); efl_text_font_slant_set(txt, EFL_TEXT_FONT_SLANT_OBLIQUE); efl_text_tab_stops_set(txt, 20); + ck_assert_int_eq(changed_emit, 4); + efl_canvas_textblock_style_apply(txt, "color=#90E135"); style = efl_canvas_textblock_all_styles_get(txt); @@ -5037,6 +5042,7 @@ EFL_START_TEST(efl_canvas_textblock_style) style = efl_canvas_textblock_all_styles_get(txt); fail_if(!strstr(style, "password=on")); + changed_emit = 0; efl_canvas_textblock_style_apply(txt, "font_width=ultracondensed"); ck_assert_int_eq(efl_text_font_width_get(txt), EFL_TEXT_FONT_WIDTH_ULTRACONDENSED); @@ -5081,6 +5087,13 @@ EFL_START_TEST(efl_canvas_textblock_style) ck_assert_int_eq(b, 0x6C); ck_assert_int_eq(a, 0xFF); + ck_assert_int_eq(changed_emit, 12); + + //check if multiple attribute set, called only once + changed_emit = 0; + efl_canvas_textblock_style_apply(txt, style); + ck_assert_int_eq(changed_emit, 1); + // Style Apply taking efl_text_set(txt,"A"); efl_canvas_textblock_style_apply(txt,"font_size=2"); @@ -5092,7 +5105,7 @@ EFL_START_TEST(efl_canvas_textblock_style) efl_text_gfx_filter_set(txt, "code"); ck_assert_str_eq(efl_text_gfx_filter_get(txt), "code"); - + END_EFL_CANVAS_TEXTBLOCK_TEST(); } EFL_END_TEST