diff --git a/osu.Game/Overlays/SkinEditor/SkinEditor.cs b/osu.Game/Overlays/SkinEditor/SkinEditor.cs index 690c6b35e3..5bf28ae79b 100644 --- a/osu.Game/Overlays/SkinEditor/SkinEditor.cs +++ b/osu.Game/Overlays/SkinEditor/SkinEditor.cs @@ -457,7 +457,7 @@ namespace osu.Game.Overlays.SkinEditor } SelectedComponents.Add(component); - SkinSelectionHandler.ApplyClosestAnchor(drawableComponent); + SkinSelectionHandler.ApplyClosestAnchorOrigin(drawableComponent); return true; } diff --git a/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs b/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs index cf6fb60636..f41bad4716 100644 --- a/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs +++ b/osu.Game/Overlays/SkinEditor/SkinSelectionHandler.cs @@ -204,15 +204,20 @@ namespace osu.Game.Overlays.SkinEditor drawable.Position += drawable.ScreenSpaceDeltaToParentSpace(moveEvent.ScreenSpaceDelta); - if (item.UsesFixedAnchor) continue; - - ApplyClosestAnchor(drawable); + if (!item.UsesFixedAnchor) + ApplyClosestAnchorOrigin(drawable); } return true; } - public static void ApplyClosestAnchor(Drawable drawable) => applyAnchor(drawable, getClosestAnchor(drawable)); + public static void ApplyClosestAnchorOrigin(Drawable drawable) + { + var closest = getClosestAnchor(drawable); + + applyAnchor(drawable, closest); + applyOrigin(drawable, closest); + } protected override void OnSelectionChanged() { @@ -325,15 +330,10 @@ namespace osu.Game.Overlays.SkinEditor { var drawable = (Drawable)item; - if (origin == drawable.Origin) continue; + applyOrigin(drawable, origin); - var previousOrigin = drawable.OriginPosition; - drawable.Origin = origin; - drawable.Position += drawable.OriginPosition - previousOrigin; - - if (item.UsesFixedAnchor) continue; - - ApplyClosestAnchor(drawable); + if (item.UsesFixedAnchor) + ApplyClosestAnchorOrigin(drawable); } OnOperationEnded(); @@ -368,7 +368,7 @@ namespace osu.Game.Overlays.SkinEditor foreach (var item in SelectedItems) { item.UsesFixedAnchor = false; - ApplyClosestAnchor((Drawable)item); + ApplyClosestAnchorOrigin((Drawable)item); } OnOperationEnded(); @@ -414,6 +414,15 @@ namespace osu.Game.Overlays.SkinEditor drawable.Position -= drawable.AnchorPosition - previousAnchor; } + private static void applyOrigin(Drawable drawable, Anchor origin) + { + if (origin == drawable.Origin) return; + + var previousOrigin = drawable.OriginPosition; + drawable.Origin = origin; + drawable.Position += drawable.OriginPosition - previousOrigin; + } + private static void adjustScaleFromAnchor(ref Vector2 scale, Anchor reference) { // cancel out scale in axes we don't care about (based on which drag handle was used).