diff --git a/resources/images/transparent_ams_item.svg b/resources/images/transparent_ams_item.svg new file mode 100644 index 0000000000..6991cfa546 --- /dev/null +++ b/resources/images/transparent_ams_item.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/transparent_ams_lib.svg b/resources/images/transparent_ams_lib.svg new file mode 100644 index 0000000000..4354abef91 --- /dev/null +++ b/resources/images/transparent_ams_lib.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/transparent_color_picker.svg b/resources/images/transparent_color_picker.svg new file mode 100644 index 0000000000..5a41befa3f --- /dev/null +++ b/resources/images/transparent_color_picker.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/transparent_mapping_item.svg b/resources/images/transparent_mapping_item.svg new file mode 100644 index 0000000000..f1e577439a --- /dev/null +++ b/resources/images/transparent_mapping_item.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/transparent_material_item.svg b/resources/images/transparent_material_item.svg new file mode 100644 index 0000000000..9436fd87a9 --- /dev/null +++ b/resources/images/transparent_material_item.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 865a432be0..ecaff44755 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -644,7 +644,7 @@ void AMSMaterialsSetting::set_colors(std::vector colors) void AMSMaterialsSetting::on_picker_color(wxCommandEvent& event) { unsigned int color_num = event.GetInt(); - set_color(wxColour(color_num>>16&0xFF, color_num>>8&0xFF, color_num&0xFF)); + set_color(wxColour(color_num>>24&0xFF, color_num>>16&0xFF, color_num>>8&0xFF, color_num&0xFF)); } void AMSMaterialsSetting::on_clr_picker(wxMouseEvent &event) @@ -929,7 +929,9 @@ ColorPicker::ColorPicker(wxWindow* parent, wxWindowID id, const wxPoint& pos /*= SetMaxSize(wxSize(FromDIP(25), FromDIP(25))); Bind(wxEVT_PAINT, &ColorPicker::paintEvent, this); + m_bitmap_border = create_scaled_bitmap("color_picker_border", nullptr, 25); + m_bitmap_transparent = create_scaled_bitmap("transparent_color_picker", nullptr, 25); } ColorPicker::~ColorPicker(){} @@ -982,13 +984,19 @@ void ColorPicker::render(wxDC& dc) void ColorPicker::doRender(wxDC& dc) { wxSize size = GetSize(); + auto alpha = m_colour.Alpha(); auto radius = m_show_full?size.x / 2:size.x / 2 - FromDIP(1); if (m_selected) radius -= FromDIP(1); - dc.SetPen(wxPen(m_colour)); - dc.SetBrush(wxBrush(m_colour)); - dc.DrawCircle(size.x / 2, size.x / 2, radius); + if (alpha == 0) { + dc.DrawBitmap(m_bitmap_transparent, 0, 0); + } + else { + dc.SetPen(wxPen(m_colour)); + dc.SetBrush(wxBrush(m_colour)); + dc.DrawCircle(size.x / 2, size.x / 2, radius); + } if (m_selected) { dc.SetPen(wxPen(m_colour)); @@ -1001,6 +1009,11 @@ void ColorPicker::doRender(wxDC& dc) dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawCircle(size.x / 2, size.x / 2, radius); + //transparent + if (alpha == 0) { + dc.DrawBitmap(m_bitmap_transparent, 0, 0); + } + if (m_cols.size() > 1) { int left = FromDIP(0); float total_width = size.x; @@ -1096,7 +1109,7 @@ ColorPickerPopup::ColorPickerPopup(wxWindow* parent) set_def_colour(cp->m_colour); wxCommandEvent evt(EVT_SELECTED_COLOR); - unsigned long g_col = ((cp->m_colour.Red() & 0xff) << 16) + ((cp->m_colour.Green() & 0xff) << 8) + (cp->m_colour.Blue() & 0xff); + unsigned long g_col = ((cp->m_colour.Red() & 0xff) << 24) + ((cp->m_colour.Green() & 0xff) << 16) + ((cp->m_colour.Blue() & 0xff) << 8) + (cp->m_colour.Alpha() & 0xff); evt.SetInt(g_col); wxPostEvent(GetParent(), evt); }); @@ -1183,7 +1196,7 @@ void ColorPickerPopup::on_custom_clr_picker(wxMouseEvent& event) m_custom_cp->SetBackgroundColor(picker_color); set_def_colour(picker_color); wxCommandEvent evt(EVT_SELECTED_COLOR); - unsigned long g_col = ((picker_color.Red() & 0xff) << 16) + ((picker_color.Green() & 0xff) << 8) + (picker_color.Blue() & 0xff); + unsigned long g_col = ((picker_color.Red() & 0xff) << 24) + ((picker_color.Green() & 0xff) << 16) + ((picker_color.Blue() & 0xff) << 8) + (picker_color.Alpha() & 0xff); evt.SetInt(g_col); wxPostEvent(GetParent(), evt); } @@ -1218,7 +1231,7 @@ void ColorPickerPopup::set_ams_colours(std::vector ams) set_def_colour(cp->m_colour); wxCommandEvent evt(EVT_SELECTED_COLOR); - unsigned long g_col = ((cp->m_colour.Red() & 0xff) << 16) + ((cp->m_colour.Green() & 0xff) << 8) + (cp->m_colour.Blue() & 0xff); + unsigned long g_col = ((cp->m_colour.Red() & 0xff) << 24) + ((cp->m_colour.Green() & 0xff) << 16) + ((cp->m_colour.Blue() & 0xff) << 8) + (cp->m_colour.Alpha() & 0xff); evt.SetInt(g_col); wxPostEvent(GetParent(), evt); }); diff --git a/src/slic3r/GUI/AMSMaterialsSetting.hpp b/src/slic3r/GUI/AMSMaterialsSetting.hpp index 60d7e17c0c..7a88ed930b 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.hpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.hpp @@ -32,6 +32,8 @@ class ColorPicker : public wxWindow { public: wxBitmap m_bitmap_border; + wxBitmap m_bitmap_transparent; + wxColour m_colour; std::vector m_cols; bool m_selected{false}; diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index b5d09ff0c4..dfd3dce46f 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -30,7 +30,7 @@ wxDEFINE_EVENT(EVT_SET_FINISH_MAPPING, wxCommandEvent); { m_arraw_bitmap_gray = ScalableBitmap(this, "drop_down", FromDIP(12)); m_arraw_bitmap_white = ScalableBitmap(this, "topbar_dropdown", FromDIP(12)); - + m_transparent_mitem = ScalableBitmap(this, "transparent_material_item", FromDIP(32)); m_material_coloul = mcolour; m_material_name = mname; @@ -121,6 +121,7 @@ void MaterialItem::render(wxDC &dc) dc.SetFont(::Label::Body_13); auto material_name_colour = m_material_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30); + if (m_material_coloul.Alpha() == 0) {material_name_colour = wxColour(0x26, 0x2E, 0x30);} dc.SetTextForeground(material_name_colour); if (dc.GetTextExtent(m_material_name).x > GetSize().x - 10) { @@ -134,6 +135,9 @@ void MaterialItem::render(wxDC &dc) // mapping num dc.SetFont(::Label::Body_10); dc.SetTextForeground(m_ams_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30)); + if (m_ams_coloul.Alpha() == 0) { + dc.SetTextForeground(wxColour(0x26, 0x2E, 0x30)); + } wxString mapping_txt = wxEmptyString; if (m_ams_name.empty()) { @@ -148,6 +152,10 @@ void MaterialItem::render(wxDC &dc) void MaterialItem::doRender(wxDC &dc) { + if (m_material_coloul.Alpha() == 0) { + dc.DrawBitmap(m_transparent_mitem.bmp(), FromDIP(1), FromDIP(1)); + } + //top dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(m_material_coloul)); @@ -181,7 +189,7 @@ void MaterialItem::doRender(wxDC &dc) dc.DrawRoundedRectangle(1, 1, MATERIAL_ITEM_SIZE.x - 1, MATERIAL_ITEM_SIZE.y - 1, 5); } #else - if (m_material_coloul == *wxWHITE || m_ams_coloul == *wxWHITE) { + if (m_material_coloul == *wxWHITE || m_ams_coloul == *wxWHITE || m_ams_coloul.Alpha() == 0) { dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, MATERIAL_ITEM_SIZE.y, 5); @@ -194,7 +202,6 @@ void MaterialItem::doRender(wxDC &dc) } #endif //arrow - if ( (m_ams_coloul.Red() > 160 && m_ams_coloul.Green() > 160 && m_ams_coloul.Blue() > 160) && (m_ams_coloul.Red() < 180 && m_ams_coloul.Green() < 180 && m_ams_coloul.Blue() < 180)) { dc.DrawBitmap(m_arraw_bitmap_white.bmp(), GetSize().x - m_arraw_bitmap_white.GetBmpSize().x - FromDIP(7), GetSize().y - m_arraw_bitmap_white.GetBmpSize().y); @@ -535,6 +542,8 @@ void AmsMapingPopup::paintEvent(wxPaintEvent &evt) #ifdef __WINDOWS__ SetDoubleBuffered(true); #endif //__WINDOWS__ + + m_transparent_mapping_item = ScalableBitmap(this, "transparent_mapping_item", FromDIP(44)); SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); Bind(wxEVT_PAINT, &MappingItem::paintEvent, this); } @@ -550,7 +559,7 @@ void MappingItem::send_event(int fliament_id) wxCommandEvent event(EVT_SET_FINISH_MAPPING); event.SetInt(m_tray_data.id); - wxString param = wxString::Format("%d|%d|%d|%s|%d", m_coloul.Red(), m_coloul.Green(), m_coloul.Blue(), number, fliament_id); + wxString param = wxString::Format("%d|%d|%d|%d|%s|%d", m_coloul.Red(), m_coloul.Green(), m_coloul.Blue(), m_coloul.Alpha(), number, fliament_id); event.SetString(param); event.SetEventObject(this->GetParent()->GetParent()); wxPostEvent(this->GetParent()->GetParent()->GetParent(), event); @@ -594,7 +603,7 @@ void MappingItem::render(wxDC &dc) auto txt_colour = m_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30); txt_colour = m_unmatch ? wxColour(0xCE, 0xCE, 0xCE) : txt_colour; - + if (m_coloul.Alpha() == 0) txt_colour = wxColour(0x26, 0x2E, 0x30); dc.SetTextForeground(txt_colour); /*if (dc.GetTextExtent(m_name).x > GetSize().x - 10) { @@ -628,16 +637,14 @@ void MappingItem::doRender(wxDC &dc) { dc.SetPen(m_coloul); dc.SetBrush(wxBrush(m_coloul)); - dc.DrawRectangle(0, (GetSize().y - MAPPING_ITEM_REAL_SIZE.y) / 2, MAPPING_ITEM_REAL_SIZE.x, MAPPING_ITEM_REAL_SIZE.y); -// if (m_coloul == *wxWHITE) { -// dc.SetPen(wxPen(wxColour(0xAC, 0xAC, 0xAC), 1)); -//#ifdef __APPLE__ -// dc.DrawRectangle(1, 1, GetSize().x - 1, GetSize().y - 1); -//#else -// dc.DrawRectangle(0, 0, tray_size.x, tray_size.y); -//#endif // __APPLE__ -// } + if (m_coloul.Alpha() == 0) { + dc.DrawBitmap( m_transparent_mapping_item.bmp(), 0, (GetSize().y - MAPPING_ITEM_REAL_SIZE.y) / 2); + } + else { + dc.DrawRectangle(0, (GetSize().y - MAPPING_ITEM_REAL_SIZE.y) / 2, MAPPING_ITEM_REAL_SIZE.x, MAPPING_ITEM_REAL_SIZE.y); + } + wxColour side_colour = wxColour(0xE4E4E4); diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index d1094a3859..ca4c720d51 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -75,6 +75,7 @@ public: ScalableBitmap m_arraw_bitmap_gray; ScalableBitmap m_arraw_bitmap_white; + ScalableBitmap m_transparent_mitem; bool m_selected {false}; bool m_warning{false}; @@ -106,6 +107,7 @@ public: wxColour m_coloul; wxString m_name; TrayData m_tray_data; + ScalableBitmap m_transparent_mapping_item; bool m_unmatch{false}; void msw_rescale(); diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index 39c76eb656..15d83541ed 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -449,6 +449,7 @@ bool BitmapCache::parse_color(const std::string& scolor, unsigned char* rgb_out) return false; rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); } + return true; } diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index d5a7e69a64..1231acf9ab 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -173,19 +173,19 @@ public: static wxColour decode_color(const std::string &color) { - std::array ret = {0, 0, 0}; + std::array ret = {0, 0, 0, 0}; const char * c = color.data(); if (color.size() == 8) { - for (size_t j = 0; j < 3; ++j) { + for (size_t j = 0; j < 4; ++j) { int digit1 = hex_digit_to_int(*c++); int digit2 = hex_digit_to_int(*c++); if (digit1 == -1 || digit2 == -1) break; ret[j] = float(digit1 * 16 + digit2); } } else { - return wxColour(255, 255, 255); + return wxColour(255, 255, 255, 255); } - return wxColour(ret[0], ret[1], ret[2]); + return wxColour(ret[0], ret[1], ret[2], ret[3]); } std::string id; diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index cdb69a459e..a6d7050970 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -1899,11 +1899,7 @@ bool SelectMachineDialog::get_ams_mapping_result(std::string &mapping_array_str, mapping_item["filamentId"] = it->filament_id; } //convert #RRGGBB to RRGGBBAA - if (m_filaments[k].color.size() > 6) { - mapping_item["sourceColor"] = m_filaments[k].color.substr(1, 6) + "FF"; - } else { - mapping_item["sourceColor"] = m_filaments[k].color; - } + mapping_item["sourceColor"] = m_filaments[k].color; mapping_item["targetColor"] = m_ams_mapping_result[k].color; } } @@ -2445,7 +2441,7 @@ void SelectMachineDialog::on_send_print() json mapping_info_json = json::array(); json item; if (m_filaments.size() > 0) { - item["sourceColor"] = m_filaments[0].color.substr(1, 6) + "FF"; + item["sourceColor"] = m_filaments[0].color.substr(1, 8); item["filamentType"] = m_filaments[0].type; mapping_info_json.push_back(item); ams_mapping_info = mapping_info_json.dump(); @@ -2604,13 +2600,13 @@ void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt) BOOST_LOG_TRIVIAL(info) << "The ams mapping selection result: data is " << selection_data; - if (selection_data_arr.size() == 5) { + if (selection_data_arr.size() == 6) { for (auto i = 0; i < m_ams_mapping_result.size(); i++) { - if (m_ams_mapping_result[i].id == wxAtoi(selection_data_arr[4])) { + if (m_ams_mapping_result[i].id == wxAtoi(selection_data_arr[5])) { m_ams_mapping_result[i].tray_id = evt.GetInt(); - auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2])); - auto color = wxString::Format("%sFF", ams_colour.GetAsString(wxC2S_HTML_SYNTAX).substr(1, ams_colour.GetAsString(wxC2S_HTML_SYNTAX).size()-1)); - m_ams_mapping_result[i].color = color.ToStdString(); + auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2]), wxAtoi(selection_data_arr[3])); + wxString color = wxString::Format("#%02X%02X%02X%02X", ams_colour.Red(), ams_colour.Green(), ams_colour.Blue(), ams_colour.Alpha()); + m_ams_mapping_result[i].color = color.ToStdString(); } BOOST_LOG_TRIVIAL(trace) << "The ams mapping result: id is " << m_ams_mapping_result[i].id << "tray_id is " << m_ams_mapping_result[i].tray_id; } @@ -2620,8 +2616,8 @@ void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt) Material* item = iter->second; MaterialItem *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])); - m->set_ams_info(ams_colour, selection_data_arr[3]); + 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]); } iter++; } @@ -3443,11 +3439,11 @@ void SelectMachineDialog::set_default_normal() for (auto i = 0; i < extruders.size(); i++) { auto extruder = extruders[i] - 1; - auto colour = wxGetApp().preset_bundle->project_config.opt_string("filament_colour", (unsigned int)extruder); - unsigned char rgb[3]; - bmcache.parse_color(colour, rgb); + auto colour = wxGetApp().preset_bundle->project_config.opt_string("filament_colour", (unsigned int) extruder); + unsigned char rgb[4]; + bmcache.parse_color4(colour, rgb); - auto colour_rgb = wxColour((int)rgb[0], (int)rgb[1], (int)rgb[2]); + auto colour_rgb = wxColour((int) rgb[0], (int) rgb[1], (int) rgb[2], (int) rgb[3]); if (extruder >= materials.size() || extruder < 0 || extruder >= display_materials.size()) continue; @@ -3507,7 +3503,7 @@ void SelectMachineDialog::set_default_normal() info.id = extruder; info.type = materials[extruder]; info.brand = brands[extruder]; - info.color = colour_rgb.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); + info.color = wxString::Format("#%02X%02X%02X%02X", colour_rgb.Red(), colour_rgb.Green(), colour_rgb.Blue(), colour_rgb.Alpha()).ToStdString(); m_filaments.push_back(info); } } diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 3eb103182e..951589366e 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -633,6 +633,7 @@ void AMSLib::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const w m_bitmap_editable_light = ScalableBitmap(this, "ams_editable_light", 14); m_bitmap_readonly = ScalableBitmap(this, "ams_readonly", 14); m_bitmap_readonly_light = ScalableBitmap(this, "ams_readonly_light", 14); + m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", FromDIP(68)); m_sizer_body->Add(0, 0, 1, wxEXPAND, 0); m_sizer_body->Add(m_sizer_edit, 0, wxALIGN_CENTER, 0); @@ -723,9 +724,9 @@ void AMSLib::render(wxDC &dc) temp_text_colour = AMS_CONTROL_GRAY800; } - //if (!wxWindow::IsEnabled()) { - //temp_text_colour = AMS_CONTROL_DISABLE_TEXT_COLOUR; - //} + if (tmp_lib_colour.Alpha() == 0) { + temp_text_colour = AMS_CONTROL_GRAY800; + } dc.SetFont(::Label::Body_13); dc.SetTextForeground(temp_text_colour); @@ -829,9 +830,10 @@ void AMSLib::doRender(wxDC &dc) temp_bitmap_brand = m_bitmap_readonly; } - //if (!wxWindow::IsEnabled()) { - //tmp_lib_colour = AMS_CONTROL_DISABLE_COLOUR; - //} + if (tmp_lib_colour.Alpha() == 0) { + temp_bitmap_third = m_bitmap_editable; + temp_bitmap_brand = m_bitmap_readonly; + } // selected if (m_selected) { @@ -888,6 +890,12 @@ void AMSLib::doRender(wxDC &dc) if (curr_height >= FromDIP(6)) { + //transparent + auto alpha = m_info.material_colour.Alpha(); + if (alpha == 0) { + dc.DrawBitmap(m_bitmap_transparent.bmp(),FromDIP(4), FromDIP(4)); + } + //gradient if (m_info.material_cols.size() > 1) { int left = FromDIP(4); diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index bfed45e39d..87213a44e3 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -307,6 +307,8 @@ protected: ScalableBitmap m_bitmap_editable_light; ScalableBitmap m_bitmap_readonly; ScalableBitmap m_bitmap_readonly_light; + ScalableBitmap m_bitmap_transparent; + bool m_unable_selected = {false}; bool m_enable = {false}; bool m_selected = {false};