diff --git a/resources/images/page_down.svg b/resources/images/page_down.svg
new file mode 100644
index 000000000..7841fee1f
--- /dev/null
+++ b/resources/images/page_down.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/images/page_up.svg b/resources/images/page_up.svg
new file mode 100644
index 000000000..615317ceb
--- /dev/null
+++ b/resources/images/page_up.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp
index 5f15698e6..91360486a 100644
--- a/src/libslic3r/Preset.cpp
+++ b/src/libslic3r/Preset.cpp
@@ -2677,6 +2677,17 @@ size_t PresetCollection::first_visible_idx() const
return first_visible;
}
+std::vector PresetCollection::diameters_of_selected_printer()
+{
+ std::set diameters;
+ auto printer_model = m_edited_preset.config.opt_string("printer_model");
+ for (auto &preset : m_presets) {
+ if (preset.config.opt_string("printer_model") == printer_model)
+ diameters.insert(preset.config.opt_string("printer_variant"));
+ }
+ return std::vector{diameters.begin(), diameters.end()};
+}
+
void PresetCollection::set_default_suppressed(bool default_suppressed)
{
if (m_default_suppressed != default_suppressed) {
diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp
index 038ad0b85..e43adf6cd 100644
--- a/src/libslic3r/Preset.hpp
+++ b/src/libslic3r/Preset.hpp
@@ -623,6 +623,8 @@ public:
// Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible.
size_t first_compatible_idx() const { return this->first_compatible_idx([](const Preset&) -> int { return 0; }); }
+ std::vector diameters_of_selected_printer();
+
// Return index of the first visible preset. Certainly at least the '- default -' preset shall be visible.
// Return the first visible preset. Certainly at least the '- default -' preset shall be visible.
Preset& first_visible() { return this->preset(this->first_visible_idx()); }
diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp
index 2d3bb269a..6a68e4e33 100644
--- a/src/libslic3r/PresetBundle.cpp
+++ b/src/libslic3r/PresetBundle.cpp
@@ -1922,7 +1922,7 @@ std::vector> PresetBundle::get_extruder_filament
return filament_infos;
}
-std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str)
+std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str, bool system_only)
{
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << "printer_type: " << printer_type << "nozzle_diameter_str" << nozzle_diameter_str;
std::set printer_names;
@@ -1937,7 +1937,7 @@ std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle
std::ostringstream stream;
for (auto printer_it = this->printers.begin(); printer_it != this->printers.end(); printer_it++) {
- if (!printer_it->is_system) continue;
+ if (system_only && !printer_it->is_system) continue;
ConfigOption * printer_model_opt = printer_it->config.option("printer_model");
ConfigOptionString *printer_model_str = dynamic_cast(printer_model_opt);
@@ -2020,6 +2020,24 @@ bool PresetBundle::check_filament_temp_equation_by_printer_type_and_nozzle_for_m
return is_equation;
}
+Preset *PresetBundle::get_similar_printer_preset(std::string printer_model, std::string printer_variant)
+{
+ if (printer_model.empty())
+ printer_model = printers.get_selected_preset().config.opt_string("printer_model");
+ auto printer_variant_old = printers.get_selected_preset().config.opt_string("printer_variant");
+ auto printer_names = get_printer_names_by_printer_type_and_nozzle(printer_model, printer_variant.empty() ? printer_variant_old : printer_variant, !printer_model.empty());
+ if (printer_names.empty())
+ return nullptr;
+ auto prefer_printer = printers.get_selected_preset().name;
+ if (!printer_variant.empty())
+ boost::replace_all(prefer_printer, printer_variant_old, printer_variant);
+ else if (auto n = prefer_printer.find(printer_variant_old); n != std::string::npos)
+ prefer_printer = printer_model + " " + printer_variant_old + prefer_printer.substr(n + printer_variant_old.length());
+ if (printer_names.count(prefer_printer) == 0)
+ prefer_printer = *printer_names.begin();
+ return printers.find_preset(prefer_printer, false, true);
+}
+
//BBS: check whether this is the only edited filament
bool PresetBundle::is_the_only_edited_filament(unsigned int filament_index)
{
diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp
index 37c8d185f..7ed7f4e26 100644
--- a/src/libslic3r/PresetBundle.hpp
+++ b/src/libslic3r/PresetBundle.hpp
@@ -107,7 +107,7 @@ public:
std::vector> get_extruder_filament_info() const;
- std::set get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str);
+ std::set get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str, bool system_only = true);
bool check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray(const std::string &printer_type,
std::string & nozzle_diameter_str,
std::string & setting_id,
@@ -115,6 +115,7 @@ public:
std::string & nozzle_temp_min,
std::string & nozzle_temp_max,
std::string & preset_setting_id);
+ Preset * get_similar_printer_preset(std::string printer_model, std::string printer_variant);
PresetCollection prints;
PresetCollection sla_prints;
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index c9edcad35..ac9e26865 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -318,6 +318,7 @@ struct ExtruderGroup : StaticGroup
ExtruderGroup(wxWindow * parent, int index, wxString const &title);
wxStaticBoxSizer *sizer = nullptr;
ScalableButton * btn_edit = nullptr;
+ ComboBox * combo_diameter = nullptr;
ComboBox * combo_nozzle = nullptr;
AMSPreview * ams[4] = {nullptr};
wxStaticText *ams_not_installed_msg{nullptr};
@@ -326,6 +327,7 @@ struct ExtruderGroup : StaticGroup
bool is_upward{false};
int ams_n4 = 0;
int ams_n1 = 0;
+ wxString diameter;
void set_ams_count(int n4, int n1)
{
@@ -340,6 +342,7 @@ struct ExtruderGroup : StaticGroup
{
if (btn_edit)
btn_edit->msw_rescale();
+ combo_diameter->Rescale();
combo_nozzle->Rescale();
}
};
@@ -437,6 +440,7 @@ struct Sidebar::priv
void can_search();
void sync_extruder_list();
+ bool switch_diameter(bool single);
#ifdef _WIN32
wxString btn_reslice_tip;
@@ -837,9 +841,16 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
ShowBadge(true);
// Nozzle
+ wxStaticText *label_diameter = new wxStaticText(this, wxID_ANY, _L("Diameter"));
+ label_diameter->SetFont(Label::Body_14);
+ label_diameter->SetForegroundColour("#262E30");
+ label_diameter->SetMinSize({FromDIP(80), -1});
+ auto combo_diameter = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
+ this->combo_diameter = combo_diameter;
wxStaticText *label_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle"));
label_nozzle->SetFont(Label::Body_14);
label_nozzle->SetForegroundColour("#262E30");
+ label_nozzle->SetMinSize({FromDIP(80), -1});
auto combo_nozzle = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
combo_nozzle->GetDropDown().SetUseContentWidth(true);
combo_nozzle->Bind(wxEVT_COMBOBOX, [this, index, combo_nozzle](wxCommandEvent &evt) {
@@ -852,6 +863,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS"));
label_ams->SetFont(Label::Body_14);
label_ams->SetForegroundColour("#262E30");
+ //label_ams->SetMinSize({FromDIP(70), -1});
if (index >= 0) {
btn_edit = new ScalableButton(this, wxID_ANY, "dot");
btn_edit->SetBackgroundColour(*wxWHITE);
@@ -866,7 +878,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
});
auto hovered = std::make_shared();
- for (wxWindow *w : std::initializer_list{this, label_nozzle, combo_nozzle, btn_edit, label_ams}) {
+ for (wxWindow *w : std::initializer_list{this, label_diameter, combo_diameter, label_nozzle, combo_nozzle, btn_edit, label_ams}) {
w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, this](wxMouseEvent &evt) { *hovered = w; btn_edit->SetBitmap_("edit"); });
w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, this](wxMouseEvent &evt) { if (*hovered == w) { btn_edit->SetBitmap_("dot"); *hovered = nullptr; } });
}
@@ -890,24 +902,32 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
hsizer_ams->Add(btn_edit, 0, 0);
up_down_btn = new ScalableButton(this, wxID_ANY, "dot");
+ up_down_btn->SetBackgroundColour(*wxWHITE);
up_down_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [this, index](auto &evt) {
is_upward = !is_upward;
update_ams();
});
+ wxBoxSizer *hsizer_diameter = new wxBoxSizer(wxHORIZONTAL);
+ hsizer_diameter->Add(label_diameter, 0, wxALIGN_CENTER);
+ hsizer_diameter->Add(combo_diameter, 1, wxEXPAND);
wxBoxSizer * hsizer_nozzle = new wxBoxSizer(wxHORIZONTAL);
- hsizer_nozzle->Add(label_nozzle, 2, wxALIGN_CENTER);
- hsizer_nozzle->Add(combo_nozzle, 3, wxEXPAND);
+ hsizer_nozzle->Add(label_nozzle, 0, wxALIGN_CENTER);
+ hsizer_nozzle->Add(combo_nozzle, 1, wxEXPAND);
if (index < 0) {
wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL);
- hsizer->Add(hsizer_ams, 1, wxLEFT | wxTOP | wxBOTTOM | wxALIGN_CENTER, FromDIP(4));
- hsizer->Add(hsizer_nozzle, 1, wxALL | wxALIGN_CENTER, FromDIP(4));
- hsizer->AddSpacer(FromDIP(4));
+ hsizer->Add(hsizer_ams, 1, wxLEFT | wxTOP | wxBOTTOM | wxALIGN_CENTER, FromDIP(2));
+ wxBoxSizer *vsizer_extruder = new wxBoxSizer(wxVERTICAL);
+ vsizer_extruder->Add(hsizer_diameter, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2));
+ vsizer_extruder->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2));
+ hsizer->Add(vsizer_extruder, 1, wxALL | wxALIGN_CENTER, FromDIP(2));
+ hsizer->AddSpacer(FromDIP(2)); // Avoid badge
this->sizer = hsizer;
} else {
wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL);
- vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(4));
- vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(4));
+ vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2));
+ vsizer->Add(hsizer_diameter, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2));
+ vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2));
this->sizer = vsizer;
}
@@ -966,6 +986,9 @@ void ExtruderGroup::update_ams()
for (; i < 4; ++i) { ams[i]->Close(); }
if (display_capacity < 0) {
up_down_btn->Show();
+ static ScalableBitmap down(this, "page_down", 16);
+ static ScalableBitmap up(this, "page_up", 16);
+ up_down_btn->SetBitmap(is_upward ? up.bmp() : down.bmp());
} else {
up_down_btn->Hide();
}
@@ -980,16 +1003,61 @@ void ExtruderGroup::update_ams()
}
for (size_t i = 0; i < 4; ++i) {
if (ams[i]->IsShown())
- hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(4));
+ hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(2));
}
if (up_down_btn->IsShown()) {
- hsizer_ams->AddStretchSpacer(1);
- hsizer_ams->Add(up_down_btn, 0, wxALIGN_CENTER);
+ if (btn_edit)
+ hsizer_ams->AddStretchSpacer(1);
+ hsizer_ams->Add(up_down_btn, 0, wxALIGN_CENTER | wxLEFT, FromDIP(2));
}
sizer->Layout();
}
+struct DiameterMessageDialog : MessageDialog
+{
+ DiameterMessageDialog(wxWindow * parent, wxString diameter_left, wxString diameter_right)
+ : MessageDialog(parent, _L("The software does not support using different diameter of nozzles for one print. "
+ "If the left and right nozzles are inconsistent, we can only proceed with single-head printing. "
+ "Please confirm which nozzle you would like to use for this project."), _L("Switch diameter"), wxYES_NO | wxNO_DEFAULT)
+ {
+ add_button(wxID_YES, false, wxString::Format(_L("Left nozzle: %smm"), diameter_left));
+ add_button(wxID_NO, true, wxString::Format(_L("Right nozzle: %smm"), diameter_right));
+ }
+};
+
+bool Sidebar::priv::switch_diameter(bool single)
+{
+ wxString diameter;
+ if (single) {
+ diameter = single_extruder->combo_diameter->GetValue();
+ } else {
+ auto diameter_left = left_extruder->combo_diameter->GetValue();
+ auto diameter_right = right_extruder->combo_diameter->GetValue();
+ if (diameter_left != diameter_right) {
+ DiameterMessageDialog dlg(this->plater, diameter_left, diameter_right);
+ int result = dlg.ShowModal();
+ if (result == wxID_YES)
+ diameter = diameter_left;
+ else if (result == wxID_NO)
+ diameter = diameter_right;
+ else
+ return false;
+ }
+ else {
+ diameter = diameter_left;
+ }
+ }
+ auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, diameter.ToStdString());
+ if (preset == nullptr) {
+ MessageDialog dlg(this->plater, _L(""), _L(""));
+ dlg.ShowModal();
+ return false;
+ }
+ preset->is_visible = true; // force visible
+ return wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name);
+}
+
void Sidebar::priv::sync_extruder_list()
{
MachineObject *obj = wxGetApp().getDeviceManager()->get_selected_machine();
@@ -1314,6 +1382,19 @@ Sidebar::Sidebar(Plater *parent)
p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left"));
p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right"));
p->single_extruder = new ExtruderGroup(p->m_panel_printer_content, -1, "");
+ auto switch_diameter = [this](wxCommandEvent & evt) {
+ auto extruder = dynamic_cast(dynamic_cast(evt.GetEventObject())->GetParent());
+ auto result = p->switch_diameter(extruder == p->single_extruder);
+ if (result) {
+ extruder->combo_diameter->SetSelection(evt.GetInt());
+ extruder->diameter = evt.GetString();
+ } else {
+ extruder->combo_diameter->SetValue(extruder->diameter);
+ }
+ };
+ p->left_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter);
+ p->right_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter);
+ p->single_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter);
p->vsizer_printer = new wxBoxSizer(wxVERTICAL);
p->layout_printer(true, true);
@@ -1878,11 +1959,27 @@ void Sidebar::update_presets(Preset::Type preset_type)
}
extruder.combo_nozzle->SetSelection(select);
};
+ auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer();
+ auto diameter = printer_preset.config.opt_string("printer_variant");
+ auto update_extruder_diameter = [&diameters, &diameter](ExtruderGroup & extruder) {
+ extruder.combo_diameter->Clear();
+ int select = -1;
+ for (size_t i = 0; i < diameters.size(); ++i) {
+ if (diameters[i] == diameter)
+ select = extruder.combo_diameter->GetCount();
+ extruder.combo_diameter->Append(diameters[i], {});
+ }
+ extruder.combo_diameter->SetSelection(select);
+ extruder.diameter = diameter;
+ };
if (is_dual_extruder) {
update_extruder_variant(*p->left_extruder, 0);
update_extruder_variant(*p->right_extruder, 1);
+ update_extruder_diameter(*p->left_extruder);
+ update_extruder_diameter(*p->right_extruder);
} else {
update_extruder_variant(*p->single_extruder, 0);
+ update_extruder_diameter(*p->single_extruder);
}
Layout();
@@ -7345,6 +7442,16 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
else
physical_printers.unselect_printer();
+ if (combo->is_selected_printer_model()) {
+ auto preset = wxGetApp().preset_bundle->get_similar_printer_preset(preset_name, {});
+ if (preset == nullptr) {
+ MessageDialog dlg(this->sidebar, _L(""), _L(""));
+ dlg.ShowModal();
+ }
+ preset->is_visible = true; // force visible
+ preset_name = preset->name;
+ }
+
update_objects_position_when_select_preset([this, &preset_type, &preset_name]() {
wxWindowUpdateLocker noUpdates2(sidebar->filament_panel());
wxGetApp().get_tab(preset_type)->select_preset(preset_name);
diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp
index d2df49178..3b3daa71b 100644
--- a/src/slic3r/GUI/PresetComboBoxes.cpp
+++ b/src/slic3r/GUI/PresetComboBoxes.cpp
@@ -661,6 +661,13 @@ bool PresetComboBox::is_selected_physical_printer()
return marker == LABEL_ITEM_PHYSICAL_PRINTER;
}
+bool PresetComboBox::is_selected_printer_model()
+{
+ auto selected_item = this->GetSelection();
+ auto marker = reinterpret_cast(this->GetClientData(selected_item));
+ return marker == LABEL_ITEM_PRINTER_MODELS;
+}
+
bool PresetComboBox::selection_is_changed_according_to_physical_printers()
{
if (m_type != Preset::TYPE_PRINTER || !is_selected_physical_printer())
@@ -984,18 +991,6 @@ void PlaterPresetComboBox::show_edit_menu()
wxGetApp().plater()->PopupMenu(menu);
}
-wxString PlaterPresetComboBox::get_preset_group_name(const Preset &preset)
-{
- wxString group_name;
- if (preset.is_system) {
- wxString name = get_preset_name(preset);
- if (name.size() > 12) {
- group_name = name.SubString(0, name.size() - 11);
- }
- }
- return group_name;
-}
-
wxString PlaterPresetComboBox::get_preset_name(const Preset& preset)
{
return from_u8(preset.label(false));
@@ -1042,23 +1037,14 @@ void PlaterPresetComboBox::update()
// and draw a red flag in front of the selected preset.
bool wide_icons = selected_preset && !selected_preset->is_compatible;
- struct PresetItemInfo
- {
- wxString name;
- wxString group_name;
- wxBitmap *bitmap;
-
- PresetItemInfo(wxString name_, wxString group_name_, wxBitmap * bitmap_): name(name_), group_name(group_name_), bitmap(bitmap_) {}
- };
-
- std::vector nonsys_presets;
+ std::map nonsys_presets;
//BBS: add project embedded presets logic
- std::vector project_embedded_presets;
- std::vector system_presets;
+ std::map project_embedded_presets;
+ std::map system_presets;
+ std::unordered_set system_printer_models;
std::map preset_descriptions;
std::map preset_filament_vendors;
std::map preset_filament_types;
-
//BBS: move system to the end
wxString selected_system_preset;
wxString selected_user_preset;
@@ -1082,12 +1068,7 @@ void PlaterPresetComboBox::update()
continue;
bool single_bar = false;
- const wxString name = get_preset_name(preset);
-
- wxString group_name;
- if (m_type == Preset::TYPE_PRINTER)
- group_name = get_preset_group_name(preset);
-
+ wxString name = get_preset_name(preset);
if (m_type == Preset::TYPE_FILAMENT)
{
#if 0
@@ -1110,7 +1091,16 @@ void PlaterPresetComboBox::update()
if (preset.is_default || preset.is_system) {
//BBS: move system to the end
- system_presets.emplace_back(PresetItemInfo(name, group_name, bmp));
+ if (m_type == Preset::TYPE_PRINTER) {
+ auto printer_model = preset.config.opt_string("printer_model");
+ name = from_u8(printer_model);
+ if (system_printer_models.count(printer_model) == 0) {
+ system_presets.emplace(name, bmp);
+ system_printer_models.insert(printer_model);
+ }
+ } else {
+ system_presets.emplace(name, bmp);
+ }
if (is_selected) {
tooltip = get_tooltip(preset);
selected_system_preset = name;
@@ -1124,7 +1114,7 @@ void PlaterPresetComboBox::update()
//BBS: add project embedded preset logic
else if (preset.is_project_embedded)
{
- project_embedded_presets.emplace_back(PresetItemInfo(name, group_name, bmp));
+ project_embedded_presets.emplace(name, bmp);
if (is_selected) {
selected_user_preset = name;
tooltip = wxString::FromUTF8(preset.name.c_str());
@@ -1132,7 +1122,7 @@ void PlaterPresetComboBox::update()
}
else
{
- nonsys_presets.emplace_back(PresetItemInfo(name, group_name, bmp));
+ nonsys_presets.emplace(name, bmp);
if (is_selected) {
selected_user_preset = name;
//BBS set tooltip
@@ -1154,40 +1144,43 @@ void PlaterPresetComboBox::update()
std::vector first_vendors = {"Bambu Lab", "Generic"};
std::vector first_types = {"PLA", "PETG", "ABS", "TPU"};
auto add_presets = [this, &preset_descriptions, &filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types]
- (std::vector presets, wxString const &selected, std::string const &group) {
+ (std::map const &presets, wxString const &selected, std::string const &group) {
if (!presets.empty()) {
set_label_marker(Append(separator(group), wxNullBitmap));
if (m_type == Preset::TYPE_FILAMENT) {
- std::sort(presets.begin(), presets.end(), [&filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types]
- (const PresetItemInfo& l, const PresetItemInfo& r) {
+ std::vector::value_type const*> list(presets.size(), nullptr);
+ std::transform(presets.begin(), presets.end(), list.begin(), [](auto & pair) { return &pair; });
+ std::sort(list.begin(), list.end(), [&filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types](auto *l, auto *r) {
{ // Compare order
- auto iter1 = std::find(filament_orders.begin(), filament_orders.end(), l.name);
- auto iter2 = std::find(filament_orders.begin(), filament_orders.end(), r.name);
+ auto iter1 = std::find(filament_orders.begin(), filament_orders.end(), l->first);
+ auto iter2 = std::find(filament_orders.begin(), filament_orders.end(), r->first);
if (iter1 != iter2)
return iter1 < iter2;
}
{ // Compare vendor
- auto iter1 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[l.name]);
- auto iter2 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[r.name]);
+ auto iter1 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[l->first]);
+ auto iter2 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[r->first]);
if (iter1 != iter2)
return iter1 < iter2;
}
{ // Compare type
- auto iter1 = std::find(first_types.begin(), first_types.end(), preset_filament_types[l.name]);
- auto iter2 = std::find(first_types.begin(), first_types.end(), preset_filament_types[r.name]);
+ auto iter1 = std::find(first_types.begin(), first_types.end(), preset_filament_types[l->first]);
+ auto iter2 = std::find(first_types.begin(), first_types.end(), preset_filament_types[r->first]);
if (iter1 != iter2)
return iter1 < iter2;
}
- return l.name < r.name;
+ return l->first < r->first;
});
- for (auto it = presets.begin(); it != presets.end(); ++it) {
- SetItemTooltip(Append(it->name, *it->bitmap), preset_descriptions[it->name]);
- validate_selection(it->name == selected);
+ for (auto it : list) {
+ SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]);
+ validate_selection(it->first == selected);
}
} else {
- for (auto it = presets.begin(); it != presets.end(); ++it) {
- SetItemTooltip(Append(it->name, *it->bitmap, it->group_name), preset_descriptions[it->name]);
- validate_selection(it->name == selected);
+ for (std::map::const_iterator it = presets.begin(); it != presets.end(); ++it) {
+ SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]);
+ if (group == "System presets")
+ set_label_marker(GetCount() - 1, LABEL_ITEM_PRINTER_MODELS);
+ validate_selection(it->first == selected);
}
}
}
diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp
index 94d1400f4..552cb91d5 100644
--- a/src/slic3r/GUI/PresetComboBoxes.hpp
+++ b/src/slic3r/GUI/PresetComboBoxes.hpp
@@ -40,6 +40,7 @@ public:
enum LabelItemType {
LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01,
+ LABEL_ITEM_PRINTER_MODELS,
LABEL_ITEM_DISABLED,
LABEL_ITEM_MARKER,
LABEL_ITEM_PHYSICAL_PRINTERS,
@@ -58,6 +59,8 @@ public:
bool is_selected_physical_printer();
+ bool is_selected_printer_model();
+
// Return true, if physical printer was selected
// and next internal selection was accomplished
bool selection_is_changed_according_to_physical_printers();
@@ -187,7 +190,6 @@ public:
void show_add_menu();
void show_edit_menu();
- wxString get_preset_group_name(const Preset &preset);
wxString get_preset_name(const Preset& preset) override;
void update() override;
void msw_rescale() override;