LVGL 库提交
This commit is contained in:
@@ -0,0 +1,474 @@
|
||||
/**
|
||||
* @file lv_spinbox.c
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "lv_spinbox_private.h"
|
||||
#include "../../core/lv_obj_class_private.h"
|
||||
#if LV_USE_SPINBOX
|
||||
|
||||
#include "../../misc/lv_assert.h"
|
||||
#include "../../indev/lv_indev.h"
|
||||
#include "../../stdlib/lv_string.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define MY_CLASS (&lv_spinbox_class)
|
||||
#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 8U)
|
||||
#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 4U)
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
|
||||
static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e);
|
||||
static void lv_spinbox_updatevalue(lv_obj_t * obj);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
const lv_obj_class_t lv_spinbox_class = {
|
||||
.constructor_cb = lv_spinbox_constructor,
|
||||
.event_cb = lv_spinbox_event,
|
||||
.width_def = LV_DPI_DEF,
|
||||
.instance_size = sizeof(lv_spinbox_t),
|
||||
.editable = LV_OBJ_CLASS_EDITABLE_TRUE,
|
||||
.base_class = &lv_textarea_class,
|
||||
.name = "lv_spinbox",
|
||||
};
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
|
||||
lv_obj_t * lv_spinbox_create(lv_obj_t * parent)
|
||||
{
|
||||
LV_LOG_INFO("begin");
|
||||
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
|
||||
lv_obj_class_init_obj(obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
|
||||
void lv_spinbox_set_value(lv_obj_t * obj, int32_t v)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
if(v > spinbox->range_max) v = spinbox->range_max;
|
||||
if(v < spinbox->range_min) v = spinbox->range_min;
|
||||
|
||||
spinbox->value = v;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
spinbox->rollover = rollover;
|
||||
}
|
||||
|
||||
void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT;
|
||||
|
||||
if(sep_pos >= digit_count) sep_pos = 0;
|
||||
|
||||
if(digit_count < LV_SPINBOX_MAX_DIGIT_COUNT) {
|
||||
const int64_t max_val = lv_pow(10, digit_count);
|
||||
if(spinbox->range_max > max_val - 1) spinbox->range_max = max_val - 1;
|
||||
if(spinbox->range_min < -max_val + 1) spinbox->range_min = -max_val + 1;
|
||||
}
|
||||
|
||||
spinbox->digit_count = digit_count;
|
||||
spinbox->dec_point_pos = sep_pos;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
spinbox->step = step;
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
spinbox->range_max = range_max;
|
||||
spinbox->range_min = range_min;
|
||||
|
||||
if(spinbox->value > spinbox->range_max) spinbox->value = spinbox->range_max;
|
||||
if(spinbox->value < spinbox->range_min) spinbox->value = spinbox->range_min;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min));
|
||||
const int32_t new_step = lv_pow(10, pos);
|
||||
|
||||
if(pos <= 0) spinbox->step = 1;
|
||||
else if(new_step <= step_limit) spinbox->step = new_step;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
spinbox->digit_step_dir = direction;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
/*=====================
|
||||
* Getter functions
|
||||
*====================*/
|
||||
|
||||
int32_t lv_spinbox_get_value(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
return spinbox->value;
|
||||
}
|
||||
|
||||
int32_t lv_spinbox_get_step(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
return spinbox->step;
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Other functions
|
||||
*====================*/
|
||||
|
||||
void lv_spinbox_step_next(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
const int32_t new_step = spinbox->step / 10;
|
||||
spinbox->step = (new_step > 0) ? new_step : 1;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
void lv_spinbox_step_prev(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min));
|
||||
const int32_t new_step = spinbox->step * 10;
|
||||
if(new_step <= step_limit) spinbox->step = new_step;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
|
||||
bool lv_spinbox_get_rollover(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
return spinbox->rollover;
|
||||
}
|
||||
|
||||
void lv_spinbox_increment(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
int32_t v = spinbox->value;
|
||||
/* Special mode when zero crossing. E.g -3+10 should be 3, not 7.
|
||||
* Pretend we are on -7 now.*/
|
||||
if((spinbox->value < 0) && (spinbox->value + spinbox->step) > 0) {
|
||||
v = -(spinbox->step + spinbox->value);
|
||||
}
|
||||
|
||||
if(v + spinbox->step <= spinbox->range_max) {
|
||||
v += spinbox->step;
|
||||
}
|
||||
else {
|
||||
/*Rollover?*/
|
||||
if((spinbox->rollover) && (spinbox->value == spinbox->range_max))
|
||||
v = spinbox->range_min;
|
||||
else
|
||||
v = spinbox->range_max;
|
||||
}
|
||||
|
||||
if(v != spinbox->value) {
|
||||
spinbox->value = v;
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
}
|
||||
|
||||
void lv_spinbox_decrement(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
int32_t v = spinbox->value;
|
||||
/* Special mode when zero crossing. E.g 3-10 should be -3, not -7.
|
||||
* Pretend we are on 7 now.*/
|
||||
if((spinbox->value > 0) && (spinbox->value - spinbox->step) < 0) {
|
||||
v = spinbox->step - spinbox->value;
|
||||
}
|
||||
|
||||
if(v - spinbox->step >= spinbox->range_min) {
|
||||
v -= spinbox->step;
|
||||
}
|
||||
else {
|
||||
/*Rollover?*/
|
||||
if((spinbox->rollover) && (spinbox->value == spinbox->range_min))
|
||||
v = spinbox->range_max;
|
||||
else
|
||||
v = spinbox->range_min;
|
||||
}
|
||||
|
||||
if(v != spinbox->value) {
|
||||
spinbox->value = v;
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
}
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
|
||||
{
|
||||
LV_UNUSED(class_p);
|
||||
LV_LOG_TRACE("begin");
|
||||
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
/*Initialize the allocated 'ext'*/
|
||||
spinbox->value = 0;
|
||||
spinbox->dec_point_pos = 0;
|
||||
spinbox->digit_count = 5;
|
||||
spinbox->step = 1;
|
||||
spinbox->range_max = 99999;
|
||||
spinbox->range_min = -99999;
|
||||
spinbox->rollover = false;
|
||||
spinbox->digit_step_dir = LV_DIR_RIGHT;
|
||||
|
||||
lv_textarea_set_one_line(obj, true);
|
||||
lv_textarea_set_cursor_click_pos(obj, true);
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
|
||||
LV_LOG_TRACE("Spinbox constructor finished");
|
||||
}
|
||||
|
||||
static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e)
|
||||
{
|
||||
LV_UNUSED(class_p);
|
||||
|
||||
/*Call the ancestor's event handler*/
|
||||
lv_result_t res = LV_RESULT_OK;
|
||||
res = lv_obj_event_base(MY_CLASS, e);
|
||||
if(res != LV_RESULT_OK) return;
|
||||
|
||||
const lv_event_code_t code = lv_event_get_code(e);
|
||||
lv_obj_t * obj = lv_event_get_current_target(e);
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
if(code == LV_EVENT_RELEASED) {
|
||||
/*If released with an ENCODER then move to the next digit*/
|
||||
lv_indev_t * indev = lv_indev_active();
|
||||
if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER && lv_group_get_editing(lv_obj_get_group(obj))) {
|
||||
if(spinbox->digit_count > 1) {
|
||||
if(spinbox->digit_step_dir == LV_DIR_RIGHT) {
|
||||
if(spinbox->step > 1) {
|
||||
lv_spinbox_step_next(obj);
|
||||
}
|
||||
else {
|
||||
/*Restart from the MSB*/
|
||||
spinbox->step = lv_pow(10, spinbox->digit_count - 2);
|
||||
lv_spinbox_step_prev(obj);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(spinbox->step < lv_pow(10, spinbox->digit_count - 1)) {
|
||||
lv_spinbox_step_prev(obj);
|
||||
}
|
||||
else {
|
||||
/*Restart from the LSB*/
|
||||
spinbox->step = 10;
|
||||
lv_spinbox_step_next(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*The cursor has been positioned to a digit.
|
||||
* Set `step` accordingly*/
|
||||
else {
|
||||
const char * txt = lv_textarea_get_text(obj);
|
||||
const size_t txt_len = lv_strlen(txt);
|
||||
|
||||
/* Check cursor position */
|
||||
/* Cursor is in '.' digit */
|
||||
if(txt[spinbox->ta.cursor.pos] == '.') {
|
||||
lv_textarea_cursor_left(obj);
|
||||
}
|
||||
/* Cursor is already in the right-most digit */
|
||||
else if(spinbox->ta.cursor.pos == (uint32_t)txt_len) {
|
||||
lv_textarea_set_cursor_pos(obj, txt_len - 1);
|
||||
}
|
||||
/* Cursor is already in the left-most digit AND range_min is negative */
|
||||
else if(spinbox->ta.cursor.pos == 0 && spinbox->range_min < 0) {
|
||||
lv_textarea_set_cursor_pos(obj, 1);
|
||||
}
|
||||
|
||||
/* Handle spinbox with decimal point (spinbox->dec_point_pos != 0) */
|
||||
uint32_t cp = spinbox->ta.cursor.pos;
|
||||
if(spinbox->ta.cursor.pos > spinbox->dec_point_pos && spinbox->dec_point_pos != 0) cp--;
|
||||
|
||||
const size_t len = spinbox->digit_count - 1;
|
||||
uint32_t pos = len - cp;
|
||||
|
||||
if(spinbox->range_min < 0) pos++;
|
||||
|
||||
spinbox->step = 1;
|
||||
uint32_t i;
|
||||
for(i = 0; i < pos; i++) spinbox->step *= 10;
|
||||
|
||||
lv_spinbox_updatevalue(obj);
|
||||
}
|
||||
}
|
||||
else if(code == LV_EVENT_KEY) {
|
||||
lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active());
|
||||
|
||||
uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/
|
||||
if(c == LV_KEY_RIGHT) {
|
||||
if(indev_type == LV_INDEV_TYPE_ENCODER)
|
||||
lv_spinbox_increment(obj);
|
||||
else
|
||||
lv_spinbox_step_next(obj);
|
||||
}
|
||||
else if(c == LV_KEY_LEFT) {
|
||||
if(indev_type == LV_INDEV_TYPE_ENCODER)
|
||||
lv_spinbox_decrement(obj);
|
||||
else
|
||||
lv_spinbox_step_prev(obj);
|
||||
}
|
||||
else if(c == LV_KEY_UP) {
|
||||
lv_spinbox_increment(obj);
|
||||
}
|
||||
else if(c == LV_KEY_DOWN) {
|
||||
lv_spinbox_decrement(obj);
|
||||
}
|
||||
else {
|
||||
lv_textarea_add_char(obj, c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void lv_spinbox_updatevalue(lv_obj_t * obj)
|
||||
{
|
||||
lv_spinbox_t * spinbox = (lv_spinbox_t *)obj;
|
||||
|
||||
/* LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (18): Max possible digit_count value (15) + sign + decimal point + NULL terminator */
|
||||
char textarea_txt[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES] = {0U};
|
||||
char * buf_p = textarea_txt;
|
||||
|
||||
uint32_t cur_shift_left = 0;
|
||||
if(spinbox->range_min < 0) { /*hide sign if there are only positive values*/
|
||||
/*Add the sign*/
|
||||
(*buf_p) = spinbox->value >= 0 ? '+' : '-';
|
||||
buf_p++;
|
||||
}
|
||||
else {
|
||||
/*Cursor need shift to left*/
|
||||
cur_shift_left++;
|
||||
}
|
||||
|
||||
/*Convert the numbers to string (the sign is already handled so always convert positive number)*/
|
||||
char digits[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES];
|
||||
lv_snprintf(digits, LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES, "%" LV_PRId32, LV_ABS(spinbox->value));
|
||||
|
||||
/*Add leading zeros*/
|
||||
int32_t i;
|
||||
const size_t digits_len = lv_strlen(digits);
|
||||
|
||||
const int leading_zeros_cnt = spinbox->digit_count - digits_len;
|
||||
if(leading_zeros_cnt) {
|
||||
for(i = (int32_t) digits_len; i >= 0; i--) {
|
||||
digits[i + leading_zeros_cnt] = digits[i];
|
||||
}
|
||||
/* NOTE: Substitute with memset? */
|
||||
for(i = 0; i < leading_zeros_cnt; i++) {
|
||||
digits[i] = '0';
|
||||
}
|
||||
}
|
||||
|
||||
/*Add the decimal part*/
|
||||
const uint32_t intDigits = (spinbox->dec_point_pos == 0) ? spinbox->digit_count : spinbox->dec_point_pos;
|
||||
for(i = 0; i < (int32_t)intDigits && digits[i] != '\0'; i++) {
|
||||
(*buf_p) = digits[i];
|
||||
buf_p++;
|
||||
}
|
||||
|
||||
/*Insert the decimal point*/
|
||||
if(spinbox->dec_point_pos) {
|
||||
(*buf_p) = '.';
|
||||
buf_p++;
|
||||
|
||||
for(/*Leave i*/; i < spinbox->digit_count && digits[i] != '\0'; i++) {
|
||||
(*buf_p) = digits[i];
|
||||
buf_p++;
|
||||
}
|
||||
}
|
||||
|
||||
/*Refresh the text*/
|
||||
lv_textarea_set_text(obj, (char *)textarea_txt);
|
||||
|
||||
/*Set the cursor position*/
|
||||
int32_t step = spinbox->step;
|
||||
uint32_t cur_pos = (uint32_t)spinbox->digit_count;
|
||||
while(step >= 10) {
|
||||
step /= 10;
|
||||
cur_pos--;
|
||||
}
|
||||
|
||||
if(cur_pos > intDigits) cur_pos++; /*Skip the decimal point*/
|
||||
|
||||
cur_pos -= cur_shift_left;
|
||||
|
||||
lv_textarea_set_cursor_pos(obj, cur_pos);
|
||||
}
|
||||
|
||||
#endif /*LV_USE_SPINBOX*/
|
||||
@@ -0,0 +1,164 @@
|
||||
/**
|
||||
* @file lv_spinbox.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_SPINBOX_H
|
||||
#define LV_SPINBOX_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include "../textarea/lv_textarea.h"
|
||||
|
||||
#if LV_USE_SPINBOX
|
||||
|
||||
/*Testing of dependencies*/
|
||||
#if LV_USE_TEXTAREA == 0
|
||||
#error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) "
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
#define LV_SPINBOX_MAX_DIGIT_COUNT 10
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinbox_class;
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**
|
||||
* Create a spinbox object
|
||||
* @param parent pointer to an object, it will be the parent of the new spinbox
|
||||
* @return pointer to the created spinbox
|
||||
*/
|
||||
lv_obj_t * lv_spinbox_create(lv_obj_t * parent);
|
||||
|
||||
/*=====================
|
||||
* Setter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Set spinbox value
|
||||
* @param obj pointer to spinbox
|
||||
* @param v value to be set
|
||||
*/
|
||||
void lv_spinbox_set_value(lv_obj_t * obj, int32_t v);
|
||||
|
||||
/**
|
||||
* Set spinbox rollover function
|
||||
* @param obj pointer to spinbox
|
||||
* @param rollover true or false to enable or disable (default)
|
||||
*/
|
||||
void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover);
|
||||
|
||||
/**
|
||||
* Set spinbox digit format (digit count and decimal format)
|
||||
* @param obj pointer to spinbox
|
||||
* @param digit_count number of digit excluding the decimal separator and the sign
|
||||
* @param sep_pos number of digit before the decimal point. If 0, decimal point is not
|
||||
* shown
|
||||
*/
|
||||
void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos);
|
||||
|
||||
/**
|
||||
* Set spinbox step
|
||||
* @param obj pointer to spinbox
|
||||
* @param step steps on increment/decrement. Can be 1, 10, 100, 1000, etc the digit that will change.
|
||||
*/
|
||||
void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step);
|
||||
|
||||
/**
|
||||
* Set spinbox value range
|
||||
* @param obj pointer to spinbox
|
||||
* @param range_min maximum value, inclusive
|
||||
* @param range_max minimum value, inclusive
|
||||
*/
|
||||
void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max);
|
||||
|
||||
/**
|
||||
* Set cursor position to a specific digit for edition
|
||||
* @param obj pointer to spinbox
|
||||
* @param pos selected position in spinbox
|
||||
*/
|
||||
void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos);
|
||||
|
||||
/**
|
||||
* Set direction of digit step when clicking an encoder button while in editing mode
|
||||
* @param obj pointer to spinbox
|
||||
* @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT)
|
||||
*/
|
||||
void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction);
|
||||
|
||||
/*=====================
|
||||
* Getter functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Get spinbox rollover function status
|
||||
* @param obj pointer to spinbox
|
||||
*/
|
||||
bool lv_spinbox_get_rollover(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the spinbox numeral value (user has to convert to float according to its digit format)
|
||||
* @param obj pointer to spinbox
|
||||
* @return value integer value of the spinbox
|
||||
*/
|
||||
int32_t lv_spinbox_get_value(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Get the spinbox step value (user has to convert to float according to its digit format)
|
||||
* @param obj pointer to spinbox
|
||||
* @return value integer step value of the spinbox
|
||||
*/
|
||||
int32_t lv_spinbox_get_step(lv_obj_t * obj);
|
||||
|
||||
/*=====================
|
||||
* Other functions
|
||||
*====================*/
|
||||
|
||||
/**
|
||||
* Select next lower digit for edition by dividing the step by 10
|
||||
* @param obj pointer to spinbox
|
||||
*/
|
||||
void lv_spinbox_step_next(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Select next higher digit for edition by multiplying the step by 10
|
||||
* @param obj pointer to spinbox
|
||||
*/
|
||||
void lv_spinbox_step_prev(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Increment spinbox value by one step
|
||||
* @param obj pointer to spinbox
|
||||
*/
|
||||
void lv_spinbox_increment(lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Decrement spinbox value by one step
|
||||
* @param obj pointer to spinbox
|
||||
*/
|
||||
void lv_spinbox_decrement(lv_obj_t * obj);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /*LV_USE_SPINBOX*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
#endif /*LV_SPINBOX_H*/
|
||||
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* @file lv_spinbox_private.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LV_SPINBOX_PRIVATE_H
|
||||
#define LV_SPINBOX_PRIVATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
|
||||
#include "../textarea/lv_textarea_private.h"
|
||||
#include "lv_spinbox.h"
|
||||
|
||||
#if LV_USE_SPINBOX
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/** Data of spinbox */
|
||||
struct _lv_spinbox_t {
|
||||
lv_textarea_t ta; /**< Ext. of ancestor */
|
||||
/*New data for this type*/
|
||||
int32_t value;
|
||||
int32_t range_max;
|
||||
int32_t range_min;
|
||||
int32_t step;
|
||||
uint32_t digit_count : 4;
|
||||
uint32_t dec_point_pos : 4; /**< if 0, there is no separator and the number is an integer */
|
||||
uint32_t rollover : 1; /**< Set to true for rollover functionality */
|
||||
uint32_t digit_step_dir : 2; /**< the direction the digit will step on encoder button press when editing */
|
||||
};
|
||||
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
#endif /* LV_USE_SPINBOX */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif
|
||||
|
||||
#endif /*LV_SPINBOX_PRIVATE_H*/
|
||||
Reference in New Issue
Block a user