Merge pull request #17704 from peppy/bindable-safety-skin-editor

Fix multiple issues with bindable safety in `SkinEditor` components
This commit is contained in:
Bartłomiej Dach 2022-04-07 21:43:56 +02:00 committed by GitHub
commit d256bd2cc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 8 deletions

View File

@ -21,21 +21,20 @@ public class SkinBlueprintContainer : BlueprintContainer<ISkinnableDrawable>
private readonly List<BindableList<ISkinnableDrawable>> targetComponents = new List<BindableList<ISkinnableDrawable>>();
[Resolved]
private SkinEditor editor { get; set; }
public SkinBlueprintContainer(Drawable target)
{
this.target = target;
}
[BackgroundDependencyLoader(true)]
private void load(SkinEditor editor)
{
SelectedItems.BindTo(editor.SelectedComponents);
}
protected override void LoadComplete()
{
base.LoadComplete();
SelectedItems.BindTo(editor.SelectedComponents);
// track each target container on the current screen.
var targetContainers = target.ChildrenOfType<ISkinnableTarget>().ToArray();
@ -56,7 +55,7 @@ protected override void LoadComplete()
}
}
private void componentsChanged(object sender, NotifyCollectionChangedEventArgs e)
private void componentsChanged(object sender, NotifyCollectionChangedEventArgs e) => Schedule(() =>
{
switch (e.Action)
{
@ -79,7 +78,7 @@ private void componentsChanged(object sender, NotifyCollectionChangedEventArgs e
AddBlueprintFor(item);
break;
}
}
});
protected override void AddBlueprintFor(ISkinnableDrawable item)
{
@ -93,5 +92,13 @@ protected override void AddBlueprintFor(ISkinnableDrawable item)
protected override SelectionBlueprint<ISkinnableDrawable> CreateBlueprintFor(ISkinnableDrawable component)
=> new SkinBlueprint(component);
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
foreach (var list in targetComponents)
list.UnbindAll();
}
}
}

View File

@ -203,6 +203,9 @@ public void UpdateTargetScreen(Drawable targetScreen)
SelectedComponents.Clear();
// Immediately clear the previous blueprint container to ensure it doesn't try to interact with the old target.
content?.Clear();
Scheduler.AddOnce(loadBlueprintContainer);
Scheduler.AddOnce(populateSettings);