1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-06 11:25:25 +08:00

Merge pull request #2339 from smoogipoo/scalablecontainer-size-fix

Fix ScalableContainer irrepairably altering content size
This commit is contained in:
Dean Herbert 2018-04-03 12:02:56 +09:00 committed by GitHub
commit 8eefddd475
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 38 additions and 25 deletions

View File

@ -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
{ {

View File

@ -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
} }
}; };

View File

@ -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
{ {

View File

@ -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.

View File

@ -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>

View File

@ -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);
}
} }
} }
} }