From 21ecd802539a006b703fc2178b56fc75b832e737 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 3 Apr 2026 23:59:43 +0200 Subject: [PATCH] Allow to configure auto-sync of library folders. Default is off. --- src/lay/lay/MainConfigPage7.ui | 30 ++++++++++++++- src/lay/lay/layConfig.h | 1 + src/lay/lay/layLibraryController.cc | 60 ++++++++++++++++++++++------- src/lay/lay/layLibraryController.h | 13 ++++++- src/lay/lay/layMainConfigPages.cc | 5 +++ src/lay/lay/layMainWindow.cc | 5 +++ 6 files changed, 96 insertions(+), 18 deletions(-) diff --git a/src/lay/lay/MainConfigPage7.ui b/src/lay/lay/MainConfigPage7.ui index 5cc9b7655..dabfd3a4c 100644 --- a/src/lay/lay/MainConfigPage7.ui +++ b/src/lay/lay/MainConfigPage7.ui @@ -6,8 +6,8 @@ 0 0 - 611 - 271 + 619 + 475 @@ -154,6 +154,32 @@ + + + + Synchronize Library Files + + + + + + If this option is enabled, library files will be reloaded automatically. If disabled, you can reload the files using "File/Refresh Libraries" manually. + + + true + + + + + + + Synchronize library files automatically + + + + + + diff --git a/src/lay/lay/layConfig.h b/src/lay/lay/layConfig.h index c1eb182b8..86850a4e2 100644 --- a/src/lay/lay/layConfig.h +++ b/src/lay/lay/layConfig.h @@ -63,6 +63,7 @@ static const std::string cfg_micron_digits ("digits-micron"); static const std::string cfg_dbu_digits ("digits-dbu"); static const std::string cfg_assistant_bookmarks ("assistant-bookmarks"); static const std::string cfg_always_exit_without_saving ("always-exit-without-saving"); +static const std::string cfg_auto_sync_libraries ("auto-sync-libraries"); } diff --git a/src/lay/lay/layLibraryController.cc b/src/lay/lay/layLibraryController.cc index a95b5da3e..8b3ee0114 100644 --- a/src/lay/lay/layLibraryController.cc +++ b/src/lay/lay/layLibraryController.cc @@ -25,7 +25,6 @@ #include "layApplication.h" #include "laySaltController.h" #include "layConfig.h" -#include "layMainWindow.h" #include "layQtTools.h" #include "dbLibraryManager.h" #include "dbLibrary.h" @@ -44,7 +43,8 @@ namespace lay LibraryController::LibraryController () : m_file_watcher (0), - dm_sync_files (this, &LibraryController::sync_files) + dm_sync_files (this, &LibraryController::sync_files_maybe), + m_sync (false), m_sync_once (false) { } @@ -53,7 +53,7 @@ LibraryController::initialize (lay::Dispatcher * /*root*/) { // NOTE: we initialize the libraries in the stage once to have them available for the autorun // macros. We'll do that later again in order to pull in the libraries from the packages. - sync_files (); + sync_files (false); } void @@ -69,7 +69,7 @@ LibraryController::initialized (lay::Dispatcher * /*root*/) connect (m_file_watcher, SIGNAL (fileRemoved (const QString &)), this, SLOT (file_watcher_triggered ())); } - sync_files (); + sync_files (false); } void @@ -88,9 +88,9 @@ LibraryController::uninitialize (lay::Dispatcher * /*root*/) } void -LibraryController::get_options (std::vector < std::pair > & /*options*/) const +LibraryController::get_options (std::vector < std::pair > &options) const { - // .. nothing yet .. + options.push_back (std::pair (cfg_auto_sync_libraries, "false")); } void @@ -100,8 +100,21 @@ LibraryController::get_menu_entries (std::vector & /*menu_entrie } bool -LibraryController::configure (const std::string & /*name*/, const std::string & /*value*/) +LibraryController::configure (const std::string &name, const std::string &value) { + if (name == cfg_auto_sync_libraries) { + + bool sync = false; + tl::from_string (value, sync); + + m_sync = sync; + if (sync) { + dm_sync_files (); + } + + } + + // don't consume return false; } @@ -119,8 +132,24 @@ LibraryController::can_exit (lay::Dispatcher * /*root*/) const } void -LibraryController::sync_files () +LibraryController::sync_files_maybe () { + sync_files (false); +} + +void +LibraryController::sync_files (bool always) +{ + if (tl::verbosity () >= 20) { + if (always) { + tl::info << tl::to_string (tr ("Synchronize library files unconditionally")); + } else { + tl::info << tl::to_string (tr ("Synchronize library files")); + } + } + + m_sync_once = false; + if (m_file_watcher) { m_file_watcher->clear (); m_file_watcher->enable (false); @@ -179,7 +208,7 @@ LibraryController::sync_files () std::vector libs; read_lib_file (lf->first, lf->second, libs); - read_libs (libs, new_lib_files); + read_libs (libs, new_lib_files, always); if (m_file_watcher) { m_file_watcher->add_file (tl::absolute_file_path (lf->first)); @@ -222,7 +251,7 @@ LibraryController::sync_files () } } - read_libs (libs, new_lib_files); + read_libs (libs, new_lib_files, always); } @@ -424,9 +453,9 @@ LibraryController::read_lib_file (const std::string &lib_file, const std::string } void -LibraryController::read_libs (const std::vector &libs, std::map &new_lib_files) +LibraryController::read_libs (const std::vector &libs, std::map &new_lib_files, bool always) { - bool needs_load = false; + bool needs_load = always; for (auto im = libs.begin (); im != libs.end () && ! needs_load; ++im) { @@ -532,14 +561,17 @@ void LibraryController::sync_with_external_sources () { tl::log << tl::to_string (tr ("Package updates - updating libraries")); + m_sync_once = true; dm_sync_files (); } void LibraryController::file_watcher_triggered () { - tl::log << tl::to_string (tr ("Detected file system change in libraries - updating")); - dm_sync_files (); + if (m_sync) { + tl::log << tl::to_string (tr ("Detected file system change in libraries - updating")); + dm_sync_files (); + } } LibraryController * diff --git a/src/lay/lay/layLibraryController.h b/src/lay/lay/layLibraryController.h index 0fd26634e..4b0392c63 100644 --- a/src/lay/lay/layLibraryController.h +++ b/src/lay/lay/layLibraryController.h @@ -112,6 +112,13 @@ public: */ bool can_exit (lay::Dispatcher *root) const; + /** + * @brief Synchronize files + * + * If "always" is set, all files are synchronized unconditionally. + */ + void sync_files (bool always); + /** * @brief Gets the singleton instance for this object */ @@ -147,9 +154,11 @@ private: tl::FileSystemWatcher *m_file_watcher; tl::DeferredMethod dm_sync_files; std::map m_lib_files; + bool m_sync; + bool m_sync_once; - void sync_files (); - void read_libs (const std::vector &file_info, std::map &new_lib_files); + void sync_files_maybe (); + void read_libs (const std::vector &file_info, std::map &new_lib_files, bool always); }; } diff --git a/src/lay/lay/layMainConfigPages.cc b/src/lay/lay/layMainConfigPages.cc index 3b8d9c890..c56f48357 100644 --- a/src/lay/lay/layMainConfigPages.cc +++ b/src/lay/lay/layMainConfigPages.cc @@ -197,6 +197,10 @@ MainConfigPage7::setup (lay::Dispatcher *root) root->config_get (cfg_layout_file_watcher_enabled, en); mp_ui->check_for_updates->setChecked (en); + bool asl = false; + root->config_get (cfg_auto_sync_libraries, asl); + mp_ui->auto_sync_libraries->setChecked (asl); + int kb = 0; root->config_get (cfg_keep_backups, kb); mp_ui->keep_backups->setValue (kb); @@ -211,6 +215,7 @@ MainConfigPage7::commit (lay::Dispatcher *root) { try { root->config_set (cfg_layout_file_watcher_enabled, mp_ui->check_for_updates->isChecked ()); + root->config_set (cfg_auto_sync_libraries, mp_ui->auto_sync_libraries->isChecked ()); root->config_set (cfg_keep_backups, mp_ui->keep_backups->value ()); root->config_set (cfg_always_exit_without_saving, mp_ui->always_exit_without_saving->isChecked ()); } catch (...) { } diff --git a/src/lay/lay/layMainWindow.cc b/src/lay/lay/layMainWindow.cc index 0410cbb4d..4304d056e 100644 --- a/src/lay/lay/layMainWindow.cc +++ b/src/lay/lay/layMainWindow.cc @@ -94,6 +94,7 @@ #include "laySettingsForm.h" #include "laySelectCellViewForm.h" #include "layTechnologyController.h" +#include "layLibraryController.h" #include "laySaltController.h" #include "layTipDialog.h" #include "layMacroController.h" @@ -2612,6 +2613,10 @@ MainWindow::cm_writer_options () void MainWindow::cm_refresh () { + if (lay::LibraryController::instance ()) { + lay::LibraryController::instance ()->sync_files (false); + } + db::LibraryManager::instance ().refresh_all (); }