efl_ui_widget: add new internal EAPI for new group name

theme_klass: set/get klass name used for resize_obj
theme_element: set/get group name used for resize_obj
theme_style: set/get style name used for resize_obj
element_update: automatically sets and apply theme for
             sub object of widget.
This commit is contained in:
Sungtaek Hong 2017-11-14 18:42:48 +09:00
parent bdcd034af5
commit cff9b1b11a
12 changed files with 177 additions and 43 deletions

View File

@ -362,8 +362,10 @@ _efl_ui_layout_theme_internal(Eo *obj, Efl_Ui_Layout_Data *sd)
if (!sd->file_set)
{
ret = elm_widget_theme_object_set
(obj, wd->resize_obj, sd->klass, sd->group,
elm_widget_style_get(obj));
(obj, wd->resize_obj,
elm_widget_theme_klass_get(obj),
elm_widget_theme_element_get(obj),
elm_widget_theme_style_get(obj));
}
if (ret)
@ -682,9 +684,6 @@ _efl_ui_layout_efl_canvas_group_group_del(Eo *obj, Efl_Ui_Layout_Data *sd)
eina_hash_free(sd->factories);
sd->factories = NULL;
eina_stringshare_del(sd->klass);
eina_stringshare_del(sd->group);
/* let's make our Edje object the *last* to be processed, since it
* may (smart) parent other sub objects here */
EINA_LIST_FOREACH(wd->subobjs, l, child)
@ -799,6 +798,7 @@ _efl_ui_layout_efl_file_mmap_get(Eo *obj, Efl_Ui_Layout_Data *sd EINA_UNUSED, co
EOLIAN static Efl_Ui_Theme_Apply
_efl_ui_layout_theme_set(Eo *obj, Efl_Ui_Layout_Data *sd, const char *klass, const char *group, const char *style)
{
Eina_Bool changed = EINA_FALSE;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
if (!wd->legacy && efl_finalized_get(obj))
@ -808,11 +808,14 @@ _efl_ui_layout_theme_set(Eo *obj, Efl_Ui_Layout_Data *sd, const char *klass, con
}
if (sd->file_set) sd->file_set = EINA_FALSE;
eina_stringshare_replace(&(sd->klass), klass);
eina_stringshare_replace(&(sd->group), group);
eina_stringshare_replace(&(wd->style), style);
return _efl_ui_layout_theme_internal(obj, sd);
changed |= elm_widget_theme_klass_set(obj, klass);
changed |= elm_widget_theme_element_set(obj, group);
changed |= elm_widget_theme_style_set(obj, style);
if (changed)
return efl_ui_widget_theme_apply(obj);
return EFL_UI_THEME_APPLY_SUCCESS;
}
EOLIAN static void
@ -2376,7 +2379,7 @@ elm_layout_theme_set(Evas_Object *obj, const char *klass, const char *group, con
/* Efl.Part implementation */
EOLIAN static Eo *
_efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char *part)
_efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd EINA_UNUSED, const char *part)
{
Efl_Canvas_Layout_Part_Type type;
@ -2397,7 +2400,7 @@ _efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char *
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'",
sd->group);
elm_widget_theme_element_get(obj));
}
return efl_part(efl_super(obj, MY_CLASS), part);
}
@ -2407,7 +2410,7 @@ _efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char *
if (type >= EFL_CANVAS_LAYOUT_PART_TYPE_LAST)
{
ERR("Invalid type found for part '%s' in group '%s'", part, sd->group);
ERR("Invalid type found for part '%s' in group '%s'", part, elm_widget_theme_element_get(obj));
return NULL;
}
@ -2422,7 +2425,7 @@ _efl_ui_layout_efl_part_part(const Eo *obj, Efl_Ui_Layout_Data *sd, const char *
case EFL_CANVAS_LAYOUT_PART_TYPE_SWALLOW:
return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_CONTENT_CLASS, obj, part);
case EFL_CANVAS_LAYOUT_PART_TYPE_NONE:
WRN("No such part '%s' in group '%s'", part, sd->group);
WRN("No such part '%s' in group '%s'", part, elm_widget_theme_element_get(obj));
return NULL;
default:
return ELM_PART_IMPLEMENT(EFL_UI_LAYOUT_PART_CLASS, obj, part);

View File

