From fd63164268bf6835612ee719cc77e124c687c974 Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Mon, 14 Sep 2026 03:03:45 +0300 Subject: [PATCH] Fix Printer Agent preset undo (#15645) Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com> --- src/slic3r/GUI/OptionsGroup.cpp | 8 +++--- src/slic3r/GUI/Tab.cpp | 44 ++++----------------------------- 2 files changed, 8 insertions(+), 44 deletions(-) diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 7d63556eff..99151ca599 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -798,11 +798,9 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config, #endif else if (opt_key == "printer_agent") { - // why: printer_agent is a coString kept out of m_opt_map. The generic non-opt_map revert - // below restores the edited config from get_value(), but a deregistered/"(missing)" saved - // id has no selectable row, so the field yields no value and the edited config keeps the - // user's interim pick -> stuck dirty. Restore the SAVED id straight into the edited config - // (displayable or not; config is the saved or system baseline), then repaint and notify. + // A deregistered/"(missing)" saved id has no selectable row, so the field yields no + // value. Restore the saved id directly instead of letting the generic revert path read + // the field value back into the edited config. const std::string saved_id = config.opt_string("printer_agent"); set_value(opt_key, saved_id); this->change_opt_value(opt_key, saved_id); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 2dedb23365..914e4cc7bb 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -5029,28 +5029,12 @@ void TabPrinter::build_fff() auto registered_printer_agents = NetworkAgentFactory::get_registered_printer_agents(); if (!registered_printer_agents.empty()) { - ConfigOptionDef def; - def.type = coString; - def.gui_type = ConfigOptionDef::GUIType::printer_agent_select; - def.width = 3 * Field::def_width_wider() / 2; - def.label = L("Printer Agent"); - def.tooltip = L("Select the network agent implementation for printer communication. " + option = optgroup->get_option("printer_agent"); + option.opt.gui_type = ConfigOptionDef::GUIType::printer_agent_select; + option.opt.width = 3 * Field::def_width_wider() / 2; + option.opt.tooltip = L("Select the network agent implementation for printer communication. " "Available agents are registered at startup."); - def.mode = comAdvanced; - - // Create the field without get_option() so it is not registered in m_opt_map. - // ConfigOptionsGroup handles printer_agent before the generic mapped write path. - Line agent_line = optgroup->create_single_option_line(Option(def, "printer_agent")); - optgroup->append_line(agent_line); - if (Field* agent_field = get_field("printer_agent")) - { - if (auto* choice = dynamic_cast(agent_field); choice && choice->getWindow()) - choice->set_value(m_config->opt_string("printer_agent"), false); - } - - // Register by hand so the UnsavedChanges dialog can render a row for it. - wxGetApp().sidebar().get_searcher().add_key("printer_agent", m_type, optgroup->title, - optgroup->config_category()); + optgroup->append_single_option_line(option); } } @@ -5912,15 +5896,6 @@ void TabPrinter::reload_config() if (m_active_page && m_active_page->title() == "Multimaterial") m_active_page->set_value("extruders_count", int(m_extruders_count)); - // m_opt_map-driven reload does not cover printer_agent, so sync this custom field explicitly. - if (Field* agent_field = get_field("printer_agent")) - { - if (auto* choice = dynamic_cast(agent_field); choice && choice->getWindow()) - { - const std::string selected_agent = m_config->opt_string("printer_agent"); - choice->set_value(selected_agent, false); - } - } } void TabPrinter::activate_selected_page(std::function throw_if_canceled) @@ -5932,15 +5907,6 @@ void TabPrinter::activate_selected_page(std::function throw_if_canceled) if (m_active_page && m_active_page->title() == "Multimaterial") m_active_page->set_value("extruders_count", int(m_extruders_count)); - // m_opt_map-driven reload does not cover printer_agent, so sync this custom field explicitly. - if (Field* agent_field = get_field("printer_agent")) - { - if (auto* choice = dynamic_cast(agent_field); choice && choice->getWindow()) - { - const std::string selected_agent = m_config->opt_string("printer_agent"); - choice->set_value(selected_agent, false); - } - } } void TabPrinter::clear_pages()