feat(l2): settings put in one consistent order and look

Settings: Name and Radio first, then Bluetooth, WiFi and GPS side by side
(a tap on each row opens its details: the pairing PIN, the networks, the GPS
screen with a new Options tab for power saving and the fixed position), then
Device, Mesh & data (Adverts & privacy now holds Auto-advert) and System.
Time & units, Power as one group. Row symbols get a column of their own, value
labels are as wide as their text, group headings are uppercase everywhere, the
auto-add node types show only with "By type". SOS in three groups, WiFi with
its switch, Map tools with the layers (Packet flow among them) under the trail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-11-02 09:54:08 +01:00
co-authored by Claude Opus 5.5
parent 81b74e41ce
commit 781a480aef
16 changed files with 217 additions and 144 deletions
+9 -2
View File
@@ -17,7 +17,7 @@
namespace gpsview {
enum : uint8_t { TAB_SKY, TAB_SIGNAL, TAB_DETAILS, TAB_COUNT };
enum : uint8_t { TAB_SKY, TAB_SIGNAL, TAB_DETAILS, TAB_OPTIONS, TAB_COUNT };
static uint8_t s_tab = TAB_SKY; // kept across visits
static lv_obj_t* s_sky = nullptr; // sky plot (drawn)
@@ -258,7 +258,7 @@ void UITask::buildGps() {
for (lv_obj_t*& p : s_sys_pill) p = nullptr;
lv_obj_set_style_pad_row(body, 6, 0);
{ // the tabs first under the title bar, as on every screen with tabs
static const char* TABS[] = { "Sky", "Signal", "Details", "" };
static const char* TABS[] = { "Sky", "Signal", "Details", "Options", "" };
lv_obj_t* tabs = segmented(body, TABS, s_tab, LV_PCT(100), theme::TAB_H, theme::SURFACE);
lv_obj_add_event_cb(tabs, onGpsTab, LV_EVENT_VALUE_CHANGED, NULL);
}
@@ -351,6 +351,13 @@ void UITask::buildGps() {
s_sys_pill[k] = p;
}
noteLabel(body, "Solid = used in the fix. 30+ is strong; below 25, a fix is unlikely.");
} else if (s_tab == TAB_OPTIONS) { // the GPS's own settings, in one place
lv_obj_t* g = group(body, nullptr);
schemaRow(g, SETTING(gps_interval));
char sub[40];
ownPositionText(sub, sizeof(sub));
listRow(g, "Fixed position", sub, onOwnPos, NULL);
groupNote(body, "The fixed position stands in for the GPS while it's off: on the map and in adverts.");
} else { // Details: a row once the receiver reports it
lv_obj_t* g = infoCard(body);
s_d_fix = infoRow(g, "Fix", "");