efl_ui_slider: refactor for better data flow and code readability

1. efl_ui_range_value_set only sets value
2. remove internal eo functions (such as xxx_knob, val_fetch, and val_set)
3. make access_value_and_text works correctly

@ref T7893

Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D9720
This commit is contained in:
WooHyun Jung 2019-08-26 11:27:18 +00:00 committed by Marcel Hollerbach
parent cfc0d4866c
commit 5636bb8b0b
4 changed files with 127 additions and 134 deletions

View File

@ -16,6 +16,36 @@ _slider_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev)
efl_ui_range_value_set(ev->object, 100);
}
static void
_slider_steady_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
double val;
val = efl_ui_range_value_get(ev->object);
printf("steady callbck : val = %f\n", val);
}
static void
_slider_drag_start_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
double val;
val = efl_ui_range_value_get(ev->object);
printf("drag start callbck : val = %f\n", val);
}
static void
_slider_drag_stop_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
double val;
val = efl_ui_range_value_get(ev->object);
printf("drag stop callbck : val = %f\n", val);
}
void
test_ui_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
@ -37,6 +67,9 @@ test_ui_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event
efl_add(EFL_UI_SLIDER_CLASS, bx,
efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(160, 0)),
efl_gfx_hint_weight_set(efl_added, EVAS_HINT_EXPAND, 0.0),
efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_STEADY, _slider_steady_cb, NULL),
efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, _slider_drag_start_cb, NULL),
efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, _slider_drag_stop_cb, NULL),
efl_pack(bx, efl_added));
efl_add(EFL_UI_TEXT_CLASS, bx,

View File

@ -52,19 +52,39 @@ static void
_emit_events(Eo *obj, Efl_Ui_Slider_Data *sd)
{
efl_event_callback_call(obj, EFL_UI_RANGE_EVENT_CHANGED, NULL);
if (sd->val == sd->val_min)
efl_event_callback_call(obj, EFL_UI_RANGE_EVENT_MIN_REACHED, NULL);
if (sd->val == sd->val_max)
efl_event_callback_call(obj, EFL_UI_RANGE_EVENT_MAX_REACHED, NULL);
// emit accessibility event also if value was changed by API
if (_elm_config->atspi_mode)
efl_access_value_changed_signal_emit(obj);
}
static void
_efl_ui_slider_val_fetch(Evas_Object *obj, Efl_Ui_Slider_Data *sd, Eina_Bool user_event)
_user_value_update(Evas_Object *obj, double value)
{
double posx = 0.0, posy = 0.0, pos = 0.0, val;
EFL_UI_SLIDER_DATA_GET(obj, sd);
efl_ui_range_value_set(obj, value);
ecore_timer_del(sd->delay);
sd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj);
evas_object_smart_changed(obj);
}
static void
_drag_value_fetch(Evas_Object *obj)
{
EFL_UI_SLIDER_DATA_GET(obj, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
double posx = 0.0, posy = 0.0, pos = 0.0, val;
efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable.slider"),
&posx, &posy);
if (_is_horizontal(sd->dir)) pos = posx;
@ -79,36 +99,19 @@ _efl_ui_slider_val_fetch(Evas_Object *obj, Efl_Ui_Slider_Data *sd, Eina_Bool us
if (fabs(val - sd->val) > DBL_EPSILON)
{
sd->val = val;
if (user_event)
{
_emit_events(obj, sd);
efl_event_callback_legacy_call(obj, EFL_UI_RANGE_EVENT_CHANGED, NULL);
ecore_timer_del(sd->delay);
sd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj);
}
_user_value_update(obj, val);
}
}
static void
_efl_ui_slider_val_set(Evas_Object *obj, Efl_Ui_Slider_Data *sd)
_drag_value_update(Evas_Object *obj)
{
EFL_UI_SLIDER_DATA_GET(obj, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
double pos;
if (sd->val_max > sd->val_min)
{
pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min);
}
else
{
pos = 0.0;
}
if (pos < 0.0) pos = 0.0;
else if (pos > 1.0)
pos = 1.0;
pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min);
if (efl_ui_mirrored_get(obj) ^ efl_ui_layout_orientation_is_inverted(sd->dir))
{
@ -118,35 +121,6 @@ _efl_ui_slider_val_set(Evas_Object *obj, Efl_Ui_Slider_Data *sd)
efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
pos, pos);
// emit accessibility event also if value was changed by API
if (_elm_config->atspi_mode)
efl_access_value_changed_signal_emit(obj);
evas_object_smart_changed(obj);
}
static void
_efl_ui_slider_down_knob(Evas_Object *obj, Efl_Ui_Slider_Data *sd EINA_UNUSED, double button_x, double button_y)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
button_x, button_y);
}
static void
_efl_ui_slider_move_knob(Evas_Object *obj, Efl_Ui_Slider_Data *sd EINA_UNUSED, double button_x, double button_y)
{
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
button_x, button_y);
}
static void
_slider_update(Evas_Object *obj, Eina_Bool user_event)
{
efl_ui_slider_val_fetch(obj, user_event);
evas_object_smart_changed(obj);
}
@ -156,7 +130,7 @@ _drag(void *data,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
{
_slider_update(data, EINA_TRUE);
_drag_value_fetch(data);
}
static void
@ -167,8 +141,8 @@ _drag_start(void *data,
{
if (!efl_ui_focus_object_focus_get(data))
elm_object_focus_set(data, EINA_TRUE);
_slider_update(data, EINA_TRUE);
efl_event_callback_call(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, NULL);
_drag_value_fetch(data);
elm_widget_scroll_freeze_push(data);
}
@ -178,7 +152,7 @@ _drag_stop(void *data,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
{
_slider_update(data, EINA_TRUE);
_drag_value_fetch(data);
efl_event_callback_call(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, NULL);
elm_widget_scroll_freeze_pop(data);
}
@ -189,51 +163,47 @@ _drag_step(void *data,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
{
_slider_update(data, EINA_TRUE);
_drag_value_fetch(data);
}
static void
_drag_up(void *data,
Evas_Object *obj EINA_UNUSED,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
_drag_up(Evas_Object *obj)
{
double step;
double relative_step;
EFL_UI_SLIDER_DATA_GET(data, sd);
EFL_UI_SLIDER_DATA_GET(obj, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
step = sd->step;
if (efl_ui_layout_orientation_is_inverted(sd->dir)) step *= -1.0;
ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
relative_step = step/(sd->val_max - sd->val_min);
efl_ui_drag_step_move(efl_part(wd->resize_obj, "efl.dragable.slider"),
relative_step, relative_step);
_slider_update(data, EINA_TRUE);
_drag_value_fetch(obj);
}
static void
_drag_down(void *data,
Evas_Object *obj EINA_UNUSED,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
_drag_down(Evas_Object *obj)
{
double step;
double relative_step;
EFL_UI_SLIDER_DATA_GET(data, sd);
EFL_UI_SLIDER_DATA_GET(obj, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
step = -sd->step;
if (efl_ui_layout_orientation_is_inverted(sd->dir)) step *= -1.0;
ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
relative_step = step/(sd->val_max - sd->val_min);
efl_ui_drag_step_move(efl_part(wd->resize_obj, "efl.dragable.slider"),
relative_step, relative_step);
_slider_update(data, EINA_TRUE);
_drag_value_fetch(obj);
}
static Eina_Bool
@ -250,32 +220,32 @@ _key_action_drag(Evas_Object *obj, const char *params)
if (!_is_horizontal(sd->dir))
return EINA_FALSE;
if (!efl_ui_layout_orientation_is_inverted(sd->dir))
_drag_down(obj, NULL, NULL, NULL);
else _drag_up(obj, NULL, NULL, NULL);
_drag_down(obj);
else _drag_up(obj);
}
else if (!strcmp(dir, "right"))
{
if (!_is_horizontal(sd->dir))
return EINA_FALSE;
if (!efl_ui_layout_orientation_is_inverted(sd->dir))
_drag_up(obj, NULL, NULL, NULL);
else _drag_down(obj, NULL, NULL, NULL);
_drag_up(obj);
else _drag_down(obj);
}
else if (!strcmp(dir, "up"))
{
if (_is_horizontal(sd->dir))
return EINA_FALSE;
if (efl_ui_layout_orientation_is_inverted(sd->dir))
_drag_up(obj, NULL, NULL, NULL);
else _drag_down(obj, NULL, NULL, NULL);
_drag_up(obj);
else _drag_down(obj);
}
else if (!strcmp(dir, "down"))
{
if (_is_horizontal(sd->dir))
return EINA_FALSE;
if (efl_ui_layout_orientation_is_inverted(sd->dir))
_drag_down(obj, NULL, NULL, NULL);
else _drag_up(obj, NULL, NULL, NULL);
_drag_down(obj);
else _drag_up(obj);
}
else return EINA_FALSE;
@ -306,22 +276,22 @@ _efl_ui_slider_efl_ui_widget_widget_input_event_handler(Eo *obj, Efl_Ui_Slider_D
if (efl_input_pointer_wheel_delta_get(ev) < 0)
{
if (_is_horizontal(sd->dir))
_drag_up(obj, NULL, NULL, NULL);
_drag_up(obj);
else
_drag_down(obj, NULL, NULL, NULL);
_drag_down(obj);
}
else
{
if (_is_horizontal(sd->dir))
_drag_down(obj, NULL, NULL, NULL);
_drag_down(obj);
else
_drag_up(obj, NULL, NULL, NULL);
_drag_up(obj);
}
efl_input_processed_set(ev, EINA_TRUE);
}
else return EINA_FALSE;
_slider_update(obj, EINA_TRUE);
_drag_value_fetch(obj);
return EINA_TRUE;
}
@ -336,18 +306,18 @@ _efl_ui_slider_efl_ui_widget_on_access_activate(Eo *obj, Efl_Ui_Slider_Data *sd,
(act == EFL_UI_ACTIVATE_RIGHT))
{
if (!efl_ui_layout_orientation_is_inverted(sd->dir))
_drag_up(obj, NULL, NULL, NULL);
else _drag_down(obj, NULL, NULL, NULL);
_drag_up(obj);
else _drag_down(obj);
}
else if ((act == EFL_UI_ACTIVATE_DOWN) ||
(act == EFL_UI_ACTIVATE_LEFT))
{
if (!efl_ui_layout_orientation_is_inverted(sd->dir))
_drag_down(obj, NULL, NULL, NULL);
else _drag_up(obj, NULL, NULL, NULL);
_drag_down(obj);
else _drag_up(obj);
}
_slider_update(obj, EINA_TRUE);
_drag_value_fetch(obj);
return EINA_TRUE;
}
@ -426,7 +396,7 @@ _efl_ui_slider_efl_ui_widget_theme_apply(Eo *obj, Efl_Ui_Slider_Data *sd)
else
efl_layout_signal_emit(obj, "efl,state,inverted,off", "efl");
efl_ui_slider_val_set(obj);
_drag_value_update(obj);
efl_layout_signal_process(wd->resize_obj, EINA_FALSE);
evas_object_smart_changed(obj);
@ -441,6 +411,7 @@ _spacer_down_cb(void *data,
void *event_info)
{
EFL_UI_SLIDER_DATA_GET(data, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
Evas_Event_Mouse_Down *ev = event_info;
Eina_Rect sr;
@ -463,12 +434,13 @@ _spacer_down_cb(void *data,
if (button_y < 0) button_y = 0;
}
efl_ui_slider_down_knob(data, button_x, button_y);
efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
button_x, button_y);
if (!efl_ui_focus_object_focus_get(data))
elm_object_focus_set(data, EINA_TRUE);
_slider_update(data, EINA_TRUE);
efl_event_callback_call(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, NULL);
_drag_value_fetch(data);
}
static void
@ -478,6 +450,7 @@ _spacer_move_cb(void *data,
void *event_info)
{
EFL_UI_SLIDER_DATA_GET(data, sd);
ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
Eina_Rect sr;
double button_x = 0.0, button_y = 0.0;
@ -504,7 +477,7 @@ _spacer_move_cb(void *data,
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
{
if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
_slider_update(data, EINA_TRUE);
_drag_value_fetch(data);
efl_event_callback_call
(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, NULL);
if (sd->frozen)
@ -527,8 +500,9 @@ _spacer_move_cb(void *data,
if (button_y < 0) button_y = 0;
}
efl_ui_slider_move_knob(data, button_x, button_y);
_slider_update(data, EINA_TRUE);
efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
button_x, button_y);
_drag_value_fetch(data);
}
}
@ -543,7 +517,7 @@ _spacer_up_cb(void *data,
if (!sd->spacer_down) return;
if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
_slider_update(data, EINA_TRUE);
_drag_value_fetch(data);
efl_event_callback_call(data, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, NULL);
if (sd->frozen)
@ -691,6 +665,8 @@ _efl_ui_slider_efl_ui_layout_orientable_orientation_get(const Eo *obj EINA_UNUSE
EOLIAN static void
_efl_ui_slider_efl_ui_range_display_range_limits_set(Eo *obj, Efl_Ui_Slider_Data *sd, double min, double max)
{
double val;
if (max < min)
{
ERR("Wrong params. min(%lf) is greater than max(%lf).", min, max);
@ -702,12 +678,15 @@ _efl_ui_slider_efl_ui_range_display_range_limits_set(Eo *obj, Efl_Ui_Slider_Data
return;
}
if ((EINA_DBL_EQ(sd->val_min, min)) && (EINA_DBL_EQ(sd->val_max, max))) return;
sd->val_min = min;
sd->val_max = max;
if (sd->val < sd->val_min) sd->val = sd->val_min;
if (sd->val > sd->val_max) sd->val = sd->val_max;
efl_ui_slider_val_set(obj);
val = sd->val;
if (val < sd->val_min) val = sd->val_min;
if (val > sd->val_max) val = sd->val_max;
efl_ui_range_value_set(obj, val);
}
EOLIAN static void
@ -734,11 +713,8 @@ _efl_ui_slider_efl_ui_range_display_range_value_set(Eo *obj, Efl_Ui_Slider_Data
if (EINA_DBL_EQ(val, sd->val)) return;
sd->val = val;
if (sd->val < sd->val_min) sd->val = sd->val_min;
if (sd->val > sd->val_max) sd->val = sd->val_max;
_drag_value_update(obj);
_emit_events(obj, sd);
efl_ui_slider_val_set(obj);
}
EOLIAN static double
@ -789,16 +765,16 @@ _efl_ui_slider_efl_access_value_value_and_text_get(const Eo *obj EINA_UNUSED, Ef
EOLIAN static Eina_Bool
_efl_ui_slider_efl_access_value_value_and_text_set(Eo *obj, Efl_Ui_Slider_Data *sd, double value, const char *text EINA_UNUSED)
{
double oldval = sd->val;
if (value < sd->val_min) value = sd->val_min;
if (value > sd->val_max) value = sd->val_max;
efl_event_callback_call(obj, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, NULL);
sd->val = value;
efl_ui_slider_val_set(obj);
sd->val = oldval;
_slider_update(obj, EINA_TRUE);
if (fabs(value - sd->val) > DBL_EPSILON)
{
_user_value_update(obj, value);
}
efl_event_callback_call(obj, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, NULL);
return EINA_TRUE;
@ -832,17 +808,5 @@ _efl_ui_slider_efl_access_widget_action_elm_actions_get(const Eo *obj EINA_UNUSE
}
// A11Y Accessibility - END
/* Internal EO APIs and hidden overrides */
EFL_VOID_FUNC_BODYV(efl_ui_slider_val_fetch, EFL_FUNC_CALL(user_event), Eina_Bool user_event)
EFL_VOID_FUNC_BODY(efl_ui_slider_val_set)
EFL_VOID_FUNC_BODYV(efl_ui_slider_down_knob, EFL_FUNC_CALL(button_x, button_y), double button_x, double button_y)
EFL_VOID_FUNC_BODYV(efl_ui_slider_move_knob, EFL_FUNC_CALL(button_x, button_y), double button_x, double button_y)
#define EFL_UI_SLIDER_EXTRA_OPS \
EFL_UI_SLIDER_VAL_FETCH_OPS(efl_ui_slider), \
EFL_UI_SLIDER_VAL_SET_OPS(efl_ui_slider), \
EFL_UI_SLIDER_DOWN_KNOB_OPS(efl_ui_slider), \
EFL_UI_SLIDER_MOVE_KNOB_OPS(efl_ui_slider), \
#include "efl_ui_slider.eo.c"

View File

@ -22,18 +22,6 @@ struct _Efl_Ui_Slider_Data
* @}
*/
# define EFL_UI_SLIDER_VAL_FETCH_OPS(_pfx) \
EFL_OBJECT_OP_FUNC(efl_ui_slider_val_fetch, _##_pfx##_val_fetch)
# define EFL_UI_SLIDER_VAL_SET_OPS(_pfx) \
EFL_OBJECT_OP_FUNC(efl_ui_slider_val_set, _##_pfx##_val_set)
# define EFL_UI_SLIDER_DOWN_KNOB_OPS(_pfx) \
EFL_OBJECT_OP_FUNC(efl_ui_slider_down_knob, _##_pfx##_down_knob)
# define EFL_UI_SLIDER_MOVE_KNOB_OPS(_pfx) \
EFL_OBJECT_OP_FUNC(efl_ui_slider_move_knob, _##_pfx##_move_knob)
#define EFL_UI_SLIDER_DATA_GET(o, sd) \
Efl_Ui_Slider_Data * sd = efl_data_scope_get(o, EFL_UI_SLIDER_CLASS)

View File

@ -13,8 +13,12 @@ slider_changed(void *data EINA_UNUSED, const Efl_Event *ev)
{
event_counter++;
if (event_counter == 1)
efl_event_callback_del(ev->object, EFL_UI_RANGE_EVENT_CHANGED, slider_changed, NULL);
efl_event_callback_del(ev->object, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, slider_changed, NULL);
else if (event_counter == 2)
efl_event_callback_del(ev->object, EFL_UI_RANGE_EVENT_CHANGED, slider_changed, NULL);
else if (event_counter == 3)
efl_event_callback_del(ev->object, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, slider_changed, NULL);
else if (event_counter == 4)
ecore_main_loop_quit();
}
@ -28,6 +32,8 @@ EFL_START_TEST(efl_ui_test_slider_events)
slider = efl_add(EFL_UI_SLIDER_CLASS, win,
efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_CHANGED, slider_changed, NULL),
efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_STEADY, slider_changed, NULL),
efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, slider_changed, NULL),
efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, slider_changed, NULL),
efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(400, 100))
);
@ -48,7 +54,7 @@ EFL_START_TEST(efl_ui_test_slider_events)
evas_event_feed_mouse_move(e, sx + (sw / 2), sy + (sh / 2), 0, NULL);
evas_event_feed_mouse_up(e, 1, 0, 0, NULL);
ecore_main_loop_begin();
ck_assert_int_eq(event_counter, 2);
ck_assert_int_eq(event_counter, 4);
}
EFL_END_TEST
@ -62,6 +68,8 @@ EFL_START_TEST(efl_ui_test_slider_step)
slider = efl_add(EFL_UI_SLIDER_CLASS, win,
efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_CHANGED, slider_changed, NULL),
efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_STEADY, slider_changed, NULL),
efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_START, slider_changed, NULL),
efl_event_callback_add(efl_added, EFL_UI_SLIDER_EVENT_SLIDER_DRAG_STOP, slider_changed, NULL),
efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(400, 100))
);
efl_ui_range_limits_set(slider, 0, 100);