Files
KGStudio/src/core/commands/track/ReorderTracksCommand.ts
T
2025-08-11 18:37:21 -07:00

114 lines
3.6 KiB
TypeScript

import { KGCommand } from '../KGCommand';
import { KGCore } from '../../KGCore';
import { KGTrack } from '../../track/KGTrack';
/**
* Command to reorder tracks in the project
* Handles moving a track from one position to another with undo support
*/
export class ReorderTracksCommand extends KGCommand {
private sourceIndex: number;
private destinationIndex: number;
private originalTrackOrder: KGTrack[] = [];
constructor(sourceIndex: number, destinationIndex: number) {
super();
this.sourceIndex = sourceIndex;
this.destinationIndex = destinationIndex;
}
execute(): void {
const core = KGCore.instance();
const currentProject = core.getCurrentProject();
const tracks = currentProject.getTracks();
// Store original track order for undo
this.originalTrackOrder = [...tracks];
// Validate indices
if (this.sourceIndex < 0 || this.sourceIndex >= tracks.length) {
throw new Error(`Invalid source index: ${this.sourceIndex}`);
}
if (this.destinationIndex < 0 || this.destinationIndex >= tracks.length) {
throw new Error(`Invalid destination index: ${this.destinationIndex}`);
}
// If source and destination are the same, do nothing
if (this.sourceIndex === this.destinationIndex) {
console.log('Source and destination indices are the same, no reordering needed');
return;
}
// Create a copy of the tracks array
const updatedTracks = [...tracks];
// Remove the track from the source index
const [movedTrack] = updatedTracks.splice(this.sourceIndex, 1);
// Insert the track at the destination index
updatedTracks.splice(this.destinationIndex, 0, movedTrack);
// Update trackIndex for all tracks to match their array indices
updatedTracks.forEach((track, index) => {
track.setTrackIndex(index);
});
// Update the core model
currentProject.setTracks(updatedTracks);
const movedTrackName = movedTrack.getName();
console.log(`Reordered track "${movedTrackName}" from index ${this.sourceIndex} to ${this.destinationIndex}`);
}
undo(): void {
if (this.originalTrackOrder.length === 0) {
throw new Error('Cannot undo: no original track order stored');
}
const core = KGCore.instance();
const currentProject = core.getCurrentProject();
// Restore the original track order
const restoredTracks = [...this.originalTrackOrder];
// Update trackIndex for all tracks to match their array indices
restoredTracks.forEach((track, index) => {
track.setTrackIndex(index);
});
// Update the core model
currentProject.setTracks(restoredTracks);
console.log(`Restored original track order (undoing reorder from ${this.sourceIndex} to ${this.destinationIndex})`);
}
getDescription(): string {
if (this.originalTrackOrder.length > 0) {
const movedTrack = this.originalTrackOrder[this.sourceIndex];
const trackName = movedTrack ? movedTrack.getName() : `Track ${this.sourceIndex}`;
return `Reorder track "${trackName}" from position ${this.sourceIndex + 1} to ${this.destinationIndex + 1}`;
}
return `Reorder track from position ${this.sourceIndex + 1} to ${this.destinationIndex + 1}`;
}
/**
* Get the source index of the reorder operation
*/
public getSourceIndex(): number {
return this.sourceIndex;
}
/**
* Get the destination index of the reorder operation
*/
public getDestinationIndex(): number {
return this.destinationIndex;
}
/**
* Get the original track order (only available after execute)
*/
public getOriginalTrackOrder(): KGTrack[] {
return this.originalTrackOrder;
}
}