From ac02d1ab10a694da73f59f3f60eb5de33f16ba29 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Tue, 16 May 2017 17:50:09 +0900 Subject: [PATCH] TimeRelativeContainer -> ControlPointContainer, optimize AutoTimeRelativeContainer a little bit (only recompute on invalidation). --- .../Tests/TestCaseManiaPlayfield.cs | 4 +-- ...eContainer.cs => ControlPointContainer.cs} | 27 +++++++++++-------- osu.Game.Rulesets.Mania/UI/Column.cs | 4 +-- osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs | 4 +-- .../osu.Game.Rulesets.Mania.csproj | 2 +- 5 files changed, 23 insertions(+), 18 deletions(-) rename osu.Game.Rulesets.Mania/Timing/{TimeRelativeContainer.cs => ControlPointContainer.cs} (84%) diff --git a/osu.Desktop.VisualTests/Tests/TestCaseManiaPlayfield.cs b/osu.Desktop.VisualTests/Tests/TestCaseManiaPlayfield.cs index 459f4589b5..4b7efa7499 100644 --- a/osu.Desktop.VisualTests/Tests/TestCaseManiaPlayfield.cs +++ b/osu.Desktop.VisualTests/Tests/TestCaseManiaPlayfield.cs @@ -9,7 +9,7 @@ using osu.Game.Rulesets.Mania.UI; using System.Linq; using System; using System.Collections.Generic; -using osu.Game.Rulesets.Mania.Timing; +using osu.Game.Beatmaps.Timing; namespace osu.Desktop.VisualTests.Tests { @@ -28,7 +28,7 @@ namespace osu.Desktop.VisualTests.Tests Action createPlayfield = (cols, pos) => { Clear(); - Add(new ManiaPlayfield(cols, new List()) + Add(new ManiaPlayfield(cols, new List()) { Anchor = Anchor.Centre, Origin = Anchor.Centre, diff --git a/osu.Game.Rulesets.Mania/Timing/TimeRelativeContainer.cs b/osu.Game.Rulesets.Mania/Timing/ControlPointContainer.cs similarity index 84% rename from osu.Game.Rulesets.Mania/Timing/TimeRelativeContainer.cs rename to osu.Game.Rulesets.Mania/Timing/ControlPointContainer.cs index 5407b083df..769164a761 100644 --- a/osu.Game.Rulesets.Mania/Timing/TimeRelativeContainer.cs +++ b/osu.Game.Rulesets.Mania/Timing/ControlPointContainer.cs @@ -19,20 +19,16 @@ namespace osu.Game.Rulesets.Mania.Timing /// and as such, will scroll along with the s. /// /// - public class TimeRelativeContainer : Container + public class ControlPointContainer : Container { /// /// The amount of time which the height of this container spans. /// - public double TimeSpan - { - get { return RelativeCoordinateSpace.Y; } - set { RelativeCoordinateSpace = new Vector2(1, (float)value); } - } + public double TimeSpan { get; set; } private readonly List drawableTimingSections; - public TimeRelativeContainer(IEnumerable timingChanges) + public ControlPointContainer(IEnumerable timingChanges) { drawableTimingSections = timingChanges.Select(t => new DrawableTimingSection(t)).ToList(); @@ -99,10 +95,10 @@ namespace osu.Game.Rulesets.Mania.Timing protected override void Update() { - var parent = (TimeRelativeContainer)Parent; + var parent = (ControlPointContainer)Parent; // Adjust our height to account for the speed changes - Height = (float)(parent.TimeSpan * 1000 / timingChange.BeatLength / timingChange.SpeedMultiplier); + Height = (float)(1000 / timingChange.BeatLength / timingChange.SpeedMultiplier); RelativeCoordinateSpace = new Vector2(1, (float)parent.TimeSpan); // Scroll the content @@ -127,10 +123,19 @@ namespace osu.Game.Rulesets.Mania.Timing /// The drawable to check. public bool CanContain(Drawable drawable) => content.Y <= drawable.Y; + /// + /// A container which always keeps its height and relative coordinate space "auto-sized" to its children. + /// private class AutoTimeRelativeContainer : Container { - public override bool Invalidate(Invalidation invalidation = Invalidation.All, Drawable source = null, bool shallPropagate = true) + public override void InvalidateFromChild(Invalidation invalidation) { + if ((invalidation & Invalidation.Geometry) == 0) + { + base.InvalidateFromChild(invalidation); + return; + } + float height = 0; foreach (Drawable child in Children) @@ -143,7 +148,7 @@ namespace osu.Game.Rulesets.Mania.Timing Height = height; RelativeCoordinateSpace = new Vector2(1, height); - return base.Invalidate(invalidation, source, shallPropagate); + base.InvalidateFromChild(invalidation); } } } diff --git a/osu.Game.Rulesets.Mania/UI/Column.cs b/osu.Game.Rulesets.Mania/UI/Column.cs index 8491b631c5..b8a88263b9 100644 --- a/osu.Game.Rulesets.Mania/UI/Column.cs +++ b/osu.Game.Rulesets.Mania/UI/Column.cs @@ -40,7 +40,7 @@ namespace osu.Game.Rulesets.Mania.UI private readonly Container hitTargetBar; private readonly Container keyIcon; - public readonly TimeRelativeContainer TimingSectionContainer; + public readonly ControlPointContainer TimingSectionContainer; public Column(IEnumerable timingChanges) { @@ -91,7 +91,7 @@ namespace osu.Game.Rulesets.Mania.UI } } }, - TimingSectionContainer = new TimeRelativeContainer(timingChanges) + TimingSectionContainer = new ControlPointContainer(timingChanges) { Name = "Hit objects", RelativeSizeAxes = Axes.Both, diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index 1929bfdf7d..9caa852c9c 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -56,7 +56,7 @@ namespace osu.Game.Rulesets.Mania.UI public readonly FlowContainer Columns; - private readonly TimeRelativeContainer barlineContainer; + private readonly ControlPointContainer barlineContainer; private List normalColumnColours = new List(); private Color4 specialColumnColour; @@ -101,7 +101,7 @@ namespace osu.Game.Rulesets.Mania.UI Padding = new MarginPadding { Top = HIT_TARGET_POSITION }, Children = new[] { - barlineContainer = new TimeRelativeContainer(timingChanges) + barlineContainer = new ControlPointContainer(timingChanges) { Name = "Bar lines", RelativeSizeAxes = Axes.Both, diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj index 70c875fd34..00deaba85d 100644 --- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj +++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj @@ -68,7 +68,7 @@ - +