From 4f5d15be34436bb1ab3516a850d49b8f40925efe Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Wed, 27 Dec 2023 20:10:58 +0800 Subject: [PATCH] ENH:remember filament custom color Jira: STUDIO-5635 Change-Id: Id7f7204851c6bc3975c8447db4b8ee7d2e9c6d9d --- src/libslic3r/AppConfig.cpp | 32 ++++++++++++++ src/libslic3r/AppConfig.hpp | 4 +- src/slic3r/GUI/AMSMaterialsSetting.cpp | 15 ++++++- src/slic3r/GUI/Field.cpp | 41 ++++++++++++++++++ src/slic3r/GUI/Field.hpp | 8 ++++ src/slic3r/GUI/PresetComboBoxes.cpp | 60 ++++---------------------- src/slic3r/GUI/PresetComboBoxes.hpp | 2 - src/slic3r/Utils/ColorSpaceConvert.cpp | 19 +++++++- src/slic3r/Utils/ColorSpaceConvert.hpp | 5 +++ 9 files changed, 128 insertions(+), 58 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index b6591da0b..d6425ac39 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -1188,6 +1188,38 @@ bool AppConfig::is_engineering_region(){ return false; } +void AppConfig::save_custom_color_to_config(const std::vector &colors) +{ + auto set_colors = [](std::map &data, const std::vector &colors) { + for (size_t i = 0; i < colors.size(); i++) { + data[std::to_string(10 + i)] = colors[i]; // for map sort:10 begin + } + }; + if (colors.size() > 0) { + if (!has_section("custom_color_list")) { + std::map data; + set_colors(data, colors); + set_section("custom_color_list", data); + } else { + auto data = get_section("custom_color_list"); + auto data_modify = const_cast *>(&data); + set_colors(*data_modify, colors); + set_section("custom_color_list", *data_modify); + } + } +} + +std::vector AppConfig::get_custom_color_from_config() +{ + std::vector colors; + if (has_section("custom_color_list")) { + auto data = get_section("custom_color_list"); + for (auto iter : data) { + colors.push_back(iter.second); + } + } + return colors; +} void AppConfig::reset_selections() { diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index f6d7772d8..ae8eae2ca 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -200,7 +200,9 @@ public: std::string get_country_code(); bool is_engineering_region(); - // reset the current print / filament / printer selections, so that + void save_custom_color_to_config(const std::vector &colors); + std::vector get_custom_color_from_config(); + // reset the current print / filament / printer selections, so that // the PresetBundle::load_selections(const AppConfig &config) call will select // the first non-default preset when called. void reset_selections(); diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 99631c5d2..25e6f70b7 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -8,12 +8,12 @@ #include #include #include "CalibUtils.hpp" - +#include "../Utils/ColorSpaceConvert.hpp" namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SELECTED_COLOR, wxCommandEvent); -AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id) +AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id) : DPIDialog(parent, id, _L("AMS Materials Setting"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) , m_color_picker_popup(ColorPickerPopup(this)) { @@ -1392,11 +1392,22 @@ ColorPickerPopup::ColorPickerPopup(wxWindow* parent) void ColorPickerPopup::on_custom_clr_picker(wxMouseEvent& event) { + std::vector colors = wxGetApp().app_config->get_custom_color_from_config(); + for (int i = 0; i < colors.size(); i++) { + m_clrData->SetCustomColour(i, string_to_wxColor(colors[i])); + } auto clr_dialog = new wxColourDialog(nullptr, m_clrData); wxColour picker_color; if (clr_dialog->ShowModal() == wxID_OK) { m_clrData = &(clr_dialog->GetColourData()); + if (colors.size() != CUSTOM_COLOR_COUNT) { + colors.resize(CUSTOM_COLOR_COUNT); + } + for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) { + colors[i] = color_to_string(m_clrData->GetCustomColour(i)); + } + wxGetApp().app_config->save_custom_color_to_config(colors); picker_color = wxColour( m_clrData->GetColour().Red(), diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index afa5437e5..47dc78c35 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -28,6 +28,7 @@ #include "Widgets/ComboBox.hpp" #include "Widgets/TextCtrl.h" +#include "../Utils/ColorSpaceConvert.hpp" #ifdef __WXOSX__ #define wxOSX true #else @@ -1568,6 +1569,7 @@ void ColourPicker::BUILD() if (parent_is_custom_ctrl && m_opt.height < 0) opt_height = (double)temp->GetSize().GetHeight() / m_em_unit; temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + convert_to_picker_widget(temp); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); wxGetApp().UpdateDarkUI(temp->GetPickerCtrl()); @@ -1624,6 +1626,7 @@ void ColourPicker::set_value(const boost::any& value, bool change_event) boost::any& ColourPicker::get_value() { + save_colors_to_config(); auto colour = static_cast(window)->GetColour(); if (colour == wxTransparentColour) m_value = std::string(""); @@ -1663,6 +1666,44 @@ void ColourPicker::sys_color_changed() #endif } +void ColourPicker::on_button_click(wxCommandEvent &event) { +#if !defined(__linux__) && !defined(__LINUX__) + if (m_clrData) { + std::vector colors = wxGetApp().app_config->get_custom_color_from_config(); + for (int i = 0; i < colors.size(); i++) { + m_clrData->SetCustomColour(i, string_to_wxColor(colors[i])); + } + } + m_picker_widget->OnButtonClick(event); +#endif +} + +void ColourPicker::convert_to_picker_widget(wxColourPickerCtrl *widget) +{ +#if !defined(__linux__) && !defined(__LINUX__) + m_picker_widget = dynamic_cast(widget->GetPickerCtrl()); + if (m_picker_widget) { + m_picker_widget->Bind(wxEVT_BUTTON, &ColourPicker::on_button_click, this); + m_clrData = m_picker_widget->GetColourData(); + } +#endif +} + +void ColourPicker::save_colors_to_config() { +#if !defined(__linux__) && !defined(__LINUX__) + if (m_clrData) { + std::vector colors; + if (colors.size() != CUSTOM_COLOR_COUNT) { + colors.resize(CUSTOM_COLOR_COUNT); + } + for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) { + colors[i] = color_to_string(m_clrData->GetCustomColour(i)); + } + wxGetApp().app_config->save_custom_color_to_config(colors); + } +#endif +} + void PointCtrl::BUILD() { auto temp = new wxBoxSizer(wxHORIZONTAL); diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index a951c0213..eb4b15f30 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -424,6 +424,14 @@ public: void enable() override { dynamic_cast(window)->Enable(); } void disable() override{ dynamic_cast(window)->Disable(); } wxWindow* getWindow() override { return window; } + +private: + void convert_to_picker_widget(wxColourPickerCtrl *widget); + void on_button_click(wxCommandEvent &WXUNUSED(ev)); + void save_colors_to_config(); +private: + wxColourData* m_clrData{nullptr}; + wxColourPickerWidget* m_picker_widget{nullptr}; }; class PointCtrl : public Field { diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 314c27063..49410eb76 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -35,6 +35,7 @@ #include "../Utils/ASCIIFolding.hpp" #include "../Utils/FixModelByWin10.hpp" #include "../Utils/UndoRedo.hpp" +#include "../Utils/ColorSpaceConvert.hpp" #include "BitmapCache.hpp" #include "SavePresetDialog.hpp" #include "MsgDialog.hpp" @@ -625,37 +626,6 @@ bool PresetComboBox::selection_is_changed_according_to_physical_printers() return true; } -void PlaterPresetComboBox::save_custom_color_to_config(const std::vector& colors) -{ - auto set_colors = [](std::map &data, const std::vector &colors) { - for (size_t i = 0; i < colors.size(); i++) { - data[std::to_string(10 + i)] = colors[i]; //for map sort:10 begin - } - }; - if (colors.size() > 0) { - if (!wxGetApp().app_config->has_section("custom_color_list")) { - std::map data; - set_colors(data,colors); - wxGetApp().app_config->set_section("custom_color_list", data); - } else { - auto data = wxGetApp().app_config->get_section("custom_color_list"); - auto data_modify = const_cast *>(&data); - set_colors(*data_modify, colors); - wxGetApp().app_config->set_section("custom_color_list", *data_modify); - } - } -} - -std::vector PlaterPresetComboBox::get_custom_color_from_config() { - std::vector colors; - if (wxGetApp().app_config->has_section("custom_color_list")) { - auto data = wxGetApp().app_config->get_section("custom_color_list"); - for (auto iter : data) { - colors.push_back(iter.second); - } - } - return colors; -} // --------------------------------- // *** PlaterPresetComboBox *** // --------------------------------- @@ -704,21 +674,9 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset m_clrData.SetColour(clr_picker->GetBackgroundColour()); m_clrData.SetChooseFull(true); m_clrData.SetChooseAlpha(false); - auto color_to_string = [](const wxColour& color) { - std::string str = std::to_string(color.Red()) + "," + std::to_string(color.Green()) + "," + std::to_string(color.Blue()) + "," + std::to_string(color.Alpha()); - return str; - }; - auto string_to_wxColor = [](const std::string& str) { - wxColour color; - std::vector result; - boost::split(result, str, boost::is_any_of(",")); - if (result.size() == 4) { - color = wxColour(std::stoi(result[0]), std::stoi(result[1]), std::stoi(result[2]), std::stoi(result[3])); - } - return color; - }; - std::vector colors=get_custom_color_from_config(); - for (int i = 0; i < colors.size(); i++) { + + std::vector colors = wxGetApp().app_config->get_custom_color_from_config(); + for (int i = 0; i < colors.size(); i++) { m_clrData.SetCustomColour(i, string_to_wxColor(colors[i])); } wxColourDialog dialog(this, &m_clrData); @@ -726,13 +684,13 @@ PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset if ( dialog.ShowModal() == wxID_OK ) { m_clrData = dialog.GetColourData(); - const int custom_color_count = 15; - if (colors.size() != custom_color_count) { - colors.resize(custom_color_count); } - for (int i = 0; i < custom_color_count; i++) { + if (colors.size() != CUSTOM_COLOR_COUNT) { + colors.resize(CUSTOM_COLOR_COUNT); + } + for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) { colors[i] = color_to_string(m_clrData.GetCustomColour(i)); } - save_custom_color_to_config(colors); + wxGetApp().app_config->save_custom_color_to_config(colors); // get current color DynamicPrintConfig* cfg = &wxGetApp().preset_bundle->project_config; auto colors = static_cast(cfg->option("filament_colour")->clone()); diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index daf96f692..8069e687e 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -164,8 +164,6 @@ public: PlaterPresetComboBox(wxWindow *parent, Preset::Type preset_type); ~PlaterPresetComboBox(); - void save_custom_color_to_config(const std::vector &colors); - std::vector get_custom_color_from_config(); ScalableButton* edit_btn { nullptr }; // BBS diff --git a/src/slic3r/Utils/ColorSpaceConvert.cpp b/src/slic3r/Utils/ColorSpaceConvert.cpp index 2634d1c4c..b97b5ae20 100644 --- a/src/slic3r/Utils/ColorSpaceConvert.cpp +++ b/src/slic3r/Utils/ColorSpaceConvert.cpp @@ -1,8 +1,7 @@ #include "ColorSpaceConvert.hpp" #include -#include - +#include const static float param_13 = 1.0f / 3.0f; const static float param_16116 = 16.0f / 116.0f; const static float Xn = 0.950456f; @@ -234,3 +233,19 @@ float DeltaE76(float l1, float a1, float b1, float l2, float a2, float b2) return std::sqrt(std::pow((l1 - l2), 2) + std::pow((a1 - a2), 2) + std::pow((b1 - b2), 2)); } +std::string color_to_string(const wxColour &color) +{ + std::string str = std::to_string(color.Red()) + "," + std::to_string(color.Green()) + "," + std::to_string(color.Blue()) + "," + std::to_string(color.Alpha()); + return str; +} + +wxColour string_to_wxColor(const std::string &str) +{ + wxColour color; + std::vector result; + boost::split(result, str, boost::is_any_of(",")); + if (result.size() == 4) { + color = wxColour(std::stoi(result[0]), std::stoi(result[1]), std::stoi(result[2]), std::stoi(result[3])); + } + return color; +}; diff --git a/src/slic3r/Utils/ColorSpaceConvert.hpp b/src/slic3r/Utils/ColorSpaceConvert.hpp index 9c3a659a0..363720d21 100644 --- a/src/slic3r/Utils/ColorSpaceConvert.hpp +++ b/src/slic3r/Utils/ColorSpaceConvert.hpp @@ -1,5 +1,7 @@ #ifndef slic3r_Utils_ColorSpaceConvert_hpp_ #define slic3r_Utils_ColorSpaceConvert_hpp_ +#include +const int CUSTOM_COLOR_COUNT = 16; #include @@ -18,4 +20,7 @@ float DeltaE00(float l1, float a1, float b1, float l2, float a2, float b2); float DeltaE94(float l1, float a1, float b1, float l2, float a2, float b2); float DeltaE76(float l1, float a1, float b1, float l2, float a2, float b2); +class wxColour; +std::string color_to_string(const wxColour &color); +wxColour string_to_wxColor(const std::string &str); #endif /* slic3r_Utils_ColorSpaceConvert_hpp_ */