Add back, prev, next attributes to pages #114

This commit is contained in:
fvanroie 2021-04-17 03:14:49 +02:00
parent 0db2a8be67
commit 971846efea
5 changed files with 97 additions and 16 deletions

View File

@ -178,11 +178,6 @@ static bool attribute_update_lv_property(lv_obj_t * obj, const char * attr_p, ui
}
#endif
static void my_obj_set_swipeid(lv_obj_t* obj, uint8_t swipeid)
{
if(obj) obj->user_data.swipeid = swipeid % 16;
}
// OK - this function is missing in lvgl
static uint8_t my_roller_get_visible_row_count(lv_obj_t* roller)
{
@ -1250,6 +1245,29 @@ static void hasp_process_gauge_attribute(lv_obj_t* obj, const char* attr_p, uint
// ##################### Common Attributes ########################################################
static void hasp_process_page_attributes(lv_obj_t* obj, const char* attr_p, uint16_t attr_hash, uint8_t val,
bool update)
{
uint8_t pageid;
if(haspPages.get_id(obj, &pageid)) {
switch(attr_hash) {
case ATTR_NEXT:
update ? haspPages.set_next(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_next(pageid));
break;
case ATTR_PREV:
update ? haspPages.set_prev(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_prev(pageid));
break;
// case ATTR_BACK:
default:
update ? haspPages.set_back(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_back(pageid));
break;
}
}
}
static void hasp_process_obj_attribute_txt(lv_obj_t* obj, const char* attr, const char* payload, bool update)
{
/* Attributes depending on objecttype */
@ -1418,13 +1436,12 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
LOG_WARNING(TAG_ATTR, F(D_OBJECT_UNKNOWN));
return;
}
int16_t val = atoi(payload);
char* attr = (char*)attr_p;
if(*attr == '.') attr++; // strip leading '.'
uint16_t attr_hash = Parser::get_sdbm(attr);
// LOG_VERBOSE(TAG_ATTR,"%s => %d", attr, attr_hash);
int16_t val = atoi(payload);
/* 16-bit Hash Lookup Table */
switch(attr_hash) {
@ -1543,7 +1560,7 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
break; // attribute_found
case ATTR_SWIPE:
update ? my_obj_set_swipeid(obj, Parser::is_true(payload))
update ? (void)(obj->user_data.swipeid = Parser::is_true(payload) % 16)
: attr_out_int(obj, attr, obj->user_data.swipeid);
break; // attribute_found
@ -1765,6 +1782,15 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
lv_obj_move_background(obj);
break; // attribute_found
case ATTR_NEXT:
case ATTR_PREV:
case ATTR_BACK:
if(check_obj_type(obj, LV_HASP_SCREEN)) {
hasp_process_page_attributes(obj, attr_p, attr_hash, val, update);
break; // attribute_found
}
goto attribute_not_found;
default:
hasp_local_style_attr(obj, attr, attr_hash, payload, update);
}

View File

@ -260,6 +260,11 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t)
#define ATTR_SCALE_WIDTH 36017
#define ATTR_SCALE_END_COLOR 44074
/* Page Attributes */
#define ATTR_NEXT 60915
#define ATTR_PREV 21587
#define ATTR_BACK 57799
/* Object Attributes */
#define ATTR_X 120
#define ATTR_Y 121

View File

@ -35,6 +35,7 @@ enum lv_hasp_obj_type_t {
LV_HASP_CALENDER = 54,
/* Containers */
LV_HASP_SCREEN = 1,
LV_HASP_CONTAINER = 70,
LV_HASP_WINDOW = 71, // placeholder
LV_HASP_MSGBOX = 72, // placeholder

View File

@ -8,6 +8,14 @@
namespace hasp {
bool Page::is_valid(uint8_t pageid)
{
if(pageid > 0 && pageid <= HASP_NUM_PAGES) return true;
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid);
return false;
}
Page::Page()
{
// LVGL is not yet initialized at construction time
@ -21,7 +29,8 @@ size_t Page::count()
void Page::init(uint8_t start_page)
{
for(int i = 0; i < count(); i++) {
_pages[i] = lv_obj_create(NULL, NULL);
_pages[i] = lv_obj_create(NULL, NULL);
_pages[i]->user_data.objid = LV_HASP_SCREEN;
lv_obj_set_event_cb(_pages[i], generic_event_handler);
/**< If the `indev` was pressing this object but swiped out while pressing do not search other object.*/
@ -34,14 +43,12 @@ void Page::init(uint8_t start_page)
}
}
void Page::clear(uint16_t pageid)
void Page::clear(uint8_t pageid)
{
lv_obj_t* page = get_obj(pageid);
if(!page || (pageid > HASP_NUM_PAGES)) {
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid);
} else if(page == lv_layer_sys() /*|| page == lv_layer_top()*/) {
if(page == lv_layer_sys() /*|| page == lv_layer_top()*/) {
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_LAYER));
} else {
} else if(is_valid(pageid)) {
LOG_TRACE(TAG_HASP, F(D_HASP_CLEAR_PAGE), pageid);
lv_obj_clean(page);
}
@ -55,7 +62,9 @@ void Page::clear(uint16_t pageid)
void Page::set(uint8_t pageid, lv_scr_load_anim_t animation)
{
lv_obj_t* page = get_obj(pageid);
if(!page || pageid == 0 || pageid > HASP_NUM_PAGES) {
if(!is_valid(pageid)) {
return;
} else if(!page) {
LOG_WARNING(TAG_HASP, F(D_HASP_INVALID_PAGE), pageid);
} else {
LOG_TRACE(TAG_HASP, F(D_HASP_CHANGE_PAGE), pageid);
@ -67,6 +76,36 @@ void Page::set(uint8_t pageid, lv_scr_load_anim_t animation)
}
}
uint8_t Page::get_next(uint8_t pageid)
{
return is_valid(pageid) ? _meta_data[pageid - PAGE_START_INDEX].next : 0;
}
uint8_t Page::get_prev(uint8_t pageid)
{
return is_valid(pageid) ? _meta_data[pageid - PAGE_START_INDEX].prev : 0;
}
uint8_t Page::get_back(uint8_t pageid)
{
return is_valid(pageid) ? _meta_data[pageid - PAGE_START_INDEX].back : 0;
}
void Page::set_next(uint8_t pageid, uint8_t nextid)
{
if(is_valid(pageid) && is_valid(nextid)) _meta_data[pageid - PAGE_START_INDEX].next = nextid;
}
void Page::set_prev(uint8_t pageid, uint8_t previd)
{
if(is_valid(pageid) && is_valid(previd)) _meta_data[pageid - PAGE_START_INDEX].prev = previd;
}
void Page::set_back(uint8_t pageid, uint8_t backid)
{
if(is_valid(pageid) && is_valid(backid)) _meta_data[pageid - PAGE_START_INDEX].back = backid;
}
void Page::next(lv_scr_load_anim_t animation)
{
set(_meta_data[_current_page - PAGE_START_INDEX].next, animation);

View File

@ -35,16 +35,26 @@ class Page {
Page();
size_t count();
void init(uint8_t start_page);
void clear(uint16_t pageid);
void clear(uint8_t pageid);
// void set(uint8_t pageid);
void set(uint8_t pageid, lv_scr_load_anim_t animation);
void next(lv_scr_load_anim_t animation);
void prev(lv_scr_load_anim_t animation);
void back(lv_scr_load_anim_t animation);
uint8_t get_next(uint8_t pageid);
uint8_t get_prev(uint8_t pageid);
uint8_t get_back(uint8_t pageid);
void set_next(uint8_t pageid, uint8_t nextid);
void set_prev(uint8_t pageid, uint8_t previd);
void set_back(uint8_t pageid, uint8_t backid);
uint8_t get();
void load_jsonl(const char* pagesfile);
lv_obj_t* get_obj(uint8_t pageid);
bool get_id(lv_obj_t* obj, uint8_t* pageid);
bool is_valid(uint8_t pageid);
};
} // namespace hasp