From ae3ac0cd2520469c700d43c81e33534ce0d8e92e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Tue, 9 Aug 2016 20:11:07 +0900 Subject: [PATCH] edje: Allow no_render in description Previously, it was limited to the part block. It was a mistake and should have been put in the description instead, as this allows it to change during state transition (like visible, or proxy_src_visible). @feature --- src/bin/edje/edje_cc_handlers.c | 33 +++++++++++++++++++++++++++++++++ src/lib/edje/edje_calc.c | 36 +++++++++++++++++++++++++++++++++++- src/lib/edje/edje_data.c | 2 ++ src/lib/edje/edje_private.h | 9 ++++++++- src/lib/evas/canvas/evas_clip.c | 3 +++ 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 0dc7911..615c851 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -340,6 +340,7 @@ static void st_collections_group_parts_part_description_link_base(void); static void st_collections_group_parts_part_description_source(void); static void st_collections_group_parts_part_description_state(void); static void st_collections_group_parts_part_description_visible(void); +static void st_collections_group_parts_part_description_no_render(void); static void st_collections_group_parts_part_description_limit(void); static void st_collections_group_parts_part_description_align(void); static void st_collections_group_parts_part_description_fixed(void); @@ -830,6 +831,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.parts.part.description.state", st_collections_group_parts_part_description_state}, {"collections.group.parts.part.description.visible", st_collections_group_parts_part_description_visible}, {"collections.group.parts.part.description.limit", st_collections_group_parts_part_description_limit}, + {"collections.group.parts.part.description.no_render", st_collections_group_parts_part_description_no_render}, {"collections.group.parts.part.description.align", st_collections_group_parts_part_description_align}, {"collections.group.parts.part.description.fixed", st_collections_group_parts_part_description_fixed}, {"collections.group.parts.part.description.min", st_collections_group_parts_part_description_min}, @@ -7862,6 +7864,7 @@ _copied_map_colors_get(Edje_Part_Description_Common *parent) step: 0 0; aspect: 1 1; clip_to: "clip_override_part_name"; + no_render: 0; rel1 { .. @@ -7917,6 +7920,7 @@ ob_collections_group_parts_part_description(void) ed->visible = 1; ed->limit = 0; + ed->no_render = 0; ed->align.x = FROM_DOUBLE(0.5); ed->align.y = FROM_DOUBLE(0.5); ed->min.w = 0; @@ -8477,6 +8481,35 @@ st_collections_group_parts_part_description_hid(void) /** @page edcref @property + visible + @parameters + [0 or 1] + @effect + Takes a boolean value specifying whether part is visible (1) or not + (0). Non-visible parts do not emit signals. The default value is 1. + + @since 1.19 + @endproperty +*/ +static void +st_collections_group_parts_part_description_no_render(void) +{ + if (current_part->type == EDJE_PART_TYPE_SPACER) + { + ERR("parse error %s:%i. SPACER part can't be marked as no_render", + file_in, line - 1); + exit(-1); + } + + if (check_range_arg_count(0, 1) == 1) + EDJE_DESC_NO_RENDER_SET(current_desc, parse_bool(0)); + else /* lazEDC form */ + EDJE_DESC_NO_RENDER_SET(current_desc, 1); +} + +/** + @page edcref + @property limit @parameters [mode] diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c index 879bba7..24a9c55 100644 --- a/src/lib/edje/edje_calc.c +++ b/src/lib/edje/edje_calc.c @@ -2821,6 +2821,18 @@ _edje_part_recalc_single(Edje *ed, /* visible */ params->visible = desc->visible; + /* no_render override */ + if (EDJE_DESC_NO_RENDER_IS_SET(desc)) + { + params->no_render = EDJE_DESC_NO_RENDER_VALUE(desc); + params->no_render_apply = 1; + } + else + { + params->no_render = ep->part->no_render; + params->no_render_apply = 0; + } + /* clip override */ if (clip_to) { @@ -4436,6 +4448,24 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta } } + /* and no_render as well */ + if ((p1->no_render) && (!p2->no_render)) + { + p3->no_render = (pos == FROM_INT(1)); + p3->no_render_apply = 1; + } + else if ((!p1->no_render) && (p2->no_render)) + { + p3->no_render = (pos == ZERO); + p3->no_render_apply = 1; + } + else if (p1->no_render != ep->part->no_render) + { + p3->no_render = p1->no_render; + p3->no_render_apply = 1; + } + else p3->no_render = ep->part->no_render; + p3->smooth = (beginning_pos) ? p1->smooth : p2->smooth; /* FIXME: do x and y separately base on flag */ @@ -4813,6 +4843,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta break; } evas_object_show(ep->object); + if (pf->no_render_apply) + efl_canvas_object_no_render_set(ep->object, pf->no_render); } else if (!pf->visible) { @@ -4830,8 +4862,10 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta break; } evas_object_show(ep->object); - + if (pf->no_render_apply) + efl_canvas_object_no_render_set(ep->object, pf->no_render); #endif + /* move and resize are needed for all previous object => no break here. */ case EDJE_PART_TYPE_SWALLOW: case EDJE_PART_TYPE_GROUP: diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c index 8470076..7754c9e 100644 --- a/src/lib/edje/edje_data.c +++ b/src/lib/edje/edje_data.c @@ -1128,6 +1128,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.name", state.name, EET_T_STRING); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.value", state.value, EET_T_DOUBLE); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "visible", visible, EET_T_CHAR); \ + EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "no_render", no_render, EET_T_UCHAR); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "limit", limit, EET_T_CHAR); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.x", align.x, EDJE_T_FLOAT); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.y", align.y, EDJE_T_FLOAT); \ @@ -1253,6 +1254,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "rel2.id_x", Dec.rel2.id_x, EET_T_INT); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "rel2.id_y", Dec.rel2.id_y, EET_T_INT); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "clip_to_id", Dec.clip_to_id, EET_T_INT); \ + EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "no_render", Dec.no_render, EET_T_UCHAR); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "size_class", Dec.size_class, EET_T_STRING); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "color_class", Dec.color_class, EET_T_STRING); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "color.r", Dec.color.r, EET_T_UCHAR); \ diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index afc6f79..9794736 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -526,6 +526,10 @@ typedef struct _Edje_Signal_Callback_Custom Edje_Signal_Callback_Custom; #define FLAG_Y 0x02 #define FLAG_XY (FLAG_X | FLAG_Y) +#define EDJE_DESC_NO_RENDER_IS_SET(d) (((d)->no_render & 0x2) != 0) +#define EDJE_DESC_NO_RENDER_SET(d, v) do { (d)->no_render = (!!v) | 0x2; } while (0) +#define EDJE_DESC_NO_RENDER_VALUE(d) (((d)->no_render & 0x1) != 0) + /*----------*/ struct _AABB { @@ -1309,6 +1313,7 @@ struct _Edje_Part_Description_Common Edje_3D_Vec align_3d; unsigned char visible; /* is it shown */ unsigned char limit; /* 0 == no, 1 = width, 2 = height, 3 = both */ + unsigned char no_render; /* no_render override @since 1.19 */ }; struct _Edje_Part_Description_Spec_Fill @@ -1845,7 +1850,7 @@ struct _Edje_Calc_Params Edje_Calc_Params_Type_Common *common; Edje_Calc_Params_Type_Text *text; Edje_Calc_Params_Type_Node *node; - } type; // 4/8 + } type; // 4/8 Edje_Calc_Params_Ext *ext; // 4/8 struct { FLOAT_T x, y, w, h; // 32 @@ -1858,6 +1863,8 @@ struct _Edje_Calc_Params unsigned char mapped : 1; unsigned char visible : 1; unsigned char smooth : 1; // 1 + unsigned char no_render : 1; + unsigned char no_render_apply : 1; }; // 77/85(rounded up for alignment: 80/88) struct _Edje_Real_Part_Set diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c index cb79f32..5002415 100644 --- a/src/lib/evas/canvas/evas_clip.c +++ b/src/lib/evas/canvas/evas_clip.c @@ -594,6 +594,9 @@ _efl_canvas_object_clipees_has(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Dat EOLIAN void _efl_canvas_object_no_render_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool enable) { + enable = !!enable; + if (obj->no_render == enable) return; + obj->no_render = enable; if (obj->is_smart) efl_canvas_group_no_render_set(eo_obj, enable); -- 2.7.4