From 25a6db267c90d7a69c7585c5aafafc03f139bf5e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 28 Feb 2026 09:39:12 +0100 Subject: [PATCH] Implemented backup files for the configuration file Currently, up to 10 backups are kept. "klayoutrc.1" is the most recent backup, "klayoutrc." the second most recent etc. --- src/lay/lay/gsiDeclLayApplication.cc | 7 ++++++- src/lay/lay/gsiDeclLayMainWindow.cc | 6 +++--- src/lay/lay/layApplication.cc | 8 +++++--- src/lay/lay/layApplication.h | 5 ++++- src/laybasic/laybasic/gsiDeclLayDispatcher.cc | 7 ++++++- src/laybasic/laybasic/layDispatcher.cc | 4 ++-- src/laybasic/laybasic/layDispatcher.h | 5 ++++- 7 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/lay/lay/gsiDeclLayApplication.cc b/src/lay/lay/gsiDeclLayApplication.cc index dde5d8aac..5e2b6d410 100644 --- a/src/lay/lay/gsiDeclLayApplication.cc +++ b/src/lay/lay/gsiDeclLayApplication.cc @@ -164,12 +164,17 @@ static gsi::Methods application_methods () // TODO: basically this method belongs to Dispatcher (aka MainWindow). // There is separate declaration for Dispatcher which we have to synchronize // with this method. - method ("write_config", &C::write_config, gsi::arg ("file_name"), + method ("write_config", &C::write_config, gsi::arg ("file_name"), gsi::arg ("keep_backups", 0), "@brief Writes configuration to a file\n" "@return A value indicating whether the operation was successful\n" "\n" "If the configuration file cannot be written, \n" "is returned but no exception is thrown.\n" + "\n" + "@param file_name The path to write the config file to.\n" + "@param keep_backups The number of backups to keep (0 for 'no backups').\n" + "\n" + "The 'keep_backups' option was introduced in version 0.30.7.\n" ) + // TODO: basically this method belongs to Dispatcher (aka MainWindow). // There is separate declaration for Dispatcher which we have to synchronize diff --git a/src/lay/lay/gsiDeclLayMainWindow.cc b/src/lay/lay/gsiDeclLayMainWindow.cc index 777dbac65..4b9b7e75a 100644 --- a/src/lay/lay/gsiDeclLayMainWindow.cc +++ b/src/lay/lay/gsiDeclLayMainWindow.cc @@ -202,9 +202,9 @@ static void clear_config (lay::MainWindow *mw) mw->dispatcher ()->clear_config (); } -static bool write_config (lay::MainWindow *mw, const std::string &config_file) +static bool write_config (lay::MainWindow *mw, const std::string &config_file, int keep_backups) { - return mw->dispatcher ()->write_config (config_file); + return mw->dispatcher ()->write_config (config_file, keep_backups); } static bool read_config (lay::MainWindow *mw, const std::string &config_file) @@ -348,7 +348,7 @@ Class decl_MainWindow (QT_EXTERNAL_BASE (QMainWindow) "lay", "M "\n" "This method has been introduced in version 0.27.\n" ) + - method_ext ("write_config", &write_config, gsi::arg ("file_name"), + method_ext ("write_config", &write_config, gsi::arg ("file_name"), gsi::arg ("keep_backups", 0), "@brief Writes configuration to a file\n" "This method is provided for using MainWindow without an Application object. " "It's a convience method which is equivalent to 'dispatcher().write_config(...)'. See \\Dispatcher#write_config for details.\n" diff --git a/src/lay/lay/layApplication.cc b/src/lay/lay/layApplication.cc index 139740bb0..75b8c3bc1 100644 --- a/src/lay/lay/layApplication.cc +++ b/src/lay/lay/layApplication.cc @@ -992,6 +992,8 @@ ApplicationBase::exit (int result) ::exit (result); } +const int number_of_config_file_backups = 10; + void ApplicationBase::finish () { @@ -1001,7 +1003,7 @@ ApplicationBase::finish () if (tl::verbosity () >= 20) { tl::info << tl::to_string (QObject::tr ("Updating configuration file ")) << m_config_file_to_write; } - dispatcher ()->write_config (m_config_file_to_write); + dispatcher ()->write_config (m_config_file_to_write, number_of_config_file_backups); } if (! m_config_file_to_delete.empty () && m_config_file_to_delete != m_config_file_to_write) { if (tl::verbosity () >= 20) { @@ -1419,9 +1421,9 @@ ApplicationBase::process_events_impl (QEventLoop::ProcessEventsFlags /*flags*/, } bool -ApplicationBase::write_config (const std::string &config_file) +ApplicationBase::write_config (const std::string &config_file, int keep_backups) { - return dispatcher () ? dispatcher ()->write_config (config_file) : 0; + return dispatcher () ? dispatcher ()->write_config (config_file, keep_backups) : 0; } void diff --git a/src/lay/lay/layApplication.h b/src/lay/lay/layApplication.h index 2a89b61a1..e268df204 100644 --- a/src/lay/lay/layApplication.h +++ b/src/lay/lay/layApplication.h @@ -183,8 +183,11 @@ public: * * If the configuration file cannot be written, false * is returned but no exception is thrown. + * + * "keep_backups" controls how many backups are kept for + * the configuration file. */ - bool write_config (const std::string &config_file); + bool write_config (const std::string &config_file, int keep_backups = 0); /** * @brief Read the configuration from a file diff --git a/src/laybasic/laybasic/gsiDeclLayDispatcher.cc b/src/laybasic/laybasic/gsiDeclLayDispatcher.cc index e5ae50228..9c5b691dc 100644 --- a/src/laybasic/laybasic/gsiDeclLayDispatcher.cc +++ b/src/laybasic/laybasic/gsiDeclLayDispatcher.cc @@ -71,12 +71,17 @@ Class decl_Dispatcher ("lay", "Dispatcher", "\n" "@return The instance\n" ) + - method ("write_config", &lay::Dispatcher::write_config, gsi::arg ("file_name"), + method ("write_config", &lay::Dispatcher::write_config, gsi::arg ("file_name"), gsi::arg ("keep_backups", 0), "@brief Writes configuration to a file\n" "@return A value indicating whether the operation was successful\n" "\n" "If the configuration file cannot be written, false \n" "is returned but no exception is thrown.\n" + "\n" + "@param file_name The path to write the config file to.\n" + "@param keep_backups The number of backups to keep (0 for 'no backups').\n" + "\n" + "The 'keep_backups' option was introduced in version 0.30.7.\n" ) + method ("read_config", &lay::Dispatcher::read_config, gsi::arg ("file_name"), "@brief Reads the configuration from a file\n" diff --git a/src/laybasic/laybasic/layDispatcher.cc b/src/laybasic/laybasic/layDispatcher.cc index 0cd20571e..499336b29 100644 --- a/src/laybasic/laybasic/layDispatcher.cc +++ b/src/laybasic/laybasic/layDispatcher.cc @@ -238,10 +238,10 @@ config_structure (const lay::Dispatcher *plugin) bool -Dispatcher::write_config (const std::string &config_file) +Dispatcher::write_config (const std::string &config_file, int keep_backups) { try { - tl::OutputStream os (config_file, tl::OutputStream::OM_Plain); + tl::OutputStream os (config_file, tl::OutputStream::OM_Plain, true, keep_backups); config_structure (this).write (os, *this); return true; } catch (...) { diff --git a/src/laybasic/laybasic/layDispatcher.h b/src/laybasic/laybasic/layDispatcher.h index 67046250c..f42b60585 100644 --- a/src/laybasic/laybasic/layDispatcher.h +++ b/src/laybasic/laybasic/layDispatcher.h @@ -147,9 +147,12 @@ public: * If the configuration file cannot be written, false * is returned but no exception is thrown. * + * "keep_backups" is the number of backup files kept. + * By default, no backups are kept. + * * @return false, if an error occurred. */ - bool write_config (const std::string &config_file); + bool write_config (const std::string &config_file, int keep_backups = 0); /** * @brief Read the configuration from a file