Files
Goatgarien_BAKKA-Editor/BAKKA-Editor/Operations/NoteOperation.cs
T
veroxzik 2f5247989f Squashed commit of the following:
commit b8246693780550a28c6dd45701291918795d0809
Author: veroxzik <43590004+veroxzik@users.noreply.github.com>
Date:   Wed Nov 2 21:31:00 2022 -0400

    Deleting a hold end will turn the previous joint into the end.

commit 597510e605b8687fb004d55245e1c10edf3c8ab6
Author: veroxzik <43590004+veroxzik@users.noreply.github.com>
Date:   Tue Nov 1 23:01:15 2022 -0400

    Fix undo/redo for RemoveHold operations.

commit 40936e13d4bcb66ae24573c5860b79714ee38b32
Author: veroxzik <43590004+veroxzik@users.noreply.github.com>
Date:   Sun Oct 30 17:33:21 2022 -0400

    Fix undo/redo for InsertHold operations.
2022-11-02 21:31:56 -04:00

182 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BAKKA_Editor.Operations
{
internal abstract class NoteOperation : IOperation
{
public Note Note { get; }
protected Chart Chart { get; }
public abstract string Description { get; }
public NoteOperation(Chart chart, Note item)
{
Chart = chart;
Note = item;
}
public abstract void Redo();
public abstract void Undo();
}
internal class InsertNote : NoteOperation
{
public override string Description => "Insert note";
public InsertNote(Chart chart, Note item) : base(chart, item)
{ }
public override void Redo()
{
Chart.Notes.Add(Note);
}
public override void Undo()
{
Chart.Notes.Remove(Note);
}
}
internal class RemoveNote : NoteOperation
{
public override string Description => "Remove note";
public RemoveNote(Chart chart, Note item) : base(chart, item)
{ }
public override void Redo()
{
Chart.Notes.Remove(Note);
}
public override void Undo()
{
Chart.Notes.Add(Note);
}
}
internal class EditNote : IOperation
{
public string Description => "Edit note";
protected Note Base { get; }
protected Note OldNote { get; }
protected Note NewNote { get; }
public EditNote(Note baseNote, Note newNote)
{
Base = baseNote;
OldNote = new Note(baseNote);
NewNote = new Note(newNote);
}
public void Redo()
{
Base.BeatInfo = new BeatInfo(NewNote.BeatInfo);
Base.Position = NewNote.Position;
Base.Size = NewNote.Size;
}
public void Undo()
{
Base.BeatInfo = new BeatInfo(OldNote.BeatInfo);
Base.Position = OldNote.Position;
Base.Size = OldNote.Size;
}
}
internal class InsertHoldNote : NoteOperation
{
public override string Description => "Insert hold note";
private Note prevNote;
public InsertHoldNote(Chart chart, Note item) : base(chart, item)
{
prevNote = item.PrevNote;
}
public override void Redo()
{
if (Note.PrevNote != null)
Note.PrevNote.NextNote = Note;
Chart.Notes.Add(Note);
}
public override void Undo()
{
if (Note.PrevNote != null)
Note.PrevNote.NextNote = null;
Chart.Notes.Remove(Note);
}
}
internal class RemoveHoldNote : NoteOperation
{
public override string Description => "Remove hold note";
private Note prevNote;
private NoteType prevNoteType;
private Note nextNote;
private NoteType nextNoteType;
public RemoveHoldNote(Chart chart, Note item) : base(chart, item)
{
prevNote = item.PrevNote;
if (prevNote != null)
prevNoteType = prevNote.NoteType;
nextNote = item.NextNote;
if (nextNote != null)
nextNoteType = nextNote.NoteType;
}
public override void Redo()
{
switch (Note.NoteType)
{
case NoteType.HoldStartNoBonus:
case NoteType.HoldStartBonusFlair:
nextNote.PrevNote = null;
nextNote.NoteType = Note.NoteType;
break;
case NoteType.HoldJoint:
prevNote.NextNote = nextNote;
nextNote.PrevNote = prevNote;
break;
case NoteType.HoldEnd:
prevNote.NextNote = null;
prevNote.NoteType = NoteType.HoldEnd;
break;
default:
break;
}
Chart.Notes.Remove(Note);
}
public override void Undo()
{
switch (Note.NoteType)
{
case NoteType.HoldStartNoBonus:
case NoteType.HoldStartBonusFlair:
nextNote.PrevNote = Note;
nextNote.NoteType = nextNoteType;
break;
case NoteType.HoldJoint:
prevNote.NextNote = Note;
nextNote.PrevNote = Note;
break;
case NoteType.HoldEnd:
prevNote.NextNote = Note;
prevNote.NoteType = prevNoteType;
break;
default:
break;
}
Chart.Notes.Add(Note);
}
}
}