Allow to configure auto-sync of library folders. Default is off.

This commit is contained in:
Matthias Koefferlein 2026-04-03 23:59:43 +02:00
parent 9b2d1fe0be
commit 21ecd80253
6 changed files with 96 additions and 18 deletions

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>611</width>
<height>271</height>
<width>619</width>
<height>475</height>
</rect>
</property>
<property name="windowTitle">
@ -154,6 +154,32 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Synchronize Library Files</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>If this option is enabled, library files will be reloaded automatically. If disabled, you can reload the files using &quot;File/Refresh Libraries&quot; manually.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="auto_sync_libraries">
<property name="text">
<string>Synchronize library files automatically</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>

View File

@ -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");
}

View File

@ -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<std::string, std::string> > & /*options*/) const
LibraryController::get_options (std::vector < std::pair<std::string, std::string> > &options) const
{
// .. nothing yet ..
options.push_back (std::pair<std::string, std::string> (cfg_auto_sync_libraries, "false"));
}
void
@ -100,8 +100,21 @@ LibraryController::get_menu_entries (std::vector<lay::MenuEntry> & /*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<LibFileInfo> 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<LibraryController::LibFileInfo> &libs, std::map<std::string, LibraryController::LibInfo> &new_lib_files)
LibraryController::read_libs (const std::vector<LibraryController::LibFileInfo> &libs, std::map<std::string, LibraryController::LibInfo> &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 *

View File

@ -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<LibraryController> dm_sync_files;
std::map<std::string, LibInfo> m_lib_files;
bool m_sync;
bool m_sync_once;
void sync_files ();
void read_libs (const std::vector<LibFileInfo> &file_info, std::map<std::string, LibInfo> &new_lib_files);
void sync_files_maybe ();
void read_libs (const std::vector<LibFileInfo> &file_info, std::map<std::string, LibInfo> &new_lib_files, bool always);
};
}

View File

@ -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 (...) { }

View File

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