Add local page transitions

This commit is contained in:
fvanroie 2021-03-08 04:30:59 +01:00
parent cc6ce5c4f8
commit 27e7c95cef
12 changed files with 68 additions and 55 deletions

View File

@ -517,10 +517,11 @@ typedef void* lv_font_user_data_t;
/*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/ /*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/
typedef struct { typedef struct {
uint8_t objid:8;
uint8_t pageaction:8;
uint8_t groupid:8;
uint8_t id:8; uint8_t id:8;
uint8_t objid:8;
uint8_t transitionid:4;
uint8_t actionid:4;
uint8_t groupid:4;
} lv_obj_user_data_t; } lv_obj_user_data_t;
/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ /*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/

View File

@ -582,9 +582,11 @@ typedef void * lv_font_user_data_t;
*==================*/ *==================*/
typedef struct { typedef struct {
uint8_t id:8;
uint8_t objid:8; uint8_t objid:8;
uint8_t groupid:8; uint8_t transitionid:4;
uint8_t id; uint8_t actionid:4;
uint8_t groupid:4;
} lv_obj_user_data_t; } lv_obj_user_data_t;
#if LV_USE_USER_DATA #if LV_USE_USER_DATA

View File

@ -425,7 +425,7 @@ void haspSetup(void)
haspPages.init(haspStartPage); haspPages.init(haspStartPage);
haspPages.load_jsonl(haspPagesPath); haspPages.load_jsonl(haspPagesPath);
haspPages.set(haspStartPage); haspPages.set(haspStartPage, LV_SCR_LOAD_ANIM_NONE);
} }
/********************** /**********************

View File

@ -1407,8 +1407,12 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
break; // attribute_found break; // attribute_found
case ATTR_ACTION: case ATTR_ACTION:
update ? (void)(obj->user_data.pageaction = (uint8_t)val) update ? (void)(obj->user_data.actionid = (uint8_t)val) : hasp_out_int(obj, attr, obj->user_data.actionid);
: hasp_out_int(obj, attr, obj->user_data.pageaction); break; // attribute_found
case ATTR_TRANSITION:
update ? (void)(obj->user_data.transitionid = (uint8_t)val)
: hasp_out_int(obj, attr, obj->user_data.transitionid);
break; // attribute_found break; // attribute_found
case ATTR_OBJID: case ATTR_OBJID:

View File

@ -313,6 +313,7 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t)
/* hasp user data */ /* hasp user data */
#define ATTR_ACTION 42102 #define ATTR_ACTION 42102
#define ATTR_TRANSITION 10933
#define ATTR_GROUPID 48986 #define ATTR_GROUPID 48986
#define ATTR_OBJID 41010 #define ATTR_OBJID 41010

View File

@ -819,27 +819,32 @@ void dispatch_output_current_page()
} }
// Dispatch Page Get or Set // Dispatch Page Get or Set
void dispatch_page_next() void dispatch_page_next(lv_scr_load_anim_t animation)
{ {
haspPages.next(); haspPages.next(animation);
dispatch_output_current_page(); dispatch_output_current_page();
} }
void dispatch_page_prev() void dispatch_page_prev(lv_scr_load_anim_t animation)
{ {
haspPages.prev(); haspPages.prev(animation);
dispatch_output_current_page(); dispatch_output_current_page();
} }
void dispatch_page_back() void dispatch_page_back(lv_scr_load_anim_t animation)
{ {
haspPages.back(); haspPages.back(animation);
dispatch_output_current_page(); dispatch_output_current_page();
} }
void dispatch_set_page(uint8_t pageid) void dispatch_set_page(uint8_t pageid)
{ {
haspPages.set(pageid); dispatch_set_page(pageid, LV_SCR_LOAD_ANIM_NONE);
}
void dispatch_set_page(uint8_t pageid, lv_scr_load_anim_t animation)
{
haspPages.set(pageid, animation);
dispatch_output_current_page(); dispatch_output_current_page();
} }
@ -850,15 +855,16 @@ void dispatch_page(const char*, const char* page)
return; return;
} }
lv_scr_load_anim_t animation = LV_SCR_LOAD_ANIM_NONE;
if(Utilities::is_only_digits(page)) { if(Utilities::is_only_digits(page)) {
uint8_t pageid = atoi(page); uint8_t pageid = atoi(page);
dispatch_set_page(pageid); dispatch_set_page(pageid, animation);
} else if(!strcasecmp_P(page, PSTR("prev"))) { } else if(!strcasecmp_P(page, PSTR("prev"))) {
dispatch_page_prev(); dispatch_page_prev(animation);
} else if(!strcasecmp_P(page, PSTR("next"))) { } else if(!strcasecmp_P(page, PSTR("next"))) {
dispatch_page_next(); dispatch_page_next(animation);
} else if(!strcasecmp_P(page, PSTR("back"))) { } else if(!strcasecmp_P(page, PSTR("back"))) {
dispatch_page_back(); dispatch_page_back(animation);
} else { } else {
LOG_WARNING(TAG_MSGR, PSTR(D_DISPATCH_INVALID_PAGE), page); LOG_WARNING(TAG_MSGR, PSTR(D_DISPATCH_INVALID_PAGE), page);
} }

View File

@ -47,10 +47,11 @@ void dispatch_parse_jsonl(std::istringstream& stream);
void dispatch_clear_page(const char* page); void dispatch_clear_page(const char* page);
void dispatch_json_error(uint8_t tag, DeserializationError& jsonError); void dispatch_json_error(uint8_t tag, DeserializationError& jsonError);
void dispatch_set_page(uint8_t pageid); // void dispatch_set_page(uint8_t pageid);
void dispatch_page_next(); void dispatch_set_page(uint8_t pageid, lv_scr_load_anim_t effectid);
void dispatch_page_prev(); void dispatch_page_next(lv_scr_load_anim_t effectid);
void dispatch_page_back(); void dispatch_page_prev(lv_scr_load_anim_t effectid);
void dispatch_page_back(lv_scr_load_anim_t effectid);
void dispatch_dim(const char* level); void dispatch_dim(const char* level);
void dispatch_backlight(const char* payload); void dispatch_backlight(const char* payload);

View File

@ -352,14 +352,12 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event)
hasp_update_sleep_state(); // wakeup? hasp_update_sleep_state(); // wakeup?
/* If a pageaction is attached, perform that action on UP event only */ /* If an actionid is attached, perform that action on UP event only */
if(obj->user_data.pageaction) { if(obj->user_data.actionid) {
if(eventid == HASP_EVENT_UP) { if(eventid == HASP_EVENT_UP || eventid == HASP_EVENT_SHORT) {
lv_scr_load_anim_t effectid = LV_SCR_LOAD_ANIM_NONE; lv_scr_load_anim_t transitionid = (lv_scr_load_anim_t)obj->user_data.transitionid;
if(obj->user_data.pageaction >> 4 <= LV_SCR_LOAD_ANIM_FADE_ON) haspPages.set(obj->user_data.actionid, transitionid);
effectid = (lv_scr_load_anim_t)(obj->user_data.pageaction >> 4); dispatch_set_page(obj->user_data.actionid, transitionid);
uint8_t pageid = obj->user_data.pageaction & 0x0F;
haspPages.set(pageid, effectid);
} }
} else { } else {
dispatch_object_generic_event(obj, eventid); // send object event dispatch_object_generic_event(obj, eventid); // send object event

View File

@ -43,12 +43,12 @@ void Page::clear(uint16_t pageid)
} }
} }
void Page::set(uint8_t pageid) // void Page::set(uint8_t pageid)
{ // {
set(pageid, LV_SCR_LOAD_ANIM_NONE); // set(pageid, LV_SCR_LOAD_ANIM_NONE);
} // }
void Page::set(uint8_t pageid, lv_scr_load_anim_t effectid) void Page::set(uint8_t pageid, lv_scr_load_anim_t animation)
{ {
lv_obj_t* page = get_obj(pageid); lv_obj_t* page = get_obj(pageid);
if(!page || pageid == 0 || pageid > HASP_NUM_PAGES) { if(!page || pageid == 0 || pageid > HASP_NUM_PAGES) {
@ -56,24 +56,24 @@ void Page::set(uint8_t pageid, lv_scr_load_anim_t effectid)
} else { } else {
LOG_TRACE(TAG_HASP, F(D_HASP_CHANGE_PAGE), pageid); LOG_TRACE(TAG_HASP, F(D_HASP_CHANGE_PAGE), pageid);
_current_page = pageid; _current_page = pageid;
lv_scr_load_anim(page, effectid, 1000, 0, false); lv_scr_load_anim(page, animation, 1000, 0, false);
hasp_object_tree(page, pageid, 0); hasp_object_tree(page, pageid, 0);
} }
} }
void Page::next() void Page::next(lv_scr_load_anim_t animation)
{ {
set(_meta_data[_current_page - PAGE_START_INDEX].next); set(_meta_data[_current_page - PAGE_START_INDEX].next, animation);
} }
void Page::prev() void Page::prev(lv_scr_load_anim_t animation)
{ {
set(_meta_data[_current_page - PAGE_START_INDEX].prev); set(_meta_data[_current_page - PAGE_START_INDEX].prev, animation);
} }
void Page::back() void Page::back(lv_scr_load_anim_t animation)
{ {
set(_meta_data[_current_page - PAGE_START_INDEX].back); set(_meta_data[_current_page - PAGE_START_INDEX].back, animation);
} }
uint8_t Page::get() uint8_t Page::get()

View File

@ -36,11 +36,11 @@ class Page {
size_t count(); size_t count();
void init(uint8_t start_page); void init(uint8_t start_page);
void clear(uint16_t pageid); void clear(uint16_t pageid);
void set(uint8_t pageid); // void set(uint8_t pageid);
void set(uint8_t pageid, lv_scr_load_anim_t effectid); void set(uint8_t pageid, lv_scr_load_anim_t animation);
void next(); void next(lv_scr_load_anim_t animation);
void prev(); void prev(lv_scr_load_anim_t animation);
void back(); void back(lv_scr_load_anim_t animation);
uint8_t get(); uint8_t get();
void load_jsonl(const char* pagesfile); void load_jsonl(const char* pagesfile);
lv_obj_t* get_obj(uint8_t pageid); lv_obj_t* get_obj(uint8_t pageid);

View File

@ -698,15 +698,15 @@ void debugLoop(void)
switch(keypress = debugConsole.readKey()) { switch(keypress = debugConsole.readKey()) {
case ConsoleInput::KEY_PAGE_UP: case ConsoleInput::KEY_PAGE_UP:
dispatch_page_next(); dispatch_page_next(LV_SCR_LOAD_ANIM_NONE);
break; break;
case ConsoleInput::KEY_PAGE_DOWN: case ConsoleInput::KEY_PAGE_DOWN:
dispatch_page_prev(); dispatch_page_prev(LV_SCR_LOAD_ANIM_NONE);
break; break;
case(ConsoleInput::KEY_FN)...(ConsoleInput::KEY_FN + 12): case(ConsoleInput::KEY_FN)...(ConsoleInput::KEY_FN + 12):
dispatch_set_page(keypress - ConsoleInput::KEY_FN); dispatch_set_page(keypress - ConsoleInput::KEY_FN, LV_SCR_LOAD_ANIM_NONE);
break; break;
} }
} while(keypress != 0); } while(keypress != 0);

View File

@ -376,11 +376,11 @@ void webHandleScreenshot()
if(webServer.hasArg(F("a"))) { if(webServer.hasArg(F("a"))) {
if(webServer.arg(F("a")) == F("next")) { if(webServer.arg(F("a")) == F("next")) {
dispatch_page_next(); dispatch_page_next(LV_SCR_LOAD_ANIM_NONE);
} else if(webServer.arg(F("a")) == F("prev")) { } else if(webServer.arg(F("a")) == F("prev")) {
dispatch_page_prev(); dispatch_page_prev(LV_SCR_LOAD_ANIM_NONE);
} else if(webServer.arg(F("a")) == F("back")) { } else if(webServer.arg(F("a")) == F("back")) {
dispatch_page_back(); dispatch_page_back(LV_SCR_LOAD_ANIM_NONE);
} }
} }
@ -1962,7 +1962,7 @@ void httpSetup()
webServer.on(F("/page/"), []() { webServer.on(F("/page/"), []() {
String pageid = webServer.arg(F("page")); String pageid = webServer.arg(F("page"));
webServer.send(200, PSTR("text/plain"), "Page: '" + pageid + "'"); webServer.send(200, PSTR("text/plain"), "Page: '" + pageid + "'");
dispatch_set_page(pageid.toInt()); dispatch_set_page(pageid.toInt(), LV_SCR_LOAD_ANIM_NONE);
}); });
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 #if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0