#1020 a less hacky solution for tabbed view, to make them work on linux

This commit is contained in:
remi durand 2021-03-30 17:06:24 +02:00
parent dc9c902a99
commit eaafb74c23
7 changed files with 103 additions and 25 deletions

View File

@ -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();

View File

@ -457,7 +457,7 @@ private:
int m_extra_frame_requested_delayed { std::numeric_limits<int>::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; }

View File

@ -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();

View File

@ -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;

View File

@ -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);
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);
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
});

View File

@ -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<void(int)> 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<void(int)> 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(); }

View File

@ -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<void(int state)> process_done_callback);
bool is_preview_shown() const;
bool is_preview_loaded() const;