@ -60,12 +60,11 @@ _efl_ui_panes_elm_widget_theme_apply(Eo *obj, Efl_Ui_Panes_Data *sd)
Evas_Coord minw = 0, minh = 0;
Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED;
EFL_UI_LAYOUT_DATA_GET(obj, ld);
if (sd->dir == EFL_UI_DIR_HORIZONTAL)
eina_stringshare_replace(&ld->group, "horizontal");
elm_widget_theme_element_set(obj, "horizontal");
else
eina_stringshare_replace(&ld->group, "vertical");
elm_widget_theme_element_set(obj, "vertical");
evas_object_hide(sd->event);
elm_coords_finger_size_adjust(1, &minw, 1, &minh);

View File

@ -202,12 +202,11 @@ EOLIAN static Efl_Ui_Theme_Apply
_efl_ui_progressbar_elm_widget_theme_apply(Eo *obj, Efl_Ui_Progressbar_Data *sd)
{
Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED;
EFL_UI_LAYOUT_DATA_GET(obj, ld);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_FAILED);
if (_is_horizontal(sd->dir))
eina_stringshare_replace(&ld->group, "horizontal");
else eina_stringshare_replace(&ld->group, "vertical");
elm_widget_theme_element_set(obj, "horizontal");
else elm_widget_theme_element_set(obj, "vertical");
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
if (!int_ret) return EFL_UI_THEME_APPLY_FAILED;

View File

@ -699,15 +699,14 @@ EOLIAN static Efl_Ui_Theme_Apply
_efl_ui_slider_elm_widget_theme_apply(Eo *obj, Efl_Ui_Slider_Data *sd)
{
Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED;
EFL_UI_LAYOUT_DATA_GET(obj, ld);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_FAILED);
if (_is_horizontal(sd->dir))
{
if (!sd->intvl_enable)
eina_stringshare_replace(&ld->group, "horizontal");
elm_widget_theme_element_set(obj, "horizontal");
else
eina_stringshare_replace(&ld->group, "range/horizontal");
elm_widget_theme_element_set(obj, "range/horizontal");
if (sd->popup)
_elm_theme_set(elm_widget_theme_get(obj), sd->popup,
"slider", "horizontal/popup",
@ -720,9 +719,9 @@ _efl_ui_slider_elm_widget_theme_apply(Eo *obj, Efl_Ui_Slider_Data *sd)
else
{
if (!sd->intvl_enable)
eina_stringshare_replace(&ld->group, "vertical");
elm_widget_theme_element_set(obj, "vertical");
else
eina_stringshare_replace(&ld->group, "range/vertical");
elm_widget_theme_element_set(obj, "range/vertical");
if (sd->popup)
_elm_theme_set(elm_widget_theme_get(obj), sd->popup,

View File

@ -81,12 +81,12 @@ _elm_hoversel_elm_widget_theme_apply(Eo *obj, Elm_Hoversel_Data *sd)
snprintf(buf, sizeof(buf), "hoversel_vertical/%s", style);
/* hoversel's style has an extra bit: orientation */
eina_stringshare_replace(&(wd->style), buf);
elm_widget_theme_style_set(obj, buf);
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
if (!int_ret) return EFL_UI_THEME_APPLY_FAILED;
eina_stringshare_replace(&(wd->style), style);
elm_widget_theme_style_set(obj, style);
if (sd->hover)
efl_ui_mirrored_set(sd->hover, efl_ui_mirrored_get(obj));

View File

@ -205,15 +205,12 @@ EOLIAN static void
_elm_bubble_pos_set(Eo *obj, Elm_Bubble_Data *sd, Elm_Bubble_Pos pos)
{
/* FIXME: Why is this dealing with layout data directly? */
EFL_UI_LAYOUT_DATA_GET(obj, ld);
if (pos < ELM_BUBBLE_POS_TOP_LEFT || pos > ELM_BUBBLE_POS_BOTTOM_RIGHT)
return;
sd->pos = pos;
eina_stringshare_replace
(&ld->group, corner_string[sd->pos]);
elm_widget_theme_element_set(obj, corner_string[sd->pos]);
efl_ui_widget_theme_apply(obj);
}

View File

@ -441,15 +441,14 @@ _elm_index_elm_widget_theme_apply(Eo *obj, Elm_Index_Data *sd)
Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
EFL_UI_LAYOUT_DATA_GET(obj, ld);
_index_box_clear(obj, 0);
_index_box_clear(obj, 1);
if (efl_ui_dir_is_horizontal(sd->dir, EINA_FALSE))
eina_stringshare_replace(&ld->group, "base/horizontal");
elm_widget_theme_element_set(obj, "base/horizontal");
else
eina_stringshare_replace(&ld->group, "base/vertical");
elm_widget_theme_element_set(obj, "base/vertical");
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
if (!int_ret) return EFL_UI_THEME_APPLY_FAILED;

View File

@ -895,14 +895,12 @@ _elm_scroller_efl_object_constructor(Eo *obj, Elm_Scroller_Data *_pd EINA_UNUSED
EOLIAN static void
_elm_scroller_custom_widget_base_theme_set(Eo *obj, Elm_Scroller_Data *_pd EINA_UNUSED, const char *klass, const char *group)
{
EFL_UI_LAYOUT_DATA_GET(obj, ld);
EINA_SAFETY_ON_NULL_RETURN(klass);
EINA_SAFETY_ON_NULL_RETURN(group);
if (eina_stringshare_replace(&(ld->klass), klass) ||
eina_stringshare_replace(&(ld->group), group))
efl_ui_widget_theme_apply(obj);
if (elm_widget_theme_klass_set(obj, klass) ||
elm_widget_theme_element_set(obj, group))
efl_ui_widget_theme_apply(obj);
}
EAPI void

View File

@ -20,12 +20,11 @@ EOLIAN static Efl_Ui_Theme_Apply
_elm_separator_elm_widget_theme_apply(Eo *obj, Elm_Separator_Data *sd EINA_UNUSED)
{
Efl_Ui_Theme_Apply int_ret = EFL_UI_THEME_APPLY_FAILED;
EFL_UI_LAYOUT_DATA_GET(obj, ld);
if (sd->horizontal)
eina_stringshare_replace(&ld->group, "horizontal");
elm_widget_theme_element_set(obj, "horizontal");
else
eina_stringshare_replace(&ld->group, "vertical");
elm_widget_theme_element_set(obj, "vertical");
int_ret = efl_ui_widget_theme_apply(efl_super(obj, MY_CLASS));
if (!int_ret) return EFL_UI_THEME_APPLY_FAILED;

View File

@ -767,6 +767,8 @@ _elm_widget_efl_canvas_group_group_del(Eo *obj, Elm_Widget_Smart_Data *sd)
EINA_LIST_FREE(sd->event_cb, ecb)
free(ecb);
eina_stringshare_del(sd->klass);
eina_stringshare_del(sd->group);
eina_stringshare_del(sd->style);
if (sd->theme) elm_theme_free(sd->theme);
eina_stringshare_del(sd->access_info);
@ -3569,6 +3571,137 @@ _elm_widget_focus_move_policy_automatic_set(Eo *obj, Elm_Widget_Smart_Data *sd,
}
}
/**
* @internal
*
* Sets the klass name of a widget.
* @param obj The widget.
* @param name Name of the klass to use.
* @return Whether the name was different and thus replaced.
*/
EAPI Eina_Bool
elm_widget_theme_klass_set(Evas_Object *obj, const char *name)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, pd, EINA_FALSE);
return eina_stringshare_replace(&(pd->klass), name);
}
/**
* @internal
*
* Gets the klass name of a widget.
* @param obj The widget.
* @return The current klass name of internal canvas object.
*/
EAPI const char *
elm_widget_theme_klass_get(const Evas_Object *obj)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, pd, NULL);
return (const char *)pd->klass;
}
/**
* @internal
*
* Sets the element name of a widget.
*
* @param obj The widget.
* @param name Name of the element to use.
* @return Whether the name was different and thus replaced.
*/
EAPI Eina_Bool
elm_widget_theme_element_set(Evas_Object *obj, const char *name)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, pd, EINA_FALSE);
return eina_stringshare_replace(&(pd->group), name);
}
/**
* @internal
*
* Gets the element name of a widget.
* @param obj The widget.
* @return The current element name of internal canvas object.
*/
EAPI const char *
elm_widget_theme_element_get(const Evas_Object *obj)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, pd, NULL);
return (const char *)pd->group;
}
/**
* @internal
*
* Sets the style name of a widget.
*
* @param obj The widget.
* @param name Name of the style to use.
* @return Whether the name was different and thus replaced.
*/
EAPI Eina_Bool
elm_widget_theme_style_set(Evas_Object *obj, const char *name)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, pd, EINA_FALSE);
return eina_stringshare_replace(&(pd->style), name);
}
/**
* @internal
*
* Gets the style name of a widget.
* @param obj The widget.
* @return The current style name of internal canvas object.
*/
EAPI const char *
elm_widget_theme_style_get(const Evas_Object *obj)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, pd, NULL);
return (const char *)pd->style;
}
/**
* @internal
*
* Register sub object as a group of a widget and re-apply its theme.
* @param obj The widget.
* @param component A sub object to be added as an element of the widget.
* @param name An element name of sub object.
* @return Whether the style was successfully applied or not.
*/
EAPI Efl_Ui_Theme_Apply
elm_widget_element_update(Evas_Object *obj, Evas_Object *component, const char *name)
{
Efl_Ui_Theme_Apply ret = EFL_UI_THEME_APPLY_SUCCESS;
Eina_Bool changed = EINA_FALSE;
const char *obj_group;
Eina_Stringshare *group;
obj_group = elm_widget_theme_element_get(obj);
if (!obj_group)
group = eina_stringshare_add(name);
else
group = eina_stringshare_printf("%s/%s", elm_widget_theme_element_get(obj), name);
if (efl_isa(component, ELM_WIDGET_CLASS))
{
changed |= elm_widget_theme_klass_set(component, elm_widget_theme_klass_get(obj));
changed |= elm_widget_theme_element_set(component, (const char *)group);
changed |= elm_widget_theme_style_set(component, elm_widget_theme_style_get(obj));
if (changed)
ret = efl_ui_widget_theme_apply(component);
}
else
{
ret = efl_ui_widget_theme_object_set(obj, component,
elm_widget_theme_klass_get(obj),
(const char *)group,
elm_widget_theme_style_get(obj));
}
eina_stringshare_del(group);
return ret;
}
static void
_track_obj_del(void *data, Evas *e, Evas_Object *obj, void *event_info);

View File

@ -407,6 +407,8 @@ typedef struct _Elm_Widget_Smart_Data
double scale;
Elm_Theme *theme;
const char *klass; /**< 1st identifier of an edje object group which is used in theme_set. klass and group are used together. */
const char *group; /**< 2nd identifier of an edje object group which is used in theme_set. klass and group are used together. */
const char *style;
const char *access_info;
const char *accessible_name;
@ -742,6 +744,14 @@ EAPI Elm_Focus_Region_Show_Mode elm_widget_focus_region_show_mode_get(const Evas
const char *elm_widget_part_translatable_text_get(const Eo *obj, const char *part, const char **domain);
void elm_widget_part_translatable_text_set(Eo *obj, const char *part, const char *label, const char *domain);
EAPI Eina_Bool elm_widget_theme_klass_set(Evas_Object *obj, const char *name);
EAPI const char *elm_widget_theme_klass_get(const Evas_Object *obj);
EAPI Eina_Bool elm_widget_theme_element_set(Evas_Object *obj, const char *name);
EAPI const char *elm_widget_theme_element_get(const Evas_Object *obj);
EAPI Eina_Bool elm_widget_theme_style_set(Evas_Object *obj, const char *name);
EAPI const char *elm_widget_theme_style_get(const Evas_Object *obj);
EAPI Efl_Ui_Theme_Apply elm_widget_element_update(Evas_Object *obj, Evas_Object *component, const char *name);
/* debug function. don't use it unless you are tracking parenting issues */
EAPI void elm_widget_tree_dump(const Evas_Object *top);
EAPI void elm_widget_tree_dot_dump(const Evas_Object *top, FILE *output);

View File

@ -56,8 +56,6 @@ typedef struct _Elm_Layout_Smart_Data
Eina_List *prop_connect; /**< The hash of properties connected to layout parts. */
Eina_Hash *factories; /**< The hash with parts connected to factories. */
Efl_Model *model; /**< The model */
const char *klass; /**< 1st identifier of an edje object group which is used in theme_set. klass and group are used together. */
const char *group; /**< 2nd identifier of an edje object group which is used in theme_set. klass and group are used together. */
int frozen; /**< Layout freeze counter */
Eina_Bool needs_size_calc : 1; /**< This flas is set true when the layout sizing eval is already requested. This defers sizing evaluation until smart calculation to avoid unnecessary calculation. */