Refine Reticulum payload memory and chat status UI

This commit is contained in:
liu weikai
2026-07-17 01:48:28 +08:00
parent dd5b6425a8
commit 18aed9abdf
33 changed files with 412 additions and 128 deletions
+4
View File
@@ -478,6 +478,10 @@ bool ui_present_interruption_app(AppScreen* app, lv_obj_t* parent)
s_interruption_app = app;
ui_set_overlay_active(true);
ui::menu_layout::setMenuVisible(false);
if (main_screen != nullptr)
{
lv_tileview_set_tile_by_index(main_screen, 0, 1, LV_ANIM_OFF);
}
ui_switch_to_app(app, parent);
return s_active_app == app;
}
@@ -274,6 +274,82 @@ bool model_fits_location_overlay(lv_obj_t* viewport_root,
return ::ui::chat::MessageDeliveryState::Unknown;
}
const char* delivery_status_text_key(::ui::chat::MessageDeliveryState delivery)
{
switch (delivery)
{
case ::ui::chat::MessageDeliveryState::Queued:
return "Queued";
case ::ui::chat::MessageDeliveryState::Sending:
case ::ui::chat::MessageDeliveryState::Sent:
return "Sending...";
case ::ui::chat::MessageDeliveryState::Delivered:
return "Delivered";
case ::ui::chat::MessageDeliveryState::Failed:
return "Failed";
case ::ui::chat::MessageDeliveryState::Draft:
case ::ui::chat::MessageDeliveryState::Received:
case ::ui::chat::MessageDeliveryState::Unknown:
return nullptr;
}
return nullptr;
}
lv_color_t delivery_status_chip_color(::ui::chat::MessageDeliveryState delivery)
{
switch (delivery)
{
case ::ui::chat::MessageDeliveryState::Queued:
return lv_color_hex(0xF4E2B0);
case ::ui::chat::MessageDeliveryState::Sending:
case ::ui::chat::MessageDeliveryState::Sent:
return lv_color_hex(0xCFE4FF);
case ::ui::chat::MessageDeliveryState::Delivered:
return lv_color_hex(0xD4F0D2);
case ::ui::chat::MessageDeliveryState::Failed:
return lv_color_hex(0xF1B8AA);
case ::ui::chat::MessageDeliveryState::Draft:
case ::ui::chat::MessageDeliveryState::Received:
case ::ui::chat::MessageDeliveryState::Unknown:
break;
}
return lv_color_hex(0xE8E0D8);
}
void update_delivery_status_chip(lv_obj_t* status_label,
::ui::chat::MessageDeliveryState delivery)
{
if (!status_label)
{
return;
}
lv_obj_t* chip = lv_obj_get_parent(status_label);
const char* text_key = delivery_status_text_key(delivery);
if (!text_key || text_key[0] == '\0')
{
lv_label_set_text(status_label, "");
if (chip)
{
lv_obj_add_flag(chip, LV_OBJ_FLAG_HIDDEN);
}
return;
}
if (chip)
{
lv_obj_set_style_bg_color(chip,
delivery_status_chip_color(delivery),
LV_PART_MAIN);
lv_obj_clear_flag(chip, LV_OBJ_FLAG_HIDDEN);
}
::ui::i18n::set_label_text(status_label, text_key);
::ui::fonts::apply_localized_font(
status_label,
lv_label_get_text(status_label),
::ui::page_profile::resolve_caption_font());
}
bool message_ref_matches_id(const ::ui::chat::MessageRef& ref,
chat::MessageId msg_id)
{
@@ -683,20 +759,13 @@ bool ChatConversationScreen::updateMessageStatus(const chat::MessageId msg_id,
return true;
}
update_delivery_status_chip(item.status_label, item.delivery);
if (status == MessageStatus::Failed)
{
::ui::i18n::set_label_text(item.status_label, "Failed");
::ui::fonts::apply_localized_font(
item.status_label, lv_label_get_text(item.status_label), ::ui::fonts::ui_chrome_font());
lv_obj_clear_flag(item.status_label, LV_OBJ_FLAG_HIDDEN);
enableRetryAction(item);
}
else
{
lv_label_set_text(item.status_label, "");
::ui::fonts::apply_localized_font(
item.status_label, lv_label_get_text(item.status_label), ::ui::fonts::ui_chrome_font());
lv_obj_add_flag(item.status_label, LV_OBJ_FLAG_HIDDEN);
disableRetryAction(item);
}
return true;
@@ -1283,6 +1352,14 @@ void ChatConversationScreen::createMessageItem(const ::ui::chat::MessageRow& row
}
item.time_label =
create_meta_chip(item.meta_row, time_buf, lv_color_hex(0xD4F0D2), max_meta_w);
if (is_self)
{
item.status_label = create_meta_chip(item.meta_row,
"Sending...",
delivery_status_chip_color(row.delivery),
max_meta_w);
update_delivery_status_chip(item.status_label, row.delivery);
}
item.text_label = chat::ui::layout::create_bubble_text(bubble);
chat::ui::conversation::styles::apply_bubble_text(item.text_label);
@@ -1331,23 +1408,10 @@ void ChatConversationScreen::createMessageItem(const ::ui::chat::MessageRow& row
lv_obj_set_width(item.text_label, LV_SIZE_CONTENT);
}
item.status_label = chat::ui::layout::create_bubble_status(bubble);
chat::ui::conversation::styles::apply_bubble_status(item.status_label);
if (row.delivery == ::ui::chat::MessageDeliveryState::Failed)
{
::ui::i18n::set_label_text(item.status_label, "Failed");
::ui::fonts::apply_localized_font(
item.status_label, lv_label_get_text(item.status_label), ::ui::fonts::ui_chrome_font());
lv_obj_clear_flag(item.status_label, LV_OBJ_FLAG_HIDDEN);
enableRetryAction(item);
}
else
{
lv_label_set_text(item.status_label, "");
::ui::fonts::apply_localized_font(
item.status_label, lv_label_get_text(item.status_label), ::ui::fonts::ui_chrome_font());
lv_obj_add_flag(item.status_label, LV_OBJ_FLAG_HIDDEN);
}
// Align row based on sender (same behavior)
chat::ui::layout::align_message_row(item.container, is_self);
@@ -206,13 +206,6 @@ lv_obj_t* create_bubble_time(lv_obj_t* bubble_parent)
return label;
}
lv_obj_t* create_bubble_status(lv_obj_t* bubble_parent)
{
lv_obj_t* label = lv_label_create(bubble_parent);
lv_obj_set_width(label, LV_SIZE_CONTENT);
return label;
}
void align_message_row(lv_obj_t* row, bool is_self)
{
// Match original behavior:
@@ -24,7 +24,6 @@ static lv_style_t s_bubble_other;
static lv_style_t s_bubble_unverified;
static lv_style_t s_bubble_text;
static lv_style_t s_bubble_time;
static lv_style_t s_bubble_status;
static constexpr lv_coord_t kPadX = 8;
static constexpr lv_coord_t kPadY = 6;
@@ -138,11 +137,6 @@ void init_once()
lv_style_set_text_color(&s_bubble_time, lv_color_hex(0x6A5646));
lv_style_set_text_align(&s_bubble_time, LV_TEXT_ALIGN_LEFT);
lv_style_set_text_font(&s_bubble_time, meta_font);
lv_style_init(&s_bubble_status);
lv_style_set_text_color(&s_bubble_status, lv_color_hex(0xCC0000));
lv_style_set_text_align(&s_bubble_status, LV_TEXT_ALIGN_LEFT);
lv_style_set_text_font(&s_bubble_status, meta_font);
}
void apply_root(lv_obj_t* root)
@@ -204,12 +198,6 @@ void apply_bubble_time(lv_obj_t* label)
lv_obj_add_style(label, &s_bubble_time, 0);
}
void apply_bubble_status(lv_obj_t* label)
{
init_once();
lv_obj_add_style(label, &s_bubble_status, 0);
}
} // namespace chat::ui::conversation::styles
#endif