mirror of
https://github.com/ppy/osu.git
synced 2025-02-16 05:03:02 +08:00
Merge pull request #7753 from peppy/placement-display-in-timeline
Show current placement blueprint in timeline
This commit is contained in:
commit
36414e9a53
@ -56,7 +56,7 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
|
|||||||
|
|
||||||
protected override void OnMouseUp(MouseUpEvent e)
|
protected override void OnMouseUp(MouseUpEvent e)
|
||||||
{
|
{
|
||||||
EndPlacement();
|
EndPlacement(true);
|
||||||
base.OnMouseUp(e);
|
base.OnMouseUp(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,12 +30,13 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.HitCircles
|
|||||||
|
|
||||||
protected override bool OnClick(ClickEvent e)
|
protected override bool OnClick(ClickEvent e)
|
||||||
{
|
{
|
||||||
EndPlacement();
|
EndPlacement(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UpdatePosition(Vector2 screenSpacePosition)
|
public override void UpdatePosition(Vector2 screenSpacePosition)
|
||||||
{
|
{
|
||||||
|
BeginPlacement();
|
||||||
HitObject.Position = ToLocalSpace(screenSpacePosition);
|
HitObject.Position = ToLocalSpace(screenSpacePosition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case PlacementState.Initial:
|
case PlacementState.Initial:
|
||||||
|
BeginPlacement();
|
||||||
HitObject.Position = ToLocalSpace(screenSpacePosition);
|
HitObject.Position = ToLocalSpace(screenSpacePosition);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -132,7 +133,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
private void endCurve()
|
private void endCurve()
|
||||||
{
|
{
|
||||||
updateSlider();
|
updateSlider();
|
||||||
EndPlacement();
|
EndPlacement(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
|
@ -45,7 +45,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Spinners
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
HitObject.EndTime = EditorClock.CurrentTime;
|
HitObject.EndTime = EditorClock.CurrentTime;
|
||||||
EndPlacement();
|
EndPlacement(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -251,15 +251,22 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
|
|
||||||
public void BeginPlacement(HitObject hitObject)
|
public void BeginPlacement(HitObject hitObject)
|
||||||
{
|
{
|
||||||
|
EditorBeatmap.PlacementObject.Value = hitObject;
|
||||||
|
|
||||||
if (distanceSnapGrid != null)
|
if (distanceSnapGrid != null)
|
||||||
hitObject.StartTime = GetSnappedPosition(distanceSnapGrid.ToLocalSpace(inputManager.CurrentState.Mouse.Position), hitObject.StartTime).time;
|
hitObject.StartTime = GetSnappedPosition(distanceSnapGrid.ToLocalSpace(inputManager.CurrentState.Mouse.Position), hitObject.StartTime).time;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EndPlacement(HitObject hitObject)
|
public void EndPlacement(HitObject hitObject, bool commit)
|
||||||
{
|
{
|
||||||
EditorBeatmap.Add(hitObject);
|
EditorBeatmap.PlacementObject.Value = null;
|
||||||
|
|
||||||
adjustableClock.Seek(hitObject.StartTime);
|
if (commit)
|
||||||
|
{
|
||||||
|
EditorBeatmap.Add(hitObject);
|
||||||
|
|
||||||
|
adjustableClock.Seek(hitObject.StartTime);
|
||||||
|
}
|
||||||
|
|
||||||
showGridFor(Enumerable.Empty<HitObject>());
|
showGridFor(Enumerable.Empty<HitObject>());
|
||||||
}
|
}
|
||||||
|
@ -103,11 +103,12 @@ namespace osu.Game.Rulesets.Edit
|
|||||||
/// Signals that the placement of <see cref="HitObject"/> has finished.
|
/// Signals that the placement of <see cref="HitObject"/> has finished.
|
||||||
/// This will destroy this <see cref="PlacementBlueprint"/>, and add the <see cref="HitObject"/> to the <see cref="Beatmap"/>.
|
/// This will destroy this <see cref="PlacementBlueprint"/>, and add the <see cref="HitObject"/> to the <see cref="Beatmap"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected void EndPlacement()
|
/// <param name="commit">Whether the object should be committed.</param>
|
||||||
|
public void EndPlacement(bool commit)
|
||||||
{
|
{
|
||||||
if (!PlacementBegun)
|
if (!PlacementBegun)
|
||||||
BeginPlacement();
|
BeginPlacement();
|
||||||
placementHandler.EndPlacement(HitObject);
|
placementHandler.EndPlacement(HitObject, commit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -32,7 +32,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
|
|
||||||
protected DragBox DragBox { get; private set; }
|
protected DragBox DragBox { get; private set; }
|
||||||
|
|
||||||
private Container<SelectionBlueprint> selectionBlueprints;
|
protected Container<SelectionBlueprint> SelectionBlueprints { get; private set; }
|
||||||
|
|
||||||
private SelectionHandler selectionHandler;
|
private SelectionHandler selectionHandler;
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
{
|
{
|
||||||
DragBox = CreateDragBox(select),
|
DragBox = CreateDragBox(select),
|
||||||
selectionHandler,
|
selectionHandler,
|
||||||
selectionBlueprints = CreateSelectionBlueprintContainer(),
|
SelectionBlueprints = CreateSelectionBlueprintContainer(),
|
||||||
DragBox.CreateProxy().With(p => p.Depth = float.MinValue)
|
DragBox.CreateProxy().With(p => p.Depth = float.MinValue)
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
selectedHitObjects.ItemsAdded += objects =>
|
selectedHitObjects.ItemsAdded += objects =>
|
||||||
{
|
{
|
||||||
foreach (var o in objects)
|
foreach (var o in objects)
|
||||||
selectionBlueprints.FirstOrDefault(b => b.HitObject == o)?.Select();
|
SelectionBlueprints.FirstOrDefault(b => b.HitObject == o)?.Select();
|
||||||
|
|
||||||
SelectionChanged?.Invoke(selectedHitObjects);
|
SelectionChanged?.Invoke(selectedHitObjects);
|
||||||
};
|
};
|
||||||
@ -81,7 +81,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
selectedHitObjects.ItemsRemoved += objects =>
|
selectedHitObjects.ItemsRemoved += objects =>
|
||||||
{
|
{
|
||||||
foreach (var o in objects)
|
foreach (var o in objects)
|
||||||
selectionBlueprints.FirstOrDefault(b => b.HitObject == o)?.Deselect();
|
SelectionBlueprints.FirstOrDefault(b => b.HitObject == o)?.Deselect();
|
||||||
|
|
||||||
SelectionChanged?.Invoke(selectedHitObjects);
|
SelectionChanged?.Invoke(selectedHitObjects);
|
||||||
};
|
};
|
||||||
@ -230,7 +230,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
|
|
||||||
private void removeBlueprintFor(HitObject hitObject)
|
private void removeBlueprintFor(HitObject hitObject)
|
||||||
{
|
{
|
||||||
var blueprint = selectionBlueprints.SingleOrDefault(m => m.HitObject == hitObject);
|
var blueprint = SelectionBlueprints.SingleOrDefault(m => m.HitObject == hitObject);
|
||||||
if (blueprint == null)
|
if (blueprint == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
blueprint.Selected -= onBlueprintSelected;
|
blueprint.Selected -= onBlueprintSelected;
|
||||||
blueprint.Deselected -= onBlueprintDeselected;
|
blueprint.Deselected -= onBlueprintDeselected;
|
||||||
|
|
||||||
selectionBlueprints.Remove(blueprint);
|
SelectionBlueprints.Remove(blueprint);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void AddBlueprintFor(HitObject hitObject)
|
protected virtual void AddBlueprintFor(HitObject hitObject)
|
||||||
@ -251,7 +251,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
blueprint.Selected += onBlueprintSelected;
|
blueprint.Selected += onBlueprintSelected;
|
||||||
blueprint.Deselected += onBlueprintDeselected;
|
blueprint.Deselected += onBlueprintDeselected;
|
||||||
|
|
||||||
selectionBlueprints.Add(blueprint);
|
SelectionBlueprints.Add(blueprint);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -278,7 +278,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
if (!allowDeselection && selectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
|
if (!allowDeselection && selectionHandler.SelectedBlueprints.Any(s => s.IsHovered))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (SelectionBlueprint blueprint in selectionBlueprints.AliveChildren)
|
foreach (SelectionBlueprint blueprint in SelectionBlueprints.AliveChildren)
|
||||||
{
|
{
|
||||||
if (blueprint.IsHovered)
|
if (blueprint.IsHovered)
|
||||||
{
|
{
|
||||||
@ -308,7 +308,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
/// <param name="rect">The rectangle to perform a selection on in screen-space coordinates.</param>
|
/// <param name="rect">The rectangle to perform a selection on in screen-space coordinates.</param>
|
||||||
private void select(RectangleF rect)
|
private void select(RectangleF rect)
|
||||||
{
|
{
|
||||||
foreach (var blueprint in selectionBlueprints)
|
foreach (var blueprint in SelectionBlueprints)
|
||||||
{
|
{
|
||||||
if (blueprint.IsAlive && blueprint.IsPresent && rect.Contains(blueprint.SelectionPoint))
|
if (blueprint.IsAlive && blueprint.IsPresent && rect.Contains(blueprint.SelectionPoint))
|
||||||
blueprint.Select();
|
blueprint.Select();
|
||||||
@ -322,7 +322,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void selectAll()
|
private void selectAll()
|
||||||
{
|
{
|
||||||
selectionBlueprints.ToList().ForEach(m => m.Select());
|
SelectionBlueprints.ToList().ForEach(m => m.Select());
|
||||||
selectionHandler.UpdateVisibility();
|
selectionHandler.UpdateVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,14 +334,14 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
private void onBlueprintSelected(SelectionBlueprint blueprint)
|
private void onBlueprintSelected(SelectionBlueprint blueprint)
|
||||||
{
|
{
|
||||||
selectionHandler.HandleSelected(blueprint);
|
selectionHandler.HandleSelected(blueprint);
|
||||||
selectionBlueprints.ChangeChildDepth(blueprint, 1);
|
SelectionBlueprints.ChangeChildDepth(blueprint, 1);
|
||||||
beatmap.SelectedHitObjects.Add(blueprint.HitObject);
|
beatmap.SelectedHitObjects.Add(blueprint.HitObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onBlueprintDeselected(SelectionBlueprint blueprint)
|
private void onBlueprintDeselected(SelectionBlueprint blueprint)
|
||||||
{
|
{
|
||||||
selectionHandler.HandleDeselected(blueprint);
|
selectionHandler.HandleDeselected(blueprint);
|
||||||
selectionBlueprints.ChangeChildDepth(blueprint, 0);
|
SelectionBlueprints.ChangeChildDepth(blueprint, 0);
|
||||||
beatmap.SelectedHitObjects.Remove(blueprint.HitObject);
|
beatmap.SelectedHitObjects.Remove(blueprint.HitObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,6 +63,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
|
|||||||
private void refreshTool()
|
private void refreshTool()
|
||||||
{
|
{
|
||||||
placementBlueprintContainer.Clear();
|
placementBlueprintContainer.Clear();
|
||||||
|
|
||||||
|
currentPlacement?.EndPlacement(false);
|
||||||
currentPlacement = null;
|
currentPlacement = null;
|
||||||
|
|
||||||
var blueprint = CurrentTool?.CreatePlacementBlueprint();
|
var blueprint = CurrentTool?.CreatePlacementBlueprint();
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
@ -21,8 +22,15 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
|||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private Timeline timeline { get; set; }
|
private Timeline timeline { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private EditorBeatmap beatmap { get; set; }
|
||||||
|
|
||||||
private DragEvent lastDragEvent;
|
private DragEvent lastDragEvent;
|
||||||
|
|
||||||
|
private Bindable<HitObject> placement;
|
||||||
|
|
||||||
|
private SelectionBlueprint placementBlueprint;
|
||||||
|
|
||||||
public TimelineBlueprintContainer()
|
public TimelineBlueprintContainer()
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
@ -43,6 +51,29 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
|
|||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
DragBox.Alpha = 0;
|
DragBox.Alpha = 0;
|
||||||
|
|
||||||
|
placement = beatmap.PlacementObject.GetBoundCopy();
|
||||||
|
placement.ValueChanged += placementChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void placementChanged(ValueChangedEvent<HitObject> obj)
|
||||||
|
{
|
||||||
|
if (obj.NewValue == null)
|
||||||
|
{
|
||||||
|
if (placementBlueprint != null)
|
||||||
|
{
|
||||||
|
SelectionBlueprints.Remove(placementBlueprint);
|
||||||
|
placementBlueprint = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
placementBlueprint = CreateBlueprintFor(obj.NewValue);
|
||||||
|
|
||||||
|
placementBlueprint.Colour = Color4.MediumPurple;
|
||||||
|
|
||||||
|
SelectionBlueprints.Add(placementBlueprint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Container<SelectionBlueprint> CreateSelectionBlueprintContainer() => new TimelineSelectionBlueprintContainer { RelativeSizeAxes = Axes.Both };
|
protected override Container<SelectionBlueprint> CreateSelectionBlueprintContainer() => new TimelineSelectionBlueprintContainer { RelativeSizeAxes = Axes.Both };
|
||||||
|
@ -17,7 +17,8 @@ namespace osu.Game.Screens.Edit.Compose
|
|||||||
/// Notifies that a placement has finished.
|
/// Notifies that a placement has finished.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="hitObject">The <see cref="HitObject"/> that has been placed.</param>
|
/// <param name="hitObject">The <see cref="HitObject"/> that has been placed.</param>
|
||||||
void EndPlacement(HitObject hitObject);
|
/// <param name="commit">Whether the object should be committed.</param>
|
||||||
|
void EndPlacement(HitObject hitObject, bool commit);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Deletes a <see cref="HitObject"/>.
|
/// Deletes a <see cref="HitObject"/>.
|
||||||
|
@ -33,7 +33,15 @@ namespace osu.Game.Screens.Edit
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public event Action<HitObject> StartTimeChanged;
|
public event Action<HitObject> StartTimeChanged;
|
||||||
|
|
||||||
public BindableList<HitObject> SelectedHitObjects { get; } = new BindableList<HitObject>();
|
/// <summary>
|
||||||
|
/// All currently selected <see cref="HitObject"/>s.
|
||||||
|
/// </summary>
|
||||||
|
public readonly BindableList<HitObject> SelectedHitObjects = new BindableList<HitObject>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The current placement. Null if there's no active placement.
|
||||||
|
/// </summary>
|
||||||
|
public readonly Bindable<HitObject> PlacementObject = new Bindable<HitObject>();
|
||||||
|
|
||||||
public readonly IBeatmap PlayableBeatmap;
|
public readonly IBeatmap PlayableBeatmap;
|
||||||
|
|
||||||
|
@ -53,9 +53,10 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EndPlacement(HitObject hitObject)
|
public void EndPlacement(HitObject hitObject, bool commit)
|
||||||
{
|
{
|
||||||
AddHitObject(CreateHitObject(hitObject));
|
if (commit)
|
||||||
|
AddHitObject(CreateHitObject(hitObject));
|
||||||
|
|
||||||
Remove(currentBlueprint);
|
Remove(currentBlueprint);
|
||||||
Add(currentBlueprint = CreateBlueprint());
|
Add(currentBlueprint = CreateBlueprint());
|
||||||
|
Loading…
Reference in New Issue
Block a user