From 5761f8c050c0ceac12c896882b0580eea3f3a3d8 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Thu, 10 Nov 2022 15:42:11 +0800 Subject: [PATCH] ENH: [STUDIO-1272] handle default filament color in presetcomboxbox Change-Id: Id78749db063fd222915b1aa5ad6abf47fb4294ca --- src/slic3r/GUI/Field.cpp | 15 ++++-- src/slic3r/GUI/PresetComboBoxes.cpp | 84 ++++++++++++++++------------- src/slic3r/GUI/PresetComboBoxes.hpp | 2 + src/slic3r/GUI/Widgets/ComboBox.cpp | 7 +++ src/slic3r/GUI/Widgets/ComboBox.hpp | 1 + 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 1a07cb147..2d60fe0d9 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -1444,14 +1444,21 @@ void ColourPicker::set_undef_value(wxColourPickerCtrl* field) field->SetColour(wxTransparentColour); wxButton* btn = dynamic_cast(field->GetPickerCtrl()); - wxBitmap bmp = btn->GetBitmap(); + wxImage image(btn->GetBitmap().GetSize()); + image.InitAlpha(); + memset(image.GetAlpha(), 0, image.GetWidth() * image.GetHeight()); + wxBitmap bmp(std::move(image)); wxMemoryDC dc(bmp); if (!dc.IsOk()) return; - dc.SetTextForeground(*wxWHITE); - dc.SetFont(wxGetApp().normal_font()); +#ifdef __WXMSW__ + wxGCDC dc2(dc); +#else + wxDC &dc2(dc); +#endif + dc2.SetPen(wxPen("#F1754E", 1)); const wxRect rect = wxRect(0, 0, bmp.GetWidth(), bmp.GetHeight()); - dc.DrawLabel("undef", rect, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL); + dc2.DrawLine(rect.GetLeftBottom(), rect.GetTopRight()); dc.SelectObject(wxNullBitmap); btn->SetBitmapLabel(bmp); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index bdd8f057a..e418aa269 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -224,16 +224,22 @@ int PresetComboBox::update_ams_color() { if (m_filament_idx < 0) return -1; int idx = selected_ams_filament(); - if (idx < 0) return -1; - auto &ams_list = wxGetApp().preset_bundle->filament_ams_list; - if (idx >= ams_list.size()) { - BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": ams %1% out of range %2%") % idx % ams_list.size(); - return -1; + std::string color; + if (idx < 0) { + auto *preset = m_collection->find_preset(Preset::remove_suffix_modified(GetLabel().ToUTF8().data())); + if (preset) color = preset->config.opt_string("default_filament_colour", 0u); + if (color.empty()) return -1; + } else { + auto &ams_list = wxGetApp().preset_bundle->filament_ams_list; + if (idx >= ams_list.size()) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": ams %1% out of range %2%") % idx % ams_list.size(); + return -1; + } + color = ams_list[idx].opt_string("filament_colour", 0u); } DynamicPrintConfig *cfg = &wxGetApp().preset_bundle->project_config; auto colors = static_cast(cfg->option("filament_colour")->clone()); - colors->values[m_filament_idx] = ams_list[idx] - .opt_string("filament_colour", 0u); + colors->values[m_filament_idx] = color; DynamicPrintConfig new_cfg; new_cfg.set_key_value("filament_colour", colors); cfg->apply(new_cfg); @@ -304,15 +310,7 @@ void PresetComboBox::update(std::string select_preset_name) if (select_preset_name.empty() && is_enabled) select_preset_name = preset.name; - std::string bitmap_key = "cb"; - if (m_type == Preset::TYPE_PRINTER) { - bitmap_key += "_printer"; - if (preset.printer_technology() == ptSLA) - bitmap_key += "_sla"; - } - std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "printer" : m_main_bitmap_name; - - wxBitmap* bmp = get_bmp(bitmap_key, main_icon_name, "unlock_normal", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); + wxBitmap* bmp = get_bmp(preset); assert(bmp); if (!is_enabled) @@ -523,7 +521,36 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con #endif } -wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name, +wxBitmap *PresetComboBox::get_bmp(Preset const &preset) +{ + static wxBitmap sbmp; + if (m_type == Preset::TYPE_FILAMENT) { + Preset const & preset2 = &m_collection->get_selected_preset() == &preset ? m_collection->get_edited_preset() : preset; + wxString color = preset2.config.opt_string("default_filament_colour", 0); + wxColour clr(color); + if (clr.IsOk()) { + std::string bitmap_key = "default_filament_colour_" + color.ToStdString(); + wxBitmap *bmp = bitmap_cache().find(bitmap_key); + if (bmp == nullptr) { + wxImage img(16, 16); + if (clr.Red() > 224 && clr.Blue() > 224 && clr.Green() > 224) { + img.SetRGB(wxRect({0, 0}, img.GetSize()), 128, 128, 128); + img.SetRGB(wxRect({1, 1}, img.GetSize() - wxSize{2, 2}), clr.Red(), clr.Green(), clr.Blue()); + } else { + img.SetRGB(wxRect({0, 0}, img.GetSize()), clr.Red(), clr.Green(), clr.Blue()); + } + bmp = new wxBitmap(img); + bmp = bitmap_cache().insert(bitmap_key, *bmp); + } + return bmp; + } + } + return &sbmp; +} + +wxBitmap *PresetComboBox::get_bmp(std::string bitmap_key, + const std::string &main_icon_name, + const std::string &next_icon_name, bool is_enabled/* = true*/, bool is_compatible/* = true*/, bool is_system/* = false*/) { // BBS: no icon @@ -939,9 +966,6 @@ void PlaterPresetComboBox::update() if (!preset.is_visible || (!preset.is_compatible && !is_selected)) continue; - std::string bitmap_key, filament_rgb, extruder_rgb, material_rgb; - std::string bitmap_type_name = bitmap_key = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - bool single_bar = false; if (m_type == Preset::TYPE_FILAMENT) { @@ -955,15 +979,8 @@ void PlaterPresetComboBox::update() bitmap_key += single_bar ? filament_rgb : filament_rgb + extruder_rgb; #endif } - else if (m_type == Preset::TYPE_SLA_MATERIAL) { - material_rgb = is_selected ? m_preset_bundle->sla_materials.get_edited_preset().config.opt_string("material_colour") : preset.config.opt_string("material_colour"); - if (material_rgb.empty()) - material_rgb = print_config_def.get("material_colour")->get_default_value()->value; - } - wxBitmap* bmp = get_bmp(bitmap_key, wide_icons, bitmap_type_name, - preset.is_compatible, preset.is_system || preset.is_default, - single_bar, filament_rgb, extruder_rgb, material_rgb); + wxBitmap* bmp = get_bmp(preset); assert(bmp); const std::string name = preset.alias.empty() ? preset.name : preset.alias; @@ -1198,15 +1215,7 @@ void TabPresetComboBox::update() // marker used for disable incompatible printer models for the selected physical printer bool is_enabled = true; - std::string bitmap_key = "tab"; - if (m_type == Preset::TYPE_PRINTER) { - bitmap_key += "_printer"; - if (preset.printer_technology() == ptSLA) - bitmap_key += "_sla"; - } - std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - - wxBitmap* bmp = get_bmp(bitmap_key, main_icon_name, "unlock_normal", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); + wxBitmap* bmp = get_bmp(preset); assert(bmp); if (preset.is_default || preset.is_system) { @@ -1361,6 +1370,7 @@ void TabPresetComboBox::update_dirty() if (old_label != new_label) { SetString(ui_id, from_u8(new_label)); + SetItemBitmap(ui_id, *get_bmp(*preset)); if (ui_id == GetSelection()) SetToolTip(wxString::FromUTF8(new_label.c_str())); // BBS } } diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index 8b176931e..4f074f50c 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -145,6 +145,8 @@ protected: wxBitmap* get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name, bool is_enabled = true, bool is_compatible = true, bool is_system = false); + wxBitmap *get_bmp(Preset const &preset); + private: void fill_width_height(); }; diff --git a/src/slic3r/GUI/Widgets/ComboBox.cpp b/src/slic3r/GUI/Widgets/ComboBox.cpp index 0b36f85e7..ffd760110 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.cpp +++ b/src/slic3r/GUI/Widgets/ComboBox.cpp @@ -179,6 +179,13 @@ void ComboBox::SetString(unsigned int n, wxString const &value) wxBitmap ComboBox::GetItemBitmap(unsigned int n) { return icons[n]; } +void ComboBox::SetItemBitmap(unsigned int n, wxBitmap const &bitmap) +{ + if (n >= texts.size()) return; + icons[n] = bitmap; + drop.Invalidate(); +} + int ComboBox::DoInsertItems(const wxArrayStringsAdapter &items, unsigned int pos, void ** clientData, diff --git a/src/slic3r/GUI/Widgets/ComboBox.hpp b/src/slic3r/GUI/Widgets/ComboBox.hpp index 0a8e018dc..86d57ff2f 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.hpp +++ b/src/slic3r/GUI/Widgets/ComboBox.hpp @@ -58,6 +58,7 @@ public: void SetString(unsigned int n, wxString const &value) override; wxBitmap GetItemBitmap(unsigned int n); + void SetItemBitmap(unsigned int n, wxBitmap const &bitmap); protected: virtual int DoInsertItems(const wxArrayStringsAdapter &items,