diff --git a/osu.Game/Overlays/SkinEditor/SkinEditor.cs b/osu.Game/Overlays/SkinEditor/SkinEditor.cs
index f972186333..cc1e5b26ec 100644
--- a/osu.Game/Overlays/SkinEditor/SkinEditor.cs
+++ b/osu.Game/Overlays/SkinEditor/SkinEditor.cs
@@ -441,6 +441,9 @@ namespace osu.Game.Overlays.SkinEditor
drawableComponent.Origin = Anchor.TopCentre;
drawableComponent.Anchor = Anchor.TopCentre;
drawableComponent.Y = targetContainer.DrawSize.Y / 2;
+
+ if (!component.SupportsClosestAnchor)
+ component.UsesFixedAnchor = true;
}
try
diff --git a/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs b/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs
index cf6fb60636..208bd71005 100644
--- a/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs
+++ b/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs
@@ -233,7 +233,8 @@ namespace osu.Game.Overlays.SkinEditor
{
var closestItem = new TernaryStateRadioMenuItem("Closest", MenuItemType.Standard, _ => applyClosestAnchors())
{
- State = { Value = GetStateFromSelection(selection, c => !c.Item.UsesFixedAnchor) }
+ State = { Value = GetStateFromSelection(selection, c => !c.Item.UsesFixedAnchor), },
+ Action = { Disabled = selection.Any(c => !c.Item.SupportsClosestAnchor) },
};
yield return new OsuMenuItem("Anchor")
diff --git a/osu.Game/Skinning/ISerialisableDrawable.cs b/osu.Game/Skinning/ISerialisableDrawable.cs
index c9dcaca6d1..898186bcc1 100644
--- a/osu.Game/Skinning/ISerialisableDrawable.cs
+++ b/osu.Game/Skinning/ISerialisableDrawable.cs
@@ -27,6 +27,14 @@ namespace osu.Game.Skinning
///
bool IsEditable => true;
+ ///
+ /// Whether this component supports the "closest" anchor.
+ ///
+ ///
+ /// This is disabled by some components that shift position automatically.
+ ///
+ bool SupportsClosestAnchor => true;
+
///
/// In the context of the skin layout editor, whether this has a permanent anchor defined.
/// If , this 's is automatically determined by proximity,