1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-21 06:53:01 +08:00

Add btn like signal handling for knob part. Add custom event to distuinguish from VALUE_CHANGED

This commit is contained in:
Adam Martini 2020-06-20 12:12:42 -07:00
parent 9b38b35420
commit f6d75e759c
3 changed files with 91 additions and 2 deletions

View File

@ -102,6 +102,7 @@ enum {
LV_EVENT_APPLY, /**< "Ok", "Apply" or similar specific button has clicked*/ LV_EVENT_APPLY, /**< "Ok", "Apply" or similar specific button has clicked*/
LV_EVENT_CANCEL, /**< "Close", "Cancel" or similar specific button has clicked*/ LV_EVENT_CANCEL, /**< "Close", "Cancel" or similar specific button has clicked*/
LV_EVENT_DELETE, /**< Object is being deleted */ LV_EVENT_DELETE, /**< Object is being deleted */
_LV_EVENT_LAST /** Number of events*/
}; };
typedef uint8_t lv_event_t; /**< Type of event being sent to the object. */ typedef uint8_t lv_event_t; /**< Type of event being sent to the object. */

View File

@ -87,6 +87,7 @@ lv_obj_t * lv_rotary_create(lv_obj_t * par, const lv_obj_t * copy)
ext->min_value = 0; ext->min_value = 0;
ext->max_value = 0; ext->max_value = 0;
ext->dragging = false; ext->dragging = false;
ext->checkable = 0;
lv_style_list_init(&ext->style_knob); lv_style_list_init(&ext->style_knob);
/*The signal and design functions are not copied so set them here*/ /*The signal and design functions are not copied so set them here*/
@ -108,6 +109,8 @@ lv_obj_t * lv_rotary_create(lv_obj_t * par, const lv_obj_t * copy)
ext->min_value = copy_ext->min_value; ext->min_value = copy_ext->min_value;
ext->max_value = copy_ext->max_value; ext->max_value = copy_ext->max_value;
ext->dragging = copy_ext->dragging; ext->dragging = copy_ext->dragging;
ext->sym = copy_ext->sym;
ext->checkable = copy_ext->checkable;
lv_style_list_copy(&ext->style_knob, &copy_ext->style_knob); lv_style_list_copy(&ext->style_knob, &copy_ext->style_knob);
lv_obj_refresh_style(rotary, LV_OBJ_PART_ALL); lv_obj_refresh_style(rotary, LV_OBJ_PART_ALL);
@ -192,6 +195,20 @@ void lv_rotary_set_symmetric(lv_obj_t * rotary, bool en)
lv_obj_invalidate(rotary); lv_obj_invalidate(rotary);
} }
/**
* Enable the toggled states
* @param rotary pointer to a button object
* @param tgl true: enable toggled states, false: disable
*/
void lv_rotary_set_checkable(lv_obj_t * rotary, bool tgl)
{
LV_ASSERT_OBJ(rotary, LV_OBJX_NAME);
lv_rotary_ext_t * ext = (lv_rotary_ext_t *)lv_obj_get_ext_attr(rotary);
ext->checkable = tgl != false ? 1 : 0;
}
/*===================== /*=====================
* Getter functions * Getter functions
*====================*/ *====================*/
@ -248,6 +265,20 @@ bool lv_rotary_is_dragged(const lv_obj_t * rotary)
return ext->dragging; return ext->dragging;
} }
/**
* Get the toggle enable attribute of the rotary
* @param rotary pointer to a rotary object
* @return true: toggle enabled, false: disabled
*/
bool lv_rotary_get_checkable(const lv_obj_t * rotary)
{
LV_ASSERT_OBJ(rotary, LV_OBJX_NAME);
lv_rotary_ext_t * ext = (lv_rotary_ext_t *)lv_obj_get_ext_attr(rotary);
return ext->checkable != 0 ? true : false;
}
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
@ -305,6 +336,7 @@ static lv_res_t lv_rotary_signal(lv_obj_t * rotary, lv_signal_t sign, void * par
if(res != LV_RES_OK) return res; if(res != LV_RES_OK) return res;
if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME);
bool tgl = lv_rotary_get_checkable(rotary);
lv_rotary_ext_t * ext = lv_obj_get_ext_attr(rotary); lv_rotary_ext_t * ext = lv_obj_get_ext_attr(rotary);
lv_point_t p; lv_point_t p;
@ -320,6 +352,23 @@ static lv_res_t lv_rotary_signal(lv_obj_t * rotary, lv_signal_t sign, void * par
ext->dragging = false; ext->dragging = false;
ext->value_to_set = NULL; ext->value_to_set = NULL;
/*If not dragged and it was not long press action then
*change state and run the action*/
if(lv_indev_is_dragging(param) == false && tgl) {
uint32_t toggled = 0;
if(lv_obj_get_state(rotary, LV_ROTARY_PART_KNOB) & LV_STATE_CHECKED) {
lv_btn_set_state(rotary, LV_ROTARY_STATE_RELEASED);
toggled = 0;
}
else {
lv_btn_set_state(rotary, LV_ROTARY_STATE_CHECKED_RELEASED);
toggled = 1;
}
res = lv_event_send(rotary, LV_EVENT_ROTARY_TOGGLED, &toggled);
if(res != LV_RES_OK) return res;
}
#if LV_USE_GROUP #if LV_USE_GROUP
/*Leave edit mode if released. (No need to wait for LONG_PRESS) */ /*Leave edit mode if released. (No need to wait for LONG_PRESS) */
lv_group_t * g = lv_obj_get_group(rotary); lv_group_t * g = lv_obj_get_group(rotary);

View File

@ -69,6 +69,7 @@ typedef struct {
int16_t * value_to_set; /*Start value of the rotary*/ int16_t * value_to_set; /*Start value of the rotary*/
uint16_t dragging :1; uint16_t dragging :1;
uint16_t sym :1; uint16_t sym :1;
uint8_t checkable :1; /* 1: Toggle enabled*/
} lv_rotary_ext_t; } lv_rotary_ext_t;
/** Built-in styles of rotary*/ /** Built-in styles of rotary*/
@ -79,6 +80,13 @@ enum {
_LV_ROTARY_PART_VIRTUAL_LAST _LV_ROTARY_PART_VIRTUAL_LAST
}; };
/** Custom events of rotary*/
enum {
LV_EVENT_ROTARY_TOGGLED = _LV_EVENT_LAST
};
typedef uint8_t lv_rotary_event_t;
/********************** /**********************
* GLOBAL PROTOTYPES * GLOBAL PROTOTYPES
**********************/ **********************/
@ -184,16 +192,30 @@ static inline void lv_rotary_set_rotation(lv_obj_t * rotary, uint16_t rotation_a
lv_arc_set_rotation(rotary, rotation_angle); lv_arc_set_rotation(rotary, rotation_angle);
} }
/**
* Enable the toggled states
* @param rotary pointer to a rotary object
* @param tgl true: enable toggled states, false: disable
*/
void lv_rotary_set_checkable(lv_obj_t * rotary, bool tgl)
/** /**
* Set the state of the rotary * Set the state of the rotary
* @param rotary pointer to a rotary object * @param rotary pointer to a rotary object
* @param state the new state of the rotary (from lv_rotary_state_t enum) * @param state the new state of the rotary (from lv_rotary_state_t enum)
*/ */
static inline void lv_rotary_set_state(lv_obj_t * rotary, lv_rotary_state_t state) static inline void lv_rotary_set_state(lv_obj_t * rotary, lv_rotary_state_t state) {
{
lv_btn_set_state(rotary, state); lv_btn_set_state(rotary, state);
} }
/**
* Toggle the state of the rotary (ON->OFF, OFF->ON)
* @param rotary pointer to a rotary object
*/
static inline void lv_rotary_toggle(lv_obj_t * rotary) {
lv_btn_toggle(rotary);
}
/*===================== /*=====================
* Getter functions * Getter functions
*====================*/ *====================*/
@ -273,6 +295,23 @@ static inline bool lv_rotary_get_symmetric(lv_obj_t * rotary)
return ext->sym; return ext->sym;
} }
/**
* Get the current state of the rotary
* @param rotary pointer to a rotary object
* @return the state of the rotary (from lv_rotary_state_t enum).
* If the rotary is in disabled state `LV_ROTARY_STATE_DISABLED` will be ORed to the other rotary states.
*/
static inline lv_btn_state_t lv_rotary_get_state(const lv_obj_t * rotary) {
return lv_btn_get_state(rotary);
}
/**
* Get the toggle enable attribute of the rotary
* @param rotary pointer to a rotary object
* @return true: toggle enabled, false: disabled
*/
bool lv_rotary_get_checkable(const lv_obj_t * rotary)
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/