diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 790060019b..207ba657d8 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -614,12 +614,12 @@ void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent) auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL); for (int i = 0; i < 4; i++) { AMSinfo temp_info = AMSinfo{ std::to_string(i), std::vector{} }; - auto amsitem = new AMSItem(m_multi_ams_panel, wxID_ANY, temp_info); + auto amsitem = new AMSPreview(m_multi_ams_panel, wxID_ANY, temp_info); amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { - on_switch_ams(amsitem->m_amsinfo.ams_id); + on_switch_ams(amsitem->get_ams_id()); e.Skip(); }); - m_ams_item_list.push_back(amsitem); + m_ams_preview_list.push_back(amsitem); ams_items_sizer->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6)); } multi_ams_sizer->Add(ams_items_sizer, 0); @@ -896,12 +896,11 @@ void CalibrationPresetPage::on_select_tray(wxCommandEvent& event) void CalibrationPresetPage::on_switch_ams(std::string ams_id) { - for (auto i = 0; i < m_ams_item_list.size(); i++) { - AMSItem* item = m_ams_item_list[i]; - if (item->m_amsinfo.ams_id == ams_id) { + for (auto i = 0; i < m_ams_preview_list.size(); i++) { + AMSPreview *item = m_ams_preview_list[i]; + if (item->get_ams_id() == ams_id) { item->OnSelected(); - } - else { + } else { item->UnSelected(); } } @@ -1616,8 +1615,8 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) } } - for (auto i = 0; i < m_ams_item_list.size(); i++) { - AMSItem* item = m_ams_item_list[i]; + for (auto i = 0; i < m_ams_preview_list.size(); i++) { + AMSPreview* item = m_ams_preview_list[i]; if (ams_info.size() > 1) { if (i < ams_info.size()) { item->Update(ams_info[i]); diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp index 4adcd858f3..176006994c 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp @@ -284,8 +284,8 @@ protected: FilamentComboBoxList m_filament_comboBox_list; FilamentComboBox* m_virtual_tray_comboBox; - - std::vector m_ams_item_list; + + std::vector m_ams_preview_list; // for update filament combobox, key : tray_id std::map filament_ams_list; diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 1c6eafe282..b3b8284544 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -19,7 +19,6 @@ namespace Slic3r { namespace GUI { /************************************************* Description:AMSControl **************************************************/ -// WX_DEFINE_OBJARRAY(AmsItemsHash); AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) : wxSimplebook(parent, wxID_ANY, pos, size) , m_Humidity_tip_popup(AmsHumidityTipPopup(this)) @@ -34,28 +33,28 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_amswin->SetBackgroundColour(*wxWHITE); // top - ams tag - m_simplebook_amsitems = new wxSimplebook(m_amswin, wxID_ANY); - m_simplebook_amsitems->SetSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - m_simplebook_amsitems->SetMinSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - auto m_sizer_amsitems = new wxBoxSizer(wxHORIZONTAL); - m_simplebook_amsitems->SetSizer(m_sizer_amsitems); - m_simplebook_amsitems->Layout(); - m_sizer_amsitems->Fit(m_simplebook_amsitems); + m_simplebook_amsprvs = new wxSimplebook(m_amswin, wxID_ANY); + m_simplebook_amsprvs->SetSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); + m_simplebook_amsprvs->SetMinSize(wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); + auto m_sizer_amspreviews = new wxBoxSizer(wxHORIZONTAL); + m_simplebook_amsprvs->SetSizer(m_sizer_amspreviews); + m_simplebook_amsprvs->Layout(); + m_sizer_amspreviews->Fit(m_simplebook_amsprvs); - m_panel_top = new wxPanel(m_simplebook_amsitems, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); - m_sizer_top = new wxBoxSizer(wxHORIZONTAL); - m_panel_top->SetSizer(m_sizer_top); - m_panel_top->Layout(); - m_sizer_top->Fit(m_panel_top); + m_panel_prv = new wxPanel(m_simplebook_amsprvs, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); + m_sizer_prv = new wxBoxSizer(wxHORIZONTAL); + m_panel_prv->SetSizer(m_sizer_prv); + m_panel_prv->Layout(); + m_sizer_prv->Fit(m_panel_prv); - auto m_panel_top_empty = new wxPanel(m_simplebook_amsitems, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); + auto m_panel_top_empty = new wxPanel(m_simplebook_amsprvs, wxID_ANY, wxDefaultPosition, wxSize(-1, AMS_CAN_ITEM_HEIGHT_SIZE)); auto m_sizer_top_empty = new wxBoxSizer(wxHORIZONTAL); m_panel_top_empty->SetSizer(m_sizer_top_empty); m_panel_top_empty->Layout(); m_sizer_top_empty->Fit(m_panel_top_empty); - m_simplebook_amsitems->AddPage(m_panel_top_empty, wxEmptyString, false); - m_simplebook_amsitems->AddPage(m_panel_top, wxEmptyString, false); + m_simplebook_amsprvs->AddPage(m_panel_top_empty, wxEmptyString, false); + m_simplebook_amsprvs->AddPage(m_panel_prv, wxEmptyString, false); wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL); @@ -456,7 +455,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_sizer_bottom->Add(0, 0, 0, wxLEFT, FromDIP(15)); m_sizer_bottom->Add(m_sizer_right, 0, wxEXPAND, FromDIP(0)); - m_sizer_body->Add(m_simplebook_amsitems, 0, wxEXPAND, 0); + m_sizer_body->Add(m_simplebook_amsprvs, 0, wxEXPAND, 0); m_sizer_body->Add(0, 0, 1, wxEXPAND | wxTOP, FromDIP(18)); m_sizer_body->Add(m_sizer_bottom, 0, wxEXPAND | wxLEFT, FromDIP(6)); @@ -657,9 +656,9 @@ void AMSControl::EnterNoneAMSMode() { m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::EXT_AMS) return; - m_panel_top->Hide(); - m_simplebook_amsitems->Hide(); - m_simplebook_amsitems->SetSelection(0); + m_panel_prv->Hide(); + m_simplebook_amsprvs->Hide(); + m_simplebook_amsprvs->SetSelection(0); m_simplebook_ams->SetSelection(0); m_extruder->no_ams_mode(true); @@ -679,9 +678,9 @@ void AMSControl::EnterGenericAMSMode() { m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::GENERIC_AMS) return; - m_panel_top->Show(); - m_simplebook_amsitems->Show(); - m_simplebook_amsitems->SetSelection(1); + m_panel_prv->Show(); + m_simplebook_amsprvs->Show(); + m_simplebook_amsprvs->SetSelection(1); m_vams_lib->m_ams_model = AMSModel::GENERIC_AMS; m_ams_tip->SetLabel(_L("AMS")); @@ -708,9 +707,9 @@ void AMSControl::EnterExtraAMSMode() { m_vams_lib->m_ams_model = m_ext_model; if(m_is_none_ams_mode == AMSModel::AMS_LITE) return; - m_panel_top->Hide(); - m_simplebook_amsitems->Show(); - m_simplebook_amsitems->SetSelection(1); + m_panel_prv->Hide(); + m_simplebook_amsprvs->Show(); + m_simplebook_amsprvs->SetSelection(1); m_vams_lib->m_ams_model = AMSModel::AMS_LITE; @@ -891,13 +890,13 @@ void AMSControl::CreateAms() std::vector::iterator it; Freeze(); for (it = ams_info.begin(); it != ams_info.end(); it++) { - AddAmsItems(*it); + AddAmsPreview(*it); AddAms(*it); AddExtraAms(*it); m_ams_info.push_back(*it); } - m_sizer_top->Layout(); + m_sizer_prv->Layout(); Thaw(); } @@ -1021,27 +1020,29 @@ void AMSControl::UpdateAms(std::vector info, bool is_reset) } if (info.size() > 1) { - m_simplebook_amsitems->Show(); + m_simplebook_amsprvs->Show(); m_amswin->Layout(); m_amswin->Fit(); SetSize(m_amswin->GetSize()); SetMinSize(m_amswin->GetSize()); } else { - m_simplebook_amsitems->Hide(); + m_simplebook_amsprvs->Hide(); m_amswin->Layout(); m_amswin->Fit(); SetSize(m_amswin->GetSize()); SetMinSize(m_amswin->GetSize()); } - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; + size_t i = 0; + for (auto prv_it : m_ams_preview_list) { + AMSPreview* prv = prv_it.second; if (i < info.size() && info.size() > 1) { - item->amsItem->Update(m_ams_info[i]); - item->amsItem->Open(); + prv->Update(m_ams_info[i]); + prv->Open(); } else { - item->amsItem->Close(); + prv->Close(); } + i++; } // update cans @@ -1088,20 +1089,16 @@ void AMSControl::UpdateAms(std::vector info, bool is_reset) } } -void AMSControl::AddAmsItems(AMSinfo info) +void AMSControl::AddAmsPreview(AMSinfo info) { - auto amsitem = new AMSItem(m_panel_top, wxID_ANY, info); - amsitem->Bind(wxEVT_LEFT_DOWN, [this, amsitem](wxMouseEvent& e) { - SwitchAms(amsitem->m_amsinfo.ams_id); + auto ams_prv = new AMSPreview(m_panel_prv, wxID_ANY, info); + m_sizer_prv->Add(ams_prv, 0, wxALIGN_CENTER | wxRIGHT, 6); + + ams_prv->Bind(wxEVT_LEFT_DOWN, [this, ams_prv](wxMouseEvent& e) { + SwitchAms(ams_prv->get_ams_id()); e.Skip(); }); - - AmsItems* item = new AmsItems(); - item->amsIndex = info.ams_id; - item->amsItem = amsitem; - - m_ams_item_list.Add(item); - m_sizer_top->Add(amsitem, 0, wxALIGN_CENTER | wxRIGHT, 6); + m_ams_preview_list[info.ams_id] = ams_prv; } void AMSControl::AddAms(AMSinfo info) @@ -1141,24 +1138,12 @@ void AMSControl::SwitchAms(std::string ams_id) } } - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; - if (item->amsItem->m_amsinfo.ams_id == m_current_show_ams) { - item->amsItem->OnSelected(); + for (auto prv_it : m_ams_preview_list) { + AMSPreview* prv = prv_it.second; + if (prv->get_ams_id() == m_current_show_ams) { + prv->OnSelected(); m_current_select = ams_id; - //bool ready_selected = false; - //for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { - // AmsCansWindow* ams = m_ams_cans_list[i]; - // if (ams->amsCans->m_info.ams_id == ams_id) { - // //ams->amsCans->SetDefSelectCan(); - // //m_vams_lib->OnSelected(); - // if () { - - // } - // } - //} - bool ready_selected = false; for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow* ams = m_ams_cans_list[i]; @@ -1181,10 +1166,10 @@ void AMSControl::SwitchAms(std::string ams_id) } } else { - item->amsItem->UnSelected(); + prv->UnSelected(); } - m_sizer_top->Layout(); - m_panel_top->Fit(); + m_sizer_prv->Layout(); + m_panel_prv->Fit(); } for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { @@ -1309,9 +1294,9 @@ void AMSControl::ShowFilamentTip(bool hasams) bool AMSControl::Enable(bool enable) { - for (auto i = 0; i < m_ams_item_list.GetCount(); i++) { - AmsItems *item = m_ams_item_list[i]; - item->amsItem->Enable(enable); + for (auto prv_it : m_ams_preview_list) { + AMSPreview* prv = prv_it.second; + prv->Enable(enable); } for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index b82d189935..b5cc4e34ab 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -32,8 +32,8 @@ protected: std::string m_current_ams; std::string m_current_show_ams; std::map m_ams_selection; - - AmsItemsHash m_ams_item_list; + + std::map m_ams_preview_list; std::vector m_ams_info; AmsCansHash m_ams_cans_list; @@ -46,7 +46,7 @@ protected: wxSimplebook *m_simplebook_right = {nullptr}; wxSimplebook *m_simplebook_calibration = {nullptr}; - wxSimplebook *m_simplebook_amsitems = {nullptr}; + wxSimplebook *m_simplebook_amsprvs = {nullptr}; wxSimplebook *m_simplebook_ams = {nullptr}; wxSimplebook *m_simplebook_generic_cans= {nullptr}; @@ -58,7 +58,7 @@ protected: Label *m_tip_load_info = {nullptr}; wxStaticText *m_text_calibration_percent = {nullptr}; wxWindow * m_none_ams_panel = {nullptr}; - wxWindow * m_panel_top = {nullptr}; + wxWindow* m_panel_prv = {nullptr}; wxWindow * m_amswin = {nullptr}; wxBoxSizer* m_vams_sizer = {nullptr}; wxBoxSizer* m_sizer_vams_tips = {nullptr}; @@ -73,7 +73,7 @@ protected: AMSVirtualRoad* m_vams_extra_road = {nullptr}; StaticBox * m_panel_can = {nullptr}; - wxBoxSizer *m_sizer_top = {nullptr}; + wxBoxSizer* m_sizer_prv = {nullptr}; wxBoxSizer *m_sizer_cans = {nullptr}; wxBoxSizer *m_sizer_right_tip = {nullptr}; wxBoxSizer* m_sizer_ams_tips = {nullptr}; @@ -135,7 +135,7 @@ public: void CreateAms(); void UpdateAms(std::vector info, bool is_reset = true); void AddAms(AMSinfo info); - void AddAmsItems(AMSinfo info); + void AddAmsPreview(AMSinfo info); void AddExtraAms(AMSinfo info); void SetExtruder(bool on_off, bool is_vams, std::string ams_now, wxColour col); void SetAmsStep(std::string ams_id, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step); diff --git a/src/slic3r/GUI/Widgets/AMSItem.cpp b/src/slic3r/GUI/Widgets/AMSItem.cpp index f9c088896e..dc5201d50b 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.cpp +++ b/src/slic3r/GUI/Widgets/AMSItem.cpp @@ -2171,6 +2171,193 @@ void AmsCans::show_sn_value(bool show) } } + +/************************************************* +Description:AMSPreview +**************************************************/ +AMSPreview::AMSPreview() {} + +AMSPreview::AMSPreview(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize cube_size, const wxPoint &pos, const wxSize &size) : AMSPreview() +{ + m_amsinfo = amsinfo; + m_cube_size = cube_size; + create(parent, id, pos, AMS_ITEM_SIZE); + Bind(wxEVT_PAINT, &AMSPreview::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &AMSPreview::OnEnterWindow, this); + Bind(wxEVT_LEAVE_WINDOW, &AMSPreview::OnLeaveWindow, this); +} + +void AMSPreview::Open() +{ + m_open = true; + Show(); +} + +void AMSPreview::Close() +{ + m_open = false; + Hide(); +} + +void AMSPreview::Update(AMSinfo amsinfo) +{ + m_amsinfo = amsinfo; +} + +void AMSPreview::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) +{ + m_ts_bitmap_cube = new ScalableBitmap(this, "ts_bitmap_cube", 14); + wxWindow::Create(parent, id, pos, size); + SetMinSize(AMS_ITEM_SIZE); + SetMaxSize(AMS_ITEM_SIZE); + SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); + Refresh(); +} + +void AMSPreview::OnEnterWindow(wxMouseEvent &evt) +{ + // m_hover = true; + // Refresh(); +} + +void AMSPreview::OnLeaveWindow(wxMouseEvent &evt) +{ + // m_hover = false; + // Refresh(); +} + +void AMSPreview::OnSelected() +{ + if (!wxWindow::IsEnabled()) { return; } + m_selected = true; + Refresh(); +} + +void AMSPreview::UnSelected() +{ + m_selected = false; + Refresh(); +} + +bool AMSPreview::Enable(bool enable) { return wxWindow::Enable(enable); } + +void AMSPreview::paintEvent(wxPaintEvent &evt) +{ + wxPaintDC dc(this); + render(dc); +} + +void AMSPreview::render(wxDC &dc) +{ +#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 +} + +void AMSPreview::doRender(wxDC &dc) +{ + wxSize size = GetSize(); + dc.SetPen(wxPen(StateColor::darkModeColorFor(m_background_colour))); + dc.SetBrush(wxBrush(StateColor::darkModeColorFor(m_background_colour))); + dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3); + + auto left = m_padding; + for (std::vector::iterator iter = m_amsinfo.cans.begin(); iter != m_amsinfo.cans.end(); iter++) { + dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); + + if (wxWindow::IsEnabled()) { + wxColour color = iter->material_colour; + change_the_opacity(color); + dc.SetBrush(wxBrush(color)); + } else { + dc.SetBrush(AMS_CONTROL_DISABLE_COLOUR); + } + + if (iter->material_cols.size() > 1) { + int fleft = left; + float total_width = AMS_ITEM_CUBE_SIZE.x; + int gwidth = std::round(total_width / (iter->material_cols.size() - 1)); + if (iter->ctype == 0) { + for (int i = 0; i < iter->material_cols.size() - 1; i++) { + + if ((fleft + gwidth) > (AMS_ITEM_CUBE_SIZE.x)) { + gwidth = (fleft + AMS_ITEM_CUBE_SIZE.x) - fleft; + } + + auto rect = wxRect(fleft, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, gwidth, AMS_ITEM_CUBE_SIZE.y); + dc.GradientFillLinear(rect, iter->material_cols[i], iter->material_cols[i + 1], wxEAST); + fleft += gwidth; + } + } else { + int cols_size = iter->material_cols.size(); + for (int i = 0; i < cols_size; i++) { + dc.SetBrush(wxBrush(iter->material_cols[i])); + float x = left + total_width * i / cols_size; + dc.DrawRoundedRectangle(x, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, total_width / cols_size, AMS_ITEM_CUBE_SIZE.y , 0); + } + } + + dc.SetPen(wxPen(StateColor::darkModeColorFor(m_background_colour))); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRoundedRectangle(left - 1, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2 - 1, AMS_ITEM_CUBE_SIZE.x + 2, AMS_ITEM_CUBE_SIZE.y + 2, 2); + + }else { + if (iter->material_colour.Alpha() == 0) { + dc.DrawBitmap(m_ts_bitmap_cube->bmp(),left,(size.y - AMS_ITEM_CUBE_SIZE.y) / 2); + } + else { + wxRect rect(left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, AMS_ITEM_CUBE_SIZE.x, AMS_ITEM_CUBE_SIZE.y); + if(iter->material_state==AMSCanType::AMS_CAN_TYPE_EMPTY){ + dc.SetPen(wxPen(wxColor(0, 0, 0))); + dc.DrawRoundedRectangle(rect, 2); + + dc.DrawLine(rect.GetRight()-1, rect.GetTop()+1, rect.GetLeft()+1, rect.GetBottom()-1); + } + else { + dc.DrawRoundedRectangle(rect, 2); + } + } + + } + + + left += AMS_ITEM_CUBE_SIZE.x; + left += m_space; + } + + auto border_colour = AMS_CONTROL_BRAND_COLOUR; + if (!wxWindow::IsEnabled()) { border_colour = AMS_CONTROL_DISABLE_COLOUR; } + + if (m_hover) { + dc.SetPen(wxPen(border_colour, 2)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(1, 1, size.x - 1, size.y - 1, 3); + + } + + if (m_selected) { + dc.SetPen(wxPen(border_colour, 2)); + dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); + dc.DrawRoundedRectangle(1, 1, size.x-1, size.y-1, 3); + } +} + +void AMSPreview::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) { wxWindow::DoSetSize(x, y, width, height, sizeFlags); } + /************************************************* Description:AMSHumidity **************************************************/ @@ -2387,190 +2574,4 @@ void AMSHumidity::msw_rescale() { Refresh(); } -/************************************************* -Description:AMSItem -**************************************************/ -AMSItem::AMSItem() {} - -AMSItem::AMSItem(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize cube_size, const wxPoint &pos, const wxSize &size) : AMSItem() -{ - m_amsinfo = amsinfo; - m_cube_size = cube_size; - create(parent, id, pos, AMS_ITEM_SIZE); - Bind(wxEVT_PAINT, &AMSItem::paintEvent, this); - Bind(wxEVT_ENTER_WINDOW, &AMSItem::OnEnterWindow, this); - Bind(wxEVT_LEAVE_WINDOW, &AMSItem::OnLeaveWindow, this); -} - -void AMSItem::Open() -{ - m_open = true; - Show(); -} - -void AMSItem::Close() -{ - m_open = false; - Hide(); -} - -void AMSItem::Update(AMSinfo amsinfo) -{ - m_amsinfo = amsinfo; -} - -void AMSItem::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) -{ - m_ts_bitmap_cube = new ScalableBitmap(this, "ts_bitmap_cube", 14); - wxWindow::Create(parent, id, pos, size); - SetMinSize(AMS_ITEM_SIZE); - SetMaxSize(AMS_ITEM_SIZE); - SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR); - Refresh(); -} - -void AMSItem::OnEnterWindow(wxMouseEvent &evt) -{ - // m_hover = true; - // Refresh(); -} - -void AMSItem::OnLeaveWindow(wxMouseEvent &evt) -{ - // m_hover = false; - // Refresh(); -} - -void AMSItem::OnSelected() -{ - if (!wxWindow::IsEnabled()) { return; } - m_selected = true; - Refresh(); -} - -void AMSItem::UnSelected() -{ - m_selected = false; - Refresh(); -} - -bool AMSItem::Enable(bool enable) { return wxWindow::Enable(enable); } - -void AMSItem::paintEvent(wxPaintEvent &evt) -{ - wxPaintDC dc(this); - render(dc); -} - -void AMSItem::render(wxDC &dc) -{ -#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 -} - -void AMSItem::doRender(wxDC &dc) -{ - wxSize size = GetSize(); - dc.SetPen(wxPen(StateColor::darkModeColorFor(m_background_colour))); - dc.SetBrush(wxBrush(StateColor::darkModeColorFor(m_background_colour))); - dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3); - - auto left = m_padding; - for (std::vector::iterator iter = m_amsinfo.cans.begin(); iter != m_amsinfo.cans.end(); iter++) { - dc.SetPen(wxPen(*wxTRANSPARENT_PEN)); - - if (wxWindow::IsEnabled()) { - wxColour color = iter->material_colour; - change_the_opacity(color); - dc.SetBrush(wxBrush(color)); - } else { - dc.SetBrush(AMS_CONTROL_DISABLE_COLOUR); - } - - if (iter->material_cols.size() > 1) { - int fleft = left; - float total_width = AMS_ITEM_CUBE_SIZE.x; - int gwidth = std::round(total_width / (iter->material_cols.size() - 1)); - if (iter->ctype == 0) { - for (int i = 0; i < iter->material_cols.size() - 1; i++) { - - if ((fleft + gwidth) > (AMS_ITEM_CUBE_SIZE.x)) { - gwidth = (fleft + AMS_ITEM_CUBE_SIZE.x) - fleft; - } - - auto rect = wxRect(fleft, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, gwidth, AMS_ITEM_CUBE_SIZE.y); - dc.GradientFillLinear(rect, iter->material_cols[i], iter->material_cols[i + 1], wxEAST); - fleft += gwidth; - } - } else { - int cols_size = iter->material_cols.size(); - for (int i = 0; i < cols_size; i++) { - dc.SetBrush(wxBrush(iter->material_cols[i])); - float x = left + total_width * i / cols_size; - dc.DrawRoundedRectangle(x, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, total_width / cols_size, AMS_ITEM_CUBE_SIZE.y , 0); - } - } - - dc.SetPen(wxPen(StateColor::darkModeColorFor(m_background_colour))); - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawRoundedRectangle(left - 1, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2 - 1, AMS_ITEM_CUBE_SIZE.x + 2, AMS_ITEM_CUBE_SIZE.y + 2, 2); - - }else { - if (iter->material_colour.Alpha() == 0) { - dc.DrawBitmap(m_ts_bitmap_cube->bmp(),left,(size.y - AMS_ITEM_CUBE_SIZE.y) / 2); - } - else { - wxRect rect(left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, AMS_ITEM_CUBE_SIZE.x, AMS_ITEM_CUBE_SIZE.y); - if(iter->material_state==AMSCanType::AMS_CAN_TYPE_EMPTY){ - dc.SetPen(wxPen(wxColor(0, 0, 0))); - dc.DrawRoundedRectangle(rect, 2); - - dc.DrawLine(rect.GetRight()-1, rect.GetTop()+1, rect.GetLeft()+1, rect.GetBottom()-1); - } - else { - dc.DrawRoundedRectangle(rect, 2); - } - } - - } - - - left += AMS_ITEM_CUBE_SIZE.x; - left += m_space; - } - - auto border_colour = AMS_CONTROL_BRAND_COLOUR; - if (!wxWindow::IsEnabled()) { border_colour = AMS_CONTROL_DISABLE_COLOUR; } - - if (m_hover) { - dc.SetPen(wxPen(border_colour, 2)); - dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); - dc.DrawRoundedRectangle(1, 1, size.x - 1, size.y - 1, 3); - - } - - if (m_selected) { - dc.SetPen(wxPen(border_colour, 2)); - dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH)); - dc.DrawRoundedRectangle(1, 1, size.x-1, size.y-1, 3); - } -} - -void AMSItem::DoSetSize(int x, int y, int width, int height, int sizeFlags /*= wxSIZE_AUTO*/) { wxWindow::DoSetSize(x, y, width, height, sizeFlags); } - }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Widgets/AMSItem.hpp b/src/slic3r/GUI/Widgets/AMSItem.hpp index 3aabf60321..4efbf9ae48 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.hpp +++ b/src/slic3r/GUI/Widgets/AMSItem.hpp @@ -465,6 +465,48 @@ public: void doRender(wxDC& dc); }; +/************************************************* +Description:AMSPreview +**************************************************/ +class AMSPreview : public wxWindow +{ +public: + AMSPreview(); + AMSPreview(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize cube_size = wxSize(14, 14), const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); + + bool m_open = {false}; + void Open(); + void Close(); + + void Update(AMSinfo amsinfo); + void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); + void OnEnterWindow(wxMouseEvent &evt); + void OnLeaveWindow(wxMouseEvent &evt); + void OnSelected(); + void UnSelected(); + virtual bool Enable(bool enable = true); + + + std::string get_ams_id() const { return m_amsinfo.ams_id; }; + +protected: + AMSinfo m_amsinfo; + + wxSize m_cube_size; + wxColour m_background_colour = {AMS_CONTROL_DEF_LIB_BK_COLOUR}; + int m_padding = {7}; + int m_space = {5}; + bool m_hover = {false}; + bool m_selected = {false}; + ScalableBitmap* m_ts_bitmap_cube; + + void paintEvent(wxPaintEvent &evt); + void render(wxDC &dc); + void doRender(wxDC &dc); + virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); +}; + + /************************************************* Description:AMSHumidity **************************************************/ @@ -501,45 +543,6 @@ private: void update_size(); }; -/************************************************* -Description:AMSItem -**************************************************/ - -class AMSItem : public wxWindow -{ -public: - AMSItem(); - AMSItem(wxWindow *parent, wxWindowID id, AMSinfo amsinfo, const wxSize cube_size = wxSize(14, 14), const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); - - bool m_open = {false}; - void Open(); - void Close(); - - void Update(AMSinfo amsinfo); - void create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size); - void OnEnterWindow(wxMouseEvent &evt); - void OnLeaveWindow(wxMouseEvent &evt); - void OnSelected(); - void UnSelected(); - virtual bool Enable(bool enable = true); - - AMSinfo m_amsinfo; - -protected: - wxSize m_cube_size; - wxColour m_background_colour = {AMS_CONTROL_DEF_LIB_BK_COLOUR}; - int m_padding = {7}; - int m_space = {5}; - bool m_hover = {false}; - bool m_selected = {false}; - ScalableBitmap* m_ts_bitmap_cube; - - void paintEvent(wxPaintEvent &evt); - void render(wxDC &dc); - void doRender(wxDC &dc); - virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); -}; - /************************************************* Description:AmsCans **************************************************/ @@ -638,13 +641,6 @@ public: } }; -class AmsItems -{ -public: - wxString amsIndex; - AMSItem *amsItem; -}; - class AMSextruders { public: @@ -653,7 +649,6 @@ public: }; WX_DEFINE_ARRAY(AmsCansWindow *, AmsCansHash); -WX_DEFINE_ARRAY(AmsItems *, AmsItemsHash); WX_DEFINE_ARRAY(AMSextruders *, AMSextrudersHash);