Completed UI for system value changes

This commit is contained in:
YuSanka 2018-03-16 17:25:11 +01:00
parent 7f5bfe3ddc
commit 7e6887cca8
5 changed files with 69 additions and 14 deletions

View file

@ -28,7 +28,7 @@ namespace Slic3r { namespace GUI {
} }
m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("bullet_white.png")), wxBITMAP_TYPE_PNG)); m_Undo_btn->SetBitmap(wxBitmap(from_u8(var("bullet_white.png")), wxBITMAP_TYPE_PNG));
m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_initial_value(); })); m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_initial_value(); }));
m_Undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ /*on_back_to_sys_value()*/; })); m_Undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent){ on_back_to_sys_value(); }));
BUILD(); BUILD();
} }
@ -53,12 +53,16 @@ namespace Slic3r { namespace GUI {
m_on_change(m_opt_id, get_value()); m_on_change(m_opt_id, get_value());
} }
void Field::on_back_to_initial_value() void Field::on_back_to_initial_value(){
{
if (m_back_to_initial_value != nullptr && m_is_modified_value) if (m_back_to_initial_value != nullptr && m_is_modified_value)
m_back_to_initial_value(m_opt_id); m_back_to_initial_value(m_opt_id);
} }
void Field::on_back_to_sys_value(){
if (m_back_to_sys_value != nullptr && m_is_nonsys_value)
m_back_to_sys_value(m_opt_id);
}
wxString Field::get_tooltip_text(const wxString& default_string) wxString Field::get_tooltip_text(const wxString& default_string)
{ {
wxString tooltip_text(""); wxString tooltip_text("");

View file

@ -52,6 +52,8 @@ protected:
void on_change_field(); void on_change_field();
/// Call the attached m_back_to_initial_value method. /// Call the attached m_back_to_initial_value method.
void on_back_to_initial_value(); void on_back_to_initial_value();
/// Call the attached m_back_to_sys_value method.
void on_back_to_sys_value();
public: public:
/// parent wx item, opportunity to refactor (probably not necessary - data duplication) /// parent wx item, opportunity to refactor (probably not necessary - data duplication)
@ -63,13 +65,14 @@ public:
/// Function object to store callback passed in from owning object. /// Function object to store callback passed in from owning object.
t_change m_on_change {nullptr}; t_change m_on_change {nullptr};
/// Function object to store callback passed in from owning object. /// Function object to store callback passed in from owning object.
t_back_to_init m_back_to_initial_value{ nullptr }; t_back_to_init m_back_to_initial_value{ nullptr };
t_back_to_init m_back_to_sys_value{ nullptr };
// This is used to avoid recursive invocation of the field change/update by wxWidgets. // This is used to avoid recursive invocation of the field change/update by wxWidgets.
bool m_disable_change_event {false}; bool m_disable_change_event {false};
bool m_is_modified_value {false}; bool m_is_modified_value {false};
bool m_is_nonsys_value; bool m_is_nonsys_value {true};
/// Copy of ConfigOption for deduction purposes /// Copy of ConfigOption for deduction purposes
const ConfigOptionDef m_opt {ConfigOptionDef()}; const ConfigOptionDef m_opt {ConfigOptionDef()};

View file

@ -82,6 +82,10 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
if (!this->m_disabled) if (!this->m_disabled)
this->back_to_initial_value(opt_id); this->back_to_initial_value(opt_id);
}; };
field->m_back_to_sys_value = [this](std::string opt_id){
if (!this->m_disabled)
this->back_to_sys_value(opt_id);
};
if (!m_is_tab_opt) { if (!m_is_tab_opt) {
field->m_Undo_btn->Hide(); field->m_Undo_btn->Hide();
field->m_Undo_to_sys_btn->Hide(); field->m_Undo_to_sys_btn->Hide();
@ -297,7 +301,20 @@ void ConfigOptionsGroup::back_to_initial_value(const std::string opt_key)
{ {
if (m_get_initial_config == nullptr) if (m_get_initial_config == nullptr)
return; return;
DynamicPrintConfig config = m_get_initial_config(); back_to_config_value(m_get_initial_config(), opt_key);
}
void ConfigOptionsGroup::back_to_sys_value(const std::string opt_key)
{
if (m_get_sys_config == nullptr)
return;
if (!have_sys_config())
return;
back_to_config_value(m_get_sys_config(), opt_key);
}
void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config, const std::string opt_key)
{
boost::any value; boost::any value;
if (opt_key == "extruders_count"){ if (opt_key == "extruders_count"){
auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("nozzle_diameter")); auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(config.option("nozzle_diameter"));
@ -345,7 +362,7 @@ boost::any ConfigOptionsGroup::config_value(std::string opt_key, int opt_index,
} }
} }
boost::any ConfigOptionsGroup::get_config_value(DynamicPrintConfig& config, std::string opt_key, int opt_index/* = -1*/) boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config, std::string opt_key, int opt_index /*= -1*/)
{ {
size_t idx = opt_index == -1 ? 0 : opt_index; size_t idx = opt_index == -1 ? 0 : opt_index;

View file

@ -79,6 +79,8 @@ public:
column_t extra_column {nullptr}; column_t extra_column {nullptr};
t_change m_on_change {nullptr}; t_change m_on_change {nullptr};
std::function<DynamicPrintConfig()> m_get_initial_config{ nullptr }; std::function<DynamicPrintConfig()> m_get_initial_config{ nullptr };
std::function<DynamicPrintConfig()> m_get_sys_config{ nullptr };
std::function<bool()> have_sys_config{ nullptr };
wxFont sidetext_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) }; wxFont sidetext_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
wxFont label_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) }; wxFont label_font {wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) };
@ -151,6 +153,7 @@ protected:
virtual void on_kill_focus (){}; virtual void on_kill_focus (){};
virtual void on_change_OG(t_config_option_key opt_id, boost::any value); virtual void on_change_OG(t_config_option_key opt_id, boost::any value);
virtual void back_to_initial_value(const std::string opt_key){}; virtual void back_to_initial_value(const std::string opt_key){};
virtual void back_to_sys_value(const std::string opt_key){};
}; };
class ConfigOptionsGroup: public OptionsGroup { class ConfigOptionsGroup: public OptionsGroup {
@ -179,11 +182,13 @@ public:
void on_change_OG(t_config_option_key opt_id, boost::any value) override; void on_change_OG(t_config_option_key opt_id, boost::any value) override;
void back_to_initial_value(const std::string opt_key) override; void back_to_initial_value(const std::string opt_key) override;
void back_to_sys_value(const std::string opt_key) override;
void back_to_config_value(const DynamicPrintConfig& config, const std::string opt_key);
void on_kill_focus() override{ reload_config();} void on_kill_focus() override{ reload_config();}
void reload_config(); void reload_config();
boost::any config_value(std::string opt_key, int opt_index, bool deserialize); boost::any config_value(std::string opt_key, int opt_index, bool deserialize);
// return option value from config // return option value from config
boost::any get_config_value(DynamicPrintConfig& config, std::string opt_key, int opt_index = -1); boost::any get_config_value(const DynamicPrintConfig& config, std::string opt_key, int opt_index = -1);
Field* get_fieldc(t_config_option_key opt_key, int opt_index); Field* get_fieldc(t_config_option_key opt_key, int opt_index);
}; };

View file

@ -97,7 +97,6 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle)
if (selected_item >= 0){ if (selected_item >= 0){
std::string selected_string = m_presets_choice->GetString(selected_item).ToUTF8().data(); std::string selected_string = m_presets_choice->GetString(selected_item).ToUTF8().data();
select_preset(selected_string); select_preset(selected_string);
update_changed_ui();
} }
})); }));
@ -247,6 +246,20 @@ void Tab::update_changed_ui()
field->m_Label->Refresh(true); field->m_Label->Refresh(true);
} }
} }
if (sys_options.empty() && !m_sys_options.empty()){
for (auto opt_key : m_config->keys()){
Field* field = get_field(opt_key);
if (field != nullptr){
field->m_Undo_to_sys_btn->SetBitmap(wxBitmap(from_u8(var(m_nonsys_btn_icon)), wxBITMAP_TYPE_PNG));
field->m_is_nonsys_value = false;
if (field->m_Label != nullptr){
field->m_Label->SetForegroundColour(wxSYS_COLOUR_WINDOWTEXT);
field->m_Label->Refresh(true);
}
}
}
m_sys_options.resize(0);
}
// Delete clear options from m_dirty_options // Delete clear options from m_dirty_options
for (auto i = 0; i < m_sys_options.size(); ++i) for (auto i = 0; i < m_sys_options.size(); ++i)
{ {
@ -646,9 +659,11 @@ void TabPrint::update()
{ {
Freeze(); Freeze();
double fill_density = m_config->option<ConfigOptionPercent>("fill_density")->value;
if (m_config->opt_bool("spiral_vase") && if (m_config->opt_bool("spiral_vase") &&
!(m_config->opt_int("perimeters") == 1 && m_config->opt_int("top_solid_layers") == 0 && !(m_config->opt_int("perimeters") == 1 && m_config->opt_int("top_solid_layers") == 0 &&
m_config->option<ConfigOptionPercent>("fill_density")->value == 0)) { fill_density == 0)) {
wxString msg_text = _(L("The Spiral Vase mode requires:\n" wxString msg_text = _(L("The Spiral Vase mode requires:\n"
"- one perimeter\n" "- one perimeter\n"
"- no top solid layers\n" "- no top solid layers\n"
@ -665,11 +680,13 @@ void TabPrint::update()
new_conf.set_key_value("support_material", new ConfigOptionBool(false)); new_conf.set_key_value("support_material", new ConfigOptionBool(false));
new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0)); new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0));
new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false)); new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false));
fill_density = 0;
} }
else { else {
new_conf.set_key_value("spiral_vase", new ConfigOptionBool(false)); new_conf.set_key_value("spiral_vase", new ConfigOptionBool(false));
} }
load_config(new_conf); load_config(new_conf);
on_value_change("fill_density", fill_density);
} }
auto first_layer_height = m_config->option<ConfigOptionFloatOrPercent>("first_layer_height")->value; auto first_layer_height = m_config->option<ConfigOptionFloatOrPercent>("first_layer_height")->value;
@ -783,7 +800,6 @@ void TabPrint::update()
"\nShall I switch to rectilinear fill pattern?")); "\nShall I switch to rectilinear fill pattern?"));
auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Infill")), wxICON_WARNING | wxYES | wxNO); auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Infill")), wxICON_WARNING | wxYES | wxNO);
DynamicPrintConfig new_conf = *m_config; DynamicPrintConfig new_conf = *m_config;
double fill_density;
if (dialog->ShowModal() == wxID_YES) { if (dialog->ShowModal() == wxID_YES) {
new_conf.set_key_value("fill_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear)); new_conf.set_key_value("fill_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
fill_density = 100; fill_density = 100;
@ -1464,15 +1480,16 @@ void TabPrinter::update(){
void Tab::load_current_preset() void Tab::load_current_preset()
{ {
auto preset = m_presets->get_edited_preset(); auto preset = m_presets->get_edited_preset();
m_nonsys_btn_icon = m_presets->get_selected_preset_parent() == nullptr ?
"bullet_white.png" :
wxMSW ? "sys_unlock.png" : "lock_open.png";
preset.is_default ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true); preset.is_default ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true);
update(); update();
// For the printer profile, generate the extruder pages. // For the printer profile, generate the extruder pages.
on_preset_loaded(); on_preset_loaded();
// Reload preset pages with the new configuration values. // Reload preset pages with the new configuration values.
reload_config(); reload_config();
m_nonsys_btn_icon = m_presets->get_selected_preset_parent() == nullptr ?
"bullet_white.png" :
wxMSW ? "sys_unlock.png" : "lock_open.png";
// use CallAfter because some field triggers schedule on_change calls using CallAfter, // use CallAfter because some field triggers schedule on_change calls using CallAfter,
// and we don't want them to be called after this update_dirty() as they would mark the // and we don't want them to be called after this update_dirty() as they would mark the
@ -1888,6 +1905,15 @@ ConfigOptionsGroupShp Page::new_optgroup(wxString title, int noncommon_label_wid
return config; return config;
}; };
optgroup->m_get_sys_config = [this](){
DynamicPrintConfig config = static_cast<Tab*>(GetParent())->m_presets->get_selected_preset_parent()->config;
return config;
};
optgroup->have_sys_config = [this](){
return static_cast<Tab*>(GetParent())->m_presets->get_selected_preset_parent() != nullptr;
};
optgroup->nonsys_btn_icon = static_cast<Tab*>(GetParent())->m_nonsys_btn_icon; optgroup->nonsys_btn_icon = static_cast<Tab*>(GetParent())->m_nonsys_btn_icon;
vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10); vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);