fix(ui): gap below header separator, one method everywhere

Content drawn under the title separator touched the line on every standard
screen, because listStart() == headerH() (the row right after the separator).
Graphical screens worked around it with a hand-rolled hdr+2.

Bake a 2px breathing gap into listStart() so every list gains it at once, and
switch the screens that hand-rolled the offset (Compass, Nav, Nearby detail) to
listStart() so the content top is computed the same way everywhere.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-06-17 21:35:51 +02:00
co-authored by Claude Opus 4.8
parent e5ff2de3e4
commit 2136e959d4
4 changed files with 8 additions and 6 deletions
@@ -33,7 +33,6 @@ public:
display.setColor(DisplayDriver::LIGHT); display.setColor(DisplayDriver::LIGHT);
display.drawCenteredHeader("COMPASS"); display.drawCenteredHeader("COMPASS");
const int hdr = display.headerH();
const int cx = display.width() / 2; const int cx = display.width() / 2;
const int ch = display.getLineHeight(); const int ch = display.getLineHeight();
const int cw = display.getCharWidth(); const int cw = display.getCharWidth();
@@ -41,7 +40,7 @@ public:
display.setTextSize(2); display.setTextSize(2);
const int bigH = display.getLineHeight(); const int bigH = display.getLineHeight();
display.setTextSize(1); display.setTextSize(1);
const int top = hdr + 2; const int top = display.listStart();
const int readout_y = display.height() - bigH - 1; // size-2 readout baseline const int readout_y = display.height() - bigH - 1; // size-2 readout baseline
const int mid = (top + readout_y) / 2; const int mid = (top + readout_y) / 2;
+1 -1
View File
@@ -37,7 +37,7 @@ inline void draw(DisplayDriver& d,
geo::fmtDist(dist, sizeof(dist), dist_km, imperial); geo::fmtDist(dist, sizeof(dist), dist_km, imperial);
const int step = d.lineStep(); const int step = d.lineStep();
int y = hdr + 2; int y = d.listStart();
// Distance — emphasised at size 2. // Distance — emphasised at size 2.
d.setTextSize(2); d.setTextSize(2);
@@ -404,7 +404,7 @@ class NearbyScreen : public UIScreen {
// ── detail rendering ────────────────────────────────────────────────────────── // ── detail rendering ──────────────────────────────────────────────────────────
void renderStoredDetail(DisplayDriver& display) { void renderStoredDetail(DisplayDriver& display) {
const Entry& e = _entries[_sel]; const Entry& e = _entries[_sel];
const int hdr = display.headerH(); const int hdr = display.listStart(); // content top (gap below the header separator)
display.drawInvertedHeader(e.name); display.drawInvertedHeader(e.name);
int step = display.lineStep(); int step = display.lineStep();
@@ -434,7 +434,7 @@ class NearbyScreen : public UIScreen {
void renderScanDetail(DisplayDriver& display) { void renderScanDetail(DisplayDriver& display) {
const Entry& e = _entries[_sel]; const Entry& e = _entries[_sel];
const int hdr = display.headerH(); const int hdr = display.listStart(); // content top (gap below the header separator)
char label[32]; char label[32];
if (e.name[0]) { strncpy(label, e.name, 31); label[31] = '\0'; } if (e.name[0]) { strncpy(label, e.name, 31); label[31] = '\0'; }
+4 -1
View File
@@ -39,7 +39,10 @@ public:
// Use these instead of hardcoded pixel values so layouts adapt to any display. // Use these instead of hardcoded pixel values so layouts adapt to any display.
int lineStep() const { return getLineHeight() + 2; } // row pitch: text + gap int lineStep() const { return getLineHeight() + 2; } // row pitch: text + gap
int headerH() const { return getLineHeight() + 3; } // title bar height int headerH() const { return getLineHeight() + 3; } // title bar height
int listStart() const { return headerH(); } // y where list items begin // y where list items begin: a 2px breathing gap below the header separator so
// the first row doesn't touch the line (matches the hand-rolled hdr+2 used by
// the graphical screens).
int listStart() const { return headerH() + 2; }
int listVisible(int itemH) const { return (height() - listStart()) / itemH; } int listVisible(int itemH) const { return (height() - listStart()) / itemH; }
int listVisible() const { return listVisible(lineStep()); } int listVisible() const { return listVisible(lineStep()); }
// x where a right-side value column starts (leaves ~8 chars for the value) // x where a right-side value column starts (leaves ~8 chars for the value)