diff --git a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
index d7aa0bcf96..115aa60446 100644
--- a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
+++ b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/MarkerPart.cs
@@ -7,7 +7,6 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Input;
-using osu.Game.Beatmaps;
using osu.Game.Graphics;
namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
@@ -17,8 +16,6 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
///
internal class MarkerPart : TimelinePart
{
- private WorkingBeatmap beatmap;
-
private readonly Drawable marker;
public MarkerPart()
@@ -32,11 +29,6 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
marker.Colour = colours.Red;
}
- protected override void LoadBeatmap(WorkingBeatmap beatmap)
- {
- this.beatmap = beatmap;
- }
-
protected override bool OnDragStart(InputState state) => true;
protected override bool OnDragEnd(InputState state) => true;
protected override bool OnDrag(InputState state)
@@ -57,16 +49,22 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
/// The position in screen coordinates.
private void seekToPosition(Vector2 screenPosition)
{
+ if (Beatmap.Value == null)
+ return;
+
float markerPos = MathHelper.Clamp(ToLocalSpace(screenPosition).X, 0, DrawWidth);
- seekTo(markerPos / DrawWidth * beatmap.Track.Length);
+ seekTo(markerPos / DrawWidth * Beatmap.Value.Track.Length);
}
- private void seekTo(double time) => beatmap.Track.Seek(time);
+ private void seekTo(double time) => Beatmap.Value?.Track.Seek(time);
protected override void Update()
{
base.Update();
- marker.X = (float)beatmap.Track.CurrentTime;
+
+ if (Beatmap.Value == null)
+ return;
+ marker.X = (float)Beatmap.Value.Track.CurrentTime;
}
private class MarkerVisualisation : CompositeDrawable
@@ -80,27 +78,27 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
AutoSizeAxes = Axes.X;
InternalChildren = new Drawable[]
{
- new Triangle
- {
- Anchor = Anchor.TopCentre,
- Origin = Anchor.BottomCentre,
- Scale = new Vector2(1, -1),
- Size = new Vector2(10, 5),
- },
- new Triangle
- {
- Anchor = Anchor.BottomCentre,
- Origin = Anchor.BottomCentre,
- Size = new Vector2(10, 5)
- },
- new Box
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- RelativeSizeAxes = Axes.Y,
- Width = 2,
- EdgeSmoothness = new Vector2(1, 0)
- }
+ new Triangle
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.BottomCentre,
+ Scale = new Vector2(1, -1),
+ Size = new Vector2(10, 5),
+ },
+ new Triangle
+ {
+ Anchor = Anchor.BottomCentre,
+ Origin = Anchor.BottomCentre,
+ Size = new Vector2(10, 5)
+ },
+ new Box
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Y,
+ Width = 2,
+ EdgeSmoothness = new Vector2(1, 0)
+ }
};
}
diff --git a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/TimelinePart.cs b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/TimelinePart.cs
index be3b116711..f5d4124b19 100644
--- a/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/TimelinePart.cs
+++ b/osu.Game/Screens/Edit/Components/Timelines/Summary/Parts/TimelinePart.cs
@@ -3,7 +3,7 @@
using System;
using OpenTK;
-using osu.Framework.Allocation;
+using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps;
@@ -15,29 +15,26 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary.Parts
///
internal abstract class TimelinePart : CompositeDrawable
{
+ public Bindable Beatmap = new Bindable();
+
private readonly Container timeline;
protected TimelinePart()
{
AddInternal(timeline = new Container { RelativeSizeAxes = Axes.Both });
- }
- [BackgroundDependencyLoader]
- private void load(OsuGameBase osuGame)
- {
- osuGame.Beatmap.ValueChanged += b =>
+ Beatmap.ValueChanged += b =>
{
timeline.Clear();
timeline.RelativeChildSize = new Vector2((float)Math.Max(1, b.Track.Length), 1);
LoadBeatmap(b);
};
-
- timeline.RelativeChildSize = new Vector2((float)Math.Max(1, osuGame.Beatmap.Value.Track.Length), 1);
- LoadBeatmap(osuGame.Beatmap);
}
protected void Add(Drawable visualisation) => timeline.Add(visualisation);
- protected abstract void LoadBeatmap(WorkingBeatmap beatmap);
+ protected virtual void LoadBeatmap(WorkingBeatmap beatmap)
+ {
+ }
}
}
diff --git a/osu.Game/Screens/Edit/Components/Timelines/Summary/SummaryTimeline.cs b/osu.Game/Screens/Edit/Components/Timelines/Summary/SummaryTimeline.cs
index 0712936bf9..4d925f7584 100644
--- a/osu.Game/Screens/Edit/Components/Timelines/Summary/SummaryTimeline.cs
+++ b/osu.Game/Screens/Edit/Components/Timelines/Summary/SummaryTimeline.cs
@@ -3,9 +3,11 @@
using OpenTK;
using osu.Framework.Allocation;
+using osu.Framework.Configuration;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
+using osu.Game.Beatmaps;
using osu.Game.Graphics;
using osu.Game.Screens.Edit.Components.Timelines.Summary.Parts;
@@ -19,6 +21,8 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary
private const float corner_radius = 5;
private const float contents_padding = 15;
+ public Bindable Beatmap = new Bindable();
+
private readonly Drawable background;
private readonly Drawable timelineBar;
@@ -28,67 +32,74 @@ namespace osu.Game.Screens.Edit.Components.Timelines.Summary
Masking = true;
CornerRadius = corner_radius;
+ TimelinePart markerPart, controlPointPart, bookmarkPart, breakPart;
+
InternalChildren = new[]
{
- background = new Box { RelativeSizeAxes = Axes.Both },
- new Container
+ background = new Box { RelativeSizeAxes = Axes.Both },
+ new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Padding = new MarginPadding { Left = contents_padding, Right = contents_padding },
+ Children = new[]
{
- RelativeSizeAxes = Axes.Both,
- Padding = new MarginPadding { Left = contents_padding, Right = contents_padding },
- Children = new[]
+ markerPart = new MarkerPart { RelativeSizeAxes = Axes.Both },
+ controlPointPart = new ControlPointPart
{
- new MarkerPart { RelativeSizeAxes = Axes.Both },
- new ControlPointPart
+ Anchor = Anchor.Centre,
+ Origin = Anchor.BottomCentre,
+ RelativeSizeAxes = Axes.Both,
+ Height = 0.35f
+ },
+ bookmarkPart = new BookmarkPart
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.TopCentre,
+ RelativeSizeAxes = Axes.Both,
+ Height = 0.35f
+ },
+ timelineBar = new Container
+ {
+ RelativeSizeAxes = Axes.Both,
+ Children = new Drawable[]
{
- Anchor = Anchor.Centre,
- Origin = Anchor.BottomCentre,
- RelativeSizeAxes = Axes.Both,
- Height = 0.35f
- },
- new BookmarkPart
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.TopCentre,
- RelativeSizeAxes = Axes.Both,
- Height = 0.35f
- },
- timelineBar = new Container
- {
- RelativeSizeAxes = Axes.Both,
- Children = new Drawable[]
+ new Circle
{
- new Circle
- {
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.CentreRight,
- Size = new Vector2(5)
- },
- new Box
- {
- Anchor = Anchor.CentreLeft,
- Origin = Anchor.CentreLeft,
- RelativeSizeAxes = Axes.X,
- Height = 1,
- EdgeSmoothness = new Vector2(0, 1),
- },
- new Circle
- {
- Anchor = Anchor.CentreRight,
- Origin = Anchor.CentreLeft,
- Size = new Vector2(5)
- },
- }
- },
- new BreakPart
- {
- Anchor = Anchor.Centre,
- Origin = Anchor.Centre,
- RelativeSizeAxes = Axes.Both,
- Height = 0.25f
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreRight,
+ Size = new Vector2(5)
+ },
+ new Box
+ {
+ Anchor = Anchor.CentreLeft,
+ Origin = Anchor.CentreLeft,
+ RelativeSizeAxes = Axes.X,
+ Height = 1,
+ EdgeSmoothness = new Vector2(0, 1),
+ },
+ new Circle
+ {
+ Anchor = Anchor.CentreRight,
+ Origin = Anchor.CentreLeft,
+ Size = new Vector2(5)
+ },
}
+ },
+ breakPart = new BreakPart
+ {
+ Anchor = Anchor.Centre,
+ Origin = Anchor.Centre,
+ RelativeSizeAxes = Axes.Both,
+ Height = 0.25f
}
}
- };
+ }
+ };
+
+ markerPart.Beatmap.BindTo(Beatmap);
+ controlPointPart.Beatmap.BindTo(Beatmap);
+ bookmarkPart.Beatmap.BindTo(Beatmap);
+ breakPart.Beatmap.BindTo(Beatmap);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index 7afbbc33bb..3ffd7754c1 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -190,6 +190,7 @@ namespace osu.Game.Screens.Edit
}
});
+ SummaryTimeline summaryTimeline;
Add(new Container
{
Anchor = Anchor.BottomLeft,
@@ -211,7 +212,7 @@ namespace osu.Game.Screens.Edit
Spacing = new Vector2(10, 0),
Children = new[]
{
- new SummaryTimeline
+ summaryTimeline = new SummaryTimeline
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
@@ -223,6 +224,8 @@ namespace osu.Game.Screens.Edit
}
}
});
+
+ summaryTimeline.Beatmap.BindTo(Beatmap);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Tests/Visual/TestCaseEditorSummaryTimeline.cs b/osu.Game/Tests/Visual/TestCaseEditorSummaryTimeline.cs
index 59037ce151..c35355aefd 100644
--- a/osu.Game/Tests/Visual/TestCaseEditorSummaryTimeline.cs
+++ b/osu.Game/Tests/Visual/TestCaseEditorSummaryTimeline.cs
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
-using osu.Framework.Allocation;
using osu.Framework.Audio.Track;
using osu.Framework.Graphics.Textures;
using osu.Framework.Graphics;
@@ -11,6 +10,7 @@ using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using OpenTK;
using osu.Game.Screens.Edit.Components.Timelines.Summary;
+using osu.Framework.Configuration;
namespace osu.Game.Tests.Visual
{
@@ -21,40 +21,48 @@ namespace osu.Game.Tests.Visual
public override IReadOnlyList RequiredTypes => new[] { typeof(SummaryTimeline) };
+ private readonly Bindable beatmap = new Bindable();
+
public TestCaseEditorSummaryTimeline()
{
random = new Random(1337);
- Add(new SummaryTimeline
+ SummaryTimeline summaryTimeline;
+ Add(summaryTimeline = new SummaryTimeline
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Size = new Vector2(500, 50)
});
+
+ summaryTimeline.Beatmap.BindTo(beatmap);
+
+ AddStep("New beatmap", newBeatmap);
+
+ newBeatmap();
}
- [BackgroundDependencyLoader]
- private void load(OsuGameBase osuGame)
+ private void newBeatmap()
{
- var beatmap = new Beatmap();
+ var b = new Beatmap();
for (int i = 0; i < random.Next(1, 10); i++)
- beatmap.ControlPointInfo.TimingPoints.Add(new TimingControlPoint { Time = random.Next(0, length) });
+ b.ControlPointInfo.TimingPoints.Add(new TimingControlPoint { Time = random.Next(0, length) });
for (int i = 0; i < random.Next(1, 5); i++)
- beatmap.ControlPointInfo.DifficultyPoints.Add(new DifficultyControlPoint { Time = random.Next(0, length) });
+ b.ControlPointInfo.DifficultyPoints.Add(new DifficultyControlPoint { Time = random.Next(0, length) });
for (int i = 0; i < random.Next(1, 5); i++)
- beatmap.ControlPointInfo.EffectPoints.Add(new EffectControlPoint { Time = random.Next(0, length) });
+ b.ControlPointInfo.EffectPoints.Add(new EffectControlPoint { Time = random.Next(0, length) });
for (int i = 0; i < random.Next(1, 5); i++)
- beatmap.ControlPointInfo.SoundPoints.Add(new SoundControlPoint { Time = random.Next(0, length) });
+ b.ControlPointInfo.SoundPoints.Add(new SoundControlPoint { Time = random.Next(0, length) });
- beatmap.BeatmapInfo.Bookmarks = new int[random.Next(10, 30)];
- for (int i = 0; i < beatmap.BeatmapInfo.Bookmarks.Length; i++)
- beatmap.BeatmapInfo.Bookmarks[i] = random.Next(0, length);
+ b.BeatmapInfo.Bookmarks = new int[random.Next(10, 30)];
+ for (int i = 0; i < b.BeatmapInfo.Bookmarks.Length; i++)
+ b.BeatmapInfo.Bookmarks[i] = random.Next(0, length);
- osuGame.Beatmap.Value = new TestWorkingBeatmap(beatmap);
+ beatmap.Value = new TestWorkingBeatmap(b);
}
private class TestWorkingBeatmap : WorkingBeatmap