summaryrefslogtreecommitdiff
path: root/src/lib/elementary/efl_ui_slider_interval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/elementary/efl_ui_slider_interval.c')
-rw-r--r--src/lib/elementary/efl_ui_slider_interval.c292
1 files changed, 239 insertions, 53 deletions
diff --git a/src/lib/elementary/efl_ui_slider_interval.c b/src/lib/elementary/efl_ui_slider_interval.c
index 17b86c2409..74131e5834 100644
--- a/src/lib/elementary/efl_ui_slider_interval.c
+++ b/src/lib/elementary/efl_ui_slider_interval.c
@@ -2,46 +2,113 @@
# include "elementary_config.h"
#endif
-#define EFL_ACCESS_PROTECTED
+#define EFL_ACCESS_OBJECT_PROTECTED
#define EFL_ACCESS_WIDGET_ACTION_PROTECTED
-#define ELM_INTERFACE_ATSPI_VALUE_PROTECTED
#include <Elementary.h>
#include "elm_priv.h"
#include "efl_ui_slider_private.h"
+#include "efl_ui_slider_interval_private.h"
#define MY_CLASS EFL_UI_SLIDER_INTERVAL_CLASS
+#define MY_CLASS_PFX efl_ui_slider_interval
#define MY_CLASS_NAME "Efl.Ui.Slider_Interval"
-EOLIAN static void
-_efl_ui_slider_interval_interval_value_get(Eo *obj, void *sd EINA_UNUSED, double *from, double *to)
+#define SLIDER_DELAY_CHANGED_INTERVAL 1.2
+
+static Eina_Bool
+_delay_change(void *data)
{
- Efl_Ui_Slider_Data *pd = efl_data_scope_get(obj, EFL_UI_SLIDER_CLASS);
- if (from) *from = fmin(pd->intvl_from, pd->intvl_to);
- if (to) *to = fmax(pd->intvl_from, pd->intvl_to);
+ EFL_UI_SLIDER_INTERVAL_DATA_GET(data, pd);
+
+ pd->delay = NULL;
+ efl_event_callback_call(data, EFL_UI_SLIDER_EVENT_DELAY_CHANGED, NULL);
+
+ if (_elm_config->atspi_mode)
+ efl_access_value_changed_signal_emit(data);
+
+ return ECORE_CALLBACK_CANCEL;
}
-static inline Eina_Bool
-_is_inverted(Efl_Ui_Dir dir)
+void
+_efl_ui_slider_interval_val_fetch(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd, Eina_Bool user_event)
{
- if ((dir == EFL_UI_DIR_LEFT) || (dir == EFL_UI_DIR_UP))
- return EINA_TRUE;
+ double posx = 0.0, posy = 0.0, pos = 0.0, val;
+ double posx2 = 0.0, posy2 = 0.0, pos2 = 0.0, val2;
+
+ EFL_UI_SLIDER_DATA_GET(obj, sd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"),
+ &posx, &posy);
+ else
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable.slider"),
+ &posx, &posy);
+ if (efl_ui_dir_is_horizontal(sd->dir, EINA_TRUE)) pos = posx;
+ else pos = posy;
+
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+ &posx2, &posy2);
+ else
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable2.slider"),
+ &posx2, &posy2);
+ if (efl_ui_dir_is_horizontal(sd->dir, EINA_TRUE)) pos2 = posx2;
+ else pos2 = posy2;
+
+ val = (pos * (sd->val_max - sd->val_min)) + sd->val_min;
+ val2 = (pos2 * (sd->val_max - sd->val_min)) + sd->val_min;
+
+ if (val > pd->intvl_to)
+ {
+ val = pd->intvl_to;
+ efl_ui_slider_val_set(obj);
+ }
+ else if (val2 < pd->intvl_from)
+ {
+ val2 = pd->intvl_from;
+ efl_ui_slider_val_set(obj);
+ }
- return EINA_FALSE;
+ if (fabs(val - pd->intvl_from) > DBL_EPSILON)
+ {
+ sd->val = val;
+ pd->intvl_from = val;
+ if (user_event)
+ {
+ efl_event_callback_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL);
+ efl_event_callback_legacy_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL);
+ ecore_timer_del(pd->delay);
+ pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj);
+ }
+ }
+
+ if (fabs(val2 - pd->intvl_to) > DBL_EPSILON)
+ {
+ pd->intvl_to = val2;
+ if (user_event)
+ {
+ efl_event_callback_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL);
+ efl_event_callback_legacy_call(obj, EFL_UI_SLIDER_EVENT_CHANGED, NULL);
+ ecore_timer_del(pd->delay);
+ pd->delay = ecore_timer_add(SLIDER_DELAY_CHANGED_INTERVAL, _delay_change, obj);
+ }
+ }
}
-static void
-_val_set(Evas_Object *obj)
+void
+_efl_ui_slider_interval_val_set(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd)
{
- Eina_Bool rtl;
double pos, pos2;
EFL_UI_SLIDER_DATA_GET(obj, sd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
if (sd->val_max > sd->val_min)
{
- pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min);
- pos2 = (sd->intvl_to - sd->val_min) / (sd->val_max - sd->val_min);
+ pos = (pd->intvl_from - sd->val_min) / (sd->val_max - sd->val_min);
+ pos2 = (pd->intvl_to - sd->val_min) / (sd->val_max - sd->val_min);
}
else
{
@@ -52,71 +119,190 @@ _val_set(Evas_Object *obj)
if (pos < 0.0) pos = 0.0;
else if (pos > 1.0)
pos = 1.0;
+
if (pos2 < 0.0) pos2 = 0.0;
else if (pos2 > 1.0)
pos2 = 1.0;
- rtl = efl_ui_mirrored_get(obj);
- if ((!rtl && _is_inverted(sd->dir)) ||
- (rtl && ((sd->dir == EFL_UI_DIR_UP) ||
- (sd->dir == EFL_UI_DIR_RIGHT))))
+ if (elm_widget_is_legacy(obj))
{
- pos = 1.0 - pos;
- pos2 = 1.0 - pos2;
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
+ pos, pos);
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+ pos2, pos2);
+ }
+ else
+ {
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
+ pos, pos);
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"),
+ pos2, pos2);
}
-
- ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
- edje_object_part_drag_value_set
- (wd->resize_obj, "elm.dragable.slider", pos, pos);
-
- if (sd->intvl_enable)
- edje_object_part_drag_value_set
- (wd->resize_obj, "elm.dragable2.slider", pos2, pos2);
// 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
-_visuals_refresh(Eo *obj)
+void
+_efl_ui_slider_interval_down_knob(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd, double button_x, double button_y)
{
- _val_set(obj);
- evas_object_smart_changed(obj);
+ EFL_UI_SLIDER_DATA_GET(obj, sd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+ double posx = 0.0, posy = 0.0, posx2 = 0.0, posy2 = 0.0, diff1, diff2, diff3;
+
+ pd->intvl_flag = 0;
+
+ if (elm_widget_is_legacy(obj))
+ {
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable.slider"),
+ &posx, &posy);
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+ &posx2, &posy2);
+ }
+ else
+ {
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable.slider"),
+ &posx, &posy);
+ efl_ui_drag_value_get(efl_part(wd->resize_obj, "efl.dragable2.slider"),
+ &posx2, &posy2);
+ }
+
+ if (efl_ui_dir_is_horizontal(sd->dir, EINA_TRUE))
+ {
+ diff1 = fabs(button_x - posx);
+ diff2 = fabs(button_x - posx2);
+ diff3 = button_x - posx;
+ }
+ else
+ {
+ diff1 = fabs(button_y - posy);
+ diff2 = fabs(button_y - posy2);
+ diff3 = button_y - posy;
+ }
+
+ if (diff1 < diff2)
+ {
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
+ button_x, button_y);
+ else
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
+ button_x, button_y);
+ pd->intvl_flag = 1;
+ }
+ else if (diff1 > diff2)
+ {
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+ button_x, button_y);
+ else
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"),
+ button_x, button_y);
+ pd->intvl_flag = 2;
+ }
+ else
+ {
+ if (diff3 < 0)
+ {
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
+ button_x, button_y);
+ else
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
+ button_x, button_y);
+ pd->intvl_flag = 1;
+ }
+ else
+ {
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+ button_x, button_y);
+ else
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"),
+ button_x, button_y);
+ pd->intvl_flag = 2;
+ }
+ }
}
-EOLIAN static void
-_efl_ui_slider_interval_interval_value_set(Eo *obj, void *sd EINA_UNUSED, double from, double to)
+void
+_efl_ui_slider_interval_move_knob(Evas_Object *obj, Efl_Ui_Slider_Interval_Data *pd, double button_x, double button_y)
{
- Efl_Ui_Slider_Data *pd = efl_data_scope_get(obj, EFL_UI_SLIDER_CLASS);
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+ if (pd->intvl_flag == 1)
+ {
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable.slider"),
+ button_x, button_y);
+ else
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable.slider"),
+ button_x, button_y);
+ }
+ else if (pd->intvl_flag == 2)
+ {
+ if (elm_widget_is_legacy(obj))
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "elm.dragable2.slider"),
+ button_x, button_y);
+ else
+ efl_ui_drag_value_set(efl_part(wd->resize_obj, "efl.dragable2.slider"),
+ button_x, button_y);
+ }
+}
+
+EOLIAN static void
+_efl_ui_slider_interval_interval_value_set(Eo *obj, Efl_Ui_Slider_Interval_Data *pd, double from, double to)
+{
+ EFL_UI_SLIDER_DATA_GET(obj, sd);
pd->intvl_from = from;
- pd->val = from;
+ sd->val = from;
pd->intvl_to = to;
- if (pd->intvl_from < pd->val_min) pd->intvl_from = pd->val_min;
- if (pd->intvl_to > pd->val_max) pd->intvl_to = pd->val_max;
+ if (pd->intvl_from < sd->val_min) {
+ pd->intvl_from = sd->val_min;
+ sd->val = sd->val_min;
+ }
+ if (pd->intvl_to > sd->val_max) pd->intvl_to = sd->val_max;
- _visuals_refresh(obj);
+ efl_ui_slider_val_set(obj);
}
-EOLIAN static Efl_Object *
-_efl_ui_slider_interval_efl_object_finalize(Eo *obj, void *sd EINA_UNUSED)
+EOLIAN static void
+_efl_ui_slider_interval_interval_value_get(const Eo *obj EINA_UNUSED, Efl_Ui_Slider_Interval_Data *pd, double *from, double *to)
{
- Efl_Ui_Slider_Data *pd = efl_data_scope_get(obj, EFL_UI_SLIDER_CLASS);
+ if (from) *from = fmin(pd->intvl_from, pd->intvl_to);
+ if (to) *to = fmax(pd->intvl_from, pd->intvl_to);
+}
- pd->intvl_enable = EINA_TRUE;
+EOLIAN static Efl_Object *
+_efl_ui_slider_interval_efl_object_constructor(Eo *obj, Efl_Ui_Slider_Interval_Data *pd EINA_UNUSED)
+{
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
- elm_widget_theme_klass_set(obj, "slider_interval");
- efl_ui_widget_theme_apply(obj);
+ if (!elm_widget_theme_klass_get(obj))
+ elm_widget_theme_klass_set(obj, "slider_interval");
+ obj = efl_constructor(efl_super(obj, MY_CLASS));
- elm_layout_signal_emit(obj, "elm,slider,range,enable", "elm");
- if (pd->indicator_show)
- edje_object_signal_emit(pd->popup2, "elm,state,val,show", "elm");
+ return obj;
+}
- obj = efl_finalize(efl_super(obj, MY_CLASS));
+EOLIAN static void
+_efl_ui_slider_interval_efl_object_destructor(Eo *obj,
+ Efl_Ui_Slider_Interval_Data *pd)
+{
+ ecore_timer_del(pd->delay);
- return obj;
+ efl_destructor(efl_super(obj, MY_CLASS));
}
+#define EFL_UI_SLIDER_INTERVAL_EXTRA_OPS \
+ EFL_UI_SLIDER_VAL_FETCH_OPS(efl_ui_slider_interval), \
+ EFL_UI_SLIDER_VAL_SET_OPS(efl_ui_slider_interval), \
+ EFL_UI_SLIDER_DOWN_KNOB_OPS(efl_ui_slider_interval), \
+ EFL_UI_SLIDER_MOVE_KNOB_OPS(efl_ui_slider_interval), \
+
#include "efl_ui_slider_interval.eo.c"