From 5ff93fe1037c664cff4eaadbb0156eecfd110780 Mon Sep 17 00:00:00 2001 From: Vovodroid Date: Sat, 29 Jun 2024 17:13:57 +0300 Subject: [PATCH] Mark unsaved project title with * (#5910) * Mark unsaved project title with * --- src/slic3r/GUI/MainFrame.cpp | 3 ++ src/slic3r/GUI/Plater.cpp | 31 ++++++++++++++++++++- src/slic3r/GUI/Plater.hpp | 1 + src/slic3r/GUI/ProjectDirtyStateManager.cpp | 3 +- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0689c5a7d..2f59daffb 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1999,6 +1999,9 @@ void MainFrame::update_slice_print_status(SlicePrintEventType event, bool can_sl m_slice_btn->Enable(enable_slice); m_slice_enable = enable_slice; m_print_enable = enable_print; + + if (wxGetApp().mainframe) + wxGetApp().plater()->update_title_dirty_status(); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 629ba996d..a89bc36f9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2572,6 +2572,7 @@ struct Plater::priv //BBS store bbs project name wxString get_project_name(); void set_project_name(const wxString& project_name); + void update_title_dirty_status(); // Call after plater and Canvas#D is initialized void init_notification_manager(); @@ -7649,6 +7650,25 @@ void Plater::priv::set_project_name(const wxString& project_name) #endif } +void Plater::priv::update_title_dirty_status() +{ + if (m_project_name.empty()) + return; + + wxString title; + if (is_project_dirty()) + title = "*" + m_project_name; + else + title = m_project_name; + +#ifdef __WINDOWS__ + wxGetApp().mainframe->topbar()->SetTitle(title); +#else + wxGetApp().mainframe->SetTitle(title); + wxGetApp().mainframe->update_title_colour_after_set_title(); +#endif +} + void Plater::priv::set_project_filename(const wxString& filename) { boost::filesystem::path full_path = into_path(filename); @@ -8525,6 +8545,7 @@ void Plater::priv::undo_redo_to(std::vector::const_iterator } dirty_state.update_from_undo_redo_stack(m_undo_redo_stack_main.project_modified()); + update_title_dirty_status(); } void Plater::priv::update_after_undo_redo(const UndoRedo::Snapshot& snapshot, bool /* temp_snapshot_was_taken */) @@ -8941,6 +8962,7 @@ int Plater::save_project(bool saveAs) } catch (...) {} + update_title_dirty_status(); return wxID_YES; } @@ -12778,8 +12800,10 @@ void Plater::on_config_change(const DynamicPrintConfig &config) if (update_scheduled) update(); - if (p->main_frame->is_loaded()) + if (p->main_frame->is_loaded()) { this->p->schedule_background_process(); + update_title_dirty_status(); + } } void Plater::set_bed_shape() const @@ -14282,6 +14306,11 @@ bool Plater::PopupObjectTableBySelection() return p->PopupObjectTable(obj_idx, vol_idx, pos); } +void Plater::update_title_dirty_status() +{ + p->update_title_dirty_status(); +} + wxMenu* Plater::plate_menu() { return p->menus.plate_menu(); } wxMenu* Plater::object_menu() { return p->menus.object_menu(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 66d63fd54..bda2ab611 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -654,6 +654,7 @@ public: bool need_update() const; void set_need_update(bool need_update); + void update_title_dirty_status(); // ROII wrapper for suppressing the Undo / Redo snapshot to be taken. class SuppressSnapshots diff --git a/src/slic3r/GUI/ProjectDirtyStateManager.cpp b/src/slic3r/GUI/ProjectDirtyStateManager.cpp index ab7f4cf45..c986328f7 100644 --- a/src/slic3r/GUI/ProjectDirtyStateManager.cpp +++ b/src/slic3r/GUI/ProjectDirtyStateManager.cpp @@ -17,8 +17,7 @@ namespace GUI { void ProjectDirtyStateManager::update_from_undo_redo_stack(bool dirty) { - if (!m_plater_dirty) - m_plater_dirty = dirty; + m_plater_dirty = dirty; if (const Plater *plater = wxGetApp().plater(); plater && wxGetApp().initialized()) wxGetApp().mainframe->update_title(); }