bar/slider/sw anim updates
This commit is contained in:
158
lv_objx/lv_sw.c
158
lv_objx/lv_sw.c
@@ -30,7 +30,6 @@
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param);
|
||||
static void lv_sw_anim_to_value(lv_obj_t * sw, int16_t value);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
@@ -80,10 +79,9 @@ lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy)
|
||||
|
||||
/*Init the new switch switch*/
|
||||
if(copy == NULL) {
|
||||
lv_slider_set_range(new_sw, 0, 1);
|
||||
lv_obj_set_size(new_sw, 2 * LV_DPI / 3, LV_DPI / 3);
|
||||
lv_obj_set_size(new_sw, 2 * LV_DPI / 3, LV_DPI / 3);
|
||||
lv_slider_set_knob_in(new_sw, true);
|
||||
lv_slider_set_range(new_sw, 0, LV_SWITCH_SLIDER_ANIM_MAX);
|
||||
lv_slider_set_range(new_sw, 0, LV_SW_MAX_VALUE);
|
||||
|
||||
/*Set the default styles*/
|
||||
lv_theme_t * th = lv_theme_get_current();
|
||||
@@ -125,83 +123,50 @@ lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy)
|
||||
|
||||
/**
|
||||
* Turn ON the switch
|
||||
* @param sw pointer to a switch object
|
||||
* @param sw pointer to a switch objec
|
||||
* @param anim true: set the value with an animation; false: change the value immediatelly
|
||||
*/
|
||||
void lv_sw_on(lv_obj_t * sw)
|
||||
void lv_sw_on(lv_obj_t * sw, bool anim)
|
||||
{
|
||||
#if USE_LV_ANIMATION == 0
|
||||
anim = false;
|
||||
#endif
|
||||
lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw);
|
||||
lv_slider_set_value(sw, LV_SWITCH_SLIDER_ANIM_MAX);
|
||||
|
||||
lv_slider_set_value(sw, LV_SW_MAX_VALUE, anim);
|
||||
lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on);
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn OFF the switch
|
||||
* @param sw pointer to a switch object
|
||||
* @param anim true: set the value with an animation; false: change the value immediatelly
|
||||
*/
|
||||
void lv_sw_off(lv_obj_t * sw)
|
||||
void lv_sw_off(lv_obj_t * sw, bool anim)
|
||||
{
|
||||
#if USE_LV_ANIMATION == 0
|
||||
anim = false;
|
||||
#endif
|
||||
lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw);
|
||||
lv_slider_set_value(sw, 0);
|
||||
|
||||
lv_slider_set_value(sw, 0, anim);
|
||||
lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle the position of the switch
|
||||
* @param sw pointer to a switch object
|
||||
* @param anim true: set the value with an animation; false: change the value immediatelly
|
||||
* @return resulting state of the switch.
|
||||
*/
|
||||
bool lv_sw_toggle(lv_obj_t *sw) {
|
||||
bool state = lv_sw_get_state(sw);
|
||||
if(state) {
|
||||
lv_sw_off(sw);
|
||||
}
|
||||
else {
|
||||
lv_sw_on(sw);
|
||||
}
|
||||
return !state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn ON the switch with an animation
|
||||
* @param sw pointer to a switch object
|
||||
*/
|
||||
void lv_sw_on_anim(lv_obj_t * sw)
|
||||
bool lv_sw_toggle(lv_obj_t *sw, bool anim)
|
||||
{
|
||||
lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw);
|
||||
if(lv_sw_get_anim_time(sw) > 0)lv_sw_anim_to_value(sw, LV_SWITCH_SLIDER_ANIM_MAX);
|
||||
else lv_slider_set_value(sw, LV_SWITCH_SLIDER_ANIM_MAX);
|
||||
#if USE_LV_ANIMATION == 0
|
||||
anim = false;
|
||||
#endif
|
||||
|
||||
lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on);
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn OFF the switch with an animation
|
||||
* @param sw pointer to a switch object
|
||||
*/
|
||||
void lv_sw_off_anim(lv_obj_t * sw)
|
||||
{
|
||||
lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw);
|
||||
if(lv_sw_get_anim_time(sw) > 0) lv_sw_anim_to_value(sw, 0);
|
||||
else lv_slider_set_value(sw, 0);
|
||||
|
||||
lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle the position of the switch with an animation
|
||||
* @param sw pointer to a switch object
|
||||
* @return resulting state of the switch.
|
||||
*/
|
||||
bool lv_sw_toggle_anim(lv_obj_t *sw) {
|
||||
bool state = lv_sw_get_state(sw);
|
||||
if(state) {
|
||||
lv_sw_off_anim(sw);
|
||||
}
|
||||
else {
|
||||
lv_sw_on_anim(sw);
|
||||
}
|
||||
if(state) lv_sw_off(sw, anim);
|
||||
else lv_sw_on(sw, anim);
|
||||
|
||||
return !state;
|
||||
}
|
||||
|
||||
@@ -304,18 +269,18 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param)
|
||||
{
|
||||
lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw);
|
||||
|
||||
/*Save the current (old) value before slider signal modifies it*/
|
||||
/*Save the current (old) value before slider signal modifies it. It will be required in the later colcualtions*/
|
||||
int16_t old_val;
|
||||
|
||||
if(sign == LV_SIGNAL_PRESSING) old_val = ext->slider.drag_value;
|
||||
else old_val = lv_slider_get_value(sw);
|
||||
|
||||
/*Do not let the slider to call the callback. The Switch will do it if required*/
|
||||
lv_action_t slider_action = ext->slider.action;
|
||||
/*Don't let the slider to call the action. Switch handles it differently*/
|
||||
lv_action_t action = ext->slider.action;
|
||||
ext->slider.action = NULL;
|
||||
|
||||
lv_res_t res;
|
||||
/* Include the ancient signal function */
|
||||
|
||||
res = ancestor_signal(sw, sign, param);
|
||||
if(res != LV_RES_OK) return res;
|
||||
|
||||
@@ -335,7 +300,7 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param)
|
||||
ext->changed = 0;
|
||||
}
|
||||
else if(sign == LV_SIGNAL_PRESSING) {
|
||||
/*See if the switch was slid*/
|
||||
/*See if the switch was slid (moved at least a little)*/
|
||||
lv_indev_t * indev = lv_indev_get_act();
|
||||
if(indev) {
|
||||
lv_point_t p = {0,0};
|
||||
@@ -345,12 +310,12 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param)
|
||||
|
||||
/*If didn't slide then revert the min/max value. So click without slide won't move the switch as a slider*/
|
||||
if(ext->slided == 0) {
|
||||
if(lv_sw_get_state(sw)) ext->slider.drag_value = LV_SWITCH_SLIDER_ANIM_MAX;
|
||||
if(lv_sw_get_state(sw)) ext->slider.drag_value = LV_SW_MAX_VALUE;
|
||||
else ext->slider.drag_value = 0;
|
||||
}
|
||||
|
||||
/*If explicitly changed (by slide) don't need to be toggled on release*/
|
||||
int16_t threshold = LV_SWITCH_SLIDER_ANIM_MAX / 2;
|
||||
int16_t threshold = LV_SW_MAX_VALUE / 2;
|
||||
if((old_val < threshold && ext->slider.drag_value > threshold) ||
|
||||
(old_val > threshold && ext->slider.drag_value < threshold))
|
||||
{
|
||||
@@ -360,48 +325,34 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param)
|
||||
else if(sign == LV_SIGNAL_PRESS_LOST) {
|
||||
if(lv_sw_get_state(sw)) {
|
||||
lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on);
|
||||
#if USE_LV_ANIMATION
|
||||
lv_sw_anim_to_value(sw, LV_SWITCH_SLIDER_ANIM_MAX);
|
||||
#endif
|
||||
lv_slider_set_value(sw, LV_SW_MAX_VALUE, true);
|
||||
}
|
||||
else {
|
||||
lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off);
|
||||
#if USE_LV_ANIMATION
|
||||
lv_sw_anim_to_value(sw, 0);
|
||||
#endif
|
||||
lv_slider_set_value(sw, 0, true);
|
||||
}
|
||||
}
|
||||
else if(sign == LV_SIGNAL_RELEASED) {
|
||||
/*If not dragged then toggle the switch*/
|
||||
if(ext->changed == 0) {
|
||||
if(lv_sw_get_state(sw)) lv_sw_off_anim(sw);
|
||||
else lv_sw_on_anim(sw);
|
||||
|
||||
if(slider_action != NULL) res = slider_action(sw);
|
||||
if(lv_sw_get_state(sw)) lv_sw_off(sw, true);
|
||||
else lv_sw_on(sw, true);
|
||||
}
|
||||
/*If the switch was dragged then calculate the new state based on the current position*/
|
||||
else {
|
||||
int16_t v = lv_slider_get_value(sw);
|
||||
if(v > LV_SWITCH_SLIDER_ANIM_MAX / 2) lv_sw_on_anim(sw);
|
||||
else lv_sw_off_anim(sw);
|
||||
|
||||
if(slider_action != NULL) res = slider_action(sw);
|
||||
if(v > LV_SW_MAX_VALUE / 2) lv_sw_on(sw, true);
|
||||
else lv_sw_off(sw, true);
|
||||
}
|
||||
|
||||
} else if(sign == LV_SIGNAL_CONTROLL) {
|
||||
|
||||
char c = *((char *)param);
|
||||
if(c == LV_GROUP_KEY_ENTER) {
|
||||
if(old_val) lv_sw_off_anim(sw);
|
||||
else lv_sw_on_anim(sw);
|
||||
|
||||
if(slider_action) res = slider_action(sw);
|
||||
} else if(c == LV_GROUP_KEY_UP || c == LV_GROUP_KEY_RIGHT) {
|
||||
lv_sw_on_anim(sw);
|
||||
if(slider_action) res = slider_action(sw);
|
||||
} else if(c == LV_GROUP_KEY_DOWN || c == LV_GROUP_KEY_LEFT) {
|
||||
lv_sw_off_anim(sw);
|
||||
if(slider_action) res = slider_action(sw);
|
||||
if(old_val) lv_sw_off(sw, true);
|
||||
else lv_sw_on(sw, true);
|
||||
} else if(c == LV_GROUP_KEY_RIGHT || c == LV_GROUP_KEY_UP) {
|
||||
lv_slider_set_value(sw, LV_SW_MAX_VALUE, true);
|
||||
} else if(c == LV_GROUP_KEY_LEFT || c == LV_GROUP_KEY_DOWN) {
|
||||
lv_slider_set_value(sw, 0, true);
|
||||
}
|
||||
} else if(sign == LV_SIGNAL_GET_EDITABLE) {
|
||||
bool * editable = (bool *)param;
|
||||
@@ -415,31 +366,10 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param)
|
||||
buf->type[i] = "lv_sw";
|
||||
}
|
||||
|
||||
/*Restore the callback*/
|
||||
if(res == LV_RES_OK) ext->slider.action = slider_action;
|
||||
/*Revert the action*/
|
||||
ext->slider.action = action;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void lv_sw_anim_to_value(lv_obj_t * sw, int16_t value)
|
||||
{
|
||||
#if USE_LV_ANIMATION
|
||||
lv_anim_t a;
|
||||
lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw);
|
||||
a.var = sw;
|
||||
a.start = ext->slider.bar.cur_value;
|
||||
a.end = value;
|
||||
a.fp = (lv_anim_fp_t)lv_slider_set_value;
|
||||
a.path = lv_anim_path_linear;
|
||||
a.end_cb = NULL;
|
||||
a.act_time = 0;
|
||||
a.time = lv_sw_get_anim_time(sw);
|
||||
a.playback = 0;
|
||||
a.playback_pause = 0;
|
||||
a.repeat = 0;
|
||||
a.repeat_pause = 0;
|
||||
lv_anim_create(&a);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user