Refine metrics screen layout

This commit is contained in:
Codex 2026-06-23 21:02:46 +08:00
parent 3394471559
commit 3906daef09

View File

@ -9,7 +9,7 @@
#define CPU_HISTORY_POINTS 64
#define CPU_CHART_W 184
#define CPU_CHART_H 58
#define CPU_CHART_H 78
#define HALO_LABEL_COUNT 8
#define DISK_ROW_COUNT 4
#define CODEX_DAILY_BAR_W 8
@ -41,21 +41,18 @@ static lv_obj_t *s_memory_bar;
static lv_obj_t *s_disk_name_labels[DISK_ROW_COUNT];
static lv_obj_t *s_disk_rate_labels[DISK_ROW_COUNT];
static lv_obj_t *s_disk_bars[DISK_ROW_COUNT];
static lv_obj_t *s_net_line_label;
static lv_obj_t *s_net_rx_label;
static lv_obj_t *s_net_tx_label;
static lv_obj_t *s_codex_5h_label;
static lv_obj_t *s_codex_week_label;
static lv_obj_t *s_codex_5h_value_label;
static lv_obj_t *s_codex_week_value_label;
static lv_obj_t *s_codex_5h_reset_label;
static lv_obj_t *s_codex_week_reset_label;
static lv_obj_t *s_codex_token_label;
static lv_obj_t *s_codex_token_bar;
static lv_obj_t *s_codex_5h_bar;
static lv_obj_t *s_codex_week_bar;
static lv_obj_t *s_codex_daily_bars[UI_CODEX_DAILY_BAR_COUNT];
static lv_obj_t *s_zhipu_status_label;
static lv_obj_t *s_zhipu_token_label;
static lv_obj_t *s_zhipu_token_bar;
static lv_obj_t *s_zhipu_5h_label;
static lv_obj_t *s_zhipu_week_label;
static lv_obj_t *s_zhipu_5h_value_label;
@ -83,6 +80,22 @@ static const halo_offset_t s_halo_offsets[HALO_LABEL_COUNT] = {
{ 1, 1 },
};
static const lv_point_precise_t s_net_down_icon_points[] = {
{ 6, 0 },
{ 6, 12 },
{ 2, 8 },
{ 6, 12 },
{ 10, 8 },
};
static const lv_point_precise_t s_net_up_icon_points[] = {
{ 6, 12 },
{ 6, 0 },
{ 2, 4 },
{ 6, 0 },
{ 10, 4 },
};
static lv_color_t ink(void)
{
return lv_color_black();
@ -186,6 +199,18 @@ static lv_obj_t *make_bar(lv_obj_t *parent, int w, int h)
return bar;
}
static lv_obj_t *make_net_arrow(lv_obj_t *parent, const lv_point_precise_t *points, uint32_t count)
{
lv_obj_t *line = lv_line_create(parent);
lv_obj_set_size(line, 12, 14);
lv_line_set_points(line, points, count);
lv_obj_set_style_line_color(line, ink(), 0);
lv_obj_set_style_line_width(line, 2, 0);
lv_obj_set_style_pad_all(line, 0, 0);
lv_obj_clear_flag(line, LV_OBJ_FLAG_SCROLLABLE);
return line;
}
static void format_capacity(int mb, char *out, size_t out_size)
{
if (mb <= 0) {
@ -251,19 +276,6 @@ static void format_percent_compact(int percent, char *out, size_t out_size)
}
}
static void format_tokens_m10(int tokens_m10, char *out, size_t out_size)
{
if (tokens_m10 < 0) {
snprintf(out, out_size, "--");
} else if (tokens_m10 >= 10000) {
snprintf(out, out_size, "%d.%dB", tokens_m10 / 10000, (tokens_m10 % 10000) / 1000);
} else if (tokens_m10 >= 1000) {
snprintf(out, out_size, "%dM", (tokens_m10 + 5) / 10);
} else {
snprintf(out, out_size, "%d.%dM", tokens_m10 / 10, tokens_m10 % 10);
}
}
static const char *zhipu_status_text(int status)
{
switch (status) {
@ -419,7 +431,6 @@ static void update_disk_rows(const char *disk_text)
static void update_codex_panel(const ui_metrics_t *metrics)
{
char text[40];
char value[12];
char reset_5h[12];
char reset_week[12];
@ -437,15 +448,6 @@ static void update_codex_panel(const ui_metrics_t *metrics)
lv_label_set_text(s_codex_5h_reset_label, reset_5h);
lv_label_set_text(s_codex_week_reset_label, reset_week);
format_tokens_m10(metrics->codex_today_tokens_m10, value, sizeof(value));
snprintf(text, sizeof(text), "%s", value);
lv_label_set_text(s_codex_token_label, text);
int today_percent = 0;
if (metrics->codex_daily_count > 0) {
today_percent = metrics->codex_daily_percent[metrics->codex_daily_count - 1];
}
set_bar_percent(s_codex_token_bar, today_percent);
for (int i = 0; i < UI_CODEX_DAILY_BAR_COUNT; i++) {
lv_obj_t *bar = s_codex_daily_bars[i];
if (bar == NULL) {
@ -476,10 +478,6 @@ static void update_zhipu_panel(const ui_metrics_t *metrics)
snprintf(text, sizeof(text), "STAT %s", zhipu_status_text(metrics->zhipu_status));
lv_label_set_text(s_zhipu_status_label, text);
format_percent_compact(metrics->zhipu_5h_percent, value, sizeof(value));
lv_label_set_text(s_zhipu_token_label, value);
set_bar_percent(s_zhipu_token_bar, metrics->zhipu_5h_percent);
format_percent_compact(metrics->zhipu_5h_percent, value, sizeof(value));
lv_label_set_text(s_zhipu_5h_value_label, value);
set_bar_percent(s_zhipu_5h_bar, metrics->zhipu_5h_percent);
@ -497,21 +495,17 @@ static void update_net_line(const ui_metrics_t *metrics)
{
char rx[12];
char tx[12];
char text[44];
format_rate_short(metrics->rx_kbps, rx, sizeof(rx));
format_rate_short(metrics->tx_kbps, tx, sizeof(tx));
snprintf(text, sizeof(text), "D %s U %s", rx, tx);
size_t text_len = strlen(text);
const lv_font_t *font = &lv_font_montserrat_20;
if (text_len >= 18) {
font = &lv_font_montserrat_14;
}
const lv_font_t *rx_font = strlen(rx) >= 5 ? &lv_font_montserrat_14 : &lv_font_montserrat_20;
const lv_font_t *tx_font = strlen(tx) >= 5 ? &lv_font_montserrat_14 : &lv_font_montserrat_20;
lv_obj_set_style_text_font(s_net_line_label, font, 0);
lv_label_set_long_mode(s_net_line_label, LV_LABEL_LONG_CLIP);
lv_label_set_text(s_net_line_label, text);
lv_obj_set_style_text_font(s_net_rx_label, rx_font, 0);
lv_obj_set_style_text_font(s_net_tx_label, tx_font, 0);
lv_label_set_text(s_net_rx_label, rx);
lv_label_set_text(s_net_tx_label, tx);
}
void ui_screen_create(void)
@ -530,7 +524,7 @@ void ui_screen_create(void)
s_cpu_line = lv_line_create(screen);
lv_obj_set_size(s_cpu_line, CPU_CHART_W + 2, CPU_CHART_H + 2);
lv_obj_align(s_cpu_line, LV_ALIGN_TOP_LEFT, 8, 112);
lv_obj_align(s_cpu_line, LV_ALIGN_TOP_LEFT, 8, 88);
lv_obj_set_style_line_color(s_cpu_line, ink(), 0);
lv_obj_set_style_line_width(s_cpu_line, 3, 0);
for (int i = 0; i < CPU_HISTORY_POINTS; i++) {
@ -550,21 +544,18 @@ void ui_screen_create(void)
lv_obj_set_width(s_env_label, 110);
lv_obj_align(s_env_label, LV_ALIGN_TOP_LEFT, 82, 8);
lv_obj_t *cpu_title = make_label(screen, "CPU", &lv_font_montserrat_14);
lv_obj_align(cpu_title, LV_ALIGN_TOP_LEFT, 8, 36);
make_label_halo(screen, s_cpu_value_halo, "--%", &lv_font_montserrat_48, 126,
LV_ALIGN_TOP_LEFT, 8, 52, 3, LV_TEXT_ALIGN_LEFT);
LV_ALIGN_TOP_LEFT, 8, 30, 3, LV_TEXT_ALIGN_LEFT);
s_cpu_value_label = make_label(screen, "--%", &lv_font_montserrat_48);
lv_obj_set_width(s_cpu_value_label, 126);
lv_obj_set_style_text_align(s_cpu_value_label, LV_TEXT_ALIGN_LEFT, 0);
lv_obj_align(s_cpu_value_label, LV_ALIGN_TOP_LEFT, 8, 52);
lv_obj_align(s_cpu_value_label, LV_ALIGN_TOP_LEFT, 8, 30);
make_label_halo(screen, s_cpu_freq_halo, "--GHz", &lv_font_montserrat_28, 128,
LV_ALIGN_TOP_LEFT, 8, 96, 2, LV_TEXT_ALIGN_LEFT);
LV_ALIGN_TOP_LEFT, 8, 72, 2, LV_TEXT_ALIGN_LEFT);
s_cpu_freq_label = make_label(screen, "--GHz", &lv_font_montserrat_28);
lv_obj_set_width(s_cpu_freq_label, 128);
lv_obj_align(s_cpu_freq_label, LV_ALIGN_TOP_LEFT, 8, 96);
lv_obj_align(s_cpu_freq_label, LV_ALIGN_TOP_LEFT, 8, 72);
lv_obj_t *memory_title = make_label(screen, "MEM", &lv_font_montserrat_14);
lv_obj_align(memory_title, LV_ALIGN_TOP_LEFT, 208, 8);
@ -577,8 +568,8 @@ void ui_screen_create(void)
s_memory_detail_label = make_label(screen, "--/--", &lv_font_montserrat_14);
lv_obj_set_width(s_memory_detail_label, 178);
lv_obj_align(s_memory_detail_label, LV_ALIGN_TOP_LEFT, 208, 24);
s_memory_bar = make_bar(screen, 126, 10);
lv_obj_align(s_memory_bar, LV_ALIGN_TOP_LEFT, 262, 46);
s_memory_bar = make_bar(screen, 180, 10);
lv_obj_align(s_memory_bar, LV_ALIGN_TOP_LEFT, 208, 46);
lv_obj_t *disk_title = make_label(screen, "DSK", &lv_font_montserrat_14);
lv_obj_align(disk_title, LV_ALIGN_TOP_LEFT, 208, 64);
@ -586,61 +577,62 @@ void ui_screen_create(void)
for (int i = 0; i < DISK_ROW_COUNT; i++) {
int y = 80 + i * 16;
s_disk_name_labels[i] = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_disk_name_labels[i], 16);
lv_obj_set_width(s_disk_name_labels[i], 14);
lv_obj_align(s_disk_name_labels[i], LV_ALIGN_TOP_LEFT, 208, y);
s_disk_bars[i] = make_bar(screen, 56, 8);
lv_obj_align(s_disk_bars[i], LV_ALIGN_TOP_LEFT, 226, y + 4);
s_disk_bars[i] = make_bar(screen, 84, 8);
lv_obj_align(s_disk_bars[i], LV_ALIGN_TOP_LEFT, 224, y + 4);
s_disk_rate_labels[i] = make_label(screen, "--/--", &lv_font_montserrat_14);
lv_label_set_long_mode(s_disk_rate_labels[i], LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_disk_rate_labels[i], 104);
lv_obj_align(s_disk_rate_labels[i], LV_ALIGN_TOP_LEFT, 288, y);
lv_obj_set_width(s_disk_rate_labels[i], 80);
lv_obj_align(s_disk_rate_labels[i], LV_ALIGN_TOP_LEFT, 312, y);
}
s_net_line_label = make_label(screen, "D -- U --", &lv_font_montserrat_20);
lv_label_set_long_mode(s_net_line_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_net_line_label, 184);
lv_obj_set_height(s_net_line_label, 24);
lv_obj_align(s_net_line_label, LV_ALIGN_TOP_LEFT, 208, 150);
lv_obj_t *net_down_icon = make_net_arrow(screen, s_net_down_icon_points,
sizeof(s_net_down_icon_points) / sizeof(s_net_down_icon_points[0]));
lv_obj_align(net_down_icon, LV_ALIGN_TOP_LEFT, 208, 152);
s_net_rx_label = make_label(screen, "--", &lv_font_montserrat_20);
lv_label_set_long_mode(s_net_rx_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_net_rx_label, 62);
lv_obj_set_height(s_net_rx_label, 24);
lv_obj_align(s_net_rx_label, LV_ALIGN_TOP_LEFT, 224, 146);
lv_obj_t *net_up_icon = make_net_arrow(screen, s_net_up_icon_points,
sizeof(s_net_up_icon_points) / sizeof(s_net_up_icon_points[0]));
lv_obj_align(net_up_icon, LV_ALIGN_TOP_LEFT, 300, 152);
s_net_tx_label = make_label(screen, "--", &lv_font_montserrat_20);
lv_label_set_long_mode(s_net_tx_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_net_tx_label, 76);
lv_obj_set_height(s_net_tx_label, 24);
lv_obj_align(s_net_tx_label, LV_ALIGN_TOP_LEFT, 316, 146);
lv_obj_t *codex_title = make_label(screen, "CODEX", &lv_font_montserrat_14);
lv_obj_align(codex_title, LV_ALIGN_TOP_LEFT, 8, 184);
s_codex_5h_label = make_label(screen, "5H", &lv_font_montserrat_14);
lv_obj_set_width(s_codex_5h_label, 28);
lv_obj_align(s_codex_5h_label, LV_ALIGN_TOP_LEFT, 8, 216);
lv_obj_align(s_codex_5h_label, LV_ALIGN_TOP_LEFT, 8, 198);
s_codex_5h_bar = make_bar(screen, 78, 8);
lv_obj_align(s_codex_5h_bar, LV_ALIGN_TOP_LEFT, 36, 220);
lv_obj_align(s_codex_5h_bar, LV_ALIGN_TOP_LEFT, 36, 202);
s_codex_5h_value_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_codex_5h_value_label, 38);
lv_obj_align(s_codex_5h_value_label, LV_ALIGN_TOP_LEFT, 118, 216);
lv_obj_align(s_codex_5h_value_label, LV_ALIGN_TOP_LEFT, 118, 198);
s_codex_5h_reset_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_label_set_long_mode(s_codex_5h_reset_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_codex_5h_reset_label, 38);
lv_obj_align(s_codex_5h_reset_label, LV_ALIGN_TOP_LEFT, 158, 216);
lv_obj_align(s_codex_5h_reset_label, LV_ALIGN_TOP_LEFT, 158, 198);
s_codex_week_label = make_label(screen, "WK", &lv_font_montserrat_14);
lv_obj_set_width(s_codex_week_label, 28);
lv_obj_align(s_codex_week_label, LV_ALIGN_TOP_LEFT, 8, 234);
lv_obj_align(s_codex_week_label, LV_ALIGN_TOP_LEFT, 8, 216);
s_codex_week_bar = make_bar(screen, 78, 8);
lv_obj_align(s_codex_week_bar, LV_ALIGN_TOP_LEFT, 36, 238);
lv_obj_align(s_codex_week_bar, LV_ALIGN_TOP_LEFT, 36, 220);
s_codex_week_value_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_codex_week_value_label, 38);
lv_obj_align(s_codex_week_value_label, LV_ALIGN_TOP_LEFT, 118, 234);
lv_obj_align(s_codex_week_value_label, LV_ALIGN_TOP_LEFT, 118, 216);
s_codex_week_reset_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_label_set_long_mode(s_codex_week_reset_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_codex_week_reset_label, 38);
lv_obj_align(s_codex_week_reset_label, LV_ALIGN_TOP_LEFT, 158, 234);
lv_obj_t *codex_token_title = make_label(screen, "TOK", &lv_font_montserrat_14);
lv_obj_set_width(codex_token_title, 28);
lv_obj_align(codex_token_title, LV_ALIGN_TOP_LEFT, 8, 198);
s_codex_token_bar = make_bar(screen, 90, 8);
lv_obj_align(s_codex_token_bar, LV_ALIGN_TOP_LEFT, 36, 202);
s_codex_token_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_codex_token_label, 64);
lv_label_set_long_mode(s_codex_token_label, LV_LABEL_LONG_CLIP);
lv_obj_set_style_text_align(s_codex_token_label, LV_TEXT_ALIGN_RIGHT, 0);
lv_obj_align(s_codex_token_label, LV_ALIGN_TOP_LEFT, 132, 198);
lv_obj_align(s_codex_week_reset_label, LV_ALIGN_TOP_LEFT, 158, 216);
make_rule(screen, 8, CODEX_DAILY_BAR_BASE_Y, 188, 1);
for (int i = 0; i < UI_CODEX_DAILY_BAR_COUNT; i++) {
@ -665,42 +657,31 @@ void ui_screen_create(void)
lv_obj_set_style_text_align(s_zhipu_status_label, LV_TEXT_ALIGN_RIGHT, 0);
lv_obj_align(s_zhipu_status_label, LV_ALIGN_TOP_RIGHT, -8, 184);
lv_obj_t *zhipu_token_title = make_label(screen, "TOK", &lv_font_montserrat_14);
lv_obj_set_width(zhipu_token_title, 28);
lv_obj_align(zhipu_token_title, LV_ALIGN_TOP_LEFT, 208, 198);
s_zhipu_token_bar = make_bar(screen, 90, 8);
lv_obj_align(s_zhipu_token_bar, LV_ALIGN_TOP_LEFT, 236, 202);
s_zhipu_token_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_zhipu_token_label, 64);
lv_label_set_long_mode(s_zhipu_token_label, LV_LABEL_LONG_CLIP);
lv_obj_set_style_text_align(s_zhipu_token_label, LV_TEXT_ALIGN_RIGHT, 0);
lv_obj_align(s_zhipu_token_label, LV_ALIGN_TOP_LEFT, 332, 198);
s_zhipu_5h_label = make_label(screen, "5H", &lv_font_montserrat_14);
lv_obj_set_width(s_zhipu_5h_label, 28);
lv_obj_align(s_zhipu_5h_label, LV_ALIGN_TOP_LEFT, 208, 216);
lv_obj_align(s_zhipu_5h_label, LV_ALIGN_TOP_LEFT, 208, 198);
s_zhipu_5h_bar = make_bar(screen, 78, 8);
lv_obj_align(s_zhipu_5h_bar, LV_ALIGN_TOP_LEFT, 236, 220);
lv_obj_align(s_zhipu_5h_bar, LV_ALIGN_TOP_LEFT, 236, 202);
s_zhipu_5h_value_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_zhipu_5h_value_label, 38);
lv_obj_align(s_zhipu_5h_value_label, LV_ALIGN_TOP_LEFT, 318, 216);
lv_obj_align(s_zhipu_5h_value_label, LV_ALIGN_TOP_LEFT, 318, 198);
s_zhipu_5h_reset_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_label_set_long_mode(s_zhipu_5h_reset_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_zhipu_5h_reset_label, 38);
lv_obj_align(s_zhipu_5h_reset_label, LV_ALIGN_TOP_LEFT, 358, 216);
lv_obj_align(s_zhipu_5h_reset_label, LV_ALIGN_TOP_LEFT, 358, 198);
s_zhipu_week_label = make_label(screen, "WK", &lv_font_montserrat_14);
lv_obj_set_width(s_zhipu_week_label, 28);
lv_obj_align(s_zhipu_week_label, LV_ALIGN_TOP_LEFT, 208, 234);
lv_obj_align(s_zhipu_week_label, LV_ALIGN_TOP_LEFT, 208, 216);
s_zhipu_week_bar = make_bar(screen, 78, 8);
lv_obj_align(s_zhipu_week_bar, LV_ALIGN_TOP_LEFT, 236, 238);
lv_obj_align(s_zhipu_week_bar, LV_ALIGN_TOP_LEFT, 236, 220);
s_zhipu_week_value_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_obj_set_width(s_zhipu_week_value_label, 38);
lv_obj_align(s_zhipu_week_value_label, LV_ALIGN_TOP_LEFT, 318, 234);
lv_obj_align(s_zhipu_week_value_label, LV_ALIGN_TOP_LEFT, 318, 216);
s_zhipu_week_reset_label = make_label(screen, "--", &lv_font_montserrat_14);
lv_label_set_long_mode(s_zhipu_week_reset_label, LV_LABEL_LONG_CLIP);
lv_obj_set_width(s_zhipu_week_reset_label, 38);
lv_obj_align(s_zhipu_week_reset_label, LV_ALIGN_TOP_LEFT, 358, 234);
lv_obj_align(s_zhipu_week_reset_label, LV_ALIGN_TOP_LEFT, 358, 216);
}
void ui_screen_tick(void)