#include "FilamentMapDialog.hpp" #include "Widgets/Button.hpp" #include "I18N.hpp" #include "GUI_App.hpp" #include "CapsuleButton.hpp" #include "MsgDialog.hpp" namespace Slic3r { namespace GUI { static bool get_pop_up_remind_flag() { auto &app_config = wxGetApp().app_config; return app_config->get_bool("pop_up_filament_map_dialog"); } static void set_pop_up_remind_flag(bool remind) { auto &app_config = wxGetApp().app_config; app_config->set_bool("pop_up_filament_map_dialog", remind); } static FilamentMapMode get_applied_map_mode(DynamicConfig& proj_config, const Plater* plater_ref, const PartPlate* partplate_ref, const bool sync_plate) { if (sync_plate) return partplate_ref->get_real_filament_map_mode(proj_config); return plater_ref->get_global_filament_map_mode(); } static std::vector get_applied_map(DynamicConfig& proj_config, const Plater* plater_ref, const PartPlate* partplate_ref, const bool sync_plate) { if (sync_plate) return partplate_ref->get_real_filament_maps(proj_config); return plater_ref->get_global_filament_map(); } extern std::string& get_left_extruder_unprintable_text(); extern std::string& get_right_extruder_unprintable_text(); bool try_pop_up_before_slice(bool is_slice_all, Plater* plater_ref, PartPlate* partplate_ref, bool force_pop_up) { auto full_config = wxGetApp().preset_bundle->full_config(); const auto nozzle_diameters = full_config.option("nozzle_diameter"); if (nozzle_diameters->size() <= 1) return true; bool sync_plate = true; std::vector filament_colors = full_config.option("filament_colour")->values; std::vector filament_types = full_config.option("filament_type")->values; FilamentMapMode applied_mode = get_applied_map_mode(full_config, plater_ref,partplate_ref, sync_plate); std::vector applied_maps = get_applied_map(full_config, plater_ref, partplate_ref, sync_plate); applied_maps.resize(filament_colors.size(), 1); if (!force_pop_up && applied_mode != fmmManual) return true; std::vector filament_lists; if (is_slice_all) { filament_lists.resize(filament_colors.size()); std::iota(filament_lists.begin(), filament_lists.end(), 1); } else { filament_lists = partplate_ref->get_extruders(); } FilamentMapDialog map_dlg(plater_ref, filament_colors, filament_types, applied_maps, filament_lists, applied_mode, plater_ref->get_machine_sync_status(), false, force_pop_up ); auto ret = map_dlg.ShowModal(); if (ret == wxID_OK) { FilamentMapMode new_mode = map_dlg.get_mode(); std::vector new_maps = map_dlg.get_filament_maps(); if (sync_plate) { if (is_slice_all) { auto plate_list = plater_ref->get_partplate_list().get_plate_list(); for (int i = 0; i < plate_list.size(); ++i) { plate_list[i]->set_filament_map_mode(new_mode); if(new_mode == fmmManual) plate_list[i]->set_filament_maps(new_maps); } } else { partplate_ref->set_filament_map_mode(new_mode); if (new_mode == fmmManual) partplate_ref->set_filament_maps(new_maps); } } else { plater_ref->set_global_filament_map_mode(new_mode); if (new_mode == fmmManual) plater_ref->set_global_filament_map(new_maps); } plater_ref->update(); // check whether able to slice, if not, return false if (!get_left_extruder_unprintable_text().empty() || !get_right_extruder_unprintable_text().empty()){ return false; } return true; } return false; } static const StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(wxColour(0, 174, 66), StateColor::Normal)); static const StateColor btn_bd_green(std::pair(wxColour(0, 174, 66), StateColor::Normal)); static const StateColor btn_text_green(std::pair(wxColour(255, 255, 254), StateColor::Normal)); static const StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Normal)); static const StateColor btn_bd_white(std::pair(wxColour(38, 46, 48), StateColor::Normal)); static const StateColor btn_text_white(std::pair(wxColour(38, 46, 48), StateColor::Normal)); FilamentMapDialog::FilamentMapDialog(wxWindow *parent, const std::vector &filament_color, const std::vector &filament_type, const std::vector &filament_map, const std::vector &filaments, const FilamentMapMode mode, bool machine_synced, bool show_default, bool with_checkbox) : wxDialog(parent, wxID_ANY, _L("Filament grouping"), wxDefaultPosition, wxDefaultSize,wxDEFAULT_DIALOG_STYLE), m_filament_color(filament_color), m_filament_type(filament_type), m_filament_map(filament_map) { SetBackgroundColour(*wxWHITE); SetMinSize(wxSize(FromDIP(580), -1)); SetMaxSize(wxSize(FromDIP(580), -1)); if (mode < fmmManual) m_page_type = PageType::ptAuto; else if (mode == fmmManual) m_page_type = PageType::ptManual; else m_page_type = PageType::ptDefault; wxBoxSizer *main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->AddSpacer(FromDIP(22)); wxBoxSizer *mode_sizer = new wxBoxSizer(wxHORIZONTAL); m_auto_btn = new CapsuleButton(this, PageType::ptAuto, _L("Auto"), false); m_manual_btn = new CapsuleButton(this, PageType::ptManual, _L("Custom"), false); if (show_default) m_default_btn = new CapsuleButton(this, PageType::ptDefault, _L("Same as Global"), true); else m_default_btn = nullptr; const int button_padding = FromDIP(2); mode_sizer->AddStretchSpacer(); mode_sizer->Add(m_auto_btn, 1, wxALIGN_CENTER | wxLEFT | wxRIGHT, button_padding); mode_sizer->Add(m_manual_btn, 1, wxALIGN_CENTER | wxLEFT | wxRIGHT, button_padding); if (show_default) mode_sizer->Add(m_default_btn, 1, wxALIGN_CENTER | wxLEFT | wxRIGHT, button_padding); mode_sizer->AddStretchSpacer(); main_sizer->Add(mode_sizer, 0, wxEXPAND); main_sizer->AddSpacer(FromDIP(24)); auto panel_sizer = new wxBoxSizer(wxHORIZONTAL); FilamentMapMode default_auto_mode = mode >= fmmManual ? fmmAutoForFlush : mode == fmmAutoForMatch && !machine_synced ? fmmAutoForFlush : mode; m_manual_map_panel = new FilamentMapManualPanel(this, m_filament_color, m_filament_type, filaments, filament_map); m_auto_map_panel = new FilamentMapAutoPanel(this, default_auto_mode, machine_synced); if (show_default) m_default_map_panel = new FilamentMapDefaultPanel(this); else m_default_map_panel = nullptr; panel_sizer->Add(m_manual_map_panel, 0, wxALIGN_CENTER | wxEXPAND); panel_sizer->Add(m_auto_map_panel, 0, wxALIGN_CENTER | wxEXPAND); if (show_default) panel_sizer->Add(m_default_map_panel, 0, wxALIGN_CENTER | wxEXPAND); main_sizer->Add(panel_sizer, 0, wxEXPAND); wxPanel* bottom_panel = new wxPanel(this); bottom_panel->SetBackgroundColour(*wxWHITE); wxBoxSizer *bottom_sizer = new wxBoxSizer(wxHORIZONTAL); bottom_panel->SetSizer(bottom_sizer); bottom_sizer->Fit(bottom_panel); if(with_checkbox) { auto* checkbox_sizer = new wxBoxSizer(wxHORIZONTAL); m_checkbox = new CheckBox(bottom_panel); m_checkbox->Bind(wxEVT_TOGGLEBUTTON, &FilamentMapDialog::on_checkbox, this); checkbox_sizer->Add(m_checkbox, 0, wxALIGN_CENTER, 0); auto* checkbox_label = new Label(bottom_panel, _L("Don't remind me again")); checkbox_label->SetFont(Label::Body_12); checkbox_sizer->Add(checkbox_label, 0, wxLEFT| wxALIGN_CENTER , FromDIP(3)); bottom_sizer->Add(checkbox_sizer, 0 , wxALIGN_CENTER | wxALL, FromDIP(15)); } bottom_sizer->AddStretchSpacer(); { wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL); m_ok_btn = new Button(bottom_panel, _L("OK")); m_cancel_btn = new Button(bottom_panel, _L("Cancel")); m_ok_btn->SetCornerRadius(FromDIP(12)); m_cancel_btn->SetCornerRadius(FromDIP(12)); m_ok_btn->SetFont(Label::Body_12); m_cancel_btn->SetFont(Label::Body_12); m_ok_btn->SetBackgroundColor(btn_bg_green); m_ok_btn->SetBorderColor(btn_bd_green); m_ok_btn->SetTextColor(btn_text_green); m_cancel_btn->SetBackgroundColor(btn_bg_white); m_cancel_btn->SetBorderColor(btn_bd_white); m_cancel_btn->SetTextColor(btn_text_white); button_sizer->Add(m_ok_btn, 1, wxRIGHT, FromDIP(4)); button_sizer->Add(m_cancel_btn, 1, wxLEFT, FromDIP(4)); bottom_sizer->Add(button_sizer, 0, wxALIGN_CENTER | wxALL, FromDIP(15)); } main_sizer->Add(bottom_panel, 0, wxEXPAND); m_ok_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_ok, this); m_cancel_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_cancle, this); m_auto_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_switch_mode, this); m_manual_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_switch_mode, this); if (show_default) m_default_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_switch_mode, this); SetSizer(main_sizer); Layout(); Fit(); CenterOnParent(); wxGetApp().UpdateDlgDarkUI(this); } FilamentMapMode FilamentMapDialog::get_mode() { if (m_page_type == PageType::ptAuto) return m_auto_map_panel->GetMode(); if (m_page_type == PageType::ptManual) return fmmManual; return fmmDefault; } int FilamentMapDialog::ShowModal() { update_panel_status(m_page_type); return wxDialog::ShowModal(); } void FilamentMapDialog::on_checkbox(wxCommandEvent &event) { bool is_checked = m_checkbox->GetValue(); m_checkbox->SetValue(is_checked); set_pop_up_remind_flag(!is_checked); if (is_checked) { MessageDialog dialog(nullptr, _L("No further pop-up will appear. You can reopen it in 'Preferences'"), _L("Tips"), wxICON_INFORMATION | wxOK); dialog.ShowModal(); this->Close(); } } void FilamentMapDialog::on_ok(wxCommandEvent &event) { if (m_page_type == PageType::ptManual) { std::vector left_filaments = m_manual_map_panel->GetLeftFilaments(); std::vector right_filaments = m_manual_map_panel->GetRightFilaments(); for (int i = 0; i < m_filament_map.size(); ++i) { if (std::find(left_filaments.begin(), left_filaments.end(), i + 1) != left_filaments.end()) { m_filament_map[i] = 1; } else if (std::find(right_filaments.begin(), right_filaments.end(), i + 1) != right_filaments.end()) { m_filament_map[i] = 2; } } } EndModal(wxID_OK); } void FilamentMapDialog::on_cancle(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void FilamentMapDialog::update_panel_status(PageType page) { std::vectorbutton_list = { m_default_btn,m_manual_btn,m_auto_btn }; for (auto p : button_list) { if (p && p->IsSelected()) { p->Select(false); } } std::vectorpanel_list = { m_default_map_panel,m_manual_map_panel,m_auto_map_panel }; for (auto p : panel_list) { if (p && p->IsShown()) { p->Hide(); } } if (page == PageType::ptDefault) { if (m_default_btn && m_default_map_panel) { m_default_btn->Select(true); m_default_map_panel->Show(); } } if (page == PageType::ptManual) { m_manual_btn->Select(true); m_manual_map_panel->Show(); } if (page == PageType::ptAuto) { m_auto_btn->Select(true); m_auto_map_panel->Show(); } Layout(); Fit(); } void FilamentMapDialog::on_switch_mode(wxCommandEvent &event) { int win_id = event.GetId(); m_page_type = PageType(win_id); update_panel_status(m_page_type); event.Skip(); } void FilamentMapDialog::set_modal_btn_labels(const wxString &ok_label, const wxString &cancel_label) { m_ok_btn->SetLabel(ok_label); m_cancel_btn->SetLabel(cancel_label); } }} // namespace Slic3r::GUI