#include "AmsMappingPopup.hpp" #include "I18N.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/Thread.hpp" #include "GUI.hpp" #include "GUI_App.hpp" #include "GUI_Preview.hpp" #include "MainFrame.hpp" #include "format.hpp" #include "Widgets/ProgressDialog.hpp" #include "Widgets/RoundedRectangle.hpp" #include "Widgets/StaticBox.hpp" #include #include #include #include #include #include #include #include "Plater.hpp" #include "BitmapCache.hpp" #include "BindDialog.hpp" namespace Slic3r { namespace GUI { #define MATERIAL_ITEM_SIZE wxSize(FromDIP(65), FromDIP(50)) #define MATERIAL_REC_WHEEL_SIZE wxSize(FromDIP(17), FromDIP(16)) #define MAPPING_ITEM_REAL_SIZE wxSize(FromDIP(60), FromDIP(60)) wxDEFINE_EVENT(EVT_SET_FINISH_MAPPING, wxCommandEvent); MaterialItem::MaterialItem(wxWindow *parent, wxColour mcolour, wxString mname) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) { m_arraw_bitmap_gray = ScalableBitmap(this, "drop_down", 12); m_arraw_bitmap_white = ScalableBitmap(this, "topbar_dropdown", 12); m_transparent_mitem = ScalableBitmap(this, "transparent_material_item", 52); //m_ams_wheel_mitem = ScalableBitmap(this, "ams_wheel", FromDIP(25)); m_ams_wheel_mitem = ScalableBitmap(this, "ams_wheel_narrow", 25); m_ams_not_match = ScalableBitmap(this, "filament_not_mactch", 25); m_material_coloul = mcolour; m_material_name = mname; m_ams_coloul = wxColour(0xEE,0xEE,0xEE); #ifdef __WINDOWS__ SetDoubleBuffered(true); #endif //__WINDOWS__ SetSize(MATERIAL_ITEM_SIZE); SetMinSize(MATERIAL_ITEM_SIZE); SetMaxSize(MATERIAL_ITEM_SIZE); SetBackgroundColour(*wxWHITE); Bind(wxEVT_PAINT, &MaterialItem::paintEvent, this); wxGetApp().UpdateDarkUI(this); } MaterialItem::~MaterialItem() {} void MaterialItem::msw_rescale() { m_arraw_bitmap_gray.msw_rescale(); m_arraw_bitmap_white.msw_rescale(); m_transparent_mitem.msw_rescale(); m_ams_wheel_mitem.msw_rescale(); } void MaterialItem::set_ams_info(wxColour col, wxString txt, int ctype, std::vector cols) { auto need_refresh = false; if (m_ams_cols != cols) { m_ams_cols = cols; need_refresh = true; } if (m_ams_ctype != ctype) { m_ams_ctype = ctype; need_refresh = true; } if (m_ams_coloul != col) { m_ams_coloul = col; need_refresh = true;} if (m_ams_name != txt) { m_ams_name = txt; need_refresh = true; } if (need_refresh) { Refresh();} } void MaterialItem::disable() { if (IsEnabled()) { this->Disable(); Refresh(); } } void MaterialItem::enable() { if (!IsEnabled()) { this->Enable(); Refresh(); } } void MaterialItem::on_selected() { if (!m_selected) { m_selected = true; Refresh(); } } void MaterialItem::on_warning() { if (!m_warning) { m_warning = true; Refresh(); } } void MaterialItem::on_normal() { if (m_selected || m_warning) { m_selected = false; m_warning = false; Refresh(); } } void MaterialItem::paintEvent(wxPaintEvent &evt) { wxPaintDC dc(this); render(dc); //PrepareDC(buffdc); //PrepareDC(dc); } void MaterialItem::render(wxDC &dc) { wxString mapping_txt = wxEmptyString; if (m_ams_name.empty()) { mapping_txt = "-"; } else { mapping_txt = m_ams_name; } if (mapping_txt == "-") { m_match = false;} else {m_match = true;} #ifdef __WXMSW__ wxSize size = GetSize(); wxMemoryDC memdc; wxBitmap bmp(size.x, size.y); memdc.SelectObject(bmp); memdc.Blit({0, 0}, size, &dc, {0, 0}); { wxGCDC dc2(memdc); doRender(dc2); } memdc.SelectObject(wxNullBitmap); dc.DrawBitmap(bmp, 0, 0); #else doRender(dc); #endif auto mcolor = m_material_coloul; auto acolor = m_ams_coloul; change_the_opacity(acolor); if (!IsEnabled()) { mcolor = wxColour(0x90, 0x90, 0x90); acolor = wxColour(0x90, 0x90, 0x90); } // materials name dc.SetFont(::Label::Body_13); auto material_name_colour = mcolor.GetLuminance() < 0.6 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30); if (mcolor.Alpha() == 0) {material_name_colour = wxColour(0x26, 0x2E, 0x30);} dc.SetTextForeground(material_name_colour); if (dc.GetTextExtent(m_material_name).x > GetSize().x - 10) { dc.SetFont(::Label::Body_10); } auto material_txt_size = dc.GetTextExtent(m_material_name); dc.DrawText(m_material_name, wxPoint((GetSize().x - material_txt_size.x) / 2, ((float)GetSize().y * 2 / 5 - material_txt_size.y) / 2)); auto mapping_txt_size = dc.GetTextExtent(mapping_txt); dc.SetTextForeground(StateColor::darkModeColorFor(wxColour(0x26, 0x2E, 0x30))); dc.SetFont(::Label::Head_12); m_text_pos_y =((float)GetSize().y * 3 / 5 - mapping_txt_size.y) / 2 + (float)GetSize().y * 2 / 5; if (m_match) { dc.DrawText(mapping_txt, wxPoint(GetSize().x / 2 + (GetSize().x / 2 - mapping_txt_size.x) / 2 - FromDIP(6), m_text_pos_y)); } } void MaterialItem::match(bool mat) { m_match = mat; Refresh(); } void MaterialItem::doRender(wxDC& dc) { wxSize size = GetSize(); auto mcolor = m_material_coloul; auto acolor = m_ams_coloul; change_the_opacity(acolor); if (mcolor.Alpha() == 0 || acolor.Alpha() == 0) { dc.DrawBitmap(m_transparent_mitem.bmp(), FromDIP(1), FromDIP(1)); } if (!IsEnabled()) { mcolor = wxColour(0x90, 0x90, 0x90); acolor = wxColour(0x90, 0x90, 0x90); } //top dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(mcolor)); dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, FromDIP(20), 5); dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(mcolor)); dc.DrawRectangle(0, FromDIP(10), MATERIAL_ITEM_SIZE.x, FromDIP(10)); dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); dc.DrawLine(FromDIP(1), FromDIP(20), FromDIP(MATERIAL_ITEM_SIZE.x), FromDIP(20)); //bottom rectangle in wheel bitmap, size is MATERIAL_REC_WHEEL_SIZE(22) auto left = (size.x / 2 - MATERIAL_REC_WHEEL_SIZE.x) / 2 + FromDIP(3); auto up = (size.y * 0.4 + (size.y * 0.6 - MATERIAL_REC_WHEEL_SIZE.y) / 2); auto right = left + MATERIAL_REC_WHEEL_SIZE.x; dc.SetPen(*wxTRANSPARENT_PEN); //bottom if (m_ams_cols.size() > 1) { int gwidth = std::round(MATERIAL_REC_WHEEL_SIZE.x / (m_ams_cols.size() - 1)); //gradient if (m_ams_ctype == 0) { for (int i = 0; i < m_ams_cols.size() - 1; i++) { auto rect = wxRect(left, up, right - left, MATERIAL_REC_WHEEL_SIZE.y); dc.GradientFillLinear(rect, m_ams_cols[i], m_ams_cols[i + 1], wxEAST); left += gwidth; } } else { int cols_size = m_ams_cols.size(); for (int i = 0; i < cols_size; i++) { dc.SetBrush(wxBrush(m_ams_cols[i])); float x = left + ((float)MATERIAL_REC_WHEEL_SIZE.x) * i / cols_size; if (i != cols_size - 1) { dc.DrawRoundedRectangle(x, up, ((float)MATERIAL_REC_WHEEL_SIZE.x) / cols_size + FromDIP(3), MATERIAL_REC_WHEEL_SIZE.y, 3); } else { dc.DrawRoundedRectangle(x, up, ((float)MATERIAL_REC_WHEEL_SIZE.x) / cols_size, MATERIAL_REC_WHEEL_SIZE.y, 3); } } } } else { if (m_match) { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(wxColour(acolor))); dc.DrawRectangle((size.x / 2 - MATERIAL_REC_WHEEL_SIZE.x) / 2 + FromDIP(3), up, MATERIAL_REC_WHEEL_SIZE.x - FromDIP(1), MATERIAL_REC_WHEEL_SIZE.y); } } ////border //#if __APPLE__ // if (m_match) { // dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); // } else { // dc.SetPen(wxPen(wxColour(234, 31, 48), 2)); // } // dc.SetBrush(*wxTRANSPARENT_BRUSH); // dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), MATERIAL_ITEM_SIZE.x - FromDIP(1), MATERIAL_ITEM_SIZE.y - FromDIP(1), 5); // // if (m_selected) { // dc.SetPen(wxColour(0x00, 0xAE, 0x42)); // dc.SetBrush(*wxTRANSPARENT_BRUSH); // dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), MATERIAL_ITEM_SIZE.x - FromDIP(1), MATERIAL_ITEM_SIZE.y - FromDIP(1), 5); // } //#else if (m_match) { dc.SetPen(wxPen(wxColour(0xAC, 0xAC, 0xAC), FromDIP(1))); } else { dc.SetPen(wxPen(wxColour(234, 31, 48), FromDIP(1))); } dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(FromDIP(0), FromDIP(0), MATERIAL_ITEM_SIZE.x - FromDIP(0), MATERIAL_ITEM_SIZE.y - FromDIP(0), 5); if (m_selected) { dc.SetPen(wxPen(wxColour(0x00, 0xAE, 0x42), FromDIP(2))); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), MATERIAL_ITEM_SIZE.x - FromDIP(1), MATERIAL_ITEM_SIZE.y - FromDIP(1), 5); } //#endif if (m_text_pos_y > 0 && m_match) { // arrow (remove arrow) if ((acolor.Red() > 160 && acolor.Green() > 160 && acolor.Blue() > 160) && (acolor.Red() < 180 && acolor.Green() < 180 && acolor.Blue() < 180)) { dc.DrawBitmap(m_arraw_bitmap_white.bmp(), size.x - m_arraw_bitmap_white.GetBmpSize().x - FromDIP(2), m_text_pos_y + FromDIP(3)); } else { dc.DrawBitmap(m_arraw_bitmap_gray.bmp(), size.x - m_arraw_bitmap_gray.GetBmpSize().x - FromDIP(2), m_text_pos_y + FromDIP(3)); } } auto wheel_left = (GetSize().x / 2 - m_ams_wheel_mitem.GetBmpSize().x) / 2 + FromDIP(2); auto wheel_top = ((float)GetSize().y * 0.6 - m_ams_wheel_mitem.GetBmpSize().y) / 2 + (float)GetSize().y * 0.4; if (!m_match) { wheel_left += m_ams_wheel_mitem.GetBmpSize().x; dc.DrawBitmap(m_ams_not_match.bmp(), (size.x - m_ams_not_match.GetBmpWidth()) / 2, wheel_top); } else { dc.DrawBitmap(m_ams_wheel_mitem.bmp(), wheel_left, wheel_top); } } MaterialSyncItem::MaterialSyncItem(wxWindow *parent, wxColour mcolour, wxString mname) : MaterialItem(parent, mcolour, mname) { } MaterialSyncItem::~MaterialSyncItem() {} void MaterialSyncItem::render(wxDC &dc) { wxString mapping_txt = wxEmptyString; if (m_ams_name.empty()) { mapping_txt = "-"; } else { mapping_txt = m_ams_name; } if (mapping_txt == "-") { m_match = false; mapping_txt = _L("Unmapped"); } else { m_match = true; } #ifdef __WXMSW__ wxSize size = GetSize(); wxMemoryDC memdc; wxBitmap bmp(size.x, size.y); memdc.SelectObject(bmp); memdc.Blit({0, 0}, size, &dc, {0, 0}); { wxGCDC dc2(memdc); doRender(dc2); } memdc.SelectObject(wxNullBitmap); dc.DrawBitmap(bmp, 0, 0); #else doRender(dc); #endif auto mcolor = m_material_coloul; auto acolor = m_ams_coloul; change_the_opacity(acolor); if (!IsEnabled()) { mcolor = wxColour(0x90, 0x90, 0x90); acolor = wxColour(0x90, 0x90, 0x90); } // materials name dc.SetFont(::Label::Body_12); auto material_name_colour = mcolor.GetLuminance() < 0.6 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30); if (mcolor.Alpha() == 0) { material_name_colour = wxColour(0x26, 0x2E, 0x30); } dc.SetTextForeground(material_name_colour); if (dc.GetTextExtent(m_material_name).x > GetSize().x - 10) { dc.SetFont(::Label::Body_10); } auto material_txt_size = dc.GetTextExtent(m_material_name); dc.DrawText(m_material_name, wxPoint((GetSize().x - material_txt_size.x) / 2, ((float) GetSize().y * 2 / 5 - material_txt_size.y) / 2)); auto mapping_txt_size = dc.GetTextExtent(mapping_txt); m_text_pos_y = ((float) GetSize().y * 3 / 5 - mapping_txt_size.y) / 2 + (float) GetSize().y * 2 / 5; if (m_match) { dc.SetTextForeground(StateColor::darkModeColorFor(wxColour(0x26, 0x2E, 0x30))); dc.SetFont(::Label::Head_12); dc.DrawText(mapping_txt, wxPoint(GetSize().x / 2 + (GetSize().x / 2 - mapping_txt_size.x) / 2 - FromDIP(6), m_text_pos_y)); } else { dc.SetTextForeground(material_name_colour); if (mapping_txt_size.x > GetSize().x - 10) { dc.SetFont(::Label::Body_10); mapping_txt_size = dc.GetTextExtent(mapping_txt); } dc.DrawText(mapping_txt, wxPoint(GetSize().x / 2 - mapping_txt_size.x / 2 , m_text_pos_y)); } } void MaterialSyncItem::doRender(wxDC &dc) { wxSize size = GetSize(); auto mcolor = m_material_coloul; auto acolor = m_ams_coloul; change_the_opacity(acolor); if (mcolor.Alpha() == 0 || acolor.Alpha() == 0) { dc.DrawBitmap(m_transparent_mitem.bmp(), FromDIP(1), FromDIP(1)); } if (!IsEnabled()) { mcolor = wxColour(0x90, 0x90, 0x90); acolor = wxColour(0x90, 0x90, 0x90); } // top dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(mcolor)); dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, FromDIP(20), 5); dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(mcolor)); dc.DrawRectangle(0, FromDIP(10), MATERIAL_ITEM_SIZE.x, FromDIP(10)); // bottom rectangle in wheel bitmap, size is MATERIAL_REC_WHEEL_SIZE(22) auto left = (size.x / 2 - MATERIAL_REC_WHEEL_SIZE.x) / 2 + FromDIP(3); auto up = (size.y * 0.4 + (size.y * 0.6 - MATERIAL_REC_WHEEL_SIZE.y) / 2); auto right = left + MATERIAL_REC_WHEEL_SIZE.x; dc.SetPen(*wxTRANSPARENT_PEN); // bottom if (m_match) { if (m_ams_cols.size() > 1) { int gwidth = std::round(MATERIAL_REC_WHEEL_SIZE.x / (m_ams_cols.size() - 1)); // gradient if (m_ams_ctype == 0) { for (int i = 0; i < m_ams_cols.size() - 1; i++) { auto rect = wxRect(left, up, right - left, MATERIAL_REC_WHEEL_SIZE.y); dc.GradientFillLinear(rect, m_ams_cols[i], m_ams_cols[i + 1], wxEAST); left += gwidth; } } else { int cols_size = m_ams_cols.size(); for (int i = 0; i < cols_size; i++) { dc.SetBrush(wxBrush(m_ams_cols[i])); float x = left + ((float) MATERIAL_REC_WHEEL_SIZE.x) * i / cols_size; if (i != cols_size - 1) { dc.DrawRoundedRectangle(x, up, ((float) MATERIAL_REC_WHEEL_SIZE.x) / cols_size + FromDIP(3), MATERIAL_REC_WHEEL_SIZE.y, 3); } else { dc.DrawRoundedRectangle(x, up, ((float) MATERIAL_REC_WHEEL_SIZE.x) / cols_size, MATERIAL_REC_WHEEL_SIZE.y, 3); } } } } else { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(wxColour(acolor))); dc.DrawRectangle((size.x / 2 - MATERIAL_REC_WHEEL_SIZE.x) / 2 + FromDIP(3), up, MATERIAL_REC_WHEEL_SIZE.x - FromDIP(1), MATERIAL_REC_WHEEL_SIZE.y); } } else { dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(mcolor)); dc.DrawRoundedRectangle(0, FromDIP(20), MATERIAL_ITEM_SIZE.x, MATERIAL_ITEM_SIZE.y - FromDIP(21), 5); dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(mcolor)); dc.DrawRectangle(0, FromDIP(20), MATERIAL_ITEM_SIZE.x, FromDIP(10)); } dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); dc.DrawLine(FromDIP(1), FromDIP(20), FromDIP(MATERIAL_ITEM_SIZE.x), FromDIP(20)); ////border #if __APPLE__ dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(1, 1, MATERIAL_ITEM_SIZE.x - 1, MATERIAL_ITEM_SIZE.y - 1, 5); if (m_selected) { dc.SetPen(wxColour(0x00, 0xAE, 0x42)); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(1, 1, MATERIAL_ITEM_SIZE.x - 1, MATERIAL_ITEM_SIZE.y - 1, 5); } #else dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, MATERIAL_ITEM_SIZE.y, 5); if (m_selected) { dc.SetPen(wxColour(0x00, 0xAE, 0x42)); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, MATERIAL_ITEM_SIZE.y, 5); } #endif if (m_text_pos_y > 0 && m_match) { // arrow (remove arrow) if ((acolor.Red() > 160 && acolor.Green() > 160 && acolor.Blue() > 160) && (acolor.Red() < 180 && acolor.Green() < 180 && acolor.Blue() < 180)) { dc.DrawBitmap(m_arraw_bitmap_white.bmp(), size.x - m_arraw_bitmap_white.GetBmpSize().x - FromDIP(2), m_text_pos_y + FromDIP(3)); } else { dc.DrawBitmap(m_arraw_bitmap_gray.bmp(), size.x - m_arraw_bitmap_gray.GetBmpSize().x - FromDIP(2), m_text_pos_y + FromDIP(3)); } } auto wheel_left = (GetSize().x / 2 - m_ams_wheel_mitem.GetBmpSize().x) / 2 + FromDIP(2); auto wheel_top = ((float) GetSize().y * 0.6 - m_ams_wheel_mitem.GetBmpSize().y) / 2 + (float) GetSize().y * 0.4; if (m_match) {// different with parent dc.DrawBitmap(m_ams_wheel_mitem.bmp(), wheel_left, wheel_top); } //not draw m_ams_not_match } AmsMapingPopup::AmsMapingPopup(wxWindow *parent, bool use_in_sync_dialog) : PopupWindow(parent, wxBORDER_NONE), m_use_in_sync_dialog(use_in_sync_dialog) { Bind(wxEVT_PAINT, &AmsMapingPopup::paintEvent, this); #if __APPLE__ Bind(wxEVT_LEFT_DOWN, &AmsMapingPopup::on_left_down, this); #endif SetBackgroundColour(*wxWHITE); m_sizer_main = new wxBoxSizer(wxVERTICAL); m_sizer_ams = new wxBoxSizer(wxHORIZONTAL); m_sizer_ams_left = new wxBoxSizer(wxVERTICAL); m_sizer_ams_right = new wxBoxSizer(wxVERTICAL); m_sizer_ams_basket_left = new wxBoxSizer(wxVERTICAL); m_sizer_ams_basket_right = new wxBoxSizer(wxVERTICAL); auto title_panel = new wxPanel(this, wxID_ANY); title_panel->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8)); title_panel->SetSize(wxSize(-1, FromDIP(30))); title_panel->SetMinSize(wxSize(-1, FromDIP(30))); wxBoxSizer *title_sizer_h= new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *title_sizer_v = new wxBoxSizer(wxVERTICAL); auto title_text = new wxStaticText(title_panel, wxID_ANY, _L("AMS Slots")); title_text->SetForegroundColour(wxColour(0x32, 0x3A, 0x3D)); title_text->SetFont(::Label::Head_13); title_sizer_v->Add(title_text, 0, wxALIGN_CENTER, 5); title_sizer_h->Add(title_sizer_v, 1, wxALIGN_CENTER, 5); title_panel->SetSizer(title_sizer_h); title_panel->Layout(); title_panel->Fit(); m_left_marea_panel = new wxPanel(this); m_right_marea_panel = new wxPanel(this); auto sizer_temp = new wxBoxSizer(wxHORIZONTAL); /*left ext*/ m_left_extra_slot = new MappingItem(m_left_marea_panel); m_left_extra_slot->m_ams_id = VIRTUAL_TRAY_DEPUTY_ID; m_left_extra_slot->m_slot_id = 0; m_left_extra_slot->SetSize(wxSize(FromDIP(48), FromDIP(60))); m_left_extra_slot->SetMinSize(wxSize(FromDIP(48), FromDIP(60))); m_left_extra_slot->SetMaxSize(wxSize(FromDIP(48), FromDIP(60))); auto left_panel = new wxPanel(m_left_marea_panel); left_panel->SetSize(wxSize(FromDIP(182), FromDIP(60))); left_panel->SetMinSize(wxSize(FromDIP(182), FromDIP(60))); left_panel->SetMaxSize(wxSize(FromDIP(182), FromDIP(60))); sizer_temp->Add(m_left_extra_slot); sizer_temp->Add(left_panel); /*right ext*/ m_right_extra_slot = new MappingItem(m_right_marea_panel); m_right_extra_slot->m_ams_id = VIRTUAL_TRAY_MAIN_ID; m_right_extra_slot->m_slot_id = 0; m_right_extra_slot->SetSize(wxSize(FromDIP(48), FromDIP(60))); m_right_extra_slot->SetMinSize(wxSize(FromDIP(48), FromDIP(60))); m_right_extra_slot->SetMaxSize(wxSize(FromDIP(48), FromDIP(60))); m_single_tip_text = _L("Please select from the following filaments"); m_left_tip_text = _L("Select filament that installed to the left nozzle"); m_right_tip_text = _L("Select filament that installed to the right nozzle"); m_left_tips = new Label(m_left_marea_panel); m_left_tips->SetForegroundColour(0x262E30); m_left_tips->SetBackgroundColour(*wxWHITE); m_left_tips->SetFont(::Label::Body_13); m_left_tips->SetLabel(m_left_tip_text); m_sizer_ams_left->Add(m_left_tips, 0, wxEXPAND | wxBOTTOM, FromDIP(8)); m_left_split_ams_sizer = create_split_sizer(m_left_marea_panel, _L("Left AMS")); m_sizer_ams_left->Add(m_left_split_ams_sizer, 0, wxEXPAND, 0); m_sizer_ams_left->Add(m_sizer_ams_basket_left, 0, wxEXPAND|wxTOP, FromDIP(8)); m_sizer_ams_left->Add(create_split_sizer(m_left_marea_panel, _L("External")), 0, wxEXPAND|wxTOP, FromDIP(8)); //m_sizer_ams_left->Add(m_left_extra_slot, 0, wxEXPAND|wxTOP, FromDIP(8)); m_sizer_ams_left->Add(sizer_temp, 0, wxEXPAND | wxTOP, FromDIP(8)); m_right_tips = new Label(m_right_marea_panel); m_right_tips->SetForegroundColour(0x262E30); m_right_tips->SetBackgroundColour(*wxWHITE); m_right_tips->SetFont(::Label::Body_13); m_right_tips->SetLabel(m_right_tip_text); m_sizer_ams_right->Add(m_right_tips, 0, wxEXPAND | wxBOTTOM, FromDIP(8)); m_right_split_ams_sizer = create_split_sizer(m_right_marea_panel, _L("Right AMS")); m_sizer_ams_right->Add(m_right_split_ams_sizer, 0, wxEXPAND, 0); m_sizer_ams_right->Add(m_sizer_ams_basket_right, 0, wxEXPAND|wxTOP, FromDIP(8)); m_sizer_ams_right->Add(create_split_sizer(m_right_marea_panel, _L("External")), 0, wxEXPAND|wxTOP, FromDIP(8)); m_sizer_ams_right->Add(m_right_extra_slot, 0, wxEXPAND|wxTOP, FromDIP(8)); m_left_marea_panel->SetSizer(m_sizer_ams_left); m_right_marea_panel->SetSizer(m_sizer_ams_right); //m_sizer_ams->Add(m_left_marea_panel, 0, wxEXPAND, FromDIP(0)); m_sizer_ams->Add(m_left_marea_panel, 0, wxRIGHT, FromDIP(10)); m_sizer_ams->Add(0, 0, 0, wxEXPAND, FromDIP(15)); m_sizer_ams->Add(m_right_marea_panel, 1, wxEXPAND, FromDIP(0)); m_warning_text = new Label(this); m_warning_text->SetForegroundColour(wxColour(0xFF, 0x6F, 0x00)); m_warning_text->SetFont(::Label::Body_12); m_warning_text->SetLabel(_L("Note: Only the AMS slots loaded with the same material type can be selected.")); m_sizer_main->Add(title_panel, 0, wxEXPAND | wxALL, FromDIP(2)); m_sizer_main->Add(m_sizer_ams, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(14)); m_sizer_main->Add( 0, 0, 0, wxTOP, FromDIP(8)); m_sizer_main->Add(m_warning_text, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(14)); m_sizer_main->Add( 0, 0, 0, wxTOP, FromDIP(8)); SetSizer(m_sizer_main); Layout(); Fit(); Bind(wxEVT_SHOW, [this](wxShowEvent& e) { if (e.IsShown() && m_parent_item) { wxPoint pos = m_parent_item->ClientToScreen(wxPoint(0, 0)); pos.y += m_parent_item->GetRect().height; this->Move(pos); } }); } void AmsMapingPopup::set_sizer_title(wxBoxSizer *sizer, wxString text) { if (!sizer) { return; } wxSizerItemList items = sizer->GetChildren(); for (wxSizerItemList::iterator it = items.begin(); it != items.end(); ++it) { wxSizerItem *item = *it; auto temp_label = dynamic_cast