From 8608e8dc7047bfe074a71e638bc44b0eec198827 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Fri, 24 Nov 2017 15:17:05 +0900 Subject: [PATCH] part bg: Fix up some unnecessary complexity See previous commit :) Note: right now the background part has a small 3d indent which comes from the legacy theme being used. This will be fixed soon. --- src/bin/elementary/test.c | 2 +- src/lib/elementary/efl_ui_layout.c | 104 ++++++++++------------------ src/lib/elementary/efl_ui_layout_part_bg.eo | 7 +- src/lib/elementary/efl_ui_widget_part_bg.eo | 15 +--- src/lib/elementary/elm_part_helper.h | 26 ++++--- src/lib/elementary/elm_widget.c | 40 +++++------ src/lib/elementary/elm_widget.h | 2 + 7 files changed, 76 insertions(+), 120 deletions(-) diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index e4ba05f..c4f5e9b 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -1133,7 +1133,7 @@ add_tests: ADD_TEST(NULL, "Widgets Disable/Enable", "Layout", test_layout_disable); //------------------------------// - ADD_TEST(NULL, "Widgets Part", "Part Background", test_part_background); + ADD_TEST_EO(NULL, "Widgets Part", "Part Background", test_part_background); #undef ADD_TEST if (autorun) diff --git a/src/lib/elementary/efl_ui_layout.c b/src/lib/elementary/efl_ui_layout.c index a4cd798..abe8554 100644 --- a/src/lib/elementary/efl_ui_layout.c +++ b/src/lib/elementary/efl_ui_layout.c @@ -2383,17 +2383,33 @@ _efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char * EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL); ELM_WIDGET_DATA_GET_OR_RETURN((Eo *) obj, wd, NULL); - if (eina_streq(part, "background")) - return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_BG_CLASS, obj, part); // Check part type without using edje_object_part_object_get(), as this // can cause recalc, which has side effects... and could be slow. type = efl_canvas_layout_part_type_get(efl_part(wd->resize_obj, part)); + if (eina_streq(part, "background")) + { + if (type != EFL_CANVAS_LAYOUT_PART_TYPE_SWALLOW) + { + if (type < EFL_CANVAS_LAYOUT_PART_TYPE_LAST) + { + const char *file = NULL, *key = NULL; + efl_file_get(wd->resize_obj, &file, &key); + WRN("Layout has a background but it's not a swallow: '%s:%s'", + file, key); + } + return efl_part(efl_super(obj, MY_CLASS), part); + } + + return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_BG_CLASS, obj, part); + } + if (type >= EFL_CANVAS_LAYOUT_PART_TYPE_LAST) { ERR("Invalid type found for part '%s' in group '%s'", part, sd->group); return NULL; } + switch (type) { case EFL_CANVAS_LAYOUT_PART_TYPE_BOX: @@ -2528,78 +2544,28 @@ _efl_ui_layout_part_legacy_efl_ui_translatable_translatable_text_set(Eo *obj, vo elm_widget_part_translatable_text_set(pd->obj, pd->part, label, domain); } -/* Efl.Ui.Layout.Part.Bg (common) */ -EOLIAN static void -_efl_ui_layout_part_bg_efl_ui_widget_part_bg_bg_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Canvas_Object *bg) -{ - Efl_Canvas_Layout_Part_Type type; - Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); - Efl_Ui_Layout_Data *sd = efl_data_scope_get(pd->obj, MY_CLASS); - ELM_WIDGET_DATA_GET_OR_RETURN(pd->obj, wd); - - // Check part type without using edje_object_part_object_get(), as this - // can cause recalc, which has side effects... and could be slow. - type = efl_canvas_layout_part_type_get(efl_part(wd->resize_obj, "background")); - if (type != EFL_CANVAS_LAYOUT_PART_TYPE_SWALLOW) - efl_ui_widget_part_bg_set(efl_super(obj, EFL_UI_LAYOUT_PART_BG_CLASS), bg); - - if (wd->bg == bg) - return; - - efl_del(wd->bg); - wd->bg = bg; - if (!wd->bg) - return; - - _efl_ui_layout_content_set(pd->obj, sd, "background", bg); -} - -EOLIAN static Eina_Bool -_efl_ui_layout_part_bg_efl_file_file_set(Eo *obj, void *pd EINA_UNUSED, const char *file, const char *key) -{ - Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj); - - return efl_file_set(bg_obj, file, key); -} - -EOLIAN static void -_efl_ui_layout_part_bg_efl_file_file_get(Eo *obj, void *pd EINA_UNUSED, const char **file, const char **key) -{ - Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj); - - efl_file_get(bg_obj, file, key); -} - -EOLIAN static void -_efl_ui_layout_part_bg_efl_gfx_color_set(Eo *obj, void *pd EINA_UNUSED, int r, int g, int b, int a) -{ - Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj); - - efl_gfx_color_set(bg_obj, r, g, b, a); -} - -EOLIAN static void -_efl_ui_layout_part_bg_efl_gfx_color_get(Eo *obj, void *pd EINA_UNUSED, int *r, int *g, int *b, int *a) -{ - Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj); +/* Efl.Ui.Layout.Part_Bg (common) */ - efl_gfx_color_get(bg_obj, r, g, b, a); -} - -EOLIAN static void -_efl_ui_layout_part_bg_efl_ui_image_scale_type_set(Eo *obj, void *pd EINA_UNUSED, Efl_Ui_Image_Scale_Type scale_type) +EOLIAN static Efl_Object * +_efl_ui_layout_part_bg_efl_object_finalize(Eo *obj, void *_pd EINA_UNUSED) { - Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj); + Efl_Ui_Layout_Data *sd; + Elm_Part_Data *pd; + Eo *bg; - efl_ui_image_scale_type_set(bg_obj, scale_type); -} + obj = efl_finalize(efl_super(obj, EFL_UI_LAYOUT_PART_BG_CLASS)); + if (!obj) return NULL; -EOLIAN static Efl_Ui_Image_Scale_Type -_efl_ui_layout_part_bg_efl_ui_image_scale_type_get(Eo *obj, void *pd EINA_UNUSED) -{ - Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj); + pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); + sd = efl_data_scope_get(pd->obj, MY_CLASS); + bg = _efl_ui_widget_bg_get(pd->obj); + if (!_efl_ui_layout_content_set(pd->obj, sd, "background", bg)) + { + ERR("Failed to swallow new background object!"); + // Shouldn't happen. What now? del bg? call super? return null? + } - return efl_ui_image_scale_type_get(bg_obj); + return obj; } /* Efl.Ui.Layout.Part_Xxx includes */ diff --git a/src/lib/elementary/efl_ui_layout_part_bg.eo b/src/lib/elementary/efl_ui_layout_part_bg.eo index 9da3921..dc157d2 100644 --- a/src/lib/elementary/efl_ui_layout_part_bg.eo +++ b/src/lib/elementary/efl_ui_layout_part_bg.eo @@ -1,11 +1,8 @@ -class Efl.Ui.Layout.Part.Bg (Efl.Ui.Widget.Part.Bg, Efl.Ui.Bg) +class Efl.Ui.Layout.Part_Bg (Efl.Ui.Widget.Part_Bg) { [[Elementary layout internal part background class]] data: null; implements { - Efl.Ui.Widget.Part.Bg.bg { set; } - Efl.File.file { get; set; } - Efl.Gfx.color { set; get; } - Efl.Ui.Image.scale_type { get; set; } + Efl.Object.finalize; } } diff --git a/src/lib/elementary/efl_ui_widget_part_bg.eo b/src/lib/elementary/efl_ui_widget_part_bg.eo index 47e5c6e..f35d4f6 100644 --- a/src/lib/elementary/efl_ui_widget_part_bg.eo +++ b/src/lib/elementary/efl_ui_widget_part_bg.eo @@ -1,21 +1,10 @@ -class Efl.Ui.Widget.Part.Bg (Efl.Ui.Widget.Part, Efl.Ui.Bg) +class Efl.Ui.Widget.Part_Bg (Efl.Ui.Widget.Part, Efl.Ui.Bg) { [[Elementary widget internal part background class]] data: null; - methods { - @property bg @protected { - [[Background object]] - set { - } - get { - } - values { - bg: Efl.Canvas.Object; - } - } - } implements { Efl.File.file { get; set; } + //Efl.File.mmap { get; set; } Efl.Gfx.color { set; get; } Efl.Ui.Image.scale_type { get; set; } } diff --git a/src/lib/elementary/elm_part_helper.h b/src/lib/elementary/elm_part_helper.h index b74bd57..eef0d2f 100644 --- a/src/lib/elementary/elm_part_helper.h +++ b/src/lib/elementary/elm_part_helper.h @@ -1,6 +1,8 @@ #ifndef _ELM_PART_HELPER_H #define _ELM_PART_HELPER_H +#include "Elementary.h" +#include "elm_priv.h" #include "efl_ui_layout_part_legacy.eo.h" //#define ELM_PART_HOOK do { ERR("%s@%p:%s [%d]", efl_class_name_get(pd->obj), pd->obj, pd->part, (int) pd->temp); } while(0) @@ -63,15 +65,23 @@ _elm_part_alias_find(const Elm_Layout_Part_Alias_Description *aliases, const cha return EINA_FALSE; } +static inline Eo * +_elm_part_initialize(Eo *proxy, Eo *obj, const char *part) +{ + Elm_Part_Data *pd = efl_data_scope_get(proxy, EFL_UI_WIDGET_PART_CLASS); + + EINA_SAFETY_ON_FALSE_RETURN_VAL(pd && obj && part, NULL); + efl_allow_parent_unref_set(proxy, 1); + // efl_auto_unref_set(proxy, 1); + pd->part = eina_tmpstr_add(part); + pd->obj = obj; + + return proxy; +} + #define ELM_PART_IMPLEMENT(PART_CLASS, _obj, _part) ({ \ - EINA_SAFETY_ON_NULL_RETURN_VAL(_obj, NULL); \ - EINA_SAFETY_ON_NULL_RETURN_VAL(_part, NULL); \ - Eo *proxy = efl_add(PART_CLASS, (Eo *) _obj); \ - Elm_Part_Data *pd = efl_data_scope_get(proxy, EFL_UI_WIDGET_PART_CLASS); \ - EINA_SAFETY_ON_NULL_RETURN_VAL(pd, NULL); \ - pd->obj = (Eo *) _obj; \ - pd->part = eina_tmpstr_add(_part); \ - efl_allow_parent_unref_set(proxy, 1); \ + Eo *proxy = efl_add(PART_CLASS, (Eo *) _obj, \ + _elm_part_initialize(efl_added, (Eo *) _obj, _part)); \ efl_auto_unref_set(proxy, 1); \ proxy; }) diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index c4e6823..e629d7c 100644 --- a/src/lib/elementary/elm_widget.c +++ b/src/lib/elementary/elm_widget.c @@ -5550,41 +5550,33 @@ _efl_ui_widget_part_efl_object_destructor(Eo *obj, Elm_Part_Data *pd) /* Efl.Part end */ /* Efl.Part Bg implementation */ -EOLIAN static void -_efl_ui_widget_part_bg_bg_set(Eo *obj, void *_pd EINA_UNUSED, Efl_Canvas_Object *bg) -{ - Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); - Elm_Widget_Smart_Data *sd = efl_data_scope_get(pd->obj, MY_CLASS); - - if (sd->bg == bg) - return; - efl_del(sd->bg); - sd->bg = bg; - if (!sd->bg) - return; - - efl_canvas_group_member_add(pd->obj, sd->bg); - evas_object_stack_below(sd->bg, sd->resize_obj); - _smart_reconfigure(sd); -} - -EOLIAN static Efl_Canvas_Object * -_efl_ui_widget_part_bg_bg_get(Eo *obj, void *_pd EINA_UNUSED) +Efl_Canvas_Object * +_efl_ui_widget_bg_get(Elm_Widget *obj) { - Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); - Elm_Widget_Smart_Data *sd = efl_data_scope_get(pd->obj, MY_CLASS); + Elm_Widget_Smart_Data *sd = efl_data_scope_get(obj, MY_CLASS); Evas_Object *bg_obj = sd->bg; if (!bg_obj) { - bg_obj = efl_add(EFL_UI_BG_CLASS, pd->obj); - efl_ui_widget_part_bg_set(obj, bg_obj); + bg_obj = efl_add(EFL_UI_BG_CLASS, obj); + EINA_SAFETY_ON_NULL_RETURN_VAL(bg_obj, NULL); + sd->bg = bg_obj; + efl_canvas_group_member_add(obj, sd->bg); + evas_object_stack_below(sd->bg, sd->resize_obj); + _smart_reconfigure(sd); } return bg_obj; } +static inline Efl_Canvas_Object * +efl_ui_widget_part_bg_get(Eo *part_obj) +{ + Elm_Part_Data *pd = efl_data_scope_get(part_obj, EFL_UI_WIDGET_PART_CLASS); + return _efl_ui_widget_bg_get(pd->obj); +} + EOLIAN static Eina_Bool _efl_ui_widget_part_bg_efl_file_file_set(Eo *obj, void *pd EINA_UNUSED, const char *file, const char *key) { diff --git a/src/lib/elementary/elm_widget.h b/src/lib/elementary/elm_widget.h index b37fed5..abc9279 100644 --- a/src/lib/elementary/elm_widget.h +++ b/src/lib/elementary/elm_widget.h @@ -751,6 +751,8 @@ EAPI Eina_Bool _elm_widget_item_onscreen_is(Elm_Object_Item *item); const char* _elm_widget_accessible_plain_name_get(Evas_Object *obj, const char* name); const char* _elm_widget_item_accessible_plain_name_get(Elm_Object_Item *item, const char* name); +Efl_Canvas_Object * _efl_ui_widget_bg_get(Elm_Widget *obj); + #define ELM_WIDGET_DATA_GET_OR_RETURN(o, ptr, ...) \ Elm_Widget_Smart_Data *ptr; \ ptr = efl_data_scope_get(o, ELM_WIDGET_CLASS); \ -- 2.7.4