fix the part flickering issue.

This problem comes out with a third scenario,
which is, if user uses a ctxpopup slider to change the attributions
of the more than first part state.

In this case, the edj will be reloaded if the attributions are changed.
But still the cursor would be inside of the state,
so the state preview will be switched to the default,
then it turns out a sort of a flickering issue.

@T2969
This commit is contained in:
Hermet Park 2016-01-01 23:39:11 +09:00
parent 175a4355bf
commit 9ddf6e49c3
3 changed files with 44 additions and 19 deletions

View File

@ -160,9 +160,9 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
int value_len = 0;
double value_convert = 0.0;
td->part_name = NULL;
td->group_name = NULL;
td->state_name = NULL;
td->part_name = NULL;
td->group_name = NULL;
td->state_name = NULL;
while (p && p <= end)
{
@ -381,8 +381,11 @@ static void
cur_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
{
cur_name_td *td = data;
td->cb(td->cb_data,td->state_name, td->state_value, td->part_name, td->group_name);
td->cb(td->cb_data, td->state_name, td->state_value, td->part_name, td->group_name);
td->pd->cntd = NULL;
eina_stringshare_del(td->state_name);
eina_stringshare_del(td->part_name);
eina_stringshare_del(td->group_name);
free(td);
}
@ -391,6 +394,9 @@ cur_name_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
{
cur_name_td *td = data;
if (td->pd) td->pd->cntd = NULL;
eina_stringshare_del(td->state_name);
eina_stringshare_del(td->part_name);
eina_stringshare_del(td->group_name);
free(td->utf8);
free(td);
}

View File

@ -39,6 +39,13 @@ struct viewer_s
/* view size configured by application */
Evas_Coord_Size view_config_size;
//Keep the part info which state has been changed
struct {
Eina_Stringshare *part;
Eina_Stringshare *desc;
double state;
} changed_part;
Eina_Bool edj_reload_need : 1;
};
@ -189,7 +196,8 @@ part_obj_geom_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj,
}
Evas_Coord x, y, w , h;
if (edje_edit_part_type_get(vd->layout, vd->part_name) == EDJE_PART_TYPE_SPACER)
if (edje_edit_part_type_get(vd->layout, vd->part_name) ==
EDJE_PART_TYPE_SPACER)
{
Evas_Object *scroller_edje = elm_layout_edje_get(vd->scroller);
// Clipper need, to clip the highlight object for the part SPACER,
@ -346,6 +354,10 @@ exe_del_event_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
view_obj_min_update(vd);
view_part_highlight_set(vd, vd->part_name);
dummy_obj_update(vd->layout);
if (vd->changed_part.part)
edje_edit_part_selected_state_set(vd->layout, vd->changed_part.part,
vd->changed_part.desc,
vd->changed_part.state);
view_obj_parts_callbacks_set(vd);
vd->edj_reload_need = EINA_FALSE;
@ -542,6 +554,8 @@ view_term(view_data *vd)
eina_stringshare_del(vd->group_name);
eina_stringshare_del(vd->part_name);
eina_stringshare_del(vd->changed_part.part);
eina_stringshare_del(vd->changed_part.desc);
if (vd->part_obj)
evas_object_event_callback_del(vd->part_obj, EVAS_CALLBACK_DEL,
@ -753,8 +767,23 @@ view_string_list_free(Eina_List *list)
}
void
view_part_state_set(view_data *vd, const char *part, const char *description, const double state)
view_part_state_set(view_data *vd, Eina_Stringshare *part,
Eina_Stringshare *desc, double state)
{
if (!vd) return;
edje_edit_part_selected_state_set(vd->layout, part, description, state);
if (!part && !vd->changed_part.part) return;
//reset previous part?
if (part != vd->changed_part.part)
{
view_part_state_set(vd, vd->changed_part.part, "default", 0.0);
eina_stringshare_del(vd->changed_part.part);
eina_stringshare_del(vd->changed_part.desc);
}
edje_edit_part_selected_state_set(vd->layout, part, desc, state);
vd->changed_part.part = eina_stringshare_add(part);
vd->changed_part.desc = eina_stringshare_add(desc);
vd->changed_part.state = state;
}

View File

@ -84,7 +84,6 @@ edit_view_sync_cb(void *data, Eina_Stringshare *state_name, double state_value,
Eina_Stringshare *part_name, Eina_Stringshare *group_name)
{
Enventor_Object_Data *pd = data;
static Eina_Stringshare *prev_part_name = NULL;
edj_mgr_all_views_reload();
@ -107,23 +106,14 @@ edit_view_sync_cb(void *data, Eina_Stringshare *state_name, double state_value,
else
view_part_highlight_set(VIEW_DATA, NULL);
//reset previous part's state
if (!state_name)
{
view_part_state_set(VIEW_DATA, prev_part_name, "default", 0.0);
eina_stringshare_del(prev_part_name);
prev_part_name = NULL;
view_part_state_set(VIEW_DATA, NULL, NULL, 0);
return;
}
if ((part_name) && (part_name != prev_part_name))
{
view_part_state_set(VIEW_DATA, prev_part_name, "default", 0.0);
eina_stringshare_del(prev_part_name);
prev_part_name = NULL;
}
view_part_state_set(VIEW_DATA, part_name, state_name, state_value);
prev_part_name = part_name;
}
static void