mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-07-17 02:31:49 +08:00
#1020 a less hacky solution for tabbed view, to make them work on linux
This commit is contained in:
parent
dc9c902a99
commit
eaafb74c23
@ -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();
|
||||
|
@ -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; }
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
});
|
||||
|
@ -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(); }
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user