From e70253cf258924fa6f67f8808eed860dfb2e8a3d Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Tue, 3 Jan 2023 13:04:32 +0800 Subject: [PATCH] FIX: can not save project when modify bed type in the scene Change-Id: Iaea1bef142edcf0c68a64cfa1f3b1d309b96f251 --- src/slic3r/GUI/Plater.cpp | 9 ++++++++- src/slic3r/GUI/Plater.hpp | 1 + src/slic3r/GUI/ProjectDirtyStateManager.cpp | 3 ++- src/slic3r/GUI/ProjectDirtyStateManager.hpp | 1 + 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e71dfb5694..cbaf20c33c 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1775,6 +1775,7 @@ struct Plater::priv bool need_update() const { return m_need_update; } void set_need_update(bool need_update) { m_need_update = need_update; } + void set_plater_dirty(bool is_dirty) { dirty_state.set_plater_dirty(is_dirty); } bool is_project_dirty() const { return dirty_state.is_dirty(); } bool is_presets_dirty() const { return dirty_state.is_presets_dirty(); } void update_project_dirty_from_presets() @@ -7387,6 +7388,7 @@ bool Plater::Show(bool show) bool Plater::is_project_dirty() const { return p->is_project_dirty(); } bool Plater::is_presets_dirty() const { return p->is_presets_dirty(); } +void Plater::set_plater_dirty(bool is_dirty) { p->set_plater_dirty(is_dirty); } void Plater::update_project_dirty_from_presets() { p->update_project_dirty_from_presets(); } int Plater::save_project_if_dirty(const wxString& reason) { return p->save_project_if_dirty(reason); } void Plater::reset_project_dirty_after_save() { p->reset_project_dirty_after_save(); } @@ -10964,8 +10966,13 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click) PartPlate* curr_plate = p->partplate_list.get_curr_plate(); dlg.sync_bed_type(curr_plate->get_bed_type(false)); dlg.Bind(EVT_SET_BED_TYPE_CONFIRM, [this, plate_index](wxCommandEvent& e) { + PartPlate *curr_plate = p->partplate_list.get_curr_plate(); + BedType old_bed_type = curr_plate->get_bed_type(false); auto type = (BedType)(e.GetInt()); - p->partplate_list.get_curr_plate()->set_bed_type(type); + if (old_bed_type != type) { + curr_plate->set_bed_type(type); + set_plater_dirty(true); + } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("select bed type %1% for plate %2% at plate side")%type %plate_index; }); dlg.ShowModal(); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 935929dace..936c85d592 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -187,6 +187,7 @@ public: bool is_project_dirty() const; bool is_presets_dirty() const; + void set_plater_dirty(bool is_dirty); void update_project_dirty_from_presets(); int save_project_if_dirty(const wxString& reason); void reset_project_dirty_after_save(); diff --git a/src/slic3r/GUI/ProjectDirtyStateManager.cpp b/src/slic3r/GUI/ProjectDirtyStateManager.cpp index 0db5e6f2df..5d32ca3481 100644 --- a/src/slic3r/GUI/ProjectDirtyStateManager.cpp +++ b/src/slic3r/GUI/ProjectDirtyStateManager.cpp @@ -17,7 +17,8 @@ namespace GUI { void ProjectDirtyStateManager::update_from_undo_redo_stack(bool dirty) { - m_plater_dirty = dirty; + if (!m_plater_dirty) + m_plater_dirty = dirty; if (const Plater *plater = wxGetApp().plater(); plater && wxGetApp().initialized()) wxGetApp().mainframe->update_title(); } diff --git a/src/slic3r/GUI/ProjectDirtyStateManager.hpp b/src/slic3r/GUI/ProjectDirtyStateManager.hpp index f17772199f..171d19e219 100644 --- a/src/slic3r/GUI/ProjectDirtyStateManager.hpp +++ b/src/slic3r/GUI/ProjectDirtyStateManager.hpp @@ -14,6 +14,7 @@ public: void reset_after_save(); void reset_initial_presets(); + void set_plater_dirty(bool is_dirty) { m_plater_dirty = is_dirty; } bool is_dirty() const { return m_plater_dirty || m_project_config_dirty || m_presets_dirty; } bool is_presets_dirty() const { return m_presets_dirty; }