Fix a bug where making one selection and then making a different one would leave the original highlighted

This commit is contained in:
EliteMasterEric 2023-12-13 23:11:19 -05:00
parent 18ffb9fc36
commit e2b0ed98dd
3 changed files with 82 additions and 8 deletions

View file

@ -753,15 +753,23 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
function set_currentNoteSelection(value:Array<SongNoteData>):Array<SongNoteData>
{
// This value is true if all elements of the current selection are also in the new selection.
var isSuperset:Bool = currentNoteSelection.isSubset(value);
var isEqual:Bool = currentNoteSelection.isEqualUnordered(value);
currentNoteSelection = value;
if (currentNoteSelection.length > 0)
if (!isEqual)
{
notePreview.addNotes(currentNoteSelection, Std.int(songLengthInMs), true);
}
else
{
notePreviewDirty = true;
if (currentNoteSelection.length > 0 && isSuperset)
{
notePreview.addSelectedNotes(currentNoteSelection, Std.int(songLengthInMs));
}
else
{
// The new selection removes elements from the old selection, so we have to redraw the note preview.
notePreviewDirty = true;
}
}
return currentNoteSelection;
@ -5295,6 +5303,7 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
// TODO: Only update the notes that have changed.
notePreview.erase();
notePreview.addNotes(currentSongChartNoteData, Std.int(songLengthInMs));
notePreview.addSelectedNotes(currentNoteSelection, Std.int(songLengthInMs));
notePreview.addEvents(currentSongChartEventData, Std.int(songLengthInMs));
}

View file

@ -80,11 +80,24 @@ class ChartEditorNotePreview extends FlxSprite
* @param notes The data for the notes.
* @param songLengthInMs The total length of the song in milliseconds.
*/
public function addNotes(notes:Array<SongNoteData>, songLengthInMs:Int, ?isSelection:Bool = false):Void
public function addNotes(notes:Array<SongNoteData>, songLengthInMs:Int):Void
{
for (note in notes)
{
addNote(note, songLengthInMs, isSelection);
addNote(note, songLengthInMs, false);
}
}
/**
* Add an array of selected notes to the preview.
* @param notes The data for the notes.
* @param songLengthInMs The total length of the song in milliseconds.
*/
public function addSelectedNotes(notes:Array<SongNoteData>, songLengthInMs:Int):Void
{
for (note in notes)
{
addNote(note, songLengthInMs, true);
}
}

View file

@ -76,4 +76,56 @@ class ArrayTools
while (array.length > 0)
array.pop();
}
/**
* Return true only if both arrays contain the same elements (possibly in a different order).
* @param a The first array to compare.
* @param b The second array to compare.
* @return Weather both arrays contain the same elements.
*/
public static function isEqualUnordered<T>(a:Array<T>, b:Array<T>):Bool
{
if (a.length != b.length) return false;
for (element in a)
{
if (!b.contains(element)) return false;
}
for (element in b)
{
if (!a.contains(element)) return false;
}
return true;
}
/**
* Returns true if `superset` contains all elements of `subset`.
* @param superset The array to query for each element.
* @param subset The array containing the elements to query for.
* @return Weather `superset` contains all elements of `subset`.
*/
public static function isSuperset<T>(superset:Array<T>, subset:Array<T>):Bool
{
// Shortcuts.
if (subset.length == 0) return true;
if (subset.length > superset.length) return false;
// Check each element.
for (element in subset)
{
if (!superset.contains(element)) return false;
}
return true;
}
/**
* Returns true if `superset` contains all elements of `subset`.
* @param subset The array containing the elements to query for.
* @param superset The array to query for each element.
* @return Weather `superset` contains all elements of `subset`.
*/
public static function isSubset<T>(subset:Array<T>, superset:Array<T>):Bool
{
// Switch it around.
return isSuperset(superset, subset);
}
}