diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index a43551d73..c9219212c 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -31,6 +31,41 @@ namespace Slic3r { namespace GUI { return std::regex_match(string, regex_pattern); } + boost::any Field::get_value_by_opt_type(wxString str, ConfigOptionType type) + { + boost::any ret_val; + switch (m_opt.type){ + case coInt: + case coPercent: + if (m_opt.type == coPercent) str.RemoveLast(); + ret_val = wxAtoi(str); + break; + case coPercents: + case coFloats: + case coFloat:{ + double val; + str.ToCDouble(&val); + ret_val = val; + break; } + case coString: + case coStrings: + ret_val = str.ToStdString(); + break; + case coFloatOrPercent:{ + if (str.Last() == '%') + str.RemoveLast(); + double val; + str.ToCDouble(&val); + ret_val = val; + break; + } + default: + break; + } + + return ret_val; + } + void TextCtrl::BUILD() { auto size = wxSize(wxDefaultSize); if (m_opt.height >= 0) size.SetHeight(m_opt.height); @@ -107,10 +142,17 @@ namespace Slic3r { namespace GUI { // recast as a wxWindow to fit the calling convention window = dynamic_cast<wxWindow*>(temp); + } - } + boost::any TextCtrl::get_value() + { + wxString ret_str = static_cast<wxTextCtrl*>(window)->GetValue(); + boost::any ret_val = get_value_by_opt_type(ret_str, m_opt.type); - void TextCtrl::enable() { dynamic_cast<wxTextCtrl*>(window)->Enable(); dynamic_cast<wxTextCtrl*>(window)->SetEditable(true); } + return ret_val; + } + + void TextCtrl::enable() { dynamic_cast<wxTextCtrl*>(window)->Enable(); dynamic_cast<wxTextCtrl*>(window)->SetEditable(true); } void TextCtrl::disable() { dynamic_cast<wxTextCtrl*>(window)->Disable(); dynamic_cast<wxTextCtrl*>(window)->SetEditable(false); } void TextCtrl::set_tooltip(const wxString& tip) { } @@ -260,21 +302,6 @@ void Choice::set_selection() dynamic_cast<wxComboBox*>(window)->SetSelection(idx); break; } -// case coString:{ -// text_value = static_cast<const ConfigOptionString*>(opt.default_value)->value; -// -// auto idx = 0; -// for (auto el : opt.enum_values) -// { -// if (el.compare(text_value) == 0) -// break; -// ++idx; -// } -// idx == opt.enum_values.size() ? -// dynamic_cast<wxComboBox*>(window)->SetValue(text_value) : -// dynamic_cast<wxComboBox*>(window)->SetSelection(idx); -// break; -// } case coStrings:{ text_value = static_cast<const ConfigOptionStrings*>(m_opt.default_value)->values.at(0); @@ -361,6 +388,18 @@ void Choice::set_values(const std::vector<std::string> values) m_disable_change_event = false; } +boost::any Choice::get_value() +{ + boost::any ret_val; + wxString ret_str = static_cast<wxComboBox*>(window)->GetValue(); + + ret_val = m_opt.type == coEnum ? + static_cast<wxComboBox*>(window)->GetSelection() : + get_value_by_opt_type(ret_str, m_opt.type); + + return ret_val; +} + void ColourPicker::BUILD() { auto size = wxSize(wxDefaultSize); diff --git a/xs/src/slic3r/GUI/Field.hpp b/xs/src/slic3r/GUI/Field.hpp index bd7f3efff..71e31a015 100644 --- a/xs/src/slic3r/GUI/Field.hpp +++ b/xs/src/slic3r/GUI/Field.hpp @@ -80,6 +80,7 @@ public: virtual wxWindow* getWindow() { return nullptr; } bool is_matched(std::string string, std::string pattern); + boost::any get_value_by_opt_type(wxString str, ConfigOptionType type); /// Factory method for generating new derived classes. template<class T> @@ -110,19 +111,19 @@ public: void BUILD(); wxWindow* window {nullptr}; - virtual void set_value(std::string value) { + virtual void set_value(std::string value) { dynamic_cast<wxTextCtrl*>(window)->SetValue(wxString(value)); } - virtual void set_value(boost::any value) { + virtual void set_value(boost::any value) { dynamic_cast<wxTextCtrl*>(window)->SetValue(boost::any_cast<wxString>(value)); } - boost::any get_value() override { return boost::any(dynamic_cast<wxTextCtrl*>(window)->GetValue()); } + boost::any get_value() override; - virtual void enable(); - virtual void disable(); + virtual void enable(); + virtual void disable(); virtual wxWindow* getWindow() { return window; } - void set_tooltip(const wxString& tip); + void set_tooltip(const wxString& tip); }; @@ -191,9 +192,7 @@ public: void set_value(const std::string value); void set_value(boost::any value); void set_values(const std::vector<std::string> values); - boost::any get_value() override { - return boost::any(dynamic_cast<wxComboBox*>(window)->GetValue()); - } + boost::any get_value() override; void enable() override { dynamic_cast<wxComboBox*>(window)->Enable(); }; void disable() override{ dynamic_cast<wxComboBox*>(window)->Disable(); }; @@ -210,14 +209,13 @@ public: wxWindow* window{ nullptr }; void BUILD() override; -// void set_selection(); void set_value(const std::string value) { dynamic_cast<wxColourPickerCtrl*>(window)->SetColour(value); } void set_value(boost::any value) { dynamic_cast<wxColourPickerCtrl*>(window)->SetColour(boost::any_cast<std::string>(value)); } -// void set_values(const std::vector<std::string> values); + boost::any get_value() override { return boost::any(dynamic_cast<wxColourPickerCtrl*>(window)->GetColour()); } diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 73f1433a5..9aee0d1bd 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -196,27 +196,36 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b { try{ switch (config.def()->get(opt_key)->type){ - case coFloatOrPercent: + case coFloatOrPercent:{ + const auto &val = *config.option<ConfigOptionFloatOrPercent>(opt_key); + config.set_key_value(opt_key, new ConfigOptionFloatOrPercent(boost::any_cast</*ConfigOptionFloatOrPercent*/double>(value), val.percent)); + break;} case coPercent: - case coFloat: - { + config.set_key_value(opt_key, new ConfigOptionPercent(boost::any_cast</*ConfigOptionPercent*/double>(value))); + break; + case coFloat:{ double& val = config.opt_float(opt_key); val = boost::any_cast<double>(value); break; } - // case coPercents: - // case coFloats: + case coPercents: + case coFloats:{ + double& val = config.opt_float(opt_key, 0); + val = boost::any_cast<double>(value); + break; + } case coString: - // opt = new ConfigOptionString(config.opt_string(opt_key)); + config.set_key_value(opt_key, new ConfigOptionString(boost::any_cast<std::string>(value))); break; case coStrings: break; case coBool: config.set_key_value(opt_key, new ConfigOptionBool(boost::any_cast<bool>(value))); break; - case coBools: - // opt = new ConfigOptionBools(0, config.opt_bool(opt_key)); //! 0? - break; + case coBools:{ + ConfigOptionBools* vec_new = new ConfigOptionBools{ boost::any_cast<bool>(value) }; + config.option<ConfigOptionBools>(opt_key)->set_at(vec_new, 0, 0); + break;} case coInt: config.set_key_value(opt_key, new ConfigOptionInt(boost::any_cast<int>(value))); break; @@ -234,7 +243,7 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b } catch (const std::exception &e) { - + int i = 0;//no reason, just experiment } catch (...) { diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index d5a98a121..241795871 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -231,7 +231,9 @@ void ConfigOptionsGroup::on_change_OG(t_config_option_key opt_id, boost::any val } else { if (opt_index == -1) { - change_opt_value(*m_config, opt_key, field_value); + // change_opt_value(*m_config, opt_key, field_value); + //!? why field_value?? in this case changed value will be lose! No? + change_opt_value(*m_config, opt_key, value); } else { // auto value = m_config->get($opt_key); diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 0444bf3f1..b34dc65c8 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -150,7 +150,11 @@ void Tab::load_config(DynamicPrintConfig config) for(auto opt_key : m_config.diff(config)) { switch ( config.def()->get(opt_key)->type ){ case coFloatOrPercent: + change_opt_value(m_config, opt_key, config.option<ConfigOptionFloatOrPercent>(opt_key)->value); + break; case coPercent: + change_opt_value(m_config, opt_key, config.option<ConfigOptionPercent>(opt_key)->value); + break; case coFloat: change_opt_value(m_config, opt_key, config.opt_float(opt_key)); break; @@ -422,7 +426,8 @@ void TabPrint::update() Freeze(); if ( m_config.opt_bool("spiral_vase") && - !(m_config.opt_int("perimeters") == 1 && m_config.opt_int("top_solid_layers") == 0 && m_config.opt_float("fill_density") == 0)) { + !(m_config.opt_int("perimeters") == 1 && m_config.opt_int("top_solid_layers") == 0 && /*m_config.opt_float("fill_density") == 0*/ + m_config.option<ConfigOptionPercent>("fill_density")->value == 0)) { std::string msg_text = "The Spiral Vase mode requires:\n" "- one perimeter\n" "- no top solid layers\n"