From 7d313159dfbc8d7bd097f0a1f1d76f97de0639f4 Mon Sep 17 00:00:00 2001 From: Tommaso Bianchi Date: Sat, 15 Aug 2026 21:14:35 +0200 Subject: [PATCH] Fix cloud features staying off after login when the setup wizard was closed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported on #15239: after signing in to Orca Cloud on a fresh install, no sync prompt appears and File > Sync Presets is greyed out with nothing to explain why. CAUSE. AppConfig::get_stealth_mode() returns true whenever `firstguide/finish` is unset, and that flag is written in exactly one place — GuideFrame::SaveProfile(), i.e. only when the setup wizard is COMPLETED. Closing the wizard is what people do today to reach the login (the wizard never offers it, which is #15239 itself), so a new user ends up permanently in a stealth mode they never chose. Every cloud gate keyed on get_stealth_mode() then switches off silently, including: * GUI_App::on_user_login_handle(), which returns EARLY on stealth — so the whole post-login flow is skipped: preset migration, plugin fetch, user-preset load and show_sync_dialog(). That is the missing sync prompt. * the Sync Presets item in both the top menu and the File menu, whose enable lambda was `is_user_login() && !get_stealth_mode()`. That is the greyed item. The result is indistinguishable from real Stealth mode, and nothing in the UI says so, because the one place that DOES explain it — the "Quit Stealth Mode" dialog in handle_web_request() — only covers the homepage login commands. FIX, two parts. 1. The pre-wizard value is a DEFAULT for "the user has not been asked yet", not a setting, so it must not survive the user answering. Signing in to a cloud account is that answer. AppConfig now carries a session-only `m_cloud_logged_in` mirrored from the network agent (on login, on logout, and at agent start so a restored session counts), and get_stealth_mode() consults it before falling back to the pre-wizard default. An explicit Stealth mode setting is untouched and still wins: a user who turned it on deliberately stays offline whether or not they sign in. 2. Sync Presets no longer greys itself out. Both refusal paths already had a message to show — "You must be logged in…" and now one for Stealth mode naming the Preferences toggle — and the enable lambda was making both unreachable. A disabled item that cannot say why is the reason this took a bug report to find. Co-Authored-By: Claude Opus 5 (1M context) --- src/libslic3r/AppConfig.cpp | 13 +++++++++++-- src/libslic3r/AppConfig.hpp | 6 ++++++ src/slic3r/GUI/GUI_App.cpp | 11 +++++++++++ src/slic3r/GUI/MainFrame.cpp | 28 ++++++++++++++++++++++------ 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index a5d0e24eac..e8a0c80a3d 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -86,8 +86,17 @@ std::string AppConfig::get_hms_host() bool AppConfig::get_stealth_mode() { - // always return true when user did not finish setup wizard yet - if (!get_bool("firstguide","finish")) { + // Before the setup wizard has been completed the user has not been asked whether the app may + // use the network, so default to no. Signing in to a cloud account IS that answer, though, and + // the latch must not survive it: a user who closes the wizard and logs in from the account menu + // — the workaround people share for the wizard never offering login — otherwise gets every + // cloud feature silently switched off. No post-login sync prompt, no user presets fetched, and + // "Sync Presets" greyed out with nothing to say why, because on_user_login_handle() returns + // early on stealth. Upstream #15239. + // + // This releases the pre-wizard DEFAULT only. An explicit Stealth mode setting still wins, so a + // user who deliberately turned it on stays offline whether or not they are signed in. + if (!m_cloud_logged_in && !get_bool("firstguide","finish")) { return true; } return get_bool("stealth_mode"); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index 2c83ebb488..adb30375e3 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -91,6 +91,9 @@ public: std::string get_language_code(); std::string get_hms_host(); bool get_stealth_mode(); + // Session state, not a setting: mirrors whether a cloud account is currently signed in, so + // get_stealth_mode() can tell "the user has not been asked yet" from "the user said no". + void set_cloud_logged_in(bool logged_in) { m_cloud_logged_in = logged_in; } bool get_hide_login_side_panel(); // Clear and reset to defaults. @@ -424,6 +427,9 @@ private: Semver m_orig_version; // Whether the existing version is before system profiles & configuration updating bool m_legacy_datadir; + // A cloud account is signed in right now. Deliberately NOT persisted: it is mirrored from the + // network agent on login/logout, so a stale value cannot outlive the session that set it. + bool m_cloud_logged_in{false}; std::string m_loading_path; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index db51bd9d8e..64f539db20 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -3834,6 +3834,10 @@ bool GUI_App::on_init_network(bool try_backup) std::string country_code = app_config->get_country_code(); m_agent->set_country_code(country_code); m_agent->start(); + // A session restored from a saved token fires no login event, so seed the flag here too — + // otherwise the pre-wizard stealth default would come back on the next launch for a user + // who is already signed in. + app_config->set_cloud_logged_in(m_agent->is_user_login(ORCA_CLOUD_PROVIDER)); // Orca: disable Bambu telemetry up-front (before any login) so it never starts. check_track_enable(); } @@ -5003,6 +5007,7 @@ void GUI_App::request_user_logout(const std::string& provider/* = ORCA_CLOUD_PRO { if (m_agent && m_agent->is_user_login(provider)) { m_agent->user_logout(true, provider); + app_config->set_cloud_logged_in(m_agent->is_user_login(ORCA_CLOUD_PROVIDER)); if (provider == get_printer_cloud_provider()) { m_agent->set_user_selected_machine(""); @@ -5588,6 +5593,12 @@ void GUI_App::on_update_machine_list(wxCommandEvent &evt) void GUI_App::on_user_login_handle(wxCommandEvent &evt) { if (!m_agent) { return; } + // Tell AppConfig a cloud account is signed in BEFORE asking about stealth: an unfinished setup + // wizard makes get_stealth_mode() report stealth by default, and without this the early return + // below would swallow the whole post-login flow — presets, plugins and the sync prompt — for + // anyone who closed the wizard and signed in afterwards. An explicit Stealth mode setting is + // unaffected and still returns here. + app_config->set_cloud_logged_in(m_agent->is_user_login(ORCA_CLOUD_PROVIDER)); if (app_config->get_stealth_mode()) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": stealth mode enabled, skipping cloud connection"; return; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 8452efa437..70b57451fe 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -3402,14 +3402,22 @@ void MainFrame::init_menubar_as_editor() info_dlg.ShowModal(); return; } + if (wxGetApp().app_config->get_stealth_mode()) { + MessageDialog info_dlg(this, + _L("Stealth mode is on, so Orca Cloud syncing is switched off. " + "Turn Stealth mode off in Preferences to sync your presets."), + _L("Sync Presets"), wxOK | wxICON_INFORMATION); + info_dlg.ShowModal(); + return; + } if (m_plater) m_plater->get_notification_manager()->push_notification( into_u8(_L("Syncing presets from cloud\u2026"))); wxGetApp().restart_sync_user_preset(); }, "", nullptr, - [this]() { - return wxGetApp().is_user_login() && !wxGetApp().app_config->get_stealth_mode(); - }, this); + // Stays ENABLED whatever the cloud state: both refusals above name their reason, and a + // greyed-out item names none. A user who could not sync had no way to find out why. + []() { return true; }, this); top_menu->AppendSeparator(); append_menu_item( @@ -3539,14 +3547,22 @@ void MainFrame::init_menubar_as_editor() info_dlg.ShowModal(); return; } + if (wxGetApp().app_config->get_stealth_mode()) { + MessageDialog info_dlg(this, + _L("Stealth mode is on, so Orca Cloud syncing is switched off. " + "Turn Stealth mode off in Preferences to sync your presets."), + _L("Sync Presets"), wxOK | wxICON_INFORMATION); + info_dlg.ShowModal(); + return; + } if (m_plater) m_plater->get_notification_manager()->push_notification( into_u8(_L("Syncing presets from cloud\u2026"))); wxGetApp().restart_sync_user_preset(); }, "", nullptr, - [this]() { - return wxGetApp().is_user_login() && !wxGetApp().app_config->get_stealth_mode(); - }, this); + // Stays ENABLED whatever the cloud state: both refusals above name their reason, and a + // greyed-out item names none. A user who could not sync had no way to find out why. + []() { return true; }, this); fileMenu->AppendSeparator(); append_menu_item(