From 02170636908d0fe8be3bc3f2b3e905a313914f86 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Wed, 13 Oct 2021 17:54:36 +0200 Subject: [PATCH] Add textarea object --- src/hasp/hasp_attribute.cpp | 17 ++++++++++++++--- src/hasp/hasp_attribute_helper.h | 7 +++++++ src/hasp/hasp_event.cpp | 31 ++++++++++++++++++++++++++++++- src/hasp/hasp_event.h | 1 + src/hasp/hasp_object.cpp | 12 ++++++++++++ src/hasp_gui.cpp | 4 ++-- 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index 73dfbe3a..1700a701 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -218,7 +218,7 @@ static bool my_line_set_points(lv_obj_t* obj, const char* payload) } } - my_line_clear_points(obj); // free previous pointlist + my_line_clear_points(obj); // free previous pointlist lv_line_set_points(obj, point_arr, index); // arr.size()); return true; } @@ -829,7 +829,8 @@ static hasp_attribute_type_t hasp_process_arc_attribute(lv_obj_t* obj, uint16_t return HASP_ATTR_TYPE_INT; } -static hasp_attribute_type_t hasp_process_spinner_attribute(lv_obj_t* obj, uint16_t attr_hash, int32_t& val, bool update) +static hasp_attribute_type_t hasp_process_spinner_attribute(lv_obj_t* obj, uint16_t attr_hash, int32_t& val, + bool update) { // We already know it's a spnner object switch(attr_hash) { @@ -1182,6 +1183,13 @@ static hasp_attribute_type_t attribute_common_align(lv_obj_t* obj, const char* a val = lv_label_get_align(obj); break; + case LV_HASP_TEXTAREA: + if(update) + lv_textarea_set_text_align(obj, val); + else + val = my_textarea_get_text_align(obj); + break; + case LV_HASP_ROLLER: if(update) lv_roller_set_align(obj, val); @@ -1255,6 +1263,7 @@ static hasp_attribute_type_t attribute_common_text(lv_obj_t* obj, const char* at {LV_HASP_LABEL, ATTR_TEXT, my_label_set_text, my_label_get_text}, {LV_HASP_CHECKBOX, ATTR_TEXT, lv_checkbox_set_text, lv_checkbox_get_text}, {LV_HASP_TABVIEW, ATTR_TEXT, my_tabview_set_text, my_tabview_get_text}, + {LV_HASP_TEXTAREA, ATTR_TEXT, lv_textarea_set_text, lv_textarea_get_text}, {LV_HASP_TAB, ATTR_TEXT, my_tab_set_text, my_tab_get_text}, #if LV_USE_WIN != 0 {LV_HASP_WINDOW, ATTR_TEXT, lv_win_set_title, lv_win_get_title}, @@ -1390,9 +1399,11 @@ static hasp_attribute_type_t specific_int_attribute(lv_obj_t* obj, uint16_t attr {LV_HASP_SWITCH, ATTR_ANIM_TIME, lv_switch_set_anim_time, lv_switch_get_anim_time}, {LV_HASP_LIST, ATTR_ANIM_TIME, lv_list_set_anim_time, lv_list_get_anim_time}, {LV_HASP_MSGBOX, ATTR_ANIM_TIME, lv_msgbox_set_anim_time, lv_msgbox_get_anim_time}, - {LV_HASP_PAGE, ATTR_ANIM_TIME, lv_page_set_anim_time, lv_page_get_anim_time}, {LV_HASP_ROLLER, ATTR_ANIM_TIME, lv_roller_set_anim_time, lv_roller_get_anim_time}, {LV_HASP_TABVIEW, ATTR_ANIM_TIME, lv_tabview_set_anim_time, lv_tabview_get_anim_time}, +#if LVGL_VERSION_MAJOR == 7 && LV_USE_PAGE + {LV_HASP_PAGE, ATTR_ANIM_TIME, lv_page_set_anim_time, lv_page_get_anim_time}, +#endif #if LV_USE_WINDOW > 0 {LV_HASP_WINDOW, ATTR_ANIM_TIME, lv_win_set_anim_time, lv_win_get_anim_time}, #endif diff --git a/src/hasp/hasp_attribute_helper.h b/src/hasp/hasp_attribute_helper.h index d9f64d36..73587d14 100644 --- a/src/hasp/hasp_attribute_helper.h +++ b/src/hasp/hasp_attribute_helper.h @@ -3,6 +3,13 @@ #include "hasplib.h" +lv_label_align_t my_textarea_get_text_align(lv_obj_t* ta) +{ + lv_textarea_ext_t* ext = (lv_textarea_ext_t*)lv_obj_get_ext_attr(ta); + lv_obj_t* label = lv_textarea_get_label(ta); + return lv_label_get_align(label); +} + const char* my_tabview_get_tab_name(const lv_obj_t* tabview, uint16_t id) { if(id >= lv_tabview_get_tab_count(tabview)) return NULL; diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index f6093d4d..eab42b9d 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -255,7 +255,7 @@ static void log_event(const char* name, lv_event_t event) switch(event) { case LV_EVENT_PRESSED: - LOG_TRACE(TAG_EVENT, "%s Pressed", name); + LOG_TRACE(TAG_EVENT, "%s Changed", name); break; case LV_EVENT_PRESS_LOST: @@ -348,6 +348,35 @@ void swipe_event_handler(lv_obj_t* obj, lv_event_t event) } } +/** + * Called when a textarea is clicked + * @param obj pointer to a textarea object + * @param event type of event that occured + */ +void textarea_event_handler(lv_obj_t* obj, lv_event_t event) +{ + log_event("textarea", event); + + if(event == LV_EVENT_VALUE_CHANGED) { + LOG_TRACE(TAG_EVENT, "Changed to: %s", lv_textarea_get_text(obj)); + + uint8_t hasp_event_id; + if(!translate_event(obj, event, hasp_event_id)) return; + + char data[100]; + char eventname[8]; + Parser::get_event_name(hasp_event_id, eventname, sizeof(eventname)); + + snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\",\"text\":\"%s\"}"), eventname, + lv_textarea_get_text(obj)); + event_send_object_data(obj, data); + } else if(event == LV_EVENT_FOCUSED) { + lv_textarea_set_cursor_hidden(obj, false); + } else if(event == LV_EVENT_DEFOCUSED) { + lv_textarea_set_cursor_hidden(obj, true); + } +} + /** * Called when a button-style object is clicked * @param obj pointer to a button object diff --git a/src/hasp/hasp_event.h b/src/hasp/hasp_event.h index dd027a91..2938e271 100644 --- a/src/hasp/hasp_event.h +++ b/src/hasp/hasp_event.h @@ -26,5 +26,6 @@ void btnmatrix_event_handler(lv_obj_t* obj, lv_event_t event); void msgbox_event_handler(lv_obj_t* obj, lv_event_t event); void cpicker_event_handler(lv_obj_t* obj, lv_event_t event); void calendar_event_handler(lv_obj_t* obj, lv_event_t event); +void textarea_event_handler(lv_obj_t* obj, lv_event_t event); #endif // HASP_EVENT_H \ No newline at end of file diff --git a/src/hasp/hasp_object.cpp b/src/hasp/hasp_object.cpp index f455db8f..9937c7e4 100644 --- a/src/hasp/hasp_object.cpp +++ b/src/hasp/hasp_object.cpp @@ -343,6 +343,16 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id) } break; + case LV_HASP_TEXTAREA: + case HASP_OBJ_TEXTAREA: + obj = lv_textarea_create(parent_obj, NULL); + if(obj) { + lv_obj_set_event_cb(obj, textarea_event_handler); + lv_textarea_set_cursor_click_pos(obj, true); + obj->user_data.objid = LV_HASP_TEXTAREA; + } + break; + case LV_HASP_IMAGE: case HASP_OBJ_IMG: obj = lv_img_create(parent_obj, NULL); @@ -380,12 +390,14 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id) } break; +#if LVGL_VERSION_MAJOR == 7 && LV_USE_PAGE case LV_HASP_PAGE: case HASP_OBJ_PAGE: obj = lv_page_create(parent_obj, NULL); if(obj) obj->user_data.objid = LV_HASP_PAGE; // No event handler for pages break; +#endif #if LV_USE_WIN && LVGL_VERSION_MAJOR == 7 case LV_HASP_WINDOW: diff --git a/src/hasp_gui.cpp b/src/hasp_gui.cpp index 7438c380..2626eb5f 100644 --- a/src/hasp_gui.cpp +++ b/src/hasp_gui.cpp @@ -291,7 +291,7 @@ void guiSetup() /* Initialize GIF decoder */ #if HASP_USE_GIFDECODE > 0 - // lv_gif_init(); + // lv_gif_init(); #endif /* Initialize JPG decoder */ @@ -476,7 +476,7 @@ bool guiGetConfig(const JsonObject& settings) } changed = true; -#if TOUCH_DRIVER == 2046 && defined(USER_SETUP_LOADED) && defined(TOUCH_CS) +#if TOUCH_DRIVER == 2046 && defined(USER_SETUP_LOADED) && defined(TOUCH_CS) // tft_espi_set_touch(gui_settings.cal_data); haspTft.tft.setTouch(gui_settings.cal_data); #endif