From 37bd6e432d5829a4e4fd2066f27bea8f3b9e6866 Mon Sep 17 00:00:00 2001 From: remi durand Date: Sat, 26 Jun 2021 02:13:15 +0200 Subject: [PATCH] More control over "tab/view" automatically switch. supermerill/SuperSlicer#1338 --- src/libslic3r/AppConfig.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 38 +++++++++++++++++------ src/slic3r/GUI/Preferences.cpp | 56 ++++++++++++++++++++++++++++------ src/slic3r/GUI/Preferences.hpp | 3 ++ 4 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 8172f02e9..9504b13bb 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -165,7 +165,7 @@ void AppConfig::set_defaults() set("auto_toolbar_size", "100"); if (get("auto_switch_preview").empty()) - set("auto_switch_preview", "1"); + set("auto_switch_preview", "2"); #if ENABLE_ENVIRONMENT_MAP if (get("use_environment_map").empty()) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3f01beaa6..26f930990 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3093,14 +3093,23 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool } //update tab if needed - if (invalidated != Print::ApplyStatus::APPLY_STATUS_UNCHANGED && wxGetApp().app_config->get("auto_switch_preview") == "1") + // auto_switch_preview == 0 means "no force tab change" + if (invalidated != Print::ApplyStatus::APPLY_STATUS_UNCHANGED && wxGetApp().app_config->get("auto_switch_preview") != "0") { - if (this->preview->can_display_gcode()) - main_frame->select_tab(MainFrame::ETabType::PlaterGcode, true); - else if (this->preview->can_display_volume()) - main_frame->select_tab(MainFrame::ETabType::PlaterPreview, true); - else - main_frame->select_tab(MainFrame::ETabType::Plater3D, true); + // auto_switch_preview == 3 means "force tab change only if for gcode" + if(wxGetApp().app_config->get("auto_switch_preview") == "3") + if(this->preview->can_display_gcode()) + main_frame->select_tab(MainFrame::ETabType::PlaterGcode, true); + // auto_switch_preview == 1 means "force tab change" + // auto_switch_preview == 2 (the only other one) means "force tab change only if already on a plater one" + else if (wxGetApp().app_config->get("auto_switch_preview") == "1" || main_frame->selected_tab() < MainFrame::ETabType::LastPlater) { + if (this->preview->can_display_gcode()) + main_frame->select_tab(MainFrame::ETabType::PlaterGcode, true); + else if (this->preview->can_display_volume()) + main_frame->select_tab(MainFrame::ETabType::PlaterPreview, true); + else + main_frame->select_tab(MainFrame::ETabType::Plater3D, true); + } } return return_state; } @@ -3705,8 +3714,13 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) void Plater::priv::on_slicing_completed(wxCommandEvent & evt) { + // auto_switch_preview == 0 means "no force tab change" + // auto_switch_preview == 1 means "force tab change" + // auto_switch_preview == 2 means "force tab change only if already on a plater one" + // auto_switch_preview == 3 means "force tab change only if for gcode" notification_manager->push_slicing_complete_notification(evt.GetInt(), is_sidebar_collapsed()); - if(wxGetApp().app_config->get("auto_switch_preview") == "1" && !this->preview->can_display_gcode()) + if( ( wxGetApp().app_config->get("auto_switch_preview") == "1" || (wxGetApp().app_config->get("auto_switch_preview") == "2" && main_frame->selected_tab() < MainFrame::ETabType::LastPlater) ) + && !this->preview->can_display_gcode()) main_frame->select_tab(MainFrame::ETabType::PlaterPreview); switch (this->printer_technology) { case ptFFF: @@ -3786,7 +3800,13 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) this->background_process.stop(); this->statusbar()->reset_cancel_callback(); this->statusbar()->stop_busy(); - if (wxGetApp().app_config->get("auto_switch_preview") == "1") + // auto_switch_preview == 0 means "no force tab change" + // auto_switch_preview == 1 means "force tab change" + // auto_switch_preview == 2 means "force tab change only if already on a plater one" + // auto_switch_preview == 3 means "force tab change only if for gcode" + if (wxGetApp().app_config->get("auto_switch_preview") == "1" + || (wxGetApp().app_config->get("auto_switch_preview") == "2" && main_frame->selected_tab() < MainFrame::ETabType::LastPlater) + || wxGetApp().app_config->get("auto_switch_preview") == "3") main_frame->select_tab(MainFrame::ETabType::PlaterGcode); // Reset the "export G-code path" name, so that the automatic background processing will be enabled again. diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 48a2d39ec..1a11090ac 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -58,7 +58,7 @@ void PreferencesDialog::build() m_optgroup_general->m_on_change = [this](t_config_option_key opt_key, boost::any value) { if (opt_key == "default_action_on_close_application" || opt_key == "default_action_on_select_preset") m_values[opt_key] = boost::any_cast(value) ? "none" : "discard"; - else if (opt_key == "splash_screen_editor" || opt_key == "splash_screen_gcodeviewer") + else if (std::unordered_set{ "splash_screen_editor" ,"splash_screen_gcodeviewer" ,"auto_switch_preview" }.count(opt_key) > 0) m_values[opt_key] = boost::any_cast(value); else m_values[opt_key] = boost::any_cast(value) ? "1" : "0"; @@ -93,6 +93,30 @@ void PreferencesDialog::build() option = Option(def, "background_processing"); m_optgroup_general->append_single_option_line(option); + if (is_editor) { + def_combobox_auto_switch_preview.label = L("Switch to Preview when sliced"); + def_combobox_auto_switch_preview.type = coStrings; + def_combobox_auto_switch_preview.tooltip = L("Choose an option."); + def_combobox_auto_switch_preview.gui_type = "f_enum_open"; + def_combobox_auto_switch_preview.gui_flags = "show_value"; + def_combobox_auto_switch_preview.enum_values.push_back(_u8L("Don't switch")); + def_combobox_auto_switch_preview.enum_values.push_back(_u8L("Switch when possible")); + def_combobox_auto_switch_preview.enum_values.push_back(_u8L("Only if on plater")); + def_combobox_auto_switch_preview.enum_values.push_back(_u8L("Only when GCode is ready")); + if(app_config->get("auto_switch_preview") == "0") + def_combobox_auto_switch_preview.set_default_value(new ConfigOptionStrings{ def_combobox_auto_switch_preview.enum_values[0] }); + else if (app_config->get("auto_switch_preview") == "1") + def_combobox_auto_switch_preview.set_default_value(new ConfigOptionStrings{ def_combobox_auto_switch_preview.enum_values[1] }); + else if (app_config->get("auto_switch_preview") == "2") + def_combobox_auto_switch_preview.set_default_value(new ConfigOptionStrings{ def_combobox_auto_switch_preview.enum_values[2] }); + else if (app_config->get("auto_switch_preview") == "3") + def_combobox_auto_switch_preview.set_default_value(new ConfigOptionStrings{ def_combobox_auto_switch_preview.enum_values[3] }); + else + def_combobox_auto_switch_preview.set_default_value(new ConfigOptionStrings{ def_combobox_auto_switch_preview.enum_values[2] }); + option = Option(def_combobox_auto_switch_preview, "auto_switch_preview"); + m_optgroup_general->append_single_option_line(option); + } + // Please keep in sync with ConfigWizard def.label = L("Check for application updates"); def.type = coBool; @@ -449,15 +473,6 @@ void PreferencesDialog::build() option.opt.width = 6; m_optgroup_gui->append_single_option_line(option); - if (is_editor) { - def.label = L("Switch from 3D view to Preview when sliced"); - def.type = coBool; - def.tooltip = std::string(L("When an object is sliced, it will switch your view from the 3D view to the previewx (and then gcode-preview) automatically.")); - def.set_default_value(new ConfigOptionBool{ app_config->get("auto_switch_preview") == "1" }); - option = Option(def, "auto_switch_preview"); - m_optgroup_gui->append_single_option_line(option); - } - activate_options_tab(m_optgroup_gui); if (is_editor) { @@ -528,6 +543,27 @@ void PreferencesDialog::accept() m_values.erase(it); // we shouldn't change value, if some of those parameters was selected, and then deselected } + auto it_auto_switch_preview = m_values.find("auto_switch_preview"); + if (it_auto_switch_preview != m_values.end()) { + std::vector values = def_combobox_auto_switch_preview.enum_values; + for(size_t i=0; i< values.size(); i++) + if (values[i] == it_auto_switch_preview->second) + it_auto_switch_preview->second = std::to_string(i); + } + + auto it_background_processing = m_values.find("background_processing"); + if (it_background_processing != m_values.end() && it_background_processing->second == "1") { + bool warning = app_config->get("auto_switch_preview") != "0"; + if (it_auto_switch_preview != m_values.end()) + warning = it_auto_switch_preview->second == "1"; + if(warning) { + wxMessageDialog dialog(nullptr, "Using background processing with automatic tab switching may be combersome" + ", are-you sure to keep the automatic tab switching?", _L("Are you sure?"), wxOK | wxCANCEL | wxICON_QUESTION); + if (dialog.ShowModal() == wxID_CANCEL) + m_values["auto_switch_preview"] = "0"; + } + } + for (std::map::iterator it = m_values.begin(); it != m_values.end(); ++it) app_config->set(it->first, it->second); diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index ba911f365..1fc0961e1 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -24,6 +24,9 @@ class PreferencesDialog : public DPIDialog #if ENABLE_ENVIRONMENT_MAP std::shared_ptr m_optgroup_render; #endif // ENABLE_ENVIRONMENT_MAP + + ConfigOptionDef def_combobox_auto_switch_preview; + wxSizer* m_icon_size_sizer; wxRadioBox* m_layout_mode_box; bool isOSX {false};