faster image processing
All checks were successful
ESP32 Build & Release / build (push) Successful in 1m16s

This commit is contained in:
2026-09-13 23:31:36 +02:00
parent 8d034ed1df
commit e6760e4866
3 changed files with 169 additions and 11 deletions

View File

@@ -1616,6 +1616,11 @@ static void view_card(void)
bool has_art = load_art_crop(s_uid);
lv_coord_t prev_scroll = 0;
if (s_card_scroll_cont != NULL) {
prev_scroll = lv_obj_get_scroll_y(s_card_scroll_cont);
}
lvgl_port_lock(0);
ui_clean_screen();
@@ -1698,6 +1703,25 @@ static void view_card(void)
lv_obj_set_style_border_width(img, 1, 0);
lv_obj_set_style_radius(img, 3, 0);
cur_y += s_art_img_dsc.header.h + 4;
} else if (scryfall_is_fetching_image(s_uid)) {
/* Compact collapsible banner while art is downloading in background */
lv_obj_t *banner = lv_obj_create(s_card_scroll_cont);
lv_obj_set_size(banner, DISP_W - 32, 28);
lv_obj_align(banner, LV_ALIGN_TOP_MID, 0, cur_y);
lv_obj_set_style_bg_color(banner, lv_color_hex(0x222222), 0);
lv_obj_set_style_border_color(banner, lv_color_hex(COLOR_GOLD), 0);
lv_obj_set_style_border_width(banner, 1, 0);
lv_obj_set_style_radius(banner, 4, 0);
lv_obj_set_style_pad_all(banner, 2, 0);
lv_obj_clear_flag(banner, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t *blbl = lv_label_create(banner);
lv_label_set_text(blbl, "DOWNLOADING ART...");
lv_obj_set_style_text_font(blbl, &lv_font_montserrat_14, 0);
lv_obj_set_style_text_color(blbl, lv_color_hex(COLOR_AMBER), 0);
lv_obj_align(blbl, LV_ALIGN_CENTER, 0, 0);
cur_y += 32;
}
/* Type */
@@ -1722,6 +1746,10 @@ static void view_card(void)
lv_obj_align(oracle_lbl, LV_ALIGN_TOP_LEFT, 0, cur_y);
}
if (prev_scroll > 0) {
lv_obj_scroll_to_y(s_card_scroll_cont, prev_scroll, LV_ANIM_OFF);
}
lvgl_port_unlock();
cJSON_Delete(root);
}
@@ -1920,6 +1948,18 @@ static void handle_fetch_ready(void)
}
}
static void handle_image_ready(void)
{
const char *img_uid = scryfall_last_image_uid();
scryfall_consume_image();
/* If the user is currently viewing this exact card, refresh view_card so art replaces the banner */
if (app_get_view() == APP_STATE_CARD_VIEW && img_uid != NULL && strcmp(img_uid, s_uid) == 0) {
ESP_LOGI(TAG, "Background art arrived for %s, updating card view", img_uid);
view_card();
}
}
/* ------------------------------------------------------------------ */
/* Encoder event dispatcher */
/* ------------------------------------------------------------------ */
@@ -2283,6 +2323,11 @@ static void ui_task(void *arg)
handle_fetch_ready();
}
/* 2b. Async Scryfall card image ready */
if (scryfall_has_pending_image()) {
handle_image_ready();
}
/* 3. Button press & hold detection */
int sw_level = gpio_get_level(HW_ENC_SW_GPIO);
if (sw_level == 0) {