feat: implemented global marker track

This commit is contained in:
Xiaohan-Tian
2026-05-23 12:56:43 -07:00
parent 7ca2cb0d05
commit fb3c6cde70
27 changed files with 1566 additions and 38 deletions
+25 -5
View File
@@ -2,6 +2,7 @@ import { create } from 'zustand';
import { KGCore } from '../core/KGCore';
import { KGTrack } from '../core/track/KGTrack';
import { KGProject, type KeySignature } from '../core/KGProject';
import { KGGlobalTrack } from '../core/global-track';
import type { TimeSignature } from '../types/projectTypes';
import { KGMidiTrack, type InstrumentType } from '../core/track/KGMidiTrack';
import { beatsToTimeString } from '../util/timeUtil';
@@ -69,6 +70,7 @@ interface ProjectState {
projectName: string;
savedProjectName: string; // OPFS folder name where the project is currently saved
tracks: KGTrack[];
globalTracks: KGGlobalTrack[];
currentStatus: string;
maxBars: number;
barWidthMultiplier: number;
@@ -405,6 +407,7 @@ export const useProjectStore = create<ProjectState>((set, get) => {
projectName: currentProject.getName(),
savedProjectName: currentProject.getName(),
tracks: currentProject.getTracks() as KGTrack[],
globalTracks: currentProject.getGlobalTracks() as KGGlobalTrack[],
currentStatus: KGCore.instance().getStatus() || 'Unknown',
maxBars: currentProject.getMaxBars(),
barWidthMultiplier: currentProject.getBarWidthMultiplier(),
@@ -517,7 +520,10 @@ export const useProjectStore = create<ProjectState>((set, get) => {
// Update the store state with a new array reference to trigger re-render
const project = KGCore.instance().getCurrentProject();
set({ tracks: [...project.getTracks()] as KGTrack[] });
set({
tracks: [...project.getTracks()] as KGTrack[],
globalTracks: [...project.getGlobalTracks()] as KGGlobalTrack[],
});
// Auto-select the newly created track and open instrument selection panel
const newTrackId = command.getTrackId().toString();
@@ -539,7 +545,10 @@ export const useProjectStore = create<ProjectState>((set, get) => {
KGCore.instance().executeCommand(command);
const project = KGCore.instance().getCurrentProject();
set({ tracks: [...project.getTracks()] as KGTrack[] });
set({
tracks: [...project.getTracks()] as KGTrack[],
globalTracks: [...project.getGlobalTracks()] as KGGlobalTrack[],
});
const newTrackId = command.getTrackId().toString();
set({
@@ -659,7 +668,10 @@ export const useProjectStore = create<ProjectState>((set, get) => {
// Update the store state with a new array reference to trigger re-render
const project = KGCore.instance().getCurrentProject();
const remainingTracks = [...project.getTracks()] as KGTrack[];
set({ tracks: remainingTracks });
set({
tracks: remainingTracks,
globalTracks: [...project.getGlobalTracks()] as KGGlobalTrack[],
});
// Auto-select another track if any remain
if (remainingTracks.length > 0) {
@@ -744,7 +756,10 @@ export const useProjectStore = create<ProjectState>((set, get) => {
// Update the store state with the current project state
const project = KGCore.instance().getCurrentProject();
set({ tracks: [...project.getTracks()] as KGTrack[] });
set({
tracks: [...project.getTracks()] as KGTrack[],
globalTracks: [...project.getGlobalTracks()] as KGGlobalTrack[],
});
console.log(`Updated track ${trackId} properties`);
} catch (error) {
@@ -773,7 +788,10 @@ export const useProjectStore = create<ProjectState>((set, get) => {
// Update the store state with the current project state
const project = KGCore.instance().getCurrentProject();
set({ tracks: [...project.getTracks()] as KGTrack[] });
set({
tracks: [...project.getTracks()] as KGTrack[],
globalTracks: [...project.getGlobalTracks()] as KGGlobalTrack[],
});
console.log(`Reordered track from index ${sourceIndex} to ${destinationIndex}`);
} catch (error) {
@@ -902,6 +920,7 @@ export const useProjectStore = create<ProjectState>((set, get) => {
projectName: projectToLoad.getName(),
savedProjectName: savedName ?? projectToLoad.getName(),
tracks: [...tracks],
globalTracks: [...projectToLoad.getGlobalTracks()] as KGGlobalTrack[],
maxBars,
barWidthMultiplier: projectToLoad.getBarWidthMultiplier(),
timeSignature,
@@ -1822,6 +1841,7 @@ export const useProjectStore = create<ProjectState>((set, get) => {
set({
projectName: project.getName(),
tracks: [...project.getTracks()] as KGTrack[], // Force new array reference - key for re-rendering!
globalTracks: [...project.getGlobalTracks()] as KGGlobalTrack[],
maxBars: project.getMaxBars(),
barWidthMultiplier: project.getBarWidthMultiplier(),
timeSignature: project.getTimeSignature(),