fix(ui-new): a tool opened from Home's Tools page goes back to Home

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-10-06 14:09:22 +02:00
co-authored by Claude Opus 5.5
parent 1af8ce1a85
commit 50d0d5577b
13 changed files with 24 additions and 17 deletions
@@ -44,7 +44,7 @@ public:
bool handleInput(char c) override { bool handleInput(char c) override {
if (c == KEY_CANCEL) { if (c == KEY_CANCEL) {
_task->savePrefsIfDirty(_dirty); _task->savePrefsIfDirty(_dirty);
_task->gotoToolsScreen(); _task->leaveTool();
return true; return true;
} }
bool right = keyIsNext(c) || c == KEY_ENTER; bool right = keyIsNext(c) || c == KEY_ENTER;
+1 -1
View File
@@ -174,7 +174,7 @@ public:
if (cancel) { if (cancel) {
_task->savePrefsIfDirty(_dirty); _task->savePrefsIfDirty(_dirty);
_task->gotoToolsScreen(); _task->leaveTool();
return true; return true;
} }
if (keyIsPrev(c)) { _tab = (_tab + botcfg::TAB_COUNT - 1) % botcfg::TAB_COUNT; _sel = _scroll = 0; return true; } if (keyIsPrev(c)) { _tab = (_tab + botcfg::TAB_COUNT - 1) % botcfg::TAB_COUNT; _sel = _scroll = 0; return true; }
@@ -120,7 +120,7 @@ public:
} }
bool handleInput(char c) override { bool handleInput(char c) override {
if (c == KEY_CANCEL) { _task->gotoToolsScreen(); return true; } if (c == KEY_CANCEL) { _task->leaveTool(); return true; }
return true; return true;
} }
}; };
+1 -1
View File
@@ -134,7 +134,7 @@ public:
} }
bool handleInput(char c) override { bool handleInput(char c) override {
if (c == KEY_CANCEL) { _task->gotoToolsScreen(); return true; } if (c == KEY_CANCEL) { _task->leaveTool(); return true; }
if (c == KEY_UP) { _sel = (_sel > 0) ? _sel - 1 : _item_count - 1; return true; } if (c == KEY_UP) { _sel = (_sel > 0) ? _sel - 1 : _item_count - 1; return true; }
if (c == KEY_DOWN) { _sel = (_sel < _item_count - 1) ? _sel + 1 : 0; return true; } if (c == KEY_DOWN) { _sel = (_sel < _item_count - 1) ? _sel + 1 : 0; return true; }
if (!_prefs) return false; if (!_prefs) return false;
@@ -191,7 +191,7 @@ public:
bool handleInput(char c) override { bool handleInput(char c) override {
if (c == KEY_CANCEL) { if (c == KEY_CANCEL) {
_task->savePrefsIfDirty(_dirty); _task->savePrefsIfDirty(_dirty);
_task->gotoToolsScreen(); _task->leaveTool();
return true; return true;
} }
if (c == KEY_UP) { moveSel(-1); return true; } if (c == KEY_UP) { moveSel(-1); return true; }
@@ -298,7 +298,7 @@ public:
} }
if (c == KEY_CANCEL) { if (c == KEY_CANCEL) {
_task->savePrefsIfDirty(_dirty); // engine re-seeded per edit _task->savePrefsIfDirty(_dirty); // engine re-seeded per edit
_task->gotoToolsScreen(); _task->leaveTool();
return true; return true;
} }
if (c == KEY_UP) { moveSel(-1); return true; } if (c == KEY_UP) { moveSel(-1); return true; }
@@ -825,9 +825,9 @@ public:
// ── list view ─────────────────────────────────────────────────────────── // ── list view ───────────────────────────────────────────────────────────
if (c == KEY_CANCEL) { if (c == KEY_CANCEL) {
if (_pick_admin_target) { _pick_admin_target = false; _task->gotoToolsScreen(); return true; } if (_pick_admin_target) { _pick_admin_target = false; _task->leaveTool(); return true; }
if (_source == SRC_SCAN) leaveScan(); if (_source == SRC_SCAN) leaveScan();
else _task->gotoToolsScreen(); else _task->leaveTool();
return true; return true;
} }
if (c == KEY_CONTEXT_MENU) { openActionMenu(); return true; } if (c == KEY_CONTEXT_MENU) { openActionMenu(); return true; }
@@ -240,7 +240,7 @@ public:
if (c == KEY_CANCEL) { if (c == KEY_CANCEL) {
_task->savePrefsIfDirty(_dirty); _task->savePrefsIfDirty(_dirty);
_task->gotoToolsScreen(); _task->leaveTool();
return true; return true;
} }
if (c == KEY_UP) { _sel = (_sel > 0) ? _sel - 1 : _item_count - 1; return true; } if (c == KEY_UP) { _sel = (_sel > 0) ? _sel - 1 : _item_count - 1; return true; }
@@ -253,11 +253,11 @@ public:
the_mesh.savePrefs(); the_mesh.savePrefs();
} }
_task->stopMelody(); _task->stopMelody();
_task->gotoToolsScreen(); _task->leaveTool();
break; break;
case MI_DISCARD: case MI_DISCARD:
_task->stopMelody(); _task->stopMelody();
_task->gotoToolsScreen(); _task->leaveTool();
break; break;
default: break; default: break;
} }
@@ -265,7 +265,7 @@ public:
return true; return true;
} }
if (cancel) { _task->stopMelody(); _task->gotoToolsScreen(); return true; } if (cancel) { _task->stopMelody(); _task->leaveTool(); return true; }
if (menu_key) { openMenu(); return true; } if (menu_key) { openMenu(); return true; }
if (left && _cursor > 0) { _cursor--; clampScroll(); return true; } if (left && _cursor > 0) { _cursor--; clampScroll(); return true; }
@@ -34,8 +34,10 @@ public:
return ""; return "";
} }
// Opens a tool and moves it to the front of the recent list. // Opens a tool and moves it to the front of the recent list. from_home: the
static void run(UITask* task, Action a) { // tool's Back returns to Home instead of this list.
static void run(UITask* task, Action a, bool from_home = false) {
task->setToolFromHome(from_home);
if (s_recent[0] != a) { s_recent[1] = s_recent[0]; s_recent[0] = a; } if (s_recent[0] != a) { s_recent[1] = s_recent[0]; s_recent[0] = a; }
switch (a) { switch (a) {
case ACT_NEARBY: task->gotoNearbyScreen(); break; case ACT_NEARBY: task->gotoNearbyScreen(); break;
@@ -228,7 +228,7 @@ public:
if (c == KEY_CANCEL) { if (c == KEY_CANCEL) {
_task->savePrefsIfDirty(_cfg_dirty); _task->savePrefsIfDirty(_cfg_dirty);
if (_return_home) _task->gotoHomeScreen(); if (_return_home) _task->gotoHomeScreen();
else _task->gotoToolsScreen(); else _task->leaveTool();
return true; return true;
} }
if (c == KEY_CONTEXT_MENU) { openActionMenu(); return true; } if (c == KEY_CONTEXT_MENU) { openActionMenu(); return true; }
+3 -2
View File
@@ -605,7 +605,7 @@ class HomeScreen : public UIScreen {
if (the_mesh.advert()) _advert_sent_ms = millis(); // the row says so if (the_mesh.advert()) _advert_sent_ms = millis(); // the row says so
else _task->showAlert("Advert failed", 1000); else _task->showAlert("Advert failed", 1000);
break; break;
case QA_TOOL: ToolsScreen::run(_task, (ToolsScreen::Action)r.n); break; case QA_TOOL: ToolsScreen::run(_task, (ToolsScreen::Action)r.n, true); break;
case QA_LOCK: _task->lockScreen(); break; case QA_LOCK: _task->lockScreen(); break;
case QA_HIBERNATE: _shutdown_init = true; break; // waits for the button to be released case QA_HIBERNATE: _shutdown_init = true; break; // waits for the button to be released
case QA_GPS: _task->toggleGPS(false); break; case QA_GPS: _task->toggleGPS(false); break;
@@ -2022,7 +2022,8 @@ void UITask::begin(DisplayDriver* display, SensorManager* sensors, NodePrefs* no
// onShow() is invoked by setCurrScreen(), so most navigators are just that. // onShow() is invoked by setCurrScreen(), so most navigators are just that.
void UITask::gotoSettingsScreen() { setCurrScreen(settings); } void UITask::gotoSettingsScreen() { setCurrScreen(settings); }
void UITask::gotoToolsScreen() { setCurrScreen(tools_screen); } void UITask::gotoToolsScreen() { _tool_from_home = false; setCurrScreen(tools_screen); }
void UITask::leaveTool() { if (_tool_from_home) gotoHomeScreen(); else gotoToolsScreen(); }
void UITask::gotoBotScreen() { setCurrScreen(bot_screen); } void UITask::gotoBotScreen() { setCurrScreen(bot_screen); }
void UITask::gotoNearbyScreen() { setCurrScreen(nearby_screen); } void UITask::gotoNearbyScreen() { setCurrScreen(nearby_screen); }
+4
View File
@@ -62,6 +62,7 @@ class UITask : public UITaskBase, public UiCoreHost {
unsigned long _next_refresh, _auto_off; unsigned long _next_refresh, _auto_off;
NodePrefs* _node_prefs; NodePrefs* _node_prefs;
bool _locked; bool _locked;
bool _tool_from_home = false;
unsigned long _lock_wake_until; // when to blank screen again after locked wake (5s) unsigned long _lock_wake_until; // when to blank screen again after locked wake (5s)
int _lock_seq_count; // Enter presses while Back held (lock/unlock sequence) int _lock_seq_count; // Enter presses while Back held (lock/unlock sequence)
unsigned long _lock_seq_ms; // millis() of last lock-sequence press (for timeout) unsigned long _lock_seq_ms; // millis() of last lock-sequence press (for timeout)
@@ -282,6 +283,9 @@ public:
void pickBotChannelTarget(); // open Messages to choose the auto-reply bot's channel void pickBotChannelTarget(); // open Messages to choose the auto-reply bot's channel
void pickBotRoomTarget(); // open Messages to choose the auto-reply bot's room void pickBotRoomTarget(); // open Messages to choose the auto-reply bot's room
void gotoToolsScreen(); void gotoToolsScreen();
// A tool's Back: to Home when Home's Tools page opened it, else to the Tools list.
void leaveTool();
void setToolFromHome(bool home) { _tool_from_home = home; }
void gotoRingtoneEditor(int slot = 0); void gotoRingtoneEditor(int slot = 0);
void gotoBotScreen(); void gotoBotScreen();
void pickAdminTarget(); // Admin is remote-only: open Nodes to pick a repeater/room void pickAdminTarget(); // Admin is remote-only: open Nodes to pick a repeater/room