fix: sync profile/plugin lists when drawing profile manager

This commit is contained in:
goat 2023-06-21 19:33:52 +02:00
parent c68793b589
commit 00fd9079a9
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
3 changed files with 17 additions and 1 deletions

View file

@ -111,6 +111,7 @@ internal class ProfileManagerWidget
{
Guid? toCloneGuid = null;
using var syncScope = profman.GetSyncScope();
foreach (var profile in profman.Profiles)
{
if (profile.IsDefaultProfile)
@ -329,7 +330,8 @@ internal class ProfileManagerWidget
var pluginLineHeight = 32 * ImGuiHelpers.GlobalScale;
string? wantRemovePluginInternalName = null;
foreach (var plugin in profile.Plugins)
using var syncScope = profile.GetSyncScope();
foreach (var plugin in profile.Plugins.ToArray())
{
didAny = true;
var pmPlugin = pm.InstalledPlugins.FirstOrDefault(x => x.Manifest.InternalName == plugin.InternalName);

View file

@ -109,6 +109,13 @@ internal class Profile
/// </summary>
public ProfileModel Model => this.modelV1;
/// <summary>
/// Get a disposable that will lock the plugin list while it is not disposed.
/// You must NEVER use this in async code.
/// </summary>
/// <returns>The aforementioned disposable.</returns>
public IDisposable GetSyncScope() => new ScopedSyncRoot(this);
/// <summary>
/// Set this profile's state. This cannot be called for the default profile.
/// This will block until all states have been applied.

View file

@ -59,6 +59,13 @@ internal class ProfileManager : IServiceType
/// </summary>
public bool IsBusy => this.isBusy;
/// <summary>
/// Get a disposable that will lock the profile list while it is not disposed.
/// You must NEVER use this in async code.
/// </summary>
/// <returns>The aforementioned disposable.</returns>
public IDisposable GetSyncScope() => new ScopedSyncRoot(this.profiles);
/// <summary>
/// Check if any enabled profile wants a specific plugin enabled.
/// </summary>