From 012d90bd7e546be17b654a2f71e90628ffd596e5 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Sun, 19 Jan 2025 16:05:28 +0800 Subject: [PATCH] ENH:add MaterialSyncItem jira: STUDIO-9994 Change-Id: Id0d2ebd8dd68854f5cc1c821c7453b75852b8ba7 --- src/slic3r/GUI/AmsMappingPopup.cpp | 191 ++++++++++++++++++++++++++- src/slic3r/GUI/AmsMappingPopup.hpp | 19 ++- src/slic3r/GUI/SyncAmsInfoDialog.cpp | 22 +-- 3 files changed, 214 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 19fd0d463..84e89bbc7 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -29,8 +29,8 @@ namespace Slic3r { namespace GUI { #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, bool use_in_ams_sync) - : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize), m_use_in_ams_sync(use_in_ams_sync) + 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); @@ -318,6 +318,193 @@ void MaterialItem::doRender(wxDC& dc) } } + 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) : PopupWindow(parent, wxBORDER_NONE) { diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index 1f29866e3..f7f9dd4ee 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -71,11 +71,10 @@ struct TrayData class MaterialItem: public wxPanel { +protected: int m_text_pos_y = -1; - bool m_use_in_ams_sync = false; - public: - MaterialItem(wxWindow *parent, wxColour mcolour, wxString mname, bool use_in_ams_sync = false); + MaterialItem(wxWindow *parent, wxColour mcolour, wxString mname); ~MaterialItem(); wxPanel* m_main_panel; @@ -108,9 +107,19 @@ public: void on_left_down(wxMouseEvent &evt); void paintEvent(wxPaintEvent &evt); - void render(wxDC &dc); + virtual void render(wxDC &dc); void match(bool mat); - void doRender(wxDC &dc); + virtual void doRender(wxDC &dc); +}; + +class MaterialSyncItem : public MaterialItem +{ +public: + MaterialSyncItem(wxWindow *parent, wxColour mcolour, wxString mname); + ~MaterialSyncItem(); + + void render(wxDC &dc) override; + void doRender(wxDC &dc) override; }; class MappingItem : public wxPanel diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.cpp b/src/slic3r/GUI/SyncAmsInfoDialog.cpp index 02dd248a3..489086aaa 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.cpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.cpp @@ -1521,7 +1521,7 @@ void SyncAmsInfoDialog::sync_ams_mapping_result(std::vector &resul while (iter != m_materialList.end()) { int id = iter->second->id; Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; if (f->id == id) { wxString ams_id; @@ -2419,7 +2419,7 @@ bool SyncAmsInfoDialog::is_same_nozzle_type(std::string &filament_type, NozzleTy MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; auto filament_nozzle_hrc = preset_bundle->get_required_hrc_by_filament_type(m->m_material_name.ToStdString()); if (abs(filament_nozzle_hrc) > abs(printer_nozzle_hrc)) { @@ -2989,7 +2989,7 @@ void SyncAmsInfoDialog::on_set_finish_mapping(wxCommandEvent &evt) MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; if (item->id == m_current_filament_id) { auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2]), wxAtoi(selection_data_arr[3])); m->set_ams_info(ams_colour, selection_data_arr[4], ctype, material_cols); @@ -3651,7 +3651,7 @@ void SyncAmsInfoDialog::reset_ams_material() while (iter != m_materialList.end()) { int id = iter->first; Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; wxString ams_id = "-"; wxColour ams_col = wxColour(0xEE, 0xEE, 0xEE); m->set_ams_info(ams_col, ams_id); @@ -3896,13 +3896,13 @@ void SyncAmsInfoDialog::reset_and_sync_ams_list() contronal_index++; } - MaterialItem *item = nullptr; + MaterialSyncItem *item = nullptr; if (use_double_extruder) { if (m_filaments_map[extruder] == 1) { - item = new MaterialItem(m_filament_panel, colour_rgb, _L(display_materials[extruder]),true);// m_filament_left_panel//special + item = new MaterialSyncItem(m_filament_panel, colour_rgb, _L(display_materials[extruder])); // m_filament_left_panel//special m_sizer_ams_mapping->Add(item, 0, wxALL, FromDIP(5)); // m_sizer_ams_mapping_left } else if (m_filaments_map[extruder] == 2) { - item = new MaterialItem(m_filament_panel, colour_rgb, _L(display_materials[extruder]), true); // m_filament_right_panel + item = new MaterialSyncItem(m_filament_panel, colour_rgb, _L(display_materials[extruder])); // m_filament_right_panel m_sizer_ams_mapping->Add(item, 0, wxALL, FromDIP(5)); // m_sizer_ams_mapping_right } else { @@ -3910,7 +3910,7 @@ void SyncAmsInfoDialog::reset_and_sync_ams_list() continue; } } else { - item = new MaterialItem(m_filament_panel, colour_rgb, _L(display_materials[extruder]), true); + item = new MaterialSyncItem(m_filament_panel, colour_rgb, _L(display_materials[extruder])); m_sizer_ams_mapping->Add(item, 0, wxALL, FromDIP(5)); } contronal_index++; @@ -3921,7 +3921,7 @@ void SyncAmsInfoDialog::reset_and_sync_ams_list() while (iter != m_materialList.end()) { int id = iter->first; Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; m->on_normal(); iter++; } @@ -4008,7 +4008,7 @@ void SyncAmsInfoDialog::clone_thumbnail_data() while (iter != m_materialList.end()) { int id = iter->first; Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; m_preview_colors_in_thumbnail[id] = m->m_material_coloul; if (item->id < m_cur_colors_in_thumbnail.size()) { m_cur_colors_in_thumbnail[item->id] = m->m_ams_coloul; @@ -4148,7 +4148,7 @@ void SyncAmsInfoDialog::unify_deal_thumbnail_data(ThumbnailData &input_data, Thu while (iter != m_materialList.end()) { int id = iter->first; Material * item = iter->second; - MaterialItem *m = item->item; + auto m = item->item; if (m->m_ams_name == "-") { is_connect_printer = false; break;