From a5be8075e93d6d7610cf696106caaa614e9ada30 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Tue, 21 Jul 2026 13:15:56 +0800 Subject: [PATCH] Don't auto-connect LAN printers on Device tab entry (#14851) Adopt BambuStudio's load_last_machine (cloud machines only, remembered machine preferred) and port record_user_last_machine / get_user_last_machine. Orca's version auto-connected an arbitrary LAN printer, starting an unrequested connection that the user's first printer switch tore down mid-flight, which the 02.08 plugin's connect worker does not survive. This also caused the 100% crash-on-relaunch loop: the crashed-on printer was auto-connected at startup, so re-selecting it always hit the same-machine disconnect+reconnect path. --- src/slic3r/GUI/DeviceCore/DevManager.cpp | 43 +++++++++++++++++------- src/slic3r/GUI/DeviceCore/DevManager.h | 3 ++ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index 320d68f727..191b026a94 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -591,6 +591,7 @@ namespace Slic3r } selected_machine = dev_id; + record_user_last_machine(selected_machine); return true; } @@ -853,21 +854,39 @@ namespace Slic3r } } + void DeviceManager::record_user_last_machine(const std::string& dev_id) + { + if (Slic3r::GUI::wxGetApp().app_config) { + Slic3r::GUI::wxGetApp().app_config->set("user_last_selected_machine", dev_id); + } + } + + std::string DeviceManager::get_user_last_machine() const + { + if (Slic3r::GUI::wxGetApp().app_config) { + const auto& user_last_machine = Slic3r::GUI::wxGetApp().app_config->get("user_last_selected_machine"); + if (!user_last_machine.empty()) { + return user_last_machine; + } else if (m_agent) { + return m_agent->get_user_selected_machine(); + } + } + + return ""; + } + void DeviceManager::load_last_machine() { - // Get all available machines, include cloud machines and lan machines that have access right - auto all_machines = get_my_machine_list(); - if (all_machines.empty()) - return; - - // Then connect to the machine we last selected if available - const std::string last_monitor_machine = m_agent ? m_agent->get_user_selected_machine() : ""; - const auto last_machine = all_machines.find(last_monitor_machine); - if (last_machine != all_machines.end()) { - this->set_selected_machine(last_machine->second->get_dev_id()); + if (userMachineList.empty()) return; + else if (userMachineList.size() == 1) { + this->set_selected_machine(userMachineList.begin()->second->get_dev_id()); } else { - // If not, then select the first available one - this->set_selected_machine(all_machines.begin()->second->get_dev_id()); + const auto& last_monitor_machine = get_user_last_machine(); + if (userMachineList.find(last_monitor_machine) != userMachineList.end()) { + set_selected_machine(last_monitor_machine); + } else { + this->set_selected_machine(userMachineList.begin()->second->get_dev_id()); + } } } diff --git a/src/slic3r/GUI/DeviceCore/DevManager.h b/src/slic3r/GUI/DeviceCore/DevManager.h index bab53d02b9..1f7f87b7fb 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.h +++ b/src/slic3r/GUI/DeviceCore/DevManager.h @@ -48,6 +48,9 @@ public: MachineObject* get_selected_machine(); bool set_selected_machine(std::string dev_id); + void record_user_last_machine(const std::string& dev_id); + std::string get_user_last_machine() const; + // local machine void set_local_selected_machine(std::string dev_id) { local_selected_machine = dev_id; }; MachineObject* get_local_selected_machine() const { return get_local_machine(local_selected_machine); }