diff --git a/EmoTracker.Data/ApplicationSettings.cs b/EmoTracker.Data/ApplicationSettings.cs
index c3bf92f..1f71dd8 100644
--- a/EmoTracker.Data/ApplicationSettings.cs
+++ b/EmoTracker.Data/ApplicationSettings.cs
@@ -86,6 +86,10 @@ Sessions.SessionSettings ActiveSessionSettings
/// Called from 's adoption ctor
/// so a primary state inherits the user's pre-existing preferences
/// loaded from ApplicationSettings.json.
+ /// Also called from
+ /// to reset settings to the saved defaults before init.lua runs,
+ /// ensuring pack scripts start from the user's preferences and may
+ /// optionally override them.
///
internal void SeedIntoSession(Sessions.SessionSettings target)
{
@@ -97,6 +101,54 @@ internal void SeedIntoSession(Sessions.SessionSettings target)
target.PinLocationsOnItemCapture = mbSeedPinLocationsOnItemCapture;
}
+ ///
+ /// Called by when a tracked
+ /// property changes, so UI-driven setting changes are persisted to
+ /// ApplicationSettings.json as the new defaults for future
+ /// sessions / pack loads.
+ ///
+ ///
+ /// No-ops when called while a pack is loading (i.e.
+ /// is true) to avoid
+ /// init.lua-driven changes overwriting the user's saved preferences.
+ ///
+ ///
+ internal void SyncSeedsFromSession(Sessions.SessionSettings source)
+ {
+ if (source == null) return;
+ if (Sessions.PackageLoader.IsLoading) return;
+
+ bool changed = false;
+ if (mbSeedIgnoreAllLogic != source.IgnoreAllLogic)
+ {
+ mbSeedIgnoreAllLogic = source.IgnoreAllLogic;
+ changed = true;
+ }
+ if (mbSeedDisplayAllLocations != source.DisplayAllLocations)
+ {
+ mbSeedDisplayAllLocations = source.DisplayAllLocations;
+ changed = true;
+ }
+ if (mbSeedAlwaysAllowClearing != source.AlwaysAllowClearing)
+ {
+ mbSeedAlwaysAllowClearing = source.AlwaysAllowClearing;
+ changed = true;
+ }
+ if (mbSeedAutoUnpinLocationsOnClear != source.AutoUnpinLocationsOnClear)
+ {
+ mbSeedAutoUnpinLocationsOnClear = source.AutoUnpinLocationsOnClear;
+ changed = true;
+ }
+ if (mbSeedPinLocationsOnItemCapture != source.PinLocationsOnItemCapture)
+ {
+ mbSeedPinLocationsOnItemCapture = source.PinLocationsOnItemCapture;
+ changed = true;
+ }
+
+ if (changed)
+ WriteSettings();
+ }
+
public bool IgnoreAllLogic
{
get
diff --git a/EmoTracker.Data/Sessions/PackageLoader.cs b/EmoTracker.Data/Sessions/PackageLoader.cs
index a633562..e5379e2 100644
--- a/EmoTracker.Data/Sessions/PackageLoader.cs
+++ b/EmoTracker.Data/Sessions/PackageLoader.cs
@@ -75,6 +75,14 @@ public PackageLoadEventArgs(TrackerState target, IGamePackage package, IGamePack
[ThreadStatic]
static bool mInProgress;
+ ///
+ /// True while is executing on this thread.
+ /// Used by to
+ /// suppress seed-writes driven by pack-script (init.lua) changes,
+ /// so only explicit user UI changes update the saved defaults.
+ ///
+ internal static bool IsLoading => mInProgress;
+
///
/// Loads (with optional )
/// into 's catalogs. Caller is responsible for
diff --git a/EmoTracker.Data/Sessions/SessionSettings.cs b/EmoTracker.Data/Sessions/SessionSettings.cs
index 72b648e..089f1fa 100644
--- a/EmoTracker.Data/Sessions/SessionSettings.cs
+++ b/EmoTracker.Data/Sessions/SessionSettings.cs
@@ -54,15 +54,19 @@ public partial class SessionSettings : TransactableModelTypeBase
public partial bool IgnoreAllLogic { get; set; }
[KVMutable]
+ [OnChanged(nameof(SyncSeedsToApplicationSettings))]
public partial bool DisplayAllLocations { get; set; }
[KVMutable]
+ [OnChanged(nameof(SyncSeedsToApplicationSettings))]
public partial bool AlwaysAllowClearing { get; set; }
[KVMutable]
+ [OnChanged(nameof(SyncSeedsToApplicationSettings))]
public partial bool AutoUnpinLocationsOnClear { get; set; }
[KVMutable]
+ [OnChanged(nameof(SyncSeedsToApplicationSettings))]
public partial bool PinLocationsOnItemCapture { get; set; }
[KVMutable]
@@ -111,6 +115,12 @@ protected void OnIgnoreAllLogicChanged()
// ApplicationSettings.IgnoreAllLogic's setter.
var state = OwnerState as TrackerState;
state?.Locations.RefreshAccessibility();
+ SyncSeedsToApplicationSettings();
+ }
+
+ protected void SyncSeedsToApplicationSettings()
+ {
+ ApplicationSettings.Instance?.SyncSeedsFromSession(this);
}
// ----------- Fork support ---------------------------------------------
diff --git a/EmoTracker.Data/Sessions/TrackerState.PackageOps.cs b/EmoTracker.Data/Sessions/TrackerState.PackageOps.cs
index 58615af..9c94ae1 100644
--- a/EmoTracker.Data/Sessions/TrackerState.PackageOps.cs
+++ b/EmoTracker.Data/Sessions/TrackerState.PackageOps.cs
@@ -134,6 +134,11 @@ public void ActivatePackage(IGamePackage package, IGamePackageVariant variant)
PackageManager.Instance.RefreshActiveState();
NotifyPropertyChanged(nameof(ActiveVariantUID));
+ // Reset tracking settings to the user's saved defaults before
+ // running init.lua, so pack scripts start from the user's
+ // preferences and may optionally override them (issue #83).
+ ApplicationSettings.Instance.SeedIntoSession(Settings);
+
PackageLoader.LoadInto(this, package, variant);
}
finally