Merge pull request #16613 from frenzibyte/improve-timeline-zoom

Decrease default timeline zoom and add saving support
This commit is contained in:
Dean Herbert
2022-01-26 04:07:56 +09:00
committed by GitHub
3 changed files with 56 additions and 26 deletions

View File

@ -47,25 +47,25 @@ namespace osu.Game.Tests.Visual.Editing
AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects = new[] AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects = new[]
{ {
new HitCircle { StartTime = 100 }, new HitCircle { StartTime = 500 },
new HitCircle { StartTime = 200, Position = new Vector2(100) }, new HitCircle { StartTime = 1000, Position = new Vector2(100) },
new HitCircle { StartTime = 300, Position = new Vector2(200) }, new HitCircle { StartTime = 1500, Position = new Vector2(200) },
new HitCircle { StartTime = 400, Position = new Vector2(300) }, new HitCircle { StartTime = 2000, Position = new Vector2(300) },
})); }));
AddStep("select objects", () => EditorBeatmap.SelectedHitObjects.AddRange(addedObjects)); AddStep("select objects", () => EditorBeatmap.SelectedHitObjects.AddRange(addedObjects));
AddStep("nudge forwards", () => InputManager.Key(Key.K)); AddStep("nudge forwards", () => InputManager.Key(Key.K));
AddAssert("objects moved forwards in time", () => addedObjects[0].StartTime > 100); AddAssert("objects moved forwards in time", () => addedObjects[0].StartTime > 500);
AddStep("nudge backwards", () => InputManager.Key(Key.J)); AddStep("nudge backwards", () => InputManager.Key(Key.J));
AddAssert("objects reverted to original position", () => addedObjects[0].StartTime == 100); AddAssert("objects reverted to original position", () => addedObjects[0].StartTime == 500);
} }
[Test] [Test]
public void TestBasicSelect() public void TestBasicSelect()
{ {
var addedObject = new HitCircle { StartTime = 100 }; var addedObject = new HitCircle { StartTime = 500 };
AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("add hitobject", () => EditorBeatmap.Add(addedObject));
moveMouseToObject(() => addedObject); moveMouseToObject(() => addedObject);
@ -75,7 +75,7 @@ namespace osu.Game.Tests.Visual.Editing
var addedObject2 = new HitCircle var addedObject2 = new HitCircle
{ {
StartTime = 200, StartTime = 1000,
Position = new Vector2(100), Position = new Vector2(100),
}; };
@ -92,10 +92,10 @@ namespace osu.Game.Tests.Visual.Editing
{ {
var addedObjects = new[] var addedObjects = new[]
{ {
new HitCircle { StartTime = 100 }, new HitCircle { StartTime = 500 },
new HitCircle { StartTime = 200, Position = new Vector2(100) }, new HitCircle { StartTime = 1000, Position = new Vector2(100) },
new HitCircle { StartTime = 300, Position = new Vector2(200) }, new HitCircle { StartTime = 1500, Position = new Vector2(200) },
new HitCircle { StartTime = 400, Position = new Vector2(300) }, new HitCircle { StartTime = 2000, Position = new Vector2(300) },
}; };
AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects)); AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects));
@ -125,7 +125,7 @@ namespace osu.Game.Tests.Visual.Editing
[Test] [Test]
public void TestBasicDeselect() public void TestBasicDeselect()
{ {
var addedObject = new HitCircle { StartTime = 100 }; var addedObject = new HitCircle { StartTime = 500 };
AddStep("add hitobject", () => EditorBeatmap.Add(addedObject)); AddStep("add hitobject", () => EditorBeatmap.Add(addedObject));
moveMouseToObject(() => addedObject); moveMouseToObject(() => addedObject);
@ -166,11 +166,11 @@ namespace osu.Game.Tests.Visual.Editing
{ {
var addedObjects = new[] var addedObjects = new[]
{ {
new HitCircle { StartTime = 100 }, new HitCircle { StartTime = 500 },
new HitCircle { StartTime = 200, Position = new Vector2(100) }, new HitCircle { StartTime = 1000, Position = new Vector2(100) },
new HitCircle { StartTime = 300, Position = new Vector2(200) }, new HitCircle { StartTime = 1500, Position = new Vector2(200) },
new HitCircle { StartTime = 400, Position = new Vector2(300) }, new HitCircle { StartTime = 2000, Position = new Vector2(300) },
new HitCircle { StartTime = 500, Position = new Vector2(400) }, new HitCircle { StartTime = 2500, Position = new Vector2(400) },
}; };
AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects)); AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects));
@ -236,10 +236,10 @@ namespace osu.Game.Tests.Visual.Editing
{ {
var addedObjects = new[] var addedObjects = new[]
{ {
new HitCircle { StartTime = 100 }, new HitCircle { StartTime = 500 },
new HitCircle { StartTime = 200, Position = new Vector2(100) }, new HitCircle { StartTime = 1000, Position = new Vector2(100) },
new HitCircle { StartTime = 300, Position = new Vector2(200) }, new HitCircle { StartTime = 1500, Position = new Vector2(200) },
new HitCircle { StartTime = 400, Position = new Vector2(300) }, new HitCircle { StartTime = 2000, Position = new Vector2(300) },
}; };
AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects)); AddStep("add hitobjects", () => EditorBeatmap.AddRange(addedObjects));

View File

@ -24,7 +24,11 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
[Cached] [Cached]
public class Timeline : ZoomableScrollContainer, IPositionSnapProvider public class Timeline : ZoomableScrollContainer, IPositionSnapProvider
{ {
private const float timeline_height = 72;
private const float timeline_expanded_height = 94;
private readonly Drawable userContent; private readonly Drawable userContent;
public readonly Bindable<bool> WaveformVisible = new Bindable<bool>(); public readonly Bindable<bool> WaveformVisible = new Bindable<bool>();
public readonly Bindable<bool> ControlPointsVisible = new Bindable<bool>(); public readonly Bindable<bool> ControlPointsVisible = new Bindable<bool>();
@ -58,8 +62,12 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
private Track track; private Track track;
private const float timeline_height = 72; /// <summary>
private const float timeline_expanded_height = 94; /// The timeline zoom level at a 1x zoom scale.
/// </summary>
private float defaultTimelineZoom;
private readonly Bindable<double> timelineZoomScale = new BindableDouble(1.0);
public Timeline(Drawable userContent) public Timeline(Drawable userContent)
{ {
@ -84,7 +92,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
private Bindable<float> waveformOpacity; private Bindable<float> waveformOpacity;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(IBindable<WorkingBeatmap> beatmap, OsuColour colours, OsuConfigManager config) private void load(IBindable<WorkingBeatmap> beatmap, EditorBeatmap editorBeatmap, OsuColour colours, OsuConfigManager config)
{ {
CentreMarker centreMarker; CentreMarker centreMarker;
@ -141,9 +149,16 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
{ {
MaxZoom = getZoomLevelForVisibleMilliseconds(500); MaxZoom = getZoomLevelForVisibleMilliseconds(500);
MinZoom = getZoomLevelForVisibleMilliseconds(10000); MinZoom = getZoomLevelForVisibleMilliseconds(10000);
Zoom = getZoomLevelForVisibleMilliseconds(2000); defaultTimelineZoom = getZoomLevelForVisibleMilliseconds(6000);
} }
}, true); }, true);
timelineZoomScale.Value = editorBeatmap.BeatmapInfo.TimelineZoom;
timelineZoomScale.BindValueChanged(scale =>
{
Zoom = (float)(defaultTimelineZoom * scale.NewValue);
editorBeatmap.BeatmapInfo.TimelineZoom = scale.NewValue;
}, true);
} }
protected override void LoadComplete() protected override void LoadComplete()
@ -201,6 +216,12 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
return base.OnScroll(e); return base.OnScroll(e);
} }
protected override void OnZoomChanged()
{
base.OnZoomChanged();
timelineZoomScale.Value = Zoom / defaultTimelineZoom;
}
protected override void UpdateAfterChildren() protected override void UpdateAfterChildren()
{ {
base.UpdateAfterChildren(); base.UpdateAfterChildren();

View File

@ -136,11 +136,20 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
{ {
zoomTarget = Math.Clamp(newZoom, MinZoom, MaxZoom); zoomTarget = Math.Clamp(newZoom, MinZoom, MaxZoom);
transformZoomTo(zoomTarget, focusPoint, ZoomDuration, ZoomEasing); transformZoomTo(zoomTarget, focusPoint, ZoomDuration, ZoomEasing);
OnZoomChanged();
} }
private void transformZoomTo(float newZoom, float focusPoint, double duration = 0, Easing easing = Easing.None) private void transformZoomTo(float newZoom, float focusPoint, double duration = 0, Easing easing = Easing.None)
=> this.TransformTo(this.PopulateTransform(new TransformZoom(focusPoint, zoomedContent.DrawWidth, Current), newZoom, duration, easing)); => this.TransformTo(this.PopulateTransform(new TransformZoom(focusPoint, zoomedContent.DrawWidth, Current), newZoom, duration, easing));
/// <summary>
/// Invoked when <see cref="Zoom"/> has changed.
/// </summary>
protected virtual void OnZoomChanged()
{
}
private class TransformZoom : Transform<float, ZoomableScrollContainer> private class TransformZoom : Transform<float, ZoomableScrollContainer>
{ {
/// <summary> /// <summary>