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 ();
}