From 6432ec8a9b91939b3e433e9a44c1f437a4b35b82 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 23 Apr 2018 15:09:01 +0200 Subject: [PATCH] Experiment with extruders count change --- xs/src/slic3r/GUI/Tab.cpp | 86 ++++++++++++++++++++++++++++++++++----- xs/src/slic3r/GUI/Tab.hpp | 5 +++ 2 files changed, 81 insertions(+), 10 deletions(-) diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 3ad40d9f7..f0471cea0 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -1306,6 +1306,7 @@ void TabFilament::reload_config(){ void TabFilament::update() { + Freeze(); wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset())); m_cooling_description_line->SetText(text); text = from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle)); @@ -1319,6 +1320,7 @@ void TabFilament::update() for (auto el : { "min_fan_speed", "disable_fan_first_layers" }) get_field(el)->toggle(fan_always_on); + Thaw(); } void TabFilament::OnActivate() @@ -1349,7 +1351,8 @@ void TabPrinter::build() load_initial_data(); // to avoid redundant memory allocation / deallocation during extruders count changing - m_pages.reserve(30); + m_pages.reserve(30); + m_extruders_tree_items.reserve(30); auto *nozzle_diameter = dynamic_cast(m_config->option("nozzle_diameter")); m_initial_extruders_count = m_extruders_count = nozzle_diameter->values.size(); @@ -1400,8 +1403,10 @@ void TabPrinter::build() size_t extruders_count = boost::any_cast(optgroup->get_value("extruders_count")); wxTheApp->CallAfter([this, opt_key, value, extruders_count](){ if (opt_key.compare("extruders_count")==0 || opt_key.compare("single_extruder_multi_material")==0) { + m_correct_treectrl = true; extruders_count_changed(extruders_count); update_dirty(); + m_correct_treectrl = false; if (opt_key.compare("single_extruder_multi_material")==0) // the single_extruder_multimaterial was added to force pages on_value_change(opt_key, value); // rebuild - let's make sure the on_value_change is not skipped } @@ -1835,19 +1840,80 @@ void Tab::rebuild_page_tree() // get label of the currently selected item auto selected = m_treectrl->GetItemText(m_treectrl->GetSelection()); auto rootItem = m_treectrl->GetRootItem(); - m_treectrl->DeleteChildren(rootItem); + auto have_selection = 0; - for (auto p : m_pages) + if (name() == "printer") { - auto itemId = m_treectrl->AppendItem(rootItem, p->title(), p->iconID()); - m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); - if (p->title() == selected) { - m_disable_tree_sel_changed_event = 1; - m_treectrl->SelectItem(itemId); - m_disable_tree_sel_changed_event = 0; - have_selection = 1; + TabPrinter* tab = dynamic_cast(this); + if (!tab->m_correct_treectrl){ + m_treectrl->DeleteChildren(rootItem); + tab->m_extruders_tree_items.resize(0); + tab->m_single_extruder_MM_item = nullptr; + for (auto p : m_pages) + { + auto itemId = m_treectrl->AppendItem(rootItem, p->title(), p->iconID()); + m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); + + if (p->title().Contains(_("Extruder"))) + tab->m_extruders_tree_items.push_back(itemId); + + if (p->title() == _("Single extruder MM setup")) + tab->m_single_extruder_MM_item = itemId; + + if (p->title() == selected) { + m_disable_tree_sel_changed_event = 1; + m_treectrl->SelectItem(itemId); + m_disable_tree_sel_changed_event = 0; + have_selection = 1; + } + } + } + else + { + while (tab->m_extruders_tree_items.size() > tab->m_extruders_count){ + m_treectrl->Delete(tab->m_extruders_tree_items.back()); + tab->m_extruders_tree_items.pop_back(); + } + + size_t i = 2 + tab->m_extruders_tree_items.size(); + for (; i < 2 + tab->m_extruders_count; ++i) + { + auto p = m_pages[i]; + auto itemId = m_treectrl->InsertItem(rootItem, tab->m_extruders_tree_items.back(), p->title(), p->iconID()); + m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); + tab->m_extruders_tree_items.push_back(itemId); + } + + if (tab->m_extruders_count == 1 || !m_config->opt_bool("single_extruder_multi_material") + && tab->m_single_extruder_MM_item) + { + m_treectrl->Delete(tab->m_single_extruder_MM_item); + tab->m_single_extruder_MM_item = nullptr; + } + else if (tab->m_single_extruder_MM_item == nullptr) + { + auto p = m_pages[i]; + auto itemId = tab->m_single_extruder_MM_item = + m_treectrl->InsertItem(rootItem, tab->m_extruders_tree_items.back(), p->title(), p->iconID()); + m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); + } } } + else + { + m_treectrl->DeleteChildren(rootItem); + for (auto p : m_pages) + { + auto itemId = m_treectrl->AppendItem(rootItem, p->title(), p->iconID()); + m_treectrl->SetItemTextColour(itemId, p->get_item_colour()); + if (p->title() == selected) { + m_disable_tree_sel_changed_event = 1; + m_treectrl->SelectItem(itemId); + m_disable_tree_sel_changed_event = 0; + have_selection = 1; + } + } + } if (!have_selection) { // this is triggered on first load, so we don't disable the sel change event diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index eda6727a8..0961c71fb 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -300,6 +300,11 @@ public: size_t m_initial_extruders_count; size_t m_sys_extruders_count; + std::vector m_extruders_tree_items; + wxTreeItemId m_single_extruder_MM_item = nullptr; + bool m_correct_treectrl = false; // m_correct_tree = false -> delete/create m_treectrl + // m_correct_tree = true -> just correct m_treectrl + TabPrinter() {} TabPrinter(wxNotebook* parent, bool no_controller) : Tab(parent, _(L("Printer Settings")), "printer", no_controller) {} ~TabPrinter(){}