Remove all UsingClosestAnchor() extension logic

It is replaced with ISkinnableDrawable.UsingClosestAnchor.
This commit is contained in:
Robin Avery
2021-06-07 00:04:53 -04:00
parent ce635af83e
commit f28916e30f
3 changed files with 15 additions and 44 deletions

View File

@ -2,9 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Input.Bindings;
@ -60,7 +57,9 @@ namespace osu.Game.Extensions
component.Scale = info.Scale;
component.Anchor = info.Anchor;
component.Origin = info.Origin;
component.UsingClosestAnchor().Value = info.UsingClosestAnchor;
if (component is ISkinnableDrawable skinnable)
skinnable.UsingClosestAnchor = info.UsingClosestAnchor;
if (component is Container container)
{
@ -68,26 +67,5 @@ namespace osu.Game.Extensions
container.Add(child.CreateInstance());
}
}
/// <remarks>
/// <p>A <see cref="ConditionalWeakTable{TKey,TValue}">ConditionalWeakTable</see> is preferable to a <see cref="Dictionary{TKey,TValue}">Dictionary</see> because a <c>Dictionary</c> will keep
/// orphaned references to an <see cref="ISkinnableDrawable"/> forever, unless manually pruned.</p>
/// <p><see cref="BindableBool"/> is used as a thin wrapper around <see cref="System.Boolean">bool</see> because <c>ConditionalWeakTable</c> requires a reference type as both a key and a value.</p>
/// <p><see cref="IDrawable"/> was chosen over <see cref="Drawable"/> because it is a common ancestor between <see cref="Drawable"/> (which is required for <see cref="Drawable.Anchor"/> logic)
/// and <see cref="ISkinnableDrawable"/> (which is required for serialization via <see cref="SkinnableInfo"/>).</p>
/// <p>This collection is thread-safe according to the
/// <a href="https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.conditionalweaktable-2?view=net-5.0#thread-safety">documentation</a>,
/// but the <c>BindableBool</c>s are not unless <see cref="Bindable{T}.BeginLease">leased</see>.</p>
/// </remarks>
private static readonly ConditionalWeakTable<IDrawable, BindableBool> is_drawable_using_closest_anchor_lookup = new ConditionalWeakTable<IDrawable, BindableBool>();
/// <summary>
/// Gets or creates a <see cref="BindableBool"/> representing whether <paramref name="drawable"/> is using the closest <see cref="Drawable.Anchor">anchor point</see> within its
/// <see cref="Drawable.Parent">parent</see>.
/// </summary>
/// <returns>A <see cref="BindableBool"/> whose <see cref="Bindable{T}.Value"/> is <see langword="true"/> if the <see cref="IDrawable"/> is using the closest anchor point,
/// otherwise <see langword="false"/>.</returns>
public static BindableBool UsingClosestAnchor(this IDrawable drawable) =>
is_drawable_using_closest_anchor_lookup.GetValue(drawable, _ => new BindableBool(true));
}
}