fix(ImmichElias): bottom-only UI like Bible, fullscreen bg, tap to toggle chrome, dynamic 480x320, cache, random, slideshow 60s, crash fixes
This commit is contained in:
@@ -471,18 +471,14 @@ static void detect_display_size(AppCtx* ctx, lv_obj_t* parent) {
|
||||
static void hide_chrome(AppCtx* ctx) {
|
||||
if (!ctx) return;
|
||||
if (!tt_lvgl_lock(pdMS_TO_TICKS(500))) return;
|
||||
if (ctx->header_bar) lv_obj_add_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
// Bible-style: only bottom controls, no top header
|
||||
if (ctx->ctrl_bar) lv_obj_add_flag(ctx->ctrl_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
if (ctx->lbl_info) lv_obj_add_flag(ctx->lbl_info, LV_OBJ_FLAG_HIDDEN);
|
||||
tt_lvgl_unlock();
|
||||
}
|
||||
static void show_chrome(AppCtx* ctx) {
|
||||
if (!ctx) return;
|
||||
if (!tt_lvgl_lock(pdMS_TO_TICKS(500))) return;
|
||||
if (ctx->header_bar) lv_obj_remove_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
if (ctx->ctrl_bar) lv_obj_remove_flag(ctx->ctrl_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
if (ctx->lbl_info) lv_obj_remove_flag(ctx->lbl_info, LV_OBJ_FLAG_HIDDEN);
|
||||
if (ctx->lbl_status) lv_obj_remove_flag(ctx->lbl_status, LV_OBJ_FLAG_HIDDEN);
|
||||
tt_lvgl_unlock();
|
||||
if (tt_lvgl_lock(pdMS_TO_TICKS(300))) {
|
||||
if (ctx->autohide_timer) { lv_timer_reset(ctx->autohide_timer); lv_timer_resume(ctx->autohide_timer); }
|
||||
@@ -660,7 +656,8 @@ static void on_image_click(lv_event_t* e) {
|
||||
if (!ctx) return;
|
||||
bool is_hidden = false;
|
||||
if (tt_lvgl_lock(pdMS_TO_TICKS(200))) {
|
||||
if (ctx->header_bar) is_hidden = lv_obj_has_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
if (ctx->ctrl_bar) is_hidden = lv_obj_has_flag(ctx->ctrl_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
else if (ctx->header_bar) is_hidden = lv_obj_has_flag(ctx->header_bar, LV_OBJ_FLAG_HIDDEN);
|
||||
tt_lvgl_unlock();
|
||||
}
|
||||
if (is_hidden) show_chrome(ctx); else hide_chrome(ctx);
|
||||
@@ -724,6 +721,7 @@ static void on_show(AppHandle app, void* data, lv_obj_t* parent) {
|
||||
lv_obj_set_style_bg_color(parent, lv_color_hex(0x121212), LV_PART_MAIN);
|
||||
lv_obj_set_style_bg_opa(parent, LV_OPA_COVER, LV_PART_MAIN);
|
||||
|
||||
// Fullscreen player like Bible app - image background, only bottom controls
|
||||
ctx->player_wrapper = lv_obj_create(parent);
|
||||
lv_obj_set_size(ctx->player_wrapper, LV_PCT(100), LV_PCT(100));
|
||||
lv_obj_set_style_border_width(ctx->player_wrapper, 0, 0);
|
||||
@@ -732,9 +730,10 @@ static void on_show(AppHandle app, void* data, lv_obj_t* parent) {
|
||||
lv_obj_set_style_bg_color(ctx->player_wrapper, lv_color_hex(0x121212), LV_PART_MAIN);
|
||||
lv_obj_set_style_bg_opa(ctx->player_wrapper, LV_OPA_COVER, LV_PART_MAIN);
|
||||
lv_obj_remove_flag(ctx->player_wrapper, LV_OBJ_FLAG_SCROLLABLE);
|
||||
// Only image is clickable to avoid double-toggle on wrapper
|
||||
|
||||
// Image covers entire background
|
||||
ctx->img_page = lv_image_create(ctx->player_wrapper);
|
||||
lv_obj_set_size(ctx->img_page, LV_PCT(100), LV_PCT(100));
|
||||
lv_obj_align(ctx->img_page, LV_ALIGN_CENTER, 0, 0);
|
||||
lv_obj_set_style_bg_opa(ctx->img_page, LV_OPA_TRANSP, 0);
|
||||
lv_obj_set_style_pad_all(ctx->img_page, 0, 0);
|
||||
@@ -743,71 +742,35 @@ static void on_show(AppHandle app, void* data, lv_obj_t* parent) {
|
||||
lv_obj_add_flag(ctx->img_page, LV_OBJ_FLAG_CLICKABLE);
|
||||
lv_obj_add_event_cb(ctx->img_page, on_image_click, LV_EVENT_CLICKED, ctx);
|
||||
|
||||
ctx->header_bar = lv_obj_create(ctx->player_wrapper);
|
||||
lv_obj_set_size(ctx->header_bar, LV_PCT(100), 36);
|
||||
lv_obj_align(ctx->header_bar, LV_ALIGN_TOP_MID, 0, 0);
|
||||
lv_obj_set_style_radius(ctx->header_bar, 0, 0);
|
||||
lv_obj_set_style_bg_color(ctx->header_bar, lv_color_hex(0x11111B), LV_PART_MAIN);
|
||||
lv_obj_set_style_bg_opa(ctx->header_bar, LV_OPA_80, LV_PART_MAIN);
|
||||
lv_obj_set_style_border_color(ctx->header_bar, lv_color_hex(0x313244), LV_PART_MAIN);
|
||||
lv_obj_set_style_border_width(ctx->header_bar, 1, LV_PART_MAIN);
|
||||
lv_obj_remove_flag(ctx->header_bar, LV_OBJ_FLAG_SCROLLABLE);
|
||||
|
||||
ctx->btn_back = lv_btn_create(ctx->header_bar);
|
||||
lv_obj_set_size(ctx->btn_back, 44, 26);
|
||||
lv_obj_align(ctx->btn_back, LV_ALIGN_LEFT_MID, 4, 0);
|
||||
lv_obj_set_style_radius(ctx->btn_back, 6, 0);
|
||||
lv_obj_set_style_bg_color(ctx->btn_back, lv_color_hex(0x313244), LV_PART_MAIN);
|
||||
lv_obj_t* lbl_back = lv_label_create(ctx->btn_back); lv_label_set_text(lbl_back, LV_SYMBOL_LEFT); lv_obj_center(lbl_back);
|
||||
lv_obj_add_event_cb(ctx->btn_back, back_event_cb, LV_EVENT_CLICKED, ctx);
|
||||
|
||||
ctx->lbl_book_title = lv_label_create(ctx->header_bar);
|
||||
lv_obj_align(ctx->lbl_book_title, LV_ALIGN_CENTER, 0, 0);
|
||||
lv_obj_set_width(ctx->lbl_book_title, 160);
|
||||
lv_obj_set_style_text_align(ctx->lbl_book_title, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
|
||||
lv_obj_set_style_text_color(ctx->lbl_book_title, lv_color_hex(0xCDD6F4), LV_PART_MAIN);
|
||||
lv_obj_set_style_text_font(ctx->lbl_book_title, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
|
||||
lv_label_set_long_mode(ctx->lbl_book_title, LV_LABEL_LONG_DOT);
|
||||
|
||||
ctx->lbl_indicator = lv_label_create(ctx->header_bar);
|
||||
lv_obj_align(ctx->lbl_indicator, LV_ALIGN_RIGHT_MID, -6, 0);
|
||||
lv_obj_set_style_text_color(ctx->lbl_indicator, lv_color_hex(0xA6ADC8), LV_PART_MAIN);
|
||||
lv_obj_set_style_text_font(ctx->lbl_indicator, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
|
||||
lv_label_set_text(ctx->lbl_indicator, "0/0");
|
||||
|
||||
ctx->lbl_info = lv_label_create(ctx->player_wrapper);
|
||||
lv_obj_align(ctx->lbl_info, LV_ALIGN_TOP_MID, 0, 50);
|
||||
lv_obj_set_width(ctx->lbl_info, LV_PCT(90));
|
||||
lv_obj_set_style_text_align(ctx->lbl_info, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
|
||||
lv_obj_set_style_text_color(ctx->lbl_info, lv_color_hex(0xAAAAAA), LV_PART_MAIN);
|
||||
lv_obj_set_style_text_font(ctx->lbl_info, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
|
||||
lv_label_set_long_mode(ctx->lbl_info, LV_LABEL_LONG_WRAP);
|
||||
lv_obj_set_style_bg_color(ctx->lbl_info, lv_color_hex(0x11111B), LV_PART_MAIN);
|
||||
lv_obj_set_style_bg_opa(ctx->lbl_info, LV_OPA_60, LV_PART_MAIN);
|
||||
lv_obj_set_style_radius(ctx->lbl_info, 6, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_all(ctx->lbl_info, 6, LV_PART_MAIN);
|
||||
|
||||
ctx->lbl_status = lv_label_create(ctx->player_wrapper);
|
||||
lv_obj_align(ctx->lbl_status, LV_ALIGN_BOTTOM_MID, 0, -50);
|
||||
lv_obj_set_width(ctx->lbl_status, LV_PCT(80));
|
||||
lv_obj_set_style_text_align(ctx->lbl_status, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
|
||||
lv_obj_set_style_text_color(ctx->lbl_status, lv_color_hex(0x888888), LV_PART_MAIN);
|
||||
lv_obj_set_style_text_font(ctx->lbl_status, lvgl_get_text_font(FONT_SIZE_SMALL), LV_PART_MAIN);
|
||||
lv_label_set_long_mode(ctx->lbl_status, LV_LABEL_LONG_WRAP);
|
||||
// Bottom-only controls like Bible app - no top header, no info/status text
|
||||
ctx->header_bar = NULL;
|
||||
ctx->lbl_book_title = NULL;
|
||||
ctx->lbl_indicator = NULL;
|
||||
ctx->lbl_info = NULL;
|
||||
ctx->lbl_status = NULL;
|
||||
ctx->btn_back = NULL;
|
||||
|
||||
ctx->ctrl_bar = lv_obj_create(ctx->player_wrapper);
|
||||
lv_obj_set_size(ctx->ctrl_bar, LV_PCT(100), 44);
|
||||
lv_obj_align(ctx->ctrl_bar, LV_ALIGN_BOTTOM_MID, 0, 0);
|
||||
lv_obj_set_style_radius(ctx->ctrl_bar, 0, 0);
|
||||
lv_obj_set_style_bg_color(ctx->ctrl_bar, lv_color_hex(0x11111B), LV_PART_MAIN);
|
||||
lv_obj_set_style_bg_color(ctx->ctrl_bar, lv_color_hex(0x0E0E14), LV_PART_MAIN);
|
||||
lv_obj_set_style_bg_opa(ctx->ctrl_bar, LV_OPA_80, LV_PART_MAIN);
|
||||
lv_obj_set_style_border_width(ctx->ctrl_bar, 0, 0);
|
||||
lv_obj_set_style_pad_all(ctx->ctrl_bar, 4, 0);
|
||||
lv_obj_set_style_pad_gap(ctx->ctrl_bar, 6, 0);
|
||||
lv_obj_set_style_pad_all(ctx->ctrl_bar, 6, 0);
|
||||
lv_obj_set_style_pad_gap(ctx->ctrl_bar, 8, 0);
|
||||
lv_obj_set_flex_flow(ctx->ctrl_bar, LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_flex_align(ctx->ctrl_bar, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
|
||||
lv_obj_set_flex_align(ctx->ctrl_bar, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
|
||||
lv_obj_remove_flag(ctx->ctrl_bar, LV_OBJ_FLAG_SCROLLABLE);
|
||||
|
||||
// Left close button (like Bible app X)
|
||||
ctx->btn_back = lv_btn_create(ctx->ctrl_bar);
|
||||
lv_obj_set_size(ctx->btn_back, 44, 32);
|
||||
lv_obj_set_style_radius(ctx->btn_back, 8, 0);
|
||||
lv_obj_set_style_bg_color(ctx->btn_back, lv_color_hex(0x252538), LV_PART_MAIN);
|
||||
lv_obj_t* lbl_back = lv_label_create(ctx->btn_back); lv_label_set_text(lbl_back, LV_SYMBOL_CLOSE); lv_obj_center(lbl_back);
|
||||
lv_obj_add_event_cb(ctx->btn_back, back_event_cb, LV_EVENT_CLICKED, ctx);
|
||||
|
||||
ctx->btn_prev = lv_btn_create(ctx->ctrl_bar);
|
||||
lv_obj_set_size(ctx->btn_prev, 54, 32);
|
||||
lv_obj_set_style_radius(ctx->btn_prev, 16, 0);
|
||||
|
||||
Reference in New Issue
Block a user