diff --git a/resources/images/menu_filament.svg b/resources/images/menu_filament.svg
new file mode 100644
index 000000000..ea200795c
--- /dev/null
+++ b/resources/images/menu_filament.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp
index b9e614ad8..6bcb1a2b5 100644
--- a/src/slic3r/GUI/GUI_Factories.cpp
+++ b/src/slic3r/GUI/GUI_Factories.cpp
@@ -1361,6 +1361,20 @@ void MenuFactory::create_cut_cutter_menu()
append_menu_item_change_type(menu);
}
+void MenuFactory::create_filament_action_menu()
+{
+ wxMenu *menu = &m_filament_action_menu;
+
+ append_menu_item(
+ menu, wxID_ANY, _L("Edit"), "", [](wxCommandEvent &) {
+ plater()->sidebar().edit_filament(); }, "", nullptr,
+ []() { return true; }, m_parent);
+ append_menu_item(
+ menu, wxID_ANY, _L("Delete"), _L("Delete this filament"), [](wxCommandEvent &) {
+ plater()->sidebar().delete_filament(-2); }, "menu_delete", nullptr,
+ []() { return plater()->sidebar().combos_filament().size() > 1; }, m_parent);
+}
+
//BBS: add part plate related logic
void MenuFactory::create_plate_menu()
{
@@ -1464,6 +1478,8 @@ void MenuFactory::init(wxWindow* parent)
//BBS: add part plate related logic
create_plate_menu();
+ create_filament_action_menu();
+
// create "Instance to Object" menu item
append_menu_item_instance_to_object(&m_instance_menu);
}
@@ -1641,6 +1657,8 @@ wxMenu* MenuFactory::assemble_multi_selection_menu()
return menu;
}
+wxMenu *MenuFactory::filament_action_menu() { return &m_filament_action_menu; }
+
//BBS: add partplate related logic
wxMenu* MenuFactory::plate_menu()
diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp
index d83921761..7c13a5196 100644
--- a/src/slic3r/GUI/GUI_Factories.hpp
+++ b/src/slic3r/GUI/GUI_Factories.hpp
@@ -79,6 +79,8 @@ public:
wxMenu* assemble_part_menu();
wxMenu* assemble_multi_selection_menu();
+ wxMenu *filament_action_menu();
+
private:
enum MenuType {
mtObjectFFF = 0,
@@ -101,6 +103,8 @@ private:
MenuWithSeparators m_assemble_object_menu;
MenuWithSeparators m_assemble_part_menu;
+ wxMenu m_filament_action_menu;
+
int object_menu_count{ 0 };
int part_menu_count{ 0 };
int default_menu_count{ 0 };
@@ -130,6 +134,8 @@ private:
void create_bbl_assemble_part_menu();
void create_cut_cutter_menu();
+ void create_filament_action_menu();
+
wxMenu* append_submenu_add_generic(wxMenu* menu, ModelVolumeType type);
void append_menu_item_add_svg(wxMenu *menu, ModelVolumeType type, bool is_submenu_item = true);
void append_menu_items_add_volume(wxMenu* menu);
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 5fed7b6b0..44bcacf88 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -341,6 +341,7 @@ struct Sidebar::priv
ScalableButton * m_bpButton_del_filament;
ScalableButton * m_bpButton_ams_filament;
ScalableButton * m_bpButton_set_filament;
+ int m_menu_filament_id = -1;
wxPanel* m_panel_filament_content;
wxScrolledWindow* m_scrolledWindow_filament_content;
wxStaticLine* m_staticline2;
@@ -1089,15 +1090,15 @@ Sidebar::Sidebar(Plater *parent)
bSizer39->Add(add_btn, 0, wxALIGN_CENTER|wxALL, FromDIP(5));
bSizer39->Add(FromDIP(10), 0, 0, 0, 0 );
- ScalableButton* del_btn = new ScalableButton(p->m_panel_filament_title, wxID_ANY, "delete_filament");
- del_btn->SetToolTip(_L("Remove last filament"));
- del_btn->Bind(wxEVT_BUTTON, [this, scrolled_sizer](wxCommandEvent &e) {
- delete_filament();
- });
- p->m_bpButton_del_filament = del_btn;
+ //ScalableButton* del_btn = new ScalableButton(p->m_panel_filament_title, wxID_ANY, "delete_filament");
+ //del_btn->SetToolTip(_L("Remove last filament"));
+ //del_btn->Bind(wxEVT_BUTTON, [this, scrolled_sizer](wxCommandEvent &e) {
+ // delete_filament();
+ //});
+ //p->m_bpButton_del_filament = del_btn;
- bSizer39->Add(del_btn, 0, wxALIGN_CENTER_VERTICAL, FromDIP(5));
- bSizer39->Add(FromDIP(20), 0, 0, 0, 0);
+ //bSizer39->Add(del_btn, 0, wxALIGN_CENTER_VERTICAL, FromDIP(5));
+ //bSizer39->Add(FromDIP(20), 0, 0, 0, 0);
ams_btn = new ScalableButton(p->m_panel_filament_title, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition,
wxBU_EXACTFIT | wxNO_BORDER, false, 18);
@@ -1138,33 +1139,7 @@ Sidebar::Sidebar(Plater *parent)
p->combos_filament.push_back(nullptr);
/* first filament item */
- p->combos_filament[0] = new PlaterPresetComboBox(p->m_panel_filament_content, Preset::TYPE_FILAMENT);
- auto combo_and_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
- // BBS: filament double columns
- combo_and_btn_sizer->Add(FromDIP(8), 0, 0, 0, 0);
- if (p->combos_filament[0]->clr_picker) {
- p->combos_filament[0]->clr_picker->SetLabel("1");
- combo_and_btn_sizer->Add(p->combos_filament[0]->clr_picker, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(3));
- }
- combo_and_btn_sizer->Add(p->combos_filament[0], 1, wxALL | wxEXPAND, FromDIP(2))->SetMinSize({-1, FromDIP(30) });
-
- ScalableButton* edit_btn = new ScalableButton(p->m_panel_filament_content, wxID_ANY, "edit");
- edit_btn->SetBackgroundColour(wxColour(255, 255, 255));
- edit_btn->SetToolTip(_L("Click to edit preset"));
-
- PlaterPresetComboBox* combobox = p->combos_filament[0];
- edit_btn->Bind(wxEVT_BUTTON, [this, combobox](wxCommandEvent)
- {
- p->editing_filament = 0;
- combobox->switch_to_tab();
- });
- combobox->edit_btn = edit_btn;
-
- combo_and_btn_sizer->Add(edit_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(3));
- combo_and_btn_sizer->Add(FromDIP(8), 0, 0, 0, 0);
-
- p->combos_filament[0]->set_filament_idx(0);
- p->sizer_filaments->GetItem((size_t)0)->GetSizer()->Add(combo_and_btn_sizer, 1, wxEXPAND);
+ init_filament_combo(&p->combos_filament[0], 0);
//bSizer_filament_content->Add(p->sizer_filaments, 1, wxALIGN_CENTER | wxALL);
wxSizer *sizer_filaments2 = new wxBoxSizer(wxVERTICAL);
@@ -1292,16 +1267,18 @@ void Sidebar::init_filament_combo(PlaterPresetComboBox **combo, const int filame
combo_and_btn_sizer->Add(32 * em / 10, 0, 0, 0, 0);
combo_and_btn_sizer->Add(del_btn, 0, wxALIGN_CENTER_VERTICAL, 5 * em / 10);
*/
- ScalableButton* edit_btn = new ScalableButton(p->m_panel_filament_content, wxID_ANY, "edit");
+ ScalableButton* edit_btn = new ScalableButton(p->m_panel_filament_content, wxID_ANY, "menu_filament");
edit_btn->SetToolTip(_L("Click to edit preset"));
PlaterPresetComboBox* combobox = (*combo);
- edit_btn->Bind(wxEVT_BUTTON, [this, combobox, filament_idx](wxCommandEvent)
- {
- p->editing_filament = -1;
- if (combobox->switch_to_tab())
- p->editing_filament = filament_idx; // sync with TabPresetComboxBox's m_filament_idx
- });
+ edit_btn->Bind(wxEVT_BUTTON, [this, edit_btn, filament_idx](wxCommandEvent) {
+ auto menu = p->plater->filament_action_menu();
+ wxPoint pt { 0, edit_btn->GetSize().GetHeight() + 10 };
+ pt = edit_btn->ClientToScreen(pt);
+ pt = wxGetApp().mainframe->ScreenToClient(pt);
+ p->m_menu_filament_id = filament_idx;
+ p->plater->PopupMenu(menu, (int) pt.x, pt.y);
+ });
combobox->edit_btn = edit_btn;
combo_and_btn_sizer->Add(edit_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(3));
@@ -1313,7 +1290,7 @@ void Sidebar::init_filament_combo(PlaterPresetComboBox **combo, const int filame
auto /***/sizer_filaments = this->p->sizer_filaments->GetItem(side)->GetSizer();
if (side == 1 && filament_idx > 1) sizer_filaments->Remove(filament_idx / 2);
sizer_filaments->Add(combo_and_btn_sizer, 1, wxEXPAND);
- if (side == 0) {
+ if (side == 0 && filament_idx > 0) {
sizer_filaments = this->p->sizer_filaments->GetItem(1)->GetSizer();
sizer_filaments->AddStretchSpacer(1);
}
@@ -1905,6 +1882,9 @@ void Sidebar::delete_filament(size_t filament_id) {
if (p->combos_filament.size() <= 1) return;
wxBusyCursor busy;
size_t filament_count = p->combos_filament.size() - 1;
+ if (filament_id == size_t(-2)) {
+ filament_id = p->m_menu_filament_id;
+ }
if (filament_id == size_t(-1)) {
filament_id = filament_count;
}
@@ -1927,6 +1907,14 @@ void Sidebar::delete_filament(size_t filament_id) {
wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config);
}
+void Sidebar::edit_filament()
+{
+ p->editing_filament = -1;
+ if (p->m_menu_filament_id >= 0 && p->m_menu_filament_id < p->combos_filament.size()
+ && p->combos_filament[p->m_menu_filament_id]->switch_to_tab())
+ p->editing_filament = p->m_menu_filament_id; // sync with TabPresetComboxBox's m_filament_idx
+}
+
void Sidebar::add_custom_filament(wxColour new_col) {
if (p->combos_filament.size() >= size_t(EnforcerBlockerType::ExtruderMax)) return;
@@ -1952,43 +1940,41 @@ std::map Sidebar::build_filament_ams_list(MachineObject
std::map filament_ams_list;
if (!obj) return filament_ams_list;
- auto vt_tray = obj->vt_slot[0];
- if (obj->ams_support_virtual_tray) {
- DynamicPrintConfig vt_tray_config;
- vt_tray_config.set_key_value("filament_id", new ConfigOptionStrings{ vt_tray.setting_id });
- vt_tray_config.set_key_value("tag_uid", new ConfigOptionStrings{ vt_tray.tag_uid });
- vt_tray_config.set_key_value("filament_type", new ConfigOptionStrings{ vt_tray.type });
- vt_tray_config.set_key_value("tray_name", new ConfigOptionStrings{ std::string("Ext") });
- vt_tray_config.set_key_value("filament_colour", new ConfigOptionStrings{ into_u8(wxColour("#" + vt_tray.color).GetAsString(wxC2S_HTML_SYNTAX)) });
- vt_tray_config.set_key_value("filament_exist", new ConfigOptionBools{ true });
+ auto build_tray_config = [](AmsTray const & tray, std::string const & name) {
+ BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": name %1% setting_id %2% color %3%") % name % tray.setting_id % tray.color;
+ DynamicPrintConfig tray_config;
+ tray_config.set_key_value("filament_id", new ConfigOptionStrings{tray.setting_id});
+ tray_config.set_key_value("tag_uid", new ConfigOptionStrings{tray.tag_uid});
+ tray_config.set_key_value("filament_type", new ConfigOptionStrings{tray.type});
+ tray_config.set_key_value("tray_name", new ConfigOptionStrings{ name });
+ tray_config.set_key_value("filament_colour", new ConfigOptionStrings{into_u8(wxColour("#" + tray.color).GetAsString(wxC2S_HTML_SYNTAX))});
+ tray_config.set_key_value("filament_exist", new ConfigOptionBools{tray.is_exists});
- vt_tray_config.set_key_value("filament_multi_colors", new ConfigOptionStrings{});
- for (int i = 0; i < vt_tray.cols.size(); ++i) {
- vt_tray_config.opt("filament_multi_colors")->values.push_back(into_u8(wxColour("#" + vt_tray.cols[i]).GetAsString(wxC2S_HTML_SYNTAX)));
+ tray_config.set_key_value("filament_multi_colors", new ConfigOptionStrings{});
+ for (int i = 0; i < tray.cols.size(); ++i) {
+ tray_config.opt("filament_multi_colors")->values.push_back(into_u8(wxColour("#" + tray.cols[i]).GetAsString(wxC2S_HTML_SYNTAX)));
}
- filament_ams_list.emplace(VIRTUAL_TRAY_MAIN_ID, std::move(vt_tray_config));
+ return tray_config;
+ };
+
+ auto vt_tray = obj->vt_tray;
+ if (obj->ams_support_virtual_tray) {
+ int extruder = 0x10000;
+ //for (auto &vt_tray : obj->vt_slot) {
+ filament_ams_list.emplace(extruder + VIRTUAL_TRAY_ID, build_tray_config(vt_tray, "Ext"));
+ extruder = 0;
+ //}
}
auto list = obj->amsList;
for (auto ams : list) {
char n = ams.first.front() - '0' + 'A';
+ int extruder = /*ams.nozzle ? 0 :*/ 0x10000;
for (auto tray : ams.second->trayList) {
- BOOST_LOG_TRIVIAL(info) << __FUNCTION__
- << boost::format(": ams %1% tray %2% id %3% color %4%") % ams.first % tray.first % tray.second->setting_id % tray.second->color;
char t = tray.first.front() - '0' + '1';
- DynamicPrintConfig tray_config;
- tray_config.set_key_value("filament_id", new ConfigOptionStrings{ tray.second->setting_id });
- tray_config.set_key_value("tag_uid", new ConfigOptionStrings{ tray.second->tag_uid });
- tray_config.set_key_value("filament_type", new ConfigOptionStrings{ tray.second->type });
- tray_config.set_key_value("tray_name", new ConfigOptionStrings{ std::string(1, n) + std::string(1, t) });
- tray_config.set_key_value("filament_colour", new ConfigOptionStrings{ into_u8(wxColour("#" + tray.second->color).GetAsString(wxC2S_HTML_SYNTAX)) });
- tray_config.set_key_value("filament_exist", new ConfigOptionBools{ tray.second->is_exists });
-
- tray_config.set_key_value("filament_multi_colors", new ConfigOptionStrings{});
- for (int i = 0; i < tray.second->cols.size(); ++i) {
- tray_config.opt("filament_multi_colors")->values.push_back(into_u8(wxColour("#" + tray.second->cols[i]).GetAsString(wxC2S_HTML_SYNTAX)));
- }
- filament_ams_list.emplace(((n - 'A') * 4 + t - '1'), std::move(tray_config));
+ filament_ams_list.emplace(extruder + ((n - 'A') * 4 + t - '1'),
+ build_tray_config(*tray.second, std::string(1, n) + std::string(1, t)));
+ extruder = 0;
}
}
return filament_ams_list;
@@ -15011,6 +14997,7 @@ wxMenu* Plater::instance_menu() { return p->menus.instance_menu();
wxMenu* Plater::layer_menu() { return p->menus.layer_menu(); }
wxMenu* Plater::multi_selection_menu() { return p->menus.multi_selection_menu(); }
wxMenu *Plater::assemble_multi_selection_menu() { return p->menus.assemble_multi_selection_menu(); }
+wxMenu *Plater::filament_action_menu() { return p->menus.filament_action_menu(); }
int Plater::GetPlateIndexByRightMenuInLeftUI() { return p->m_is_RightClickInLeftUI; }
void Plater::SetPlateIndexByRightMenuInLeftUI(int index) { p->m_is_RightClickInLeftUI = index; }
SuppressBackgroundProcessingUpdate::SuppressBackgroundProcessingUpdate() :
diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp
index e1c393229..59e6e2715 100644
--- a/src/slic3r/GUI/Plater.hpp
+++ b/src/slic3r/GUI/Plater.hpp
@@ -141,6 +141,7 @@ public:
void add_filament();
void delete_filament(size_t filament_id = size_t(-1));
+ void edit_filament();
void add_custom_filament(wxColour new_col);
// BBS
void on_bed_type_change(BedType bed_type);
@@ -738,6 +739,7 @@ public:
wxMenu* layer_menu();
wxMenu* multi_selection_menu();
wxMenu* assemble_multi_selection_menu();
+ wxMenu* filament_action_menu();
int GetPlateIndexByRightMenuInLeftUI();
void SetPlateIndexByRightMenuInLeftUI(int);
static bool has_illegal_filename_characters(const wxString& name);
diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp
index a54be1851..021028769 100644
--- a/src/slic3r/GUI/PresetComboBoxes.cpp
+++ b/src/slic3r/GUI/PresetComboBoxes.cpp
@@ -375,10 +375,15 @@ void PresetComboBox::add_ams_filaments(std::string selected, bool alias_name)
{
bool is_bbl_vendor_preset = m_preset_bundle->printers.get_edited_preset().is_bbl_vendor_preset(m_preset_bundle);
if (is_bbl_vendor_preset && !m_preset_bundle->filament_ams_list.empty()) {
- set_label_marker(Append(separator(L("AMS filaments")), wxNullBitmap));
+ bool dual_extruder = (--m_preset_bundle->filament_ams_list.end())->first & 0x10000;
+ set_label_marker(Append(separator(dual_extruder ? L("Left filaments") : L("AMS filaments")), wxNullBitmap));
m_first_ams_filament = GetCount();
auto &filaments = m_collection->get_presets();
for (auto &entry : m_preset_bundle->filament_ams_list) {
+ if (dual_extruder && (entry.first & 0x10000)) {
+ dual_extruder = false;
+ set_label_marker(Append(separator(L("Right filaments")), wxNullBitmap));
+ }
auto & tray = entry.second;
std::string filament_id = tray.opt_string("filament_id", 0u);
if (filament_id.empty()) continue;