mirror of
https://github.com/ppy/osu.git
synced 2024-12-17 11:53:21 +08:00
shift alt seek to open next sample edit popover
This commit is contained in:
parent
98610f4f6d
commit
7d6ade7e84
@ -2,9 +2,7 @@
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using osu.Framework.Extensions;
|
||||
using osu.Framework.Graphics.UserInterface;
|
||||
using osu.Framework.Input.Events;
|
||||
using osu.Game.Audio;
|
||||
using osu.Game.Rulesets.Objects;
|
||||
using osu.Game.Rulesets.Objects.Types;
|
||||
@ -24,12 +22,10 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
||||
NodeIndex = nodeIndex;
|
||||
}
|
||||
|
||||
protected override bool OnDoubleClick(DoubleClickEvent e)
|
||||
protected override double GetTime()
|
||||
{
|
||||
var hasRepeats = (IHasRepeats)HitObject;
|
||||
EditorClock?.SeekSmoothlyTo(HitObject.StartTime + hasRepeats.Duration * NodeIndex / hasRepeats.SpanCount());
|
||||
this.ShowPopover();
|
||||
return true;
|
||||
return HitObject.StartTime + hasRepeats.Duration * NodeIndex / hasRepeats.SpanCount();
|
||||
}
|
||||
|
||||
protected override IList<HitSampleInfo> GetSamples()
|
||||
|
@ -21,6 +21,7 @@ using osu.Game.Graphics.UserInterfaceV2;
|
||||
using osu.Game.Rulesets.Objects;
|
||||
using osu.Game.Screens.Edit.Components.TernaryButtons;
|
||||
using osu.Game.Rulesets.Objects.Drawables;
|
||||
using osu.Game.Rulesets.Objects.Types;
|
||||
using osu.Game.Screens.Edit.Timing;
|
||||
using osuTK;
|
||||
using osuTK.Graphics;
|
||||
@ -33,7 +34,10 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
||||
public readonly HitObject HitObject;
|
||||
|
||||
[Resolved]
|
||||
protected EditorClock? EditorClock { get; private set; }
|
||||
private EditorClock? editorClock { get; set; }
|
||||
|
||||
[Resolved]
|
||||
private Editor? editor { get; set; }
|
||||
|
||||
public SamplePointPiece(HitObject hitObject)
|
||||
{
|
||||
@ -44,11 +48,30 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
||||
|
||||
protected override Color4 GetRepresentingColour(OsuColour colours) => AlternativeColor ? colours.Pink2 : colours.Pink1;
|
||||
|
||||
protected virtual double GetTime() => HitObject is IHasRepeats r ? HitObject.StartTime + r.Duration / r.SpanCount() / 2 : HitObject.StartTime;
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
private void load()
|
||||
{
|
||||
HitObject.DefaultsApplied += _ => updateText();
|
||||
updateText();
|
||||
|
||||
if (editor != null)
|
||||
editor.ShowSampleEditPopoverRequested += OnShowSampleEditPopoverRequested;
|
||||
}
|
||||
|
||||
protected override void Dispose(bool isDisposing)
|
||||
{
|
||||
base.Dispose(isDisposing);
|
||||
|
||||
if (editor != null)
|
||||
editor.ShowSampleEditPopoverRequested -= OnShowSampleEditPopoverRequested;
|
||||
}
|
||||
|
||||
private void OnShowSampleEditPopoverRequested(double time)
|
||||
{
|
||||
if (time == GetTime())
|
||||
this.ShowPopover();
|
||||
}
|
||||
|
||||
protected override bool OnClick(ClickEvent e)
|
||||
@ -59,7 +82,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
||||
|
||||
protected override bool OnDoubleClick(DoubleClickEvent e)
|
||||
{
|
||||
EditorClock?.SeekSmoothlyTo(HitObject.StartTime);
|
||||
editorClock?.SeekSmoothlyTo(GetTime());
|
||||
this.ShowPopover();
|
||||
return true;
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ using osu.Game.Overlays.OSD;
|
||||
using osu.Game.Rulesets;
|
||||
using osu.Game.Rulesets.Edit;
|
||||
using osu.Game.Rulesets.Objects;
|
||||
using osu.Game.Rulesets.Objects.Types;
|
||||
using osu.Game.Screens.Edit.Components.Menus;
|
||||
using osu.Game.Screens.Edit.Compose;
|
||||
using osu.Game.Screens.Edit.Compose.Components.Timeline;
|
||||
@ -1074,11 +1075,66 @@ namespace osu.Game.Screens.Edit
|
||||
clock.SeekSmoothlyTo(found.StartTime);
|
||||
}
|
||||
|
||||
[CanBeNull]
|
||||
public event Action<double> ShowSampleEditPopoverRequested;
|
||||
|
||||
private void seekSamplePoint(int direction)
|
||||
{
|
||||
double currentTime = clock.CurrentTimeAccurate;
|
||||
|
||||
var current = direction < 1
|
||||
? editorBeatmap.HitObjects.LastOrDefault(p => p is IHasRepeats r && p.StartTime < currentTime && r.EndTime >= currentTime)
|
||||
: editorBeatmap.HitObjects.LastOrDefault(p => p is IHasRepeats r && p.StartTime <= currentTime && r.EndTime > currentTime);
|
||||
|
||||
if (current == null)
|
||||
{
|
||||
if (direction < 1)
|
||||
{
|
||||
current = editorBeatmap.HitObjects.LastOrDefault(p => p.StartTime < currentTime);
|
||||
if (current != null)
|
||||
clock.SeekSmoothlyTo(current is IHasRepeats r ? r.EndTime : current.StartTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
current = editorBeatmap.HitObjects.FirstOrDefault(p => p.StartTime > currentTime);
|
||||
if (current != null)
|
||||
clock.SeekSmoothlyTo(current.StartTime);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Find the next node sample point
|
||||
var r = (IHasRepeats)current;
|
||||
double[] nodeSamplePointTimes = new double[r.RepeatCount + 3];
|
||||
|
||||
nodeSamplePointTimes[0] = current.StartTime;
|
||||
// The sample point for the main samples is sandwiched between the head and the first repeat
|
||||
nodeSamplePointTimes[1] = current.StartTime + r.Duration / r.SpanCount() / 2;
|
||||
|
||||
for (int i = 0; i < r.SpanCount(); i++)
|
||||
{
|
||||
nodeSamplePointTimes[i + 2] = current.StartTime + r.Duration / r.SpanCount() * (i + 1);
|
||||
}
|
||||
|
||||
double found = direction < 1
|
||||
? nodeSamplePointTimes.Last(p => p < currentTime)
|
||||
: nodeSamplePointTimes.First(p => p > currentTime);
|
||||
|
||||
clock.SeekSmoothlyTo(found);
|
||||
}
|
||||
|
||||
// Show the sample edit popover at the current time
|
||||
ShowSampleEditPopoverRequested?.Invoke(clock.CurrentTimeAccurate);
|
||||
}
|
||||
|
||||
private void seek(UIEvent e, int direction)
|
||||
{
|
||||
if (e.AltPressed)
|
||||
{
|
||||
seekHitObject(direction);
|
||||
if (e.ShiftPressed)
|
||||
seekSamplePoint(direction);
|
||||
else
|
||||
seekHitObject(direction);
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user