Make slider work better with keyboard.
SVN revision: 31740
This commit is contained in:
parent
1554f92345
commit
9341299f6a
|
@ -16,6 +16,7 @@ struct _E_Smart_Data
|
||||||
Evas_Object *edje_obj;
|
Evas_Object *edje_obj;
|
||||||
double val, val_min, val_max, step_size;
|
double val, val_min, val_max, step_size;
|
||||||
int reversed, step_count, horizontal;
|
int reversed, step_count, horizontal;
|
||||||
|
int direction;
|
||||||
const char *format;
|
const char *format;
|
||||||
Evas_Coord minw, minh;
|
Evas_Coord minw, minh;
|
||||||
Ecore_Timer *set_timer;
|
Ecore_Timer *set_timer;
|
||||||
|
@ -100,6 +101,7 @@ e_slider_value_range_set(Evas_Object *obj, double min, double max)
|
||||||
sd->val_min = min;
|
sd->val_min = min;
|
||||||
sd->val_max = max;
|
sd->val_max = max;
|
||||||
if (sd->val_max < sd->val_min) sd->val_min = sd->val_max;
|
if (sd->val_max < sd->val_min) sd->val_min = sd->val_max;
|
||||||
|
sd->direction = 0;
|
||||||
_e_smart_value_limit(sd);
|
_e_smart_value_limit(sd);
|
||||||
_e_smart_value_update_now(sd);
|
_e_smart_value_update_now(sd);
|
||||||
}
|
}
|
||||||
|
@ -124,6 +126,7 @@ e_slider_value_step_size_set(Evas_Object *obj, double step_size)
|
||||||
if (sd->val_max > sd->val_min)
|
if (sd->val_max > sd->val_min)
|
||||||
step = step_size / (sd->val_max - sd->val_min);
|
step = step_size / (sd->val_max - sd->val_min);
|
||||||
edje_object_part_drag_step_set(sd->edje_obj, "e.dragable.slider", step, step);
|
edje_object_part_drag_step_set(sd->edje_obj, "e.dragable.slider", step, step);
|
||||||
|
sd->direction = 0;
|
||||||
_e_smart_value_limit(sd);
|
_e_smart_value_limit(sd);
|
||||||
_e_smart_value_update_now(sd);
|
_e_smart_value_update_now(sd);
|
||||||
}
|
}
|
||||||
|
@ -140,6 +143,7 @@ e_slider_value_step_count_set(Evas_Object *obj, int step_count)
|
||||||
{
|
{
|
||||||
API_ENTRY return;
|
API_ENTRY return;
|
||||||
sd->step_count = step_count;
|
sd->step_count = step_count;
|
||||||
|
sd->direction = 0;
|
||||||
_e_smart_value_limit(sd);
|
_e_smart_value_limit(sd);
|
||||||
_e_smart_value_update_now(sd);
|
_e_smart_value_update_now(sd);
|
||||||
}
|
}
|
||||||
|
@ -257,6 +261,7 @@ _e_smart_value_fetch(E_Smart_Data *sd)
|
||||||
static void
|
static void
|
||||||
_e_smart_value_limit(E_Smart_Data *sd)
|
_e_smart_value_limit(E_Smart_Data *sd)
|
||||||
{
|
{
|
||||||
|
printf("direction: %d\n", sd->direction);
|
||||||
if (sd->val < sd->val_min) sd->val = sd->val_min;
|
if (sd->val < sd->val_min) sd->val = sd->val_min;
|
||||||
if (sd->val > sd->val_max) sd->val = sd->val_max;
|
if (sd->val > sd->val_max) sd->val = sd->val_max;
|
||||||
if (sd->val_max > sd->val_min)
|
if (sd->val_max > sd->val_min)
|
||||||
|
@ -264,48 +269,32 @@ _e_smart_value_limit(E_Smart_Data *sd)
|
||||||
if (sd->step_count > 0)
|
if (sd->step_count > 0)
|
||||||
{
|
{
|
||||||
double p, s;
|
double p, s;
|
||||||
double v1, v2;
|
|
||||||
|
|
||||||
p = sd->val_min;
|
|
||||||
s = (sd->val_max - sd->val_min) / sd->step_count;
|
s = (sd->val_max - sd->val_min) / sd->step_count;
|
||||||
v1 = sd->val_min;
|
p = sd->val / s;
|
||||||
v2 = sd->val_max;
|
if (sd->direction == 1)
|
||||||
while (p <= sd->val_max)
|
p = (int)(p + 1);
|
||||||
{
|
else if (sd->direction == -1)
|
||||||
p += s;
|
p = (int)p;
|
||||||
if ((p <= sd->val) && ((sd->val - p) < (sd->val - v1)))
|
|
||||||
v1 = p;
|
|
||||||
if ((p >= sd->val) && ((p - sd->val) < (v2 - sd->val)))
|
|
||||||
v2 = p;
|
|
||||||
}
|
|
||||||
if ((sd->val - v1) < (v2 - sd->val))
|
|
||||||
sd->val = v1;
|
|
||||||
else
|
else
|
||||||
sd->val = v2;
|
p = round(p);
|
||||||
|
sd->val = p * s;
|
||||||
}
|
}
|
||||||
else if (sd->step_size > 0.0)
|
else if (sd->step_size > 0.0)
|
||||||
{
|
{
|
||||||
double p, s;
|
double p;
|
||||||
double v1, v2;
|
|
||||||
|
|
||||||
p = sd->val_min;
|
p = sd->val / sd->step_size;
|
||||||
s = sd->step_size;
|
if (sd->direction == 1)
|
||||||
v1 = sd->val_min;
|
p = (int)(p + 1);
|
||||||
v2 = sd->val_max;
|
else if (sd->direction == -1)
|
||||||
while (p <= sd->val_max)
|
p = (int)p;
|
||||||
{
|
|
||||||
p += s;
|
|
||||||
if ((p <= sd->val) && ((sd->val - p) < (sd->val - v1)))
|
|
||||||
v1 = p;
|
|
||||||
if ((p >= sd->val) && ((p - sd->val) < (v2 - sd->val)))
|
|
||||||
v2 = p;
|
|
||||||
}
|
|
||||||
if ((sd->val - v1) < (v2 - sd->val))
|
|
||||||
sd->val = v1;
|
|
||||||
else
|
else
|
||||||
sd->val = v2;
|
p = round(p);
|
||||||
|
sd->val = p * sd->step_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sd->direction = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -388,6 +377,7 @@ _e_smart_event_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", -sd->step_size, -sd->step_size);
|
edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", -sd->step_size, -sd->step_size);
|
||||||
|
sd->direction = -1;
|
||||||
}
|
}
|
||||||
else if ((!strcmp(ev->keyname, "Down")) ||
|
else if ((!strcmp(ev->keyname, "Down")) ||
|
||||||
(!strcmp(ev->keyname, "KP_Down")) ||
|
(!strcmp(ev->keyname, "KP_Down")) ||
|
||||||
|
@ -403,16 +393,19 @@ _e_smart_event_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", sd->step_size, sd->step_size);
|
edje_object_part_drag_step(sd->edje_obj, "e.dragable.slider", sd->step_size, sd->step_size);
|
||||||
|
sd->direction = 1;
|
||||||
}
|
}
|
||||||
else if ((!strcmp(ev->keyname, "Home")) ||
|
else if ((!strcmp(ev->keyname, "Home")) ||
|
||||||
(!strcmp(ev->keyname, "KP_Home")))
|
(!strcmp(ev->keyname, "KP_Home")))
|
||||||
{
|
{
|
||||||
edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", 0., 0.);
|
edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", 0., 0.);
|
||||||
|
sd->direction = 0;
|
||||||
}
|
}
|
||||||
else if ((!strcmp(ev->keyname, "End")) ||
|
else if ((!strcmp(ev->keyname, "End")) ||
|
||||||
(!strcmp(ev->keyname, "KP_End")))
|
(!strcmp(ev->keyname, "KP_End")))
|
||||||
{
|
{
|
||||||
edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", 1., 1.);
|
edje_object_part_drag_value_set(sd->edje_obj, "e.dragable.slider", 1., 1.);
|
||||||
|
sd->direction = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,6 +439,7 @@ _e_smart_add(Evas_Object *obj)
|
||||||
sd->step_count = 0;
|
sd->step_count = 0;
|
||||||
sd->horizontal = 0;
|
sd->horizontal = 0;
|
||||||
sd->format = NULL;
|
sd->format = NULL;
|
||||||
|
sd->direction = 0;
|
||||||
|
|
||||||
sd->edje_obj = edje_object_add(evas_object_evas_get(obj));
|
sd->edje_obj = edje_object_add(evas_object_evas_get(obj));
|
||||||
e_theme_edje_object_set(sd->edje_obj, "base/theme/widgets",
|
e_theme_edje_object_set(sd->edje_obj, "base/theme/widgets",
|
||||||
|
|
Loading…
Reference in New Issue