33using System . Linq ;
44using System . Text ;
55using System . Threading . Tasks ;
6+ using TuneLab . Base . Data ;
7+ using TuneLab . Base . Structures ;
68using TuneLab . Base . Utils ;
79using TuneLab . Extensions . Formats . DataInfo ;
810
911namespace TuneLab . Data ;
1012
11- internal class TimeSignatureManager : ITimeSignatureManager
13+ internal class TimeSignatureManager : DataObject , ITimeSignatureManager
1214{
15+ public IProject Project => mProject ;
1316 public IReadOnlyList < ITimeSignature > TimeSignatures => mTimeSignatures ;
1417
1518 public const int DefaultNumerator = 4 ;
1619 public const int DefaultDenominator = 4 ;
17- public TimeSignatureManager ( ) : this ( DefaultNumerator , DefaultDenominator ) { }
18- public TimeSignatureManager ( int numerator , int denominator ) : this ( new TimeSignatureInfo [ ] { new TimeSignatureInfo { BarIndex = 0 , Numerator = numerator , Denominator = denominator } } ) { }
20+ public TimeSignatureManager ( IProject project ) : this ( project , DefaultNumerator , DefaultDenominator ) { }
21+ public TimeSignatureManager ( IProject project , int numerator , int denominator ) : this ( project , [ new TimeSignatureInfo { BarIndex = 0 , Numerator = numerator , Denominator = denominator } ] ) { }
1922
20- public TimeSignatureManager ( IReadOnlyList < TimeSignatureInfo > timeSignatures )
23+ public TimeSignatureManager ( IProject project , List < TimeSignatureInfo > timeSignatures ) : base ( project )
2124 {
22- if ( timeSignatures == null || timeSignatures . Count == 0 )
23- timeSignatures = new TimeSignatureInfo [ ] { new TimeSignatureInfo { BarIndex = 0 , Numerator = DefaultNumerator , Denominator = DefaultDenominator } } ;
24-
25- foreach ( var timeSignature in timeSignatures )
26- {
27- mTimeSignatures . Add ( new TimeSignature ( timeSignature . BarIndex , timeSignature . Numerator , timeSignature . Denominator ) ) ;
28- }
29- CorrectStatusFrom ( 0 ) ;
25+ mTimeSignatures = new ( this ) ;
26+ mProject = project ;
27+ IDataObject < List < TimeSignatureInfo > > . SetInfo ( this , timeSignatures ) ;
3028 }
3129
32- public void AddTimeSignature ( int barIndex , int numerator , int denominator )
30+ public int AddTimeSignature ( int barIndex , int numerator , int denominator )
3331 {
32+ barIndex = Math . Max ( barIndex , TimeSignatures [ 0 ] . BarIndex ) ;
33+
34+ BeginMergeNotify ( ) ;
3435 int i = mTimeSignatures . Count - 1 ;
3536 for ( ; i >= 0 ; -- i )
3637 {
3738 if ( mTimeSignatures [ i ] . BarIndex <= barIndex )
3839 break ;
3940 }
4041
42+ int result ;
4143 if ( mTimeSignatures [ i ] . BarIndex == barIndex )
42- mTimeSignatures [ i ] = new TimeSignature ( barIndex , numerator , denominator ) { GlobalBeatIndex = mTimeSignatures [ i ] . GlobalBeatIndex , Pos = mTimeSignatures [ i ] . Pos } ;
44+ {
45+ var timeSignature = mTimeSignatures [ i ] ;
46+ timeSignature . Numerator . Set ( numerator ) ;
47+ timeSignature . Denominator . Set ( denominator ) ;
48+ result = i ;
49+ }
4350 else
44- mTimeSignatures . Insert ( i + 1 , new TimeSignature ( barIndex , numerator , denominator ) ) ;
51+ {
52+ mTimeSignatures . Insert ( i + 1 , new TimeSignature ( new ( ) { BarIndex = barIndex , Numerator = numerator , Denominator = denominator } ) ) ;
53+ result = i + 1 ;
54+ }
4555
4656 CorrectStatusFrom ( i + 1 ) ;
57+ EndMergeNotify ( ) ;
58+ return result ;
4759 }
4860
4961 public void RemoveTimeSignatureAt ( int index )
5062 {
5163 if ( index < 0 || index >= mTimeSignatures . Count )
5264 return ;
5365
66+ BeginMergeNotify ( ) ;
5467 mTimeSignatures . RemoveAt ( index ) ;
5568 CorrectStatusFrom ( index ) ;
69+ EndMergeNotify ( ) ;
5670 }
5771
58- public void SetNumeratorAndDenominator ( int index , int numerator , int denominator )
72+ public void SetMeter ( int index , int numerator , int denominator )
5973 {
6074 if ( index < 0 || index >= TimeSignatures . Count )
6175 return ;
6276
63- mTimeSignatures [ index ] . Numerator = numerator ;
64- mTimeSignatures [ index ] . Denominator = denominator ;
77+ BeginMergeNotify ( ) ;
78+ mTimeSignatures [ index ] . Numerator . Set ( numerator ) ;
79+ mTimeSignatures [ index ] . Denominator . Set ( denominator ) ;
6580 CorrectStatusFrom ( index + 1 ) ;
81+ EndMergeNotify ( ) ;
6682 }
6783
6884 void CorrectStatusFrom ( int index )
@@ -87,25 +103,52 @@ void CorrectStatusFrom(int index)
87103 }
88104 }
89105
90- readonly List < TimeSignature > mTimeSignatures = new ( ) ;
91- class TimeSignature : ITimeSignature
106+ public List < TimeSignatureInfo > GetInfo ( )
107+ {
108+ return mTimeSignatures . GetInfo ( ) . ToInfo ( ) ;
109+ }
110+
111+ void IDataObject < List < TimeSignatureInfo > > . SetInfo ( List < TimeSignatureInfo > info )
92112 {
93- public int BarIndex { get => mBarIndex ; set => mBarIndex = value ; }
94- public int Numerator { get => mNumerator ; set => mNumerator = value ; }
95- public int Denominator { get => mDenominator ; set => mDenominator = value ; }
113+ if ( info . Count == 0 )
114+ info = [ new ( ) { BarIndex = 0 , Numerator = DefaultNumerator , Denominator = DefaultDenominator } ] ;
115+
116+ IDataObject < List < TimeSignatureInfo > > . SetInfo ( mTimeSignatures , info . Convert ( t => new TimeSignature ( t ) ) . ToArray ( ) ) ;
117+ CorrectStatusFrom ( 0 ) ;
118+ }
119+
120+ readonly DataObjectList < TimeSignature > mTimeSignatures ;
121+ readonly IProject mProject ;
122+
123+ class TimeSignature : DataObject , ITimeSignature
124+ {
125+ public DataStruct < int > BarIndex { get ; }
126+ public DataStruct < int > Numerator { get ; }
127+ public DataStruct < int > Denominator { get ; }
96128 public int GlobalBeatIndex { get => mBeatIndex ; set => mBeatIndex = value ; }
97129 public double Pos { get => mPos ; set => mPos = value ; }
98130
99- public TimeSignature ( int barIndex , int numerator , int denominator )
131+ int ITimeSignature . BarIndex => BarIndex ;
132+ int IMeter . Numerator => Numerator ;
133+ int IMeter . Denominator => Denominator ;
134+
135+ public TimeSignature ( TimeSignatureInfo info )
136+ {
137+ BarIndex = new ( this ) ;
138+ Numerator = new ( this ) ;
139+ Denominator = new ( this ) ;
140+ IDataObject < TimeSignatureInfo > . SetInfo ( this , info ) ;
141+ }
142+
143+ public TimeSignatureInfo GetInfo ( ) => new ( ) { BarIndex = BarIndex . Value , Numerator = Numerator . Value , Denominator = Denominator . Value } ;
144+
145+ void IDataObject < TimeSignatureInfo > . SetInfo ( TimeSignatureInfo info )
100146 {
101- mBarIndex = barIndex ;
102- mNumerator = numerator ;
103- mDenominator = denominator ;
147+ IDataObject < TimeSignatureInfo > . SetInfo ( BarIndex , info . BarIndex ) ;
148+ IDataObject < TimeSignatureInfo > . SetInfo ( Numerator , info . Numerator ) ;
149+ IDataObject < TimeSignatureInfo > . SetInfo ( Denominator , info . Denominator ) ;
104150 }
105151
106- int mBarIndex ;
107- int mNumerator ;
108- int mDenominator ;
109152 int mBeatIndex ;
110153 double mPos ;
111154 }
0 commit comments