summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/release-notes.md2
-rw-r--r--src/SMAPI/Utilities/PerScreen.cs25
2 files changed, 20 insertions, 7 deletions
diff --git a/docs/release-notes.md b/docs/release-notes.md
index be34e653..deac0bc8 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -9,7 +9,7 @@
## Upcoming release
* For modders:
- * Expanded `PerScreen<T>` API: you can now get/set the value for any screen.
+ * Expanded `PerScreen<T>` API: you can now get/set the value for any screen, or clear all values.
* Added an option to disable rewriting mods for compatibility (thanks to Bpendragon!). This may prevent older mods from loading, but bypasses a Visual Studio crash when debugging.
* For the Error Handler mod:
diff --git a/src/SMAPI/Utilities/PerScreen.cs b/src/SMAPI/Utilities/PerScreen.cs
index 1498488b..60406d6b 100644
--- a/src/SMAPI/Utilities/PerScreen.cs
+++ b/src/SMAPI/Utilities/PerScreen.cs
@@ -11,10 +11,10 @@ namespace StardewModdingAPI.Utilities
/*********
** Fields
*********/
- /// <summary>Create the initial value for a player.</summary>
+ /// <summary>Create the initial value for a screen.</summary>
private readonly Func<T> CreateNewState;
- /// <summary>The tracked values for each player.</summary>
+ /// <summary>The tracked values for each screen.</summary>
private readonly IDictionary<int, T> States = new Dictionary<int, T>();
/// <summary>The last <see cref="Context.LastRemovedScreenId"/> value for which this instance was updated.</summary>
@@ -24,8 +24,8 @@ namespace StardewModdingAPI.Utilities
/*********
** Accessors
*********/
- /// <summary>The value for the current player.</summary>
- /// <remarks>The value is initialized the first time it's requested for that player, unless it's set manually first.</remarks>
+ /// <summary>The value for the current screen.</summary>
+ /// <remarks>The value is initialized the first time it's requested for that screen, unless it's set manually first.</remarks>
public T Value
{
get => this.GetValueForScreen(Context.ScreenId);
@@ -41,7 +41,7 @@ namespace StardewModdingAPI.Utilities
: this(null) { }
/// <summary>Construct an instance.</summary>
- /// <param name="createNewState">Create the initial state for a player screen.</param>
+ /// <param name="createNewState">Create the initial state for a screen.</param>
public PerScreen(Func<T> createNewState)
{
this.CreateNewState = createNewState ?? (() => default);
@@ -66,6 +66,12 @@ namespace StardewModdingAPI.Utilities
this.States[screenId] = value;
}
+ /// <summary>Remove all active values.</summary>
+ public void ResetAllScreens()
+ {
+ this.RemoveScreens(p => true);
+ }
+
/*********
** Private methods
@@ -77,9 +83,16 @@ namespace StardewModdingAPI.Utilities
return;
this.LastRemovedScreenId = Context.LastRemovedScreenId;
+ this.RemoveScreens(id => !Context.HasScreenId(id));
+ }
+
+ /// <summary>Remove screens matching a condition.</summary>
+ /// <param name="shouldRemove">Returns whether a screen ID should be removed.</param>
+ private void RemoveScreens(Func<int, bool> shouldRemove)
+ {
foreach (var pair in this.States.ToArray())
{
- if (!Context.HasScreenId(pair.Key))
+ if (shouldRemove(pair.Key))
this.States.Remove(pair.Key);
}
}