247 lines
6.8 KiB
C
247 lines
6.8 KiB
C
|
/**
|
||
|
* @file lv_group.h
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef LV_GROUP_H
|
||
|
#define LV_GROUP_H
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*********************
|
||
|
* INCLUDES
|
||
|
*********************/
|
||
|
|
||
|
#include "../lv_conf_internal.h"
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <stdbool.h>
|
||
|
#include "../misc/lv_ll.h"
|
||
|
#include "../misc/lv_types.h"
|
||
|
|
||
|
/*********************
|
||
|
* DEFINES
|
||
|
*********************/
|
||
|
/*Predefined keys to control the focused object via lv_group_send(group, c)*/
|
||
|
|
||
|
enum {
|
||
|
LV_KEY_UP = 17, /*0x11*/
|
||
|
LV_KEY_DOWN = 18, /*0x12*/
|
||
|
LV_KEY_RIGHT = 19, /*0x13*/
|
||
|
LV_KEY_LEFT = 20, /*0x14*/
|
||
|
LV_KEY_ESC = 27, /*0x1B*/
|
||
|
LV_KEY_DEL = 127, /*0x7F*/
|
||
|
LV_KEY_BACKSPACE = 8, /*0x08*/
|
||
|
LV_KEY_ENTER = 10, /*0x0A, '\n'*/
|
||
|
LV_KEY_NEXT = 9, /*0x09, '\t'*/
|
||
|
LV_KEY_PREV = 11, /*0x0B, '*/
|
||
|
LV_KEY_HOME = 2, /*0x02, STX*/
|
||
|
LV_KEY_END = 3, /*0x03, ETX*/
|
||
|
};
|
||
|
typedef uint8_t lv_key_t;
|
||
|
|
||
|
/**********************
|
||
|
* TYPEDEFS
|
||
|
**********************/
|
||
|
|
||
|
struct _lv_obj_t;
|
||
|
struct _lv_group_t;
|
||
|
|
||
|
typedef void (*lv_group_focus_cb_t)(struct _lv_group_t *);
|
||
|
|
||
|
/**
|
||
|
* Groups can be used to logically hold objects so that they can be individually focused.
|
||
|
* They are NOT for laying out objects on a screen (try layouts for that).
|
||
|
*/
|
||
|
typedef struct _lv_group_t {
|
||
|
lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/
|
||
|
struct _lv_obj_t ** obj_focus; /**< The object in focus*/
|
||
|
|
||
|
lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/
|
||
|
#if LV_USE_USER_DATA
|
||
|
void * user_data;
|
||
|
#endif
|
||
|
|
||
|
uint8_t frozen : 1; /**< 1: can't focus to new object*/
|
||
|
uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/
|
||
|
uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on
|
||
|
deletion.*/
|
||
|
uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end
|
||
|
of list.*/
|
||
|
} lv_group_t;
|
||
|
|
||
|
|
||
|
typedef enum {
|
||
|
LV_GROUP_REFOCUS_POLICY_NEXT = 0,
|
||
|
LV_GROUP_REFOCUS_POLICY_PREV = 1
|
||
|
} lv_group_refocus_policy_t;
|
||
|
|
||
|
/**********************
|
||
|
* GLOBAL PROTOTYPES
|
||
|
**********************/
|
||
|
|
||
|
/**
|
||
|
* Init. the group module
|
||
|
* @remarks Internal function, do not call directly.
|
||
|
*/
|
||
|
void _lv_group_init(void);
|
||
|
|
||
|
/**
|
||
|
* Create a new object group
|
||
|
* @return pointer to the new object group
|
||
|
*/
|
||
|
lv_group_t * lv_group_create(void);
|
||
|
|
||
|
/**
|
||
|
* Delete a group object
|
||
|
* @param group pointer to a group
|
||
|
*/
|
||
|
void lv_group_del(lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Set a default group. New object are added to this group if it's enabled in their class with `add_to_def_group = true`
|
||
|
* @param group pointer to a group (can be `NULL`)
|
||
|
*/
|
||
|
void lv_group_set_default(lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Get the default group
|
||
|
* @return pointer to the default group
|
||
|
*/
|
||
|
lv_group_t * lv_group_get_default(void);
|
||
|
|
||
|
/**
|
||
|
* Add an object to a group
|
||
|
* @param group pointer to a group
|
||
|
* @param obj pointer to an object to add
|
||
|
*/
|
||
|
void lv_group_add_obj(lv_group_t * group, struct _lv_obj_t * obj);
|
||
|
|
||
|
/**
|
||
|
* Swap 2 object in a group. The object must be in the same group
|
||
|
* @param obj1 pointer to an object
|
||
|
* @param obj2 pointer to an other object
|
||
|
*/
|
||
|
void lv_group_swap_obj(struct _lv_obj_t * obj1, struct _lv_obj_t * obj2);
|
||
|
|
||
|
/**
|
||
|
* Remove an object from its group
|
||
|
* @param obj pointer to an object to remove
|
||
|
*/
|
||
|
void lv_group_remove_obj(struct _lv_obj_t * obj);
|
||
|
|
||
|
/**
|
||
|
* Remove all objects from a group
|
||
|
* @param group pointer to a group
|
||
|
*/
|
||
|
void lv_group_remove_all_objs(lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Focus on an object (defocus the current)
|
||
|
* @param obj pointer to an object to focus on
|
||
|
*/
|
||
|
void lv_group_focus_obj(struct _lv_obj_t * obj);
|
||
|
|
||
|
/**
|
||
|
* Focus the next object in a group (defocus the current)
|
||
|
* @param group pointer to a group
|
||
|
*/
|
||
|
void lv_group_focus_next(lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Focus the previous object in a group (defocus the current)
|
||
|
* @param group pointer to a group
|
||
|
*/
|
||
|
void lv_group_focus_prev(lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Do not let to change the focus from the current object
|
||
|
* @param group pointer to a group
|
||
|
* @param en true: freeze, false: release freezing (normal mode)
|
||
|
*/
|
||
|
void lv_group_focus_freeze(lv_group_t * group, bool en);
|
||
|
|
||
|
/**
|
||
|
* Send a control character to the focuses object of a group
|
||
|
* @param group pointer to a group
|
||
|
* @param c a character (use LV_KEY_.. to navigate)
|
||
|
* @return result of focused object in group.
|
||
|
*/
|
||
|
lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c);
|
||
|
|
||
|
/**
|
||
|
* Set a function for a group which will be called when a new object is focused
|
||
|
* @param group pointer to a group
|
||
|
* @param focus_cb the call back function or NULL if unused
|
||
|
*/
|
||
|
void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb);
|
||
|
|
||
|
/**
|
||
|
* Set whether the next or previous item in a group is focused if the currently focused obj is
|
||
|
* deleted.
|
||
|
* @param group pointer to a group
|
||
|
* @param policy new refocus policy enum
|
||
|
*/
|
||
|
void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy);
|
||
|
|
||
|
/**
|
||
|
* Manually set the current mode (edit or navigate).
|
||
|
* @param group pointer to group
|
||
|
* @param edit true: edit mode; false: navigate mode
|
||
|
*/
|
||
|
void lv_group_set_editing(lv_group_t * group, bool edit);
|
||
|
|
||
|
/**
|
||
|
* Set whether focus next/prev will allow wrapping from first->last or last->first object.
|
||
|
* @param group pointer to group
|
||
|
* @param en true: wrapping enabled; false: wrapping disabled
|
||
|
*/
|
||
|
void lv_group_set_wrap(lv_group_t * group, bool en);
|
||
|
|
||
|
/**
|
||
|
* Get the focused object or NULL if there isn't one
|
||
|
* @param group pointer to a group
|
||
|
* @return pointer to the focused object
|
||
|
*/
|
||
|
struct _lv_obj_t * lv_group_get_focused(const lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Get the focus callback function of a group
|
||
|
* @param group pointer to a group
|
||
|
* @return the call back function or NULL if not set
|
||
|
*/
|
||
|
lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Get the current mode (edit or navigate).
|
||
|
* @param group pointer to group
|
||
|
* @return true: edit mode; false: navigate mode
|
||
|
*/
|
||
|
bool lv_group_get_editing(const lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Get whether focus next/prev will allow wrapping from first->last or last->first object.
|
||
|
* @param group pointer to group
|
||
|
* @param en true: wrapping enabled; false: wrapping disabled
|
||
|
*/
|
||
|
bool lv_group_get_wrap(lv_group_t * group);
|
||
|
|
||
|
/**
|
||
|
* Get the number of object in the group
|
||
|
* @param group pointer to a group
|
||
|
* @return number of objects in the group
|
||
|
*/
|
||
|
uint32_t lv_group_get_obj_count(lv_group_t * group);
|
||
|
|
||
|
/**********************
|
||
|
* MACROS
|
||
|
**********************/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
} /*extern "C"*/
|
||
|
#endif
|
||
|
|
||
|
#endif /*LV_GROUP_H*/
|