diff --git a/Commons/Settings.qml b/Commons/Settings.qml index d4deed9e8..0318b288c 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -40,6 +40,28 @@ Singleton { signal settingsSaved signal settingsReloaded + // Debounce external reload requests (file watcher + parent directory watcher) + // so atomic symlink swaps only trigger one reload. + Timer { + id: externalReloadTimer + running: false + interval: 200 + onTriggered: { + if (settingsFileView.path !== undefined) { + Logger.d("Settings", "Reloading settings after external change detection"); + reloadSettings = true; + settingsFileView.reload(); + } + } + } + + function scheduleExternalReload() { + if (!directoriesCreated || settingsFileView.path === undefined) { + return; + } + externalReloadTimer.restart(); + } + // ----------------------------------------------------- // ----------------------------------------------------- // Ensure directories exist before FileView tries to read files @@ -87,10 +109,7 @@ Singleton { watchChanges: true onAdapterUpdated: saveTimer.start() - onFileChanged: { - reloadSettings = true; - reload(); - } + onFileChanged: scheduleExternalReload() // Trigger initial load when path changes from empty to actual path onPathChanged: { @@ -142,6 +161,17 @@ Singleton { } } + // Watch parent config directory as a fallback for declarative setups where + // settings.json may be replaced atomically (e.g., new symlink target on nix rebuild). + FileView { + id: settingsDirWatcher + path: directoriesCreated ? configDir : undefined + printErrors: false + watchChanges: true + + onFileChanged: scheduleExternalReload() + } + // FileView to load default settings for comparison FileView { id: defaultSettingsFileView diff --git a/Modules/Panels/Media/MediaPlayerPanel.qml b/Modules/Panels/Media/MediaPlayerPanel.qml index 99275a6b5..721ba7b5f 100644 --- a/Modules/Panels/Media/MediaPlayerPanel.qml +++ b/Modules/Panels/Media/MediaPlayerPanel.qml @@ -74,7 +74,7 @@ SmartPanel { id: playerContent anchors.fill: parent - property real contentPreferredHeight: mainLayout.implicitHeight + Style.margin2L; + property real contentPreferredHeight: mainLayout.implicitHeight + Style.margin2L property Component visualizerSource: { switch (root.visualizerType) {