From 995297314dfded98a44f9145ba2c847ec33caea3 Mon Sep 17 00:00:00 2001 From: Adolfo Date: Sat, 25 Jul 2026 15:47:08 -0400 Subject: [PATCH] fix(ImmichElias): bottom-only UI like Bible, fullscreen bg, tap to toggle chrome, dynamic 480x320, cache, random, slideshow 60s, crash fixes --- Apps/ImmichElias/main/Source/main.c | 87 +++++++++-------------------- 1 file changed, 25 insertions(+), 62 deletions(-) diff --git a/Apps/ImmichElias/main/Source/main.c b/Apps/ImmichElias/main/Source/main.c index b853e61..222cd89 100644 --- a/Apps/ImmichElias/main/Source/main.c +++ b/Apps/ImmichElias/main/Source/main.c @@ -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);