From eaafb74c23eae021609eb7a74276f2abc5d41094 Mon Sep 17 00:00:00 2001 From: remi durand Date: Tue, 30 Mar 2021 17:06:24 +0200 Subject: [PATCH] #1020 a less hacky solution for tabbed view, to make them work on linux --- src/slic3r/GUI/GLCanvas3D.cpp | 8 ++-- src/slic3r/GUI/GLCanvas3D.hpp | 4 +- src/slic3r/GUI/GUI_Preview.cpp | 16 ++++++++ src/slic3r/GUI/GUI_Preview.hpp | 4 ++ src/slic3r/GUI/MainFrame.cpp | 68 ++++++++++++++++++++++++++-------- src/slic3r/GUI/Plater.cpp | 24 +++++++++++- src/slic3r/GUI/Plater.hpp | 4 +- 7 files changed, 103 insertions(+), 25 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2a115c1fd..f0b86598f 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1292,9 +1292,9 @@ void GLCanvas3D::set_as_dirty() m_dirty = true; } -void GLCanvas3D::set_items_show(bool show_volumes, bool show_gcode) +void GLCanvas3D::set_items_show(bool show_objects, bool show_gcode) { - m_show_volume = show_volumes; + m_show_objects = show_objects; m_show_gcode = show_gcode; } @@ -1667,7 +1667,7 @@ void GLCanvas3D::render() // draw scene glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); _render_background(); - if(m_show_volume) + if(m_show_objects) _render_objects(); if (m_show_gcode && !m_main_toolbar.is_enabled()) _render_gcode(); @@ -5762,8 +5762,8 @@ void GLCanvas3D::_load_print_toolpaths() GLVolume &vol = *volume; volume = m_volumes.new_toolpath_volume(vol.color); reserve_new_volume_finalize_old_volume(*volume, vol, m_initialized); + } } -} volume->indexed_vertex_array.finalize_geometry(m_initialized); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 545e05e20..d26a6c459 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -457,7 +457,7 @@ private: int m_extra_frame_requested_delayed { std::numeric_limits::max() }; bool m_event_handlers_bound{ false }; - bool m_show_volume = true;; + bool m_show_objects = true; mutable GLVolumeCollection m_volumes; bool m_show_gcode = true; GCodeViewer m_gcode_viewer; @@ -554,7 +554,7 @@ public: void post_event(wxEvent &&event); void set_as_dirty(); - void set_items_show(bool show_volumes, bool show_gcode); + void set_items_show(bool show_objects, bool show_gcode); unsigned int get_volumes_count() const; const GLVolumeCollection& get_volumes() const { return m_volumes; } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 797b2ff77..4e874a1b2 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -496,6 +496,22 @@ void Preview::hide_layers_slider() Layout(); } +bool Preview::can_display_gcode() +{ + return !m_gcode_result->moves.empty(); +} + +bool Preview::can_display_volume() +{ + const Print* print = m_canvas->fff_print(); + if (print == nullptr) + return false; + + if (!print->is_step_done(psSkirt) || !print->is_step_done(psBrim)) + return false; + return true; +} + void Preview::on_size(wxSizeEvent& evt) { evt.Skip(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 436ece776..eeae2d243 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -179,6 +179,7 @@ Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSl void reload_print(bool keep_volumes = false); void refresh_print(); void set_force_state(ForceState new_force_state = ForceState::NoForce) { current_force_state = new_force_state; } + ForceState get_force_state() { return current_force_state; } void msw_rescale(); void jump_layers_slider(wxKeyEvent& evt); @@ -199,6 +200,9 @@ Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSl #endif // ENABLE_ARROW_KEYS_WITH_SLIDERS void hide_layers_slider(); + bool can_display_gcode(); + bool can_display_volume(); + private: ForceState current_force_state = ForceState::NoForce; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index a7d641bf4..396c364bb 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -263,17 +263,24 @@ void MainFrame::update_layout() // On Linux m_plater needs to be removed from m_tabpanel before to reparent it int plater_page_id = m_tabpanel->FindPage(m_plater); - while (plater_page_id != wxNOT_FOUND) { + if (plater_page_id != wxNOT_FOUND) m_tabpanel->RemovePage(plater_page_id); - plater_page_id = m_tabpanel->FindPage(m_plater); - } + + for (int i = 0; i < m_tabpanel->GetPageCount(); i++) + if (m_tabpanel->GetPage(i)->GetChildren().size() == 1 && m_tabpanel->GetPage(i)->GetChildren().front() == m_plater) + m_tabpanel->GetPage(i)->GetSizer()->Clear(); + + if (m_plater->GetParent() != this) + m_plater->Reparent(this); + + while(m_tabpanel->GetPage(0)->GetChildren().size() == 0) + m_tabpanel->DeletePage(0); + for (int i = 0; i < m_tabpanel->GetPageCount(); i++) { m_tabpanel->SetPageImage(i, -1); } m_tabpanel->SetImageList(nullptr); //clear - if (m_plater->GetParent() != this) - m_plater->Reparent(this); if (m_tabpanel->GetParent() != this) m_tabpanel->Reparent(this); @@ -293,7 +300,8 @@ void MainFrame::update_layout() m_tabpanel->Hide(); m_plater->Hide(); m_plater->enable_view_toolbar(true); - m_plater->force_preview(Preview::ForceState::NoForce); + m_plater->set_force_preview(Preview::ForceState::NoForce); + m_plater->process_done_callback([this](int) {}); Layout(); }; @@ -343,7 +351,18 @@ void MainFrame::update_layout() { // don't use view_toolbar here m_plater->enable_view_toolbar(false); - m_plater->Reparent(m_tabpanel); + m_plater->process_done_callback([this](int process_state) { + //note: this won't call wxEVT_NOTEBOOK_PAGE_CHANGED and it's intended as the process_done caller will update the panel itself. + if (m_tabpanel->GetSelection() != process_state && m_tabpanel->GetSelection() < 3) + { + //m_plater->Hide(); + m_tabpanel->GetCurrentPage()->GetSizer()->Clear(); + m_plater->Reparent(m_tabpanel->GetPage(process_state)); + m_tabpanel->GetPage(process_state)->GetSizer()->Add(m_plater, 1, wxEXPAND); + m_tabpanel->SetSelection(process_state); + m_plater->Show(); + } + }); // icons for ESettingsLayout::Old wxImageList* img_list = nullptr; for (std::string icon_name : {"editor_menu", "layers", "preview_menu", "cog"}) { @@ -353,15 +372,20 @@ void MainFrame::update_layout() img_list->Add(bmp); } m_tabpanel->AssignImageList(img_list); - m_tabpanel->InsertPage(0, m_plater, _L("3D view")); - m_tabpanel->InsertPage(1, m_plater, _L("Sliced preview")); - m_tabpanel->InsertPage(2, m_plater, _L("Gcode preview")); + m_tabpanel->InsertPage(0, new wxPanel(m_tabpanel), _L("3D view")); + m_tabpanel->InsertPage(1, new wxPanel(m_tabpanel), _L("Sliced preview")); + m_tabpanel->InsertPage(2, new wxPanel(m_tabpanel), _L("Gcode preview")); + m_tabpanel->GetPage(0)->SetSizer(new wxBoxSizer(wxVERTICAL)); + m_tabpanel->GetPage(1)->SetSizer(new wxBoxSizer(wxVERTICAL)); + m_tabpanel->GetPage(2)->SetSizer(new wxBoxSizer(wxVERTICAL)); m_tabpanel->SetPageImage(0, 0); m_tabpanel->SetPageImage(1, 1); m_tabpanel->SetPageImage(2, 2); m_tabpanel->SetPageImage(3, 3); m_tabpanel->SetPageImage(4, 3); m_tabpanel->SetPageImage(5, 3); + m_plater->Reparent(m_tabpanel->GetPage(0)); + m_tabpanel->GetPage(0)->GetSizer()->Add(m_plater, 1, wxEXPAND); m_main_sizer->Add(m_tabpanel, 1, wxEXPAND); m_plater->Show(); m_tabpanel->Show(); @@ -585,18 +609,30 @@ void MainFrame::init_tabpanel() m_last_selected_tab = m_tabpanel->GetSelection(); } else if (this->m_layout == ESettingsLayout::Old) { + //m_plater->Hide(); + for(int i=0;i<3;i++) + m_tabpanel->GetPage(i)->GetSizer()->Clear(); + m_plater->Reparent(m_tabpanel->GetCurrentPage()); if (m_tabpanel->GetSelection() == 0) this->m_plater->select_view_3D("3D"); else if (m_tabpanel->GetSelection() == 1) { - this->m_plater->force_preview(Preview::ForceState::ForceExtrusions); - this->m_plater->select_view_3D("Preview"); - this->m_plater->refresh_print(); + if (this->m_plater->get_force_preview() != Preview::ForceState::ForceExtrusions) { + this->m_plater->set_force_preview(Preview::ForceState::ForceExtrusions); + this->m_plater->select_view_3D("Preview"); + this->m_plater->refresh_print(); + }else + this->m_plater->select_view_3D("Preview"); } else if (m_tabpanel->GetSelection() == 2) { - this->m_plater->force_preview(Preview::ForceState::ForceGcode); - this->m_plater->select_view_3D("Preview"); - this->m_plater->refresh_print(); + if (this->m_plater->get_force_preview() != Preview::ForceState::ForceGcode) { + this->m_plater->set_force_preview(Preview::ForceState::ForceGcode); + this->m_plater->select_view_3D("Preview"); + this->m_plater->refresh_print(); + }else + this->m_plater->select_view_3D("Preview"); } + m_tabpanel->GetCurrentPage()->GetSizer()->Add(m_plater, 1, wxEXPAND); + m_plater->Show(); }else select_tab(size_t(0)); // select Plater }); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ce92e04a6..b54f6548a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -799,7 +799,6 @@ Sidebar::Sidebar(Plater *parent) p->plater->export_gcode(true); else p->plater->reslice(); - p->plater->select_view_3D("Preview"); }); p->btn_send_gcode->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->send_gcode(); }); // p->btn_eject_device->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->eject_drive(); }); @@ -1651,6 +1650,7 @@ struct Plater::priv BackgroundSlicingProcess background_process; bool suppressed_backround_processing_update { false }; + std::function process_done_callback = [](int) {}; // Jobs defined inside the group class will be managed so that only one can // run at a time. Also, the background process will be stopped if a job is @@ -3094,6 +3094,16 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool show_action_buttons(true); } + //update tab if needed + if (invalidated != Print::ApplyStatus::APPLY_STATUS_UNCHANGED && process_done_callback) + { + if (this->preview->can_display_gcode()) + process_done_callback(2); + else if (this->preview->can_display_volume()) + process_done_callback(1); + else + process_done_callback(0); + } return return_state; } @@ -3698,6 +3708,7 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt) void Plater::priv::on_slicing_completed(wxCommandEvent & evt) { notification_manager->push_slicing_complete_notification(evt.GetInt(), is_sidebar_collapsed()); + process_done_callback(1); switch (this->printer_technology) { case ptFFF: this->update_fff_scene(); @@ -3777,6 +3788,7 @@ void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt) this->background_process.stop(); this->statusbar()->reset_cancel_callback(); this->statusbar()->stop_busy(); + process_done_callback(2); // Reset the "export G-code path" name, so that the automatic background processing will be enabled again. this->background_process.reset_export(); @@ -5217,11 +5229,19 @@ void Plater::select_view(const std::string& direction) { p->select_view(directio void Plater::select_view_3D(const std::string& name) { p->select_view_3D(name); } -void Plater::force_preview(Preview::ForceState force) { +void Plater::set_force_preview(Preview::ForceState force) { if (p->preview) p->preview->set_force_state(force); } +Preview::ForceState Plater::get_force_preview() { + return p->preview->get_force_state(); +} + +void Plater::process_done_callback(std::function process_done_callback) { + p->process_done_callback = process_done_callback; +} + bool Plater::is_preview_shown() const { return p->is_preview_shown(); } bool Plater::is_preview_loaded() const { return p->is_preview_loaded(); } bool Plater::is_view3D_shown() const { return p->is_view3D_shown(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 398c993e9..6949f89fb 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -167,7 +167,9 @@ public: void stop_jobs(); void select_view(const std::string& direction); void select_view_3D(const std::string& name); - void force_preview(Preview::ForceState force); + void set_force_preview(Preview::ForceState force); + Preview::ForceState get_force_preview(); + void process_done_callback(std::function process_done_callback); bool is_preview_shown() const; bool is_preview_loaded() const;