diff --git a/fluXis/Screens/Edit/Actions/Events/EventsMoveToTimeAction.cs b/fluXis/Screens/Edit/Actions/Events/EventsMoveToTimeAction.cs new file mode 100644 index 000000000..65fae0061 --- /dev/null +++ b/fluXis/Screens/Edit/Actions/Events/EventsMoveToTimeAction.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using fluXis.Map.Structures.Bases; + +namespace fluXis.Screens.Edit.Actions.Events; + +public class EventsMoveToTimeAction : EditorAction +{ + public override string Description => $"Move {objects.Count} events to {destinationTime}ms."; + + private readonly List objects; + private readonly double destinationTime; + private readonly double sourceTime; + + public EventsMoveToTimeAction(List objects, double destinationTime) + { + this.objects = objects; + this.destinationTime = destinationTime; + this.sourceTime = objects[0].Time; + } + + public override void Run(EditorMap map) + { + foreach (var o in objects) + { + double offset = o.Time - sourceTime; + o.Time = destinationTime + offset; + map.Update(o); + } + } + + public override void Undo(EditorMap map) + { + foreach (var o in objects) + { + double offset = o.Time - destinationTime; + o.Time = sourceTime + offset; + map.Update(o); + } + } +} diff --git a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs index 2f07b402f..204c326df 100644 --- a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs +++ b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointListEntry.cs @@ -39,6 +39,7 @@ public abstract partial class PointListEntry : Container, IHasContextMenu public MenuItem[] ContextMenuItems => new MenuItem[] { new MenuActionItem("Clone to current time", FontAwesome6.Solid.Clone, clone), + new MenuActionItem("Move to current time", FontAwesome6.Solid.Clock, moveToCurrentTime), new MenuActionItem("Go to time", FontAwesome6.Solid.ArrowRight, goTo), new MenuActionItem("Bulk-Apply Group", FontAwesome6.Solid.ObjectGroup, applyGroup) { IsEnabled = () => State == SelectedState.Selected }, new MenuActionItem("Edit", FontAwesome6.Solid.PenRuler, OpenSettings), @@ -72,6 +73,7 @@ public SelectedState State public Action RequestApplyGroup { get; set; } public Action DeleteSelected { get; set; } public Action CloneSelected { get; set; } + public Action MoveSelectedToCurrentTime { get; set; } public Action OnClone { get; set; } public ITimedObject Object { get; } @@ -287,6 +289,17 @@ private void clone() OnClone?.Invoke(clone); } + private void moveToCurrentTime() + { + if (State == SelectedState.Selected) + { + MoveSelectedToCurrentTime?.Invoke(); + return; + } + + ActionStack.Add(new EventsMoveToTimeAction(new List { Object }, clock.CurrentTime)); + } + private void applyGroup() { if (State != SelectedState.Selected) diff --git a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs index b42817a2d..047b735b7 100644 --- a/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs +++ b/fluXis/Screens/Edit/Tabs/Shared/Points/List/PointsList.cs @@ -322,6 +322,11 @@ protected void Create(ITimedObject obj, bool overrideTime = true, bool openSetti flow.FirstOrDefault(e => e.Object == obj)?.OpenSettings(); } + private void moveSelectionToCurrentTime() + { + ActionStack.Add(new EventsMoveToTimeAction(selectedEntries.Select(x => x.Object).ToList(), clock.CurrentTime)); + } + private void sortPoints() { flow.OrderBy(e => e.Object.Time).ForEach(e => flow.SetLayoutPosition(e, (float)e.Object.Time)); @@ -383,6 +388,7 @@ protected void AddPoint(ITimedObject obj) entry.CloneSelected = duplicateSelected; entry.DeleteSelected = deleteSelected; entry.OnClone = o => Create(o); + entry.MoveSelectedToCurrentTime = moveSelectionToCurrentTime; entry.Selected += select; entry.Deselected += deselect;