diff --git a/src/libslic3r/MultipleBeds.cpp b/src/libslic3r/MultipleBeds.cpp index 2c31b449df..77ccfbf959 100644 --- a/src/libslic3r/MultipleBeds.cpp +++ b/src/libslic3r/MultipleBeds.cpp @@ -416,14 +416,15 @@ void MultipleBeds::start_autoslice(std::function select_bed_fn) -void MultipleBeds::stop_autoslice(bool restore_original) +bool MultipleBeds::stop_autoslice(bool restore_original) { if (! is_autoslicing()) - return; + return false; m_autoslicing = false; if (restore_original) m_select_bed_fn(m_autoslicing_original_bed, false); + return true; } diff --git a/src/libslic3r/MultipleBeds.hpp b/src/libslic3r/MultipleBeds.hpp index a31bb91cd2..92994f645e 100644 --- a/src/libslic3r/MultipleBeds.hpp +++ b/src/libslic3r/MultipleBeds.hpp @@ -75,7 +75,7 @@ public: void ensure_wipe_towers_on_beds(Model& model, const std::vector>& prints); void start_autoslice(std::function); - void stop_autoslice(bool restore_original); + bool stop_autoslice(bool restore_original); bool is_autoslicing() const { return m_autoslicing; } void autoslice_next_bed(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9b962d8a94..a39ed13e39 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -143,8 +143,10 @@ void GLCanvas3D::select_bed(int i, bool triggered_by_user) } wxGetApp().plater()->schedule_background_process(); wxGetApp().plater()->object_list_changed(); // Updates Slice Now / Export buttons. - if (s_multiple_beds.is_autoslicing() && triggered_by_user) + if (s_multiple_beds.is_autoslicing() && triggered_by_user) { s_multiple_beds.stop_autoslice(false); + wxGetApp().sidebar().switch_from_autoslicing_mode(); + } }); } @@ -6716,8 +6718,10 @@ void Slic3r::GUI::GLCanvas3D::_render_bed_selector() ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2()); if (imgui.image_button(ImGui::SliceAllBtnIcon, "Slice All")) { - if (!s_multiple_beds.is_autoslicing()) + if (!s_multiple_beds.is_autoslicing()) { s_multiple_beds.start_autoslice([this](int i, bool user) { this->select_bed(i, user); }); + wxGetApp().sidebar().switch_to_autoslicing_mode(); + } } ImGui::SameLine(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3a0cee5b03..cb9302c5e3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2314,6 +2314,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool notification_manager->set_slicing_progress_hidden(); } + if ((invalidated != Print::APPLY_STATUS_UNCHANGED || force_validation) && ! background_process.empty()) { // The delayed error message is no more valid. delayed_error_message.clear(); @@ -2970,11 +2971,13 @@ void Plater::priv::set_current_panel(wxPanel* panel) #endif // __WXMAC__ ScopeGuard guard([]() { s_reload_preview_after_switching_beds = false; }); + if (current_panel == panel) { if (! s_reload_preview_after_switching_beds) return; - else + else { update_background_process(); + } } wxPanel* old_panel = current_panel; @@ -3004,7 +3007,10 @@ void Plater::priv::set_current_panel(wxPanel* panel) if (current_panel == view3D) { - s_multiple_beds.stop_autoslice(true); + if(s_multiple_beds.stop_autoslice(true)) { + sidebar->switch_from_autoslicing_mode(); + update_background_process(); + } if (old_panel == preview) preview->get_canvas3d()->unbind_event_handlers(); diff --git a/src/slic3r/GUI/Sidebar.cpp b/src/slic3r/GUI/Sidebar.cpp index 28372dce05..86f5a5e855 100644 --- a/src/slic3r/GUI/Sidebar.cpp +++ b/src/slic3r/GUI/Sidebar.cpp @@ -500,20 +500,20 @@ Sidebar::Sidebar(Plater *parent) enable_buttons(false); - auto *btns_sizer = new wxBoxSizer(wxVERTICAL); + m_btns_sizer = new wxBoxSizer(wxVERTICAL); - auto* complect_btns_sizer = new wxBoxSizer(wxHORIZONTAL); + auto *complect_btns_sizer = new wxBoxSizer(wxHORIZONTAL); complect_btns_sizer->Add(m_btn_export_gcode, 1, wxEXPAND); complect_btns_sizer->Add(m_btn_connect_gcode, 1, wxEXPAND | wxLEFT, margin_5); complect_btns_sizer->Add(m_btn_send_gcode, 0, wxLEFT, margin_5); complect_btns_sizer->Add(m_btn_export_gcode_removable, 0, wxLEFT, margin_5); - btns_sizer->Add(m_btn_reslice, 0, wxEXPAND | wxTOP, margin_5); - btns_sizer->Add(complect_btns_sizer, 0, wxEXPAND | wxTOP, margin_5); + m_btns_sizer->Add(m_btn_reslice, 0, wxEXPAND | wxTOP, margin_5); + m_btns_sizer->Add(complect_btns_sizer, 0, wxEXPAND | wxTOP, margin_5); auto *sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(m_scrolled_panel, 1, wxEXPAND); - sizer->Add(btns_sizer, 0, wxEXPAND | wxLEFT | wxBOTTOM + sizer->Add(m_btns_sizer, 0, wxEXPAND | wxLEFT | wxBOTTOM #ifndef _WIN32 | wxRIGHT #endif // __linux__ @@ -856,11 +856,17 @@ void Sidebar::show_info_sizer() const int obj_idx = selection.get_object_idx(); const int inst_idx = selection.get_instance_idx(); - if (m_mode < comExpert || objects.empty() || obj_idx < 0 || int(objects.size()) <= obj_idx || - inst_idx < 0 || int(objects[obj_idx]->instances.size()) <= inst_idx || - objects[obj_idx]->volumes.empty() || // hack to avoid crash when deleting the last object on the bed - (selection.is_single_full_object() && objects[obj_idx]->instances.size()> 1) || - !(selection.is_single_full_instance() || selection.is_single_volume())) { + if ( + m_mode < comExpert + || objects.empty() + || obj_idx < 0 + || int(objects.size()) <= obj_idx + || inst_idx < 0 + || int(objects[obj_idx]->instances.size()) <= inst_idx + || objects[obj_idx]->volumes.empty() // hack to avoid crash when deleting the last object on the bed + || (selection.is_single_full_object() && objects[obj_idx]->instances.size()> 1) + || !(selection.is_single_full_instance() || selection.is_single_volume()) + ) { m_object_info->Show(false); return; } @@ -1065,6 +1071,10 @@ void Sidebar::update_sliced_info_sizer() void Sidebar::show_sliced_info_sizer(const bool show) { + if (m_autoslicing_mode) { + return; + } + wxWindowUpdateLocker freeze_guard(this); m_sliced_info->Show(show); @@ -1075,6 +1085,19 @@ void Sidebar::show_sliced_info_sizer(const bool show) m_scrolled_panel->Refresh(); } +void Sidebar::show_btns_sizer(const bool show) +{ + if (m_autoslicing_mode) { + return; + } + + wxWindowUpdateLocker freeze_guard(this); + m_btns_sizer->Show(show); + + Layout(); + m_scrolled_panel->Refresh(); +} + void Sidebar::enable_buttons(bool enable) { m_btn_reslice->Enable(enable); @@ -1084,11 +1107,50 @@ void Sidebar::enable_buttons(bool enable) m_btn_connect_gcode->Enable(enable); } -bool Sidebar::show_reslice(bool show) const { return m_btn_reslice->Show(show); } -bool Sidebar::show_export(bool show) const { return m_btn_export_gcode->Show(show); } -bool Sidebar::show_send(bool show) const { return m_btn_send_gcode->Show(show); } -bool Sidebar::show_export_removable(bool show) const { return m_btn_export_gcode_removable->Show(show); } -bool Sidebar::show_connect(bool show) const { return m_btn_connect_gcode->Show(show); } +bool Sidebar::show_reslice(bool show) const { + if (this->m_autoslicing_mode) { + return false; + } + return m_btn_reslice->Show(show); +} +bool Sidebar::show_export(bool show) const { + if (this->m_autoslicing_mode) { + return false; + } + return m_btn_export_gcode->Show(show); +} +bool Sidebar::show_send(bool show) const { + if (this->m_autoslicing_mode) { + return false; + } + return m_btn_send_gcode->Show(show); +} +bool Sidebar::show_export_removable(bool show) const { + if (this->m_autoslicing_mode) { + return false; + } + return m_btn_export_gcode_removable->Show(show); +} +bool Sidebar::show_connect(bool show) const { + if (this->m_autoslicing_mode) { + return false; + } + return m_btn_connect_gcode->Show(show); +} + +void Sidebar::switch_to_autoslicing_mode() { + this->show_sliced_info_sizer(false); + this->show_btns_sizer(false); + this->m_autoslicing_mode = true; +} + +void Sidebar::switch_from_autoslicing_mode() { + if (!this->m_autoslicing_mode) { + return; + } + this->m_autoslicing_mode = false; + this->show_sliced_info_sizer(true); +} void Sidebar::update_mode() diff --git a/src/slic3r/GUI/Sidebar.hpp b/src/slic3r/GUI/Sidebar.hpp index 31acbe0a96..0f53abf5b7 100644 --- a/src/slic3r/GUI/Sidebar.hpp +++ b/src/slic3r/GUI/Sidebar.hpp @@ -75,6 +75,7 @@ class Sidebar : public wxPanel ObjectList* m_object_list { nullptr }; ObjectInfo* m_object_info { nullptr }; SlicedInfo* m_sliced_info { nullptr }; + wxBoxSizer* m_btns_sizer { nullptr }; wxButton* m_btn_export_gcode { nullptr }; wxButton* m_btn_reslice { nullptr }; @@ -87,6 +88,7 @@ class Sidebar : public wxPanel std::unique_ptr m_object_settings; std::unique_ptr m_object_layers; + bool m_autoslicing_mode{ false }; #ifdef _WIN32 wxString m_reslice_btn_tooltip; #endif @@ -117,6 +119,8 @@ public: void show_info_sizer(); void show_sliced_info_sizer(const bool show); + void show_btns_sizer(const bool show); + void update_sliced_info_sizer(); void enable_buttons(bool enable); @@ -127,6 +131,9 @@ public: bool show_export_removable(bool show) const; bool show_connect(bool show) const; + void switch_to_autoslicing_mode(); + void switch_from_autoslicing_mode(); + void collapse(bool collapse); void set_extruders_count(size_t extruders_count);