efl_ui/progressbar: check for part existence before using parts

Summary:
some progressbar styles do not have certain parts, so it's necessary to
check part existence on theme load to avoid triggering unnecessary
errors

@fix

Depends on D8981

Reviewers: cedric

Reviewed By: cedric

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D8982
This commit is contained in:
Mike Blumenkrantz 2019-05-29 09:28:47 -04:00
parent af2613a3dc
commit f8ce1c0578
2 changed files with 48 additions and 23 deletions

View File

@ -44,13 +44,14 @@ static const Elm_Layout_Part_Alias_Description _content_aliases[] =
}; };
static Efl_Ui_Progress_Status * static Efl_Ui_Progress_Status *
_progress_status_new(const char *part_name, double val) _progress_status_new(const char *part_name, double val, Eina_Bool exists)
{ {
Efl_Ui_Progress_Status *ps; Efl_Ui_Progress_Status *ps;
ps = calloc(1, sizeof(Efl_Ui_Progress_Status)); ps = calloc(1, sizeof(Efl_Ui_Progress_Status));
if (!ps) return NULL; if (!ps) return NULL;
ps->part_name = eina_stringshare_add(part_name); ps->part_name = eina_stringshare_add(part_name);
ps->val = val; ps->val = val;
ps->part_exists = exists;
return ps; return ps;
} }
@ -114,14 +115,16 @@ _units_set(Evas_Object *obj)
eina_strbuf_reset(sd->format_strbuf); eina_strbuf_reset(sd->format_strbuf);
sd->format_cb(sd->format_cb_data, sd->format_strbuf, val); sd->format_cb(sd->format_cb_data, sd->format_strbuf, val);
eina_value_flush(&val);
if (!sd->has_status_text_part) return;
if (elm_widget_is_legacy(obj)) if (elm_widget_is_legacy(obj))
elm_layout_text_set(obj, "elm.text.status", eina_strbuf_string_get(sd->format_strbuf)); elm_layout_text_set(obj, "elm.text.status", eina_strbuf_string_get(sd->format_strbuf));
else else
elm_layout_text_set(obj, "efl.text.status", eina_strbuf_string_get(sd->format_strbuf)); elm_layout_text_set(obj, "efl.text.status", eina_strbuf_string_get(sd->format_strbuf));
eina_value_flush(&val);
} }
else else if (sd->has_status_text_part)
{ {
if (elm_widget_is_legacy(obj)) if (elm_widget_is_legacy(obj))
elm_layout_text_set(obj, "elm.text.status", NULL); elm_layout_text_set(obj, "elm.text.status", NULL);
@ -150,6 +153,7 @@ _val_set(Evas_Object *obj)
WRN("progressbar min and max are equal."); WRN("progressbar min and max are equal.");
continue; continue;
} }
if (!ps->part_exists) continue;
pos = (ps->val - ps->val_min)/(ps->val_max - ps->val_min); pos = (ps->val - ps->val_min)/(ps->val_max - ps->val_min);
if ((!rtl && _is_inverted(sd->dir)) || if ((!rtl && _is_inverted(sd->dir)) ||
@ -238,6 +242,16 @@ _efl_ui_progressbar_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Progressbar_Data *
Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC; Eina_Error int_ret = EFL_UI_THEME_APPLY_ERROR_GENERIC;
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_ERROR_GENERIC); ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_UI_THEME_APPLY_ERROR_GENERIC);
char *group; char *group;
const char *statuspart[] =
{
"efl.text.status",
"elm.text.status",
};
const char *curprogresspart[] =
{
"efl.cur.progressbar",
"elm.cur.progressbar",
};
group = _efl_ui_progressbar_theme_group_get(obj, sd); group = _efl_ui_progressbar_theme_group_get(obj, sd);
if (group) if (group)
@ -275,6 +289,8 @@ _efl_ui_progressbar_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Progressbar_Data *
if (sd->format_cb && (!sd->pulse)) if (sd->format_cb && (!sd->pulse))
elm_layout_signal_emit(obj, "efl,state,units,visible", "efl"); elm_layout_signal_emit(obj, "efl,state,units,visible", "efl");
} }
sd->has_status_text_part = edje_object_part_exists(obj, statuspart[elm_widget_is_legacy(obj)]);
sd->has_cur_progressbar_part = edje_object_part_exists(obj, curprogresspart[elm_widget_is_legacy(obj)]);
if (_is_horizontal(sd->dir)) if (_is_horizontal(sd->dir))
evas_object_size_hint_min_set evas_object_size_hint_min_set
@ -300,6 +316,13 @@ _efl_ui_progressbar_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Progressbar_Data *
elm_layout_signal_emit(obj, "efl,state,inverted,off", "efl"); elm_layout_signal_emit(obj, "efl,state,inverted,off", "efl");
} }
{
Efl_Ui_Progress_Status *ps;
const Eina_List *l;
EINA_LIST_FOREACH(sd->progress_status, l, ps)
ps->part_exists = edje_object_part_exists(obj, ps->part_name);
}
_units_set(obj); _units_set(obj);
_val_set(obj); _val_set(obj);
@ -328,11 +351,10 @@ _access_state_cb(void *data EINA_UNUSED, Evas_Object *obj)
Eina_Strbuf *buf; Eina_Strbuf *buf;
buf = eina_strbuf_new(); buf = eina_strbuf_new();
const char *txt; const char *txt = NULL;
if (elm_widget_is_legacy(obj)) EFL_UI_PROGRESSBAR_DATA_GET(obj, sd);
txt = elm_layout_text_get(obj, "elm.text.status"); if (sd->format_strbuf)
else txt = eina_strbuf_string_get(sd->format_strbuf);
txt = elm_layout_text_get(obj, "efl.text.status");
if (txt) eina_strbuf_append(buf, txt); if (txt) eina_strbuf_append(buf, txt);
@ -528,7 +550,7 @@ _progress_part_min_max_set(Eo *obj, Efl_Ui_Progressbar_Data *sd, const char *par
} }
if (!existing_ps) if (!existing_ps)
{ {
ps = _progress_status_new(part_name, min); ps = _progress_status_new(part_name, min, edje_object_part_exists(obj, part_name));
ps->val_min = min; ps->val_min = min;
ps->val_max = max; ps->val_max = max;
sd->progress_status = eina_list_append(sd->progress_status, ps); sd->progress_status = eina_list_append(sd->progress_status, ps);
@ -543,22 +565,21 @@ _progressbar_part_value_set(Eo *obj, Efl_Ui_Progressbar_Data *sd, const char *pa
Eina_Bool existing_ps = EINA_FALSE; Eina_Bool existing_ps = EINA_FALSE;
Eina_List *l; Eina_List *l;
double min = 0.0, max = 0.0; double min = 0.0, max = 0.0;
const char *curprogresspart[] =
{
"efl.cur.progressbar",
"elm.cur.progressbar",
};
Eina_Bool is_cur_progressbar = !strcmp(part_name, curprogresspart[elm_widget_is_legacy(obj)]);
efl_ui_range_min_max_get(efl_part(obj, part_name), &min, &max); if ((!is_cur_progressbar) || sd->has_cur_progressbar_part)
efl_ui_range_min_max_get(efl_part(obj, part_name), &min, &max);
if (val < min) val = min; if (val < min) val = min;
if (val > max) val = max; if (val > max) val = max;
if (elm_widget_is_legacy(obj)) if (is_cur_progressbar)
{ sd->val = val;
if (!strcmp(part_name, "elm.cur.progressbar"))
sd->val = val;
}
else
{
if (!strcmp(part_name, "efl.cur.progressbar"))
sd->val = val;
}
EINA_LIST_FOREACH(sd->progress_status, l, ps) EINA_LIST_FOREACH(sd->progress_status, l, ps)
{ {
@ -571,7 +592,7 @@ _progressbar_part_value_set(Eo *obj, Efl_Ui_Progressbar_Data *sd, const char *pa
if (!existing_ps) if (!existing_ps)
{ {
ps = _progress_status_new(part_name, val); ps = _progress_status_new(part_name, val, edje_object_part_exists(obj, part_name));
ps->val_min = 0.0; ps->val_min = 0.0;
ps->val_max = 1.0; ps->val_max = 1.0;
ps->val = val; ps->val = val;
@ -612,8 +633,9 @@ _efl_ui_progressbar_efl_ui_range_display_range_value_set(Eo *obj, Efl_Ui_Progres
} }
EOLIAN static double EOLIAN static double
_efl_ui_progressbar_efl_ui_range_display_range_value_get(const Eo *obj, Efl_Ui_Progressbar_Data *sd EINA_UNUSED) _efl_ui_progressbar_efl_ui_range_display_range_value_get(const Eo *obj, Efl_Ui_Progressbar_Data *sd)
{ {
if (!sd->has_cur_progressbar_part) return 0.0;
if (elm_widget_is_legacy(obj)) if (elm_widget_is_legacy(obj))
return efl_ui_range_value_get(efl_part(obj, "elm.cur.progressbar")); return efl_ui_range_value_get(efl_part(obj, "elm.cur.progressbar"));
else else

View File

@ -49,6 +49,8 @@ struct _Efl_Ui_Progressbar_Data
Eina_Bool pulse_state : 1; /**< To start the pulsing animation, otherwise to stop it */ Eina_Bool pulse_state : 1; /**< To start the pulsing animation, otherwise to stop it */
Eina_Bool is_legacy_format_string : 1; Eina_Bool is_legacy_format_string : 1;
Eina_Bool is_legacy_format_cb : 1; Eina_Bool is_legacy_format_cb : 1;
Eina_Bool has_status_text_part : 1;
Eina_Bool has_cur_progressbar_part : 1;
}; };
struct _Efl_Ui_Progress_Status struct _Efl_Ui_Progress_Status
@ -56,6 +58,7 @@ struct _Efl_Ui_Progress_Status
const char *part_name; const char *part_name;
double val; double val;
double val_min, val_max; double val_min, val_max;
Eina_Bool part_exists : 1;
}; };
/** /**