diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index c101f1bd3..464734f9c 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -160,34 +160,78 @@ void add_correct_opts_to_dirty_options(const std::string &opt_key, std::vector<s } } +template<class T> +void add_correct_opts_to_sys_options(const std::string &opt_key, std::vector<std::string> *vec, TabPrinter *tab) +{ + const Preset* sys_preset = tab->m_presets->get_selected_preset_parent(); + if (sys_preset == nullptr) + return; + T *opt_cur = static_cast<T*>(tab->m_config->option(opt_key)); + const T *opt_sys = static_cast<const T*>(sys_preset->config.option(opt_key)); + int opt_max_id = opt_sys->values.size()-1; + for (int i = 0; i < opt_cur->values.size(); i++) + { + int init_id = i <= opt_max_id ? i : 0; + if (opt_cur->values[i] == opt_sys->values[init_id]) + vec->emplace_back(opt_key + "#" + std::to_string(i)); + } +} + // Update UI according to changes void Tab::update_changed_ui() { auto dirty_options = m_presets->current_dirty_options(); + auto sys_options = m_presets->system_equal_options(); + if (name() == "printer"){ // Update dirty_options in case changes of Extruder's options TabPrinter* tab = static_cast<TabPrinter*>(this); - std::vector<std::string> new_dirty; + std::vector<std::string> new_options; for (auto opt_key : dirty_options) { switch (m_config->option(opt_key)->type()) { - case coInts: add_correct_opts_to_dirty_options<ConfigOptionInts >(opt_key, &new_dirty, tab); break; - case coBools: add_correct_opts_to_dirty_options<ConfigOptionBools >(opt_key, &new_dirty, tab); break; - case coFloats: add_correct_opts_to_dirty_options<ConfigOptionFloats >(opt_key, &new_dirty, tab); break; - case coStrings: add_correct_opts_to_dirty_options<ConfigOptionStrings >(opt_key, &new_dirty, tab); break; - case coPercents:add_correct_opts_to_dirty_options<ConfigOptionPercents >(opt_key, &new_dirty, tab); break; - case coPoints: add_correct_opts_to_dirty_options<ConfigOptionPoints >(opt_key, &new_dirty, tab); break; - default: new_dirty.emplace_back(opt_key); break; + case coInts: add_correct_opts_to_dirty_options<ConfigOptionInts >(opt_key, &new_options, tab); break; + case coBools: add_correct_opts_to_dirty_options<ConfigOptionBools >(opt_key, &new_options, tab); break; + case coFloats: add_correct_opts_to_dirty_options<ConfigOptionFloats >(opt_key, &new_options, tab); break; + case coStrings: add_correct_opts_to_dirty_options<ConfigOptionStrings >(opt_key, &new_options, tab); break; + case coPercents:add_correct_opts_to_dirty_options<ConfigOptionPercents >(opt_key, &new_options, tab); break; + case coPoints: add_correct_opts_to_dirty_options<ConfigOptionPoints >(opt_key, &new_options, tab); break; + default: new_options.emplace_back(opt_key); break; } } dirty_options.resize(0); - dirty_options = new_dirty; - if (tab->m_initial_extruders_count != tab->m_extruders_count){ + dirty_options = new_options; + if (tab->m_initial_extruders_count != tab->m_extruders_count) dirty_options.emplace_back("extruders_count"); + + new_options.resize(0); + std::initializer_list<const char*> optional_keys{"bed_shape", "compatible_printers", "compatible_printers_condition" }; + for (auto &opt_key : optional_keys) { + if (find(sys_options.begin(), sys_options.end(),opt_key) != sys_options.end()) + new_options.emplace_back(opt_key); } + for (auto opt_key : m_config->keys()) + { + if (opt_key == "bed_shape") continue; + switch (m_config->option(opt_key)->type()) + { + case coInts: add_correct_opts_to_sys_options<ConfigOptionInts >(opt_key, &new_options, tab); break; + case coBools: add_correct_opts_to_sys_options<ConfigOptionBools >(opt_key, &new_options, tab); break; + case coFloats: add_correct_opts_to_sys_options<ConfigOptionFloats >(opt_key, &new_options, tab); break; + case coStrings: add_correct_opts_to_sys_options<ConfigOptionStrings >(opt_key, &new_options, tab); break; + case coPercents:add_correct_opts_to_sys_options<ConfigOptionPercents>(opt_key, &new_options, tab); break; + case coPoints: add_correct_opts_to_sys_options<ConfigOptionPoints >(opt_key, &new_options, tab); break; + default: new_options.emplace_back(opt_key); break; + } + } + + sys_options.resize(0); + sys_options = new_options; + if (tab->m_sys_extruders_count == tab->m_extruders_count) + sys_options.emplace_back("extruders_count"); } // Add new dirty options to m_dirty_options @@ -231,7 +275,6 @@ void Tab::update_changed_ui() //update system options (colored in green) - auto sys_options = m_presets->system_equal_options(); // Add new system equal options to m_sys_options for (auto opt_key : sys_options){ Field* field = get_field(opt_key); @@ -265,16 +308,18 @@ void Tab::update_changed_ui() { const std::string &opt_key = m_sys_options[i]; Field* field = get_field(opt_key); - if (field != nullptr && find(sys_options.begin(), sys_options.end(), opt_key) == sys_options.end()) + if (find(sys_options.begin(), sys_options.end(), opt_key) == sys_options.end()) { - // use bouth of temporary_icons till don't have "unlock_icon" - field->m_Undo_to_sys_btn->SetBitmap(wxBitmap(from_u8(var(m_nonsys_btn_icon)), wxBITMAP_TYPE_PNG)); - if (field->m_Label != nullptr && - find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ - field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); - field->m_Label->Refresh(true); + if (field != nullptr){ + // use bouth of temporary_icons till don't have "unlock_icon" + field->m_Undo_to_sys_btn->SetBitmap(wxBitmap(from_u8(var(m_nonsys_btn_icon)), wxBITMAP_TYPE_PNG)); + if (field->m_Label != nullptr && + find(m_dirty_options.begin(), m_dirty_options.end(), opt_key) == m_dirty_options.end()){ + field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT); + field->m_Label->Refresh(true); + } + field->m_is_nonsys_value = true; } - field->m_is_nonsys_value = true; std::vector<std::string>::iterator itr = find(m_sys_options.begin(), m_sys_options.end(), opt_key); if (itr != m_sys_options.end()){ m_sys_options.erase(itr); @@ -1071,6 +1116,7 @@ void TabPrinter::build() auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter")); m_initial_extruders_count = m_extruders_count = nozzle_diameter->values.size(); + m_sys_extruders_count = static_cast<const ConfigOptionFloats*>(m_presets->get_selected_preset_parent()->config.option("nozzle_diameter"))->values.size(); auto page = add_options_page(_(L("General")), "printer_empty.png"); auto optgroup = page->new_optgroup(_(L("Size and coordinates"))); @@ -1729,6 +1775,8 @@ void Tab::save_preset(std::string name /*= ""*/) // Update the selection boxes at the platter. on_presets_changed(); + if (m_name == "printer") + static_cast<TabPrinter*>(this)->m_initial_extruders_count = static_cast<TabPrinter*>(this)->m_extruders_count; update_changed_ui(); } diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index d3be0e8bc..a2cf648e9 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -228,6 +228,7 @@ public: size_t m_extruders_count; size_t m_initial_extruders_count; + size_t m_sys_extruders_count; std::vector<PageShp> m_extruder_pages; TabPrinter() {}