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

250 lines
9.1 KiB
C
Raw Normal View History

2016-09-30 13:35:54 +02:00
/**
* @file lv_btnm.h
2018-06-19 09:49:58 +02:00
*
2016-09-30 13:35:54 +02:00
*/
#ifndef LV_BTNMATRIX_H
#define LV_BTNMATRIX_H
2016-09-30 13:35:54 +02:00
2017-07-09 15:32:49 +02:00
#ifdef __cplusplus
extern "C" {
#endif
2016-09-30 13:35:54 +02:00
/*********************
* INCLUDES
*********************/
#include "../lv_conf_internal.h"
#if LV_USE_BTNMATRIX != 0
2016-09-30 13:35:54 +02:00
2017-11-30 11:35:33 +01:00
#include "../lv_core/lv_obj.h"
2016-09-30 13:35:54 +02:00
#include "lv_label.h"
#include "lv_btn.h"
/*********************
* DEFINES
*********************/
#define LV_BTNMATRIX_WIDTH_MASK 0x0007
#define LV_BTNMATRIX_BTN_NONE 0xFFFF
LV_EXPORT_CONST_INT(LV_BTNMATRIX_BTN_NONE);
2016-09-30 13:35:54 +02:00
/**********************
* TYPEDEFS
**********************/
/** Type to store button control bits (disabled, hidden etc.)
* The first 3 bits are used to store the width */
enum {
LV_BTNMATRIX_CTRL_HIDDEN = 0x0008, /**< Button hidden */
LV_BTNMATRIX_CTRL_NO_REPEAT = 0x0010, /**< Do not repeat press this button. */
2020-03-04 16:29:21 +01:00
LV_BTNMATRIX_CTRL_DISABLED = 0x0020, /**< Disable this button. */
LV_BTNMATRIX_CTRL_CHECKABLE = 0x0040, /**< Button *can* be toggled. */
2020-02-14 17:03:25 +01:00
LV_BTNMATRIX_CTRL_CHECK_STATE = 0x0080, /**< Button is currently toggled (e.g. checked). */
LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_SELECTED on CLICK, 0: Send LV_EVENT_SELECTED on PRESS*/
};
typedef uint16_t lv_btnmatrix_ctrl_t;
/*Data of button matrix*/
2020-02-26 19:48:27 +01:00
typedef struct {
/*No inherited ext.*/ /*Ext. of ancestor*/
/*New data for this type */
2019-06-27 07:16:15 +02:00
const char ** map_p; /*Pointer to the current map*/
lv_area_t * button_areas; /*Array of areas of buttons*/
lv_btnmatrix_ctrl_t * ctrl_bits; /*Array of control bytes*/
lv_style_list_t style_btn; /*Styles of buttons in each state*/
2019-06-27 07:16:15 +02:00
uint16_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/
uint16_t btn_id_pr; /*Index of the currently pressed button or LV_BTNMATRIX_BTN_NONE*/
uint16_t btn_id_focused; /*Index of the currently focused button or LV_BTNMATRIX_BTN_NONE*/
uint16_t btn_id_act; /*Index of the active button (being pressed/released etc) or LV_BTNMATRIX_BTN_NONE */
2019-04-04 07:15:40 +02:00
uint8_t recolor : 1; /*Enable button recoloring*/
2020-03-04 16:29:21 +01:00
uint8_t one_check : 1; /*Single button toggled at once*/
} lv_btnmatrix_ext_t;
2018-09-18 13:59:40 +02:00
enum {
LV_BTNMATRIX_PART_BG,
LV_BTNMATRIX_PART_BTN,
2018-09-18 13:59:40 +02:00
};
typedef uint8_t lv_btnmatrix_part_t;
2016-09-30 13:35:54 +02:00
/**********************
* GLOBAL PROTOTYPES
**********************/
/**
* Create a button matrix objects
* @param par pointer to an object, it will be the parent of the new button matrix
2019-04-04 07:15:40 +02:00
* @param copy pointer to a button matrix object, if not NULL then the new object will be copied
* from it
* @return pointer to the created button matrix
*/
lv_obj_t * lv_btnmatrix_create(lv_obj_t * par, const lv_obj_t * copy);
2017-11-10 15:01:40 +01:00
/*=====================
* Setter functions
*====================*/
2016-09-30 13:35:54 +02:00
/**
* Set a new map. Buttons will be created/deleted according to the map. The
* button matrix keeps a reference to the map and so the string array must not
* be deallocated during the life of the matrix.
* @param btnm pointer to a button matrix object
* @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break.
*/
void lv_btnmatrix_set_map(lv_obj_t * btnm, const char * map[]);
/**
* Set the button control map (hidden, disabled etc.) for a button matrix. The
* control map array will be copied and so may be deallocated after this
* function returns.
* @param btnm pointer to a button matrix object
* @param ctrl_map pointer to an array of `lv_btn_ctrl_t` control bytes. The
* length of the array and position of the elements must match
* the number and order of the individual buttons (i.e. excludes
* newline entries).
2019-06-17 16:05:30 +02:00
* An element of the map should look like e.g.:
* `ctrl_map[0] = width | LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_TGL_ENABLE`
*/
2020-02-15 00:33:26 +01:00
void lv_btnmatrix_set_ctrl_map(lv_obj_t * btnm, const lv_btnmatrix_ctrl_t ctrl_map[]);
/**
2020-03-10 22:11:17 +01:00
* Set the focused button i.e. visually highlight it.
* @param btnm pointer to button matrix object
2020-03-10 22:11:17 +01:00
* @param id index of the button to focus(`LV_BTNMATRIX_BTN_NONE` to remove focus)
*/
2020-03-10 22:11:17 +01:00
void lv_btnmatrix_set_focused_btn(lv_obj_t * btnm, uint16_t id);
/**
* Enable recoloring of button's texts
* @param btnm pointer to button matrix object
* @param en true: enable recoloring; false: disable
*/
void lv_btnmatrix_set_recolor(const lv_obj_t * btnm, bool en);
/**
2019-06-17 16:05:30 +02:00
* Set the attributes of a button of the button matrix
* @param btnm pointer to button matrix object
* @param btn_id 0 based index of the button to modify. (Not counting new lines)
*/
void lv_btnmatrix_set_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl);
2019-06-17 16:05:30 +02:00
/**
* Clear the attributes of a button of the button matrix
* @param btnm pointer to button matrix object
* @param btn_id 0 based index of the button to modify. (Not counting new lines)
*/
void lv_btnmatrix_clear_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl);
/**
* Set the attributes of all buttons of a button matrix
* @param btnm pointer to a button matrix object
* @param ctrl attribute(s) to set from `lv_btnmatrix_ctrl_t`. Values can be ORed.
2019-06-17 16:05:30 +02:00
*/
void lv_btnmatrix_set_btn_ctrl_all(lv_obj_t * btnm, lv_btnmatrix_ctrl_t ctrl);
2019-06-17 16:05:30 +02:00
/**
* Clear the attributes of all buttons of a button matrix
* @param btnm pointer to a button matrix object
* @param ctrl attribute(s) to set from `lv_btnmatrix_ctrl_t`. Values can be ORed.
* @param en true: set the attributes; false: clear the attributes
*/
void lv_btnmatrix_clear_btn_ctrl_all(lv_obj_t * btnm, lv_btnmatrix_ctrl_t ctrl);
/**
* Set a single buttons relative width.
* This method will cause the matrix be regenerated and is a relatively
* expensive operation. It is recommended that initial width be specified using
* `lv_btnmatrix_set_ctrl_map` and this method only be used for dynamic changes.
* @param btnm pointer to button matrix object
* @param btn_id 0 based index of the button to modify.
* @param width Relative width compared to the buttons in the same row. [1..7]
*/
2020-02-14 22:04:00 +01:00
void lv_btnmatrix_set_btn_width(lv_obj_t * btnm, uint16_t btn_id, uint8_t width);
/**
* Make the button matrix like a selector widget (only one button may be toggled at a time).
2020-03-04 16:29:21 +01:00
* `Checkable` must be enabled on the buttons you want to be selected with `lv_btnmatrix_set_ctrl` or
* `lv_btnmatrix_set_btn_ctrl_all`.
* @param btnm Button matrix object
2020-03-04 16:29:21 +01:00
* @param one_chk Whether "one check" mode is enabled
*/
2020-03-04 16:29:21 +01:00
void lv_btnmatrix_set_one_check(lv_obj_t * btnm, bool one_chk);
2017-11-10 15:01:40 +01:00
/*=====================
* Getter functions
*====================*/
/**
* Get the current map of a button matrix
* @param btnm pointer to a button matrix object
* @return the current map
*/
const char ** lv_btnmatrix_get_map_array(const lv_obj_t * btnm);
/**
* Check whether the button's text can use recolor or not
* @param btnm pointer to button matrix object
* @return true: text recolor enable; false: disabled
*/
bool lv_btnmatrix_get_recolor(const lv_obj_t * btnm);
2018-11-19 07:00:17 +01:00
/**
* Get the index of the lastly "activated" button by the user (pressed, released etc)
* Useful in the the `event_cb` to get the text of the button, check if hidden etc.
2018-11-19 07:00:17 +01:00
* @param btnm pointer to button matrix object
* @return index of the last released button (LV_BTNMATRIX_BTN_NONE: if unset)
2018-11-19 07:00:17 +01:00
*/
uint16_t lv_btnmatrix_get_active_btn(const lv_obj_t * btnm);
2019-03-12 06:20:45 +01:00
/**
* Get the text of the lastly "activated" button by the user (pressed, released etc)
* Useful in the the `event_cb`
* @param btnm pointer to button matrix object
* @return text of the last released button (NULL: if unset)
*/
const char * lv_btnmatrix_get_active_btn_text(const lv_obj_t * btnm);
2019-03-12 06:20:45 +01:00
/**
2020-03-10 22:11:17 +01:00
* Get the focused button's index.
* @param btnm pointer to button matrix object
2020-03-10 22:11:17 +01:00
* @return index of the focused button (LV_BTNMATRIX_BTN_NONE: if unset)
*/
2020-03-10 22:11:17 +01:00
uint16_t lv_btnmatrix_get_focused_btn(const lv_obj_t * btnm);
2017-04-21 09:15:39 +02:00
2017-11-10 15:01:40 +01:00
/**
* Get the button's text
* @param btnm pointer to button matrix object
2019-04-04 07:15:40 +02:00
* @param btn_id the index a button not counting new line characters. (The return value of
* lv_btnmatrix_get_pressed/released)
* @return text of btn_index` button
*/
const char * lv_btnmatrix_get_btn_text(const lv_obj_t * btnm, uint16_t btn_id);
/**
* Get the whether a control value is enabled or disabled for button of a button matrix
2017-11-10 15:01:40 +01:00
* @param btnm pointer to a button matrix object
2019-04-04 07:15:40 +02:00
* @param btn_id the index a button not counting new line characters. (E.g. the return value of
* lv_btnmatrix_get_pressed/released)
* @param ctrl control values to check (ORed value can be used)
* @return true: long press repeat is disabled; false: long press repeat enabled
*/
bool lv_btnmatrix_get_btn_ctrl(lv_obj_t * btnm, uint16_t btn_id, lv_btnmatrix_ctrl_t ctrl);
/**
* Find whether "one toggle" mode is enabled.
* @param btnm Button matrix object
* @return whether "one toggle" mode is enabled
*/
2020-03-04 16:29:21 +01:00
bool lv_btnmatrix_get_one_check(const lv_obj_t * btnm);
2016-09-30 13:35:54 +02:00
/**********************
* MACROS
**********************/
#endif /*LV_USE_BTNMATRIX*/
2016-09-30 13:35:54 +02:00
2017-07-09 15:32:49 +02:00
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*LV_BTNMATRIX_H*/