#include "Tactility/service/gui/Gui.h" #include "Tactility/app/AppInstance.h" #include "Tactility/lvgl/LvglSync.h" #include "Tactility/lvgl/Style.h" #include #include namespace tt::service::gui { #define TAG "gui" static lv_obj_t* createAppViews(Gui* gui, lv_obj_t* parent) { lv_obj_send_event(gui->statusbarWidget, LV_EVENT_DRAW_MAIN, nullptr); lv_obj_t* child_container = lv_obj_create(parent); lv_obj_set_style_pad_all(child_container, 0, 0); lv_obj_set_width(child_container, LV_PCT(100)); lv_obj_set_flex_grow(child_container, 1); if (softwareKeyboardIsEnabled()) { gui->keyboard = lv_keyboard_create(parent); lv_obj_add_flag(gui->keyboard, LV_OBJ_FLAG_HIDDEN); } else { gui->keyboard = nullptr; } return child_container; } lv_obj_tree_walk_res_t add_to_group(lv_obj_t * obj, void * user_data) { lv_group_t *group = (lv_group_t*)user_data; TT_LOG_I(TAG, "walk"); if (lv_obj_check_type(obj, &lv_button_class) || lv_obj_check_type(obj, &lv_list_button_class) || lv_obj_check_type(obj, &lv_textarea_class) || lv_obj_check_type(obj, &lv_dropdown_class)) { lv_group_add_obj(group, obj); } return LV_OBJ_TREE_WALK_NEXT; } static void add_child_to_default_group(lv_event_t * e) { lv_obj_t * child = (lv_obj_t *)lv_event_get_param(e); TT_LOG_I(TAG, "added %X", (unsigned)lv_obj_get_class(child)); if (lv_obj_check_type(child, &lv_list_text_class)) { lv_obj_add_flag(child, LV_OBJ_FLAG_CLICKABLE); lv_obj_add_flag(child, LV_OBJ_FLAG_CLICK_FOCUSABLE); lv_obj_add_flag(child, LV_OBJ_FLAG_SCROLL_ON_FOCUS); lv_group_add_obj(lv_group_get_default(), child); TT_LOG_I(TAG, "listitem set"); } } void redraw(Gui* gui) { assert(gui); // Lock GUI and LVGL lock(); if (lvgl::lock(1000)) { lv_obj_clean(gui->appRootWidget); if (gui->appToRender != nullptr) { lv_group_t *group = lv_group_create(); auto* indev = lv_indev_get_next(nullptr); while(indev) { TT_LOG_I(TAG, "Added indev %X", (unsigned)indev); lv_indev_set_group(indev, group); indev = lv_indev_get_next(indev); } lv_group_set_default(group); //lv_obj_add_flag(gui->appRootWidget, LV_OBJ_FLAG_SCROLL_CHAIN_VER); //lv_gridnav_add(gui->appRootWidget, (lv_gridnav_ctrl_t)(LV_GRIDNAV_CTRL_ROLLOVER | LV_GRIDNAV_CTRL_SCROLL_FIRST | LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY)); //lv_group_add_obj(group, gui->appRootWidget); app::Flags flags = std::static_pointer_cast(gui->appToRender)->getFlags(); if (flags.showStatusbar) { lv_obj_remove_flag(gui->statusbarWidget, LV_OBJ_FLAG_HIDDEN); } else { lv_obj_add_flag(gui->statusbarWidget, LV_OBJ_FLAG_HIDDEN); } lv_obj_t* container = createAppViews(gui, gui->appRootWidget); gui->appToRender->getApp()->onShow(*gui->appToRender, container); //lv_obj_tree_walk(container, add_to_group, group); //lv_obj_add_event_cb(gui->appRootWidget, add_child_to_default_group, LV_EVENT_CHILD_CREATED, NULL); } else { TT_LOG_W(TAG, "nothing to draw"); } // Unlock GUI and LVGL lvgl::unlock(); } else { TT_LOG_E(TAG, LOG_MESSAGE_MUTEX_LOCK_FAILED_FMT, "LVGL"); } unlock(); } } // namespace