mirror of
https://github.com/ppy/osu.git
synced 2025-02-06 09:33:12 +08:00
Merge pull request #2339 from smoogipoo/scalablecontainer-size-fix
Fix ScalableContainer irrepairably altering content size
This commit is contained in:
commit
8eefddd475
@ -30,10 +30,10 @@ namespace osu.Game.Rulesets.Catch.UI
|
|||||||
Anchor = Anchor.TopCentre;
|
Anchor = Anchor.TopCentre;
|
||||||
Origin = Anchor.TopCentre;
|
Origin = Anchor.TopCentre;
|
||||||
|
|
||||||
ScaledContent.Anchor = Anchor.BottomLeft;
|
base.Content.Anchor = Anchor.BottomLeft;
|
||||||
ScaledContent.Origin = Anchor.BottomLeft;
|
base.Content.Origin = Anchor.BottomLeft;
|
||||||
|
|
||||||
ScaledContent.AddRange(new Drawable[]
|
base.Content.AddRange(new Drawable[]
|
||||||
{
|
{
|
||||||
explodingFruitContainer = new Container
|
explodingFruitContainer = new Container
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ namespace osu.Game.Rulesets.Osu.Replays
|
|||||||
{
|
{
|
||||||
new ReplayState<OsuAction>
|
new ReplayState<OsuAction>
|
||||||
{
|
{
|
||||||
Mouse = new ReplayMouseState(ToScreenSpace(Position ?? Vector2.Zero)),
|
Mouse = new ReplayMouseState(GamefieldToScreenSpace(Position ?? Vector2.Zero)),
|
||||||
PressedActions = CurrentFrame.Actions
|
PressedActions = CurrentFrame.Actions
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -122,7 +122,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
Direction = direction;
|
Direction = direction;
|
||||||
|
|
||||||
Padding = new MarginPadding(2);
|
Padding = new MarginPadding(2);
|
||||||
ScaledContent.Masking = true;
|
Content.Masking = true;
|
||||||
|
|
||||||
AddInternal(new Box
|
AddInternal(new Box
|
||||||
{
|
{
|
||||||
|
@ -13,9 +13,9 @@ namespace osu.Game.Input.Handlers
|
|||||||
public abstract class ReplayInputHandler : InputHandler
|
public abstract class ReplayInputHandler : InputHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A function provided to convert replay coordinates from gamefield to screen space.
|
/// A function that converts coordinates from gamefield to screen space.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Func<Vector2, Vector2> ToScreenSpace { protected get; set; }
|
public Func<Vector2, Vector2> GamefieldToScreenSpace { protected get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the current frame based on an incoming time value.
|
/// Update the current frame based on an incoming time value.
|
||||||
|
@ -290,7 +290,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
base.SetReplay(replay);
|
base.SetReplay(replay);
|
||||||
|
|
||||||
if (ReplayInputManager?.ReplayInputHandler != null)
|
if (ReplayInputManager?.ReplayInputHandler != null)
|
||||||
ReplayInputManager.ReplayInputHandler.ToScreenSpace = input => Playfield.ScaledContent.ToScreenSpace(input);
|
ReplayInputManager.ReplayInputHandler.GamefieldToScreenSpace = Playfield.GamefieldToScreenSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
@ -12,13 +13,16 @@ namespace osu.Game.Rulesets.UI
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ScalableContainer : Container
|
public class ScalableContainer : Container
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A function that converts coordinates from gamefield to screen space.
|
||||||
|
/// </summary>
|
||||||
|
public Func<Vector2, Vector2> GamefieldToScreenSpace => scaledContent.GamefieldToScreenSpace;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The scaled content.
|
/// The scaled content.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly Container ScaledContent;
|
private readonly ScaledContainer scaledContent;
|
||||||
|
protected override Container<Drawable> Content => scaledContent;
|
||||||
protected override Container<Drawable> Content => content;
|
|
||||||
private readonly Container content;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A <see cref="Container"/> which can have its internal coordinate system scaled to a specific size.
|
/// A <see cref="Container"/> which can have its internal coordinate system scaled to a specific size.
|
||||||
@ -31,17 +35,21 @@ namespace osu.Game.Rulesets.UI
|
|||||||
/// </param>
|
/// </param>
|
||||||
public ScalableContainer(float? customWidth = null, float? customHeight = null)
|
public ScalableContainer(float? customWidth = null, float? customHeight = null)
|
||||||
{
|
{
|
||||||
AddInternal(ScaledContent = new ScaledContainer
|
AddInternal(scaledContent = new ScaledContainer
|
||||||
{
|
{
|
||||||
CustomWidth = customWidth,
|
CustomWidth = customWidth,
|
||||||
CustomHeight = customHeight,
|
CustomHeight = customHeight,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Child = content = new Container { RelativeSizeAxes = Axes.Both }
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ScaledContainer : Container
|
private class ScaledContainer : Container
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A function that converts coordinates from gamefield to screen space.
|
||||||
|
/// </summary>
|
||||||
|
public Func<Vector2, Vector2> GamefieldToScreenSpace => content.ToScreenSpace;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The value to scale the width of the content to match.
|
/// The value to scale the width of the content to match.
|
||||||
/// If null, <see cref="CustomHeight"/> is used.
|
/// If null, <see cref="CustomHeight"/> is used.
|
||||||
@ -54,6 +62,22 @@ namespace osu.Game.Rulesets.UI
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public float? CustomHeight;
|
public float? CustomHeight;
|
||||||
|
|
||||||
|
private readonly Container content;
|
||||||
|
protected override Container<Drawable> Content => content;
|
||||||
|
|
||||||
|
public ScaledContainer()
|
||||||
|
{
|
||||||
|
AddInternal(content = new Container { RelativeSizeAxes = Axes.Both });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Update()
|
||||||
|
{
|
||||||
|
base.Update();
|
||||||
|
|
||||||
|
content.Scale = sizeScale;
|
||||||
|
content.Size = Vector2.Divide(Vector2.One, sizeScale);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The scale that is required for the size of the content to match <see cref="CustomWidth"/> and <see cref="CustomHeight"/>.
|
/// The scale that is required for the size of the content to match <see cref="CustomWidth"/> and <see cref="CustomHeight"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -70,17 +94,6 @@ namespace osu.Game.Rulesets.UI
|
|||||||
return Vector2.One;
|
return Vector2.One;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Scale the content to the required container size by multiplying by <see cref="sizeScale"/>.
|
|
||||||
/// </summary>
|
|
||||||
protected override Vector2 DrawScale => sizeScale * base.DrawScale;
|
|
||||||
|
|
||||||
protected override void Update()
|
|
||||||
{
|
|
||||||
base.Update();
|
|
||||||
RelativeChildSize = new Vector2(CustomWidth.HasValue ? sizeScale.X : RelativeChildSize.X, CustomHeight.HasValue ? sizeScale.Y : RelativeChildSize.Y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user