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.
This commit is contained in:
Jean-Philippe Andre 2017-11-24 15:17:05 +09:00
parent 3c47a4f9f9
commit 8608e8dc70
7 changed files with 78 additions and 122 deletions

View File

@ -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)

View File

@ -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.Ui.Layout.Part_Bg (common) */
EOLIAN static Efl_Object *
_efl_ui_layout_part_bg_efl_object_finalize(Eo *obj, void *_pd EINA_UNUSED)
{
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);
Efl_Ui_Layout_Data *sd;
Elm_Part_Data *pd;
Eo *bg;
// 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);
obj = efl_finalize(efl_super(obj, EFL_UI_LAYOUT_PART_BG_CLASS));
if (!obj) return NULL;
if (wd->bg == bg)
return;
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?
}
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_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)
{
Evas_Object *bg_obj = efl_ui_widget_part_bg_get(obj);
efl_ui_image_scale_type_set(bg_obj, scale_type);
}
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);
return efl_ui_image_scale_type_get(bg_obj);
return obj;
}
/* Efl.Ui.Layout.Part_Xxx includes */

View File

@ -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;
}
}

View File

@ -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; }
}

View File

@ -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; })

View File

@ -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)
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);
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)
{
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)
{

View File

@ -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); \