feat(app): имя узла обрезается по ширине, вольтаж показывается при наличии места

This commit is contained in:
shade committed 2026-10-22 18:01:39 +03:00
1 parent 91e6cdde17
commit f6c9089446
1 file changed
+34 -10
+34 -10
View File
@@ -1015,9 +1015,7 @@ void UITask::renderStatus() {
_display->setCursor(0, 0);
_display->setTextSize(1);
_display->setColor(UIColor::primary_txt);
_display->print(_node_prefs->node_name);
// батарея: иконка с заполнением и напряжение справа в верхней строке
// верхняя строка: имя узла слева (с обрезкой), батарея справа
{
const unsigned batt_mv = _board ? _board->getBattMilliVolts() : 0;
const int batt_pct = batteryPercent();
@@ -1026,16 +1024,42 @@ void UITask::renderStatus() {
const int icon_x = _display->width() - icon_w - 3;
const int icon_y = 2;
// напряжение слева от иконки
sprintf(tmp, "%u.%02uV", batt_mv / 1000U, (batt_mv % 1000U) / 10U);
int tx = icon_x - 4 - (int)strlen(tmp) * CHAR_W;
if (tx < 0) tx = 0;
char volts[16];
sprintf(volts, "%u.%02uV", batt_mv / 1000U, (batt_mv % 1000U) / 10U);
const int volt_w = (int)strlen(volts) * CHAR_W + 4;
// имя: показываем вольтаж только если он помещается рядом с именем
const char* nm = _node_prefs ? _node_prefs->node_name : "";
const int name_w = (int)strlen(nm) * CHAR_W;
const bool show_volts = (name_w + 4 + volt_w) <= icon_x;
const int limit_px = icon_x - 4 - (show_volts ? volt_w : 0);
int max_chars = limit_px / CHAR_W;
char nmbuf[40];
int len = (int)strlen(nm);
if (len > max_chars && max_chars > 3) {
int keep = max_chars - 2; // место под «..»
if (keep > (int)sizeof(nmbuf) - 3) keep = (int)sizeof(nmbuf) - 3;
memcpy(nmbuf, nm, keep);
nmbuf[keep] = '.';
nmbuf[keep + 1] = '.';
nmbuf[keep + 2] = 0;
} else {
strncpy(nmbuf, nm, sizeof(nmbuf) - 1);
nmbuf[sizeof(nmbuf) - 1] = 0;
}
_display->setCursor(0, 0);
_display->print(nmbuf);
_display->setColor(UIColor::primary_txt);
_display->setCursor(tx, 1);
_display->print(tmp);
// напряжение слева от иконки
if (show_volts) {
_display->setCursor(icon_x - 4 - (int)strlen(volts) * CHAR_W, 1);
_display->print(volts);
}
// корпус, «пипка» и заполнение по проценту
_display->setColor(UIColor::primary_txt);
_display->drawRect(icon_x, icon_y, icon_w, icon_h);
_display->fillRect(icon_x + icon_w, icon_y + 2, 2, icon_h - 4);
int pct = batt_pct < 0 ? 0 : (batt_pct > 100 ? 100 : batt_pct);