00001
00008 #include "core/sheet.h"
00009 #include "core/playable.h"
00010 #include "core/functionmarkingcontext.h"
00011 #include "core/functionmarking.h"
00012
00024 CAFunctionMarkingContext::CAFunctionMarkingContext( const QString name, CASheet *sheet )
00025 : CAContext( name, sheet ) {
00026 _contextType = CAContext::FunctionMarkingContext;
00027
00028 repositFunctions();
00029 }
00030
00031 CAFunctionMarkingContext::~CAFunctionMarkingContext() {
00032 clear();
00033 }
00034
00035 CAFunctionMarkingContext *CAFunctionMarkingContext::clone( CASheet *s ) {
00036 CAFunctionMarkingContext *newFmc = new CAFunctionMarkingContext( name(), s );
00037
00038 for (int i=0; i<_functionMarkingList.size(); i++) {
00039 CAFunctionMarking *newFm = _functionMarkingList[i]->clone();
00040 newFm->setContext( newFmc );
00041 newFmc->addFunctionMarking( newFm );
00042 }
00043
00044 return newFmc;
00045 }
00046
00047 void CAFunctionMarkingContext::clear() {
00048 for (int i=0; i<_functionMarkingList.size(); i++)
00049 delete _functionMarkingList[i];
00050
00051 _functionMarkingList.clear();
00052 }
00053
00057 void CAFunctionMarkingContext::addFunctionMarking( CAFunctionMarking *function, bool replace ) {
00058 int i;
00059 for (i=_functionMarkingList.size()-1; i>0 && _functionMarkingList[i]->timeStart()>function->timeStart(); i--);
00060 _functionMarkingList.insert( i+1, function );
00061 if ( replace && i<_functionMarkingList.size() && i>=0 && _functionMarkingList[i]->isEmpty() ) {
00062 _functionMarkingList.removeAt( i );
00063 } else if (!replace) {
00064 i++;
00065 while ( ++i < _functionMarkingList.size() )
00066 _functionMarkingList[i]->setTimeStart( _functionMarkingList[i]->timeStart() + function->timeLength() );
00067 }
00068 }
00069
00070 CAMusElement *CAFunctionMarkingContext::next(CAMusElement *elt) {
00071 int idx = _functionMarkingList.indexOf((CAFunctionMarking*)elt);
00072 if (idx==-1)
00073 return 0;
00074
00075 if (++idx>=_functionMarkingList.size())
00076 return 0;
00077 else
00078 return _functionMarkingList[idx];
00079 }
00080
00081 CAMusElement *CAFunctionMarkingContext::previous(CAMusElement *elt) {
00082 int idx = _functionMarkingList.indexOf((CAFunctionMarking*)elt);
00083 if (idx==-1)
00084 return 0;
00085
00086 if (--idx<0)
00087 return 0;
00088 else
00089 return _functionMarkingList[idx];
00090 }
00091
00092 bool CAFunctionMarkingContext::remove( CAMusElement *elt ) {
00093 return _functionMarkingList.removeAll(static_cast<CAFunctionMarking*>(elt));
00094 }
00095
00104 void CAFunctionMarkingContext::repositFunctions() {
00105 int TS, TL;
00106 int curIdx;
00107 QList<CAPlayable*> chord;
00108 for ( TS=0, curIdx=0; (chord=sheet()->getChord(TS)).size() || curIdx<_functionMarkingList.size(); TS+=TL ) {
00109 TL = (chord.size()?chord[0]->timeLength():256);
00110 for ( int i=0; i<chord.size(); i++ )
00111 if (chord[i]->timeLength()<TL)
00112 TL = chord[i]->timeLength();
00113
00114 if ( curIdx == _functionMarkingList.size() ) {
00115 addEmptyFunction( TS, TL);
00116 curIdx++;
00117 }
00118
00119
00120 for ( int startIdx = curIdx; curIdx==0 || curIdx < _functionMarkingList.size() && _functionMarkingList[curIdx]->timeStart()==_functionMarkingList[startIdx]->timeStart(); curIdx++ ) {
00121 _functionMarkingList[curIdx]->setTimeLength( TL );
00122 _functionMarkingList[curIdx]->setTimeStart( TS );
00123 }
00124 }
00125 }
00126
00131 void CAFunctionMarkingContext::addEmptyFunction( int timeStart, int timeLength ) {
00132 addFunctionMarking( new CAFunctionMarking( CAFunctionMarking::Undefined, false, "C", this, timeStart, timeLength ), false );
00133 }
00134
00138 int CAFunctionMarkingContext::functionMarkingCount(int timeStart) {
00139 int i;
00140 for (i=0; i<_functionMarkingList.size() && _functionMarkingList[i]->timeStart()>timeStart; i++);
00141 if (i<_functionMarkingList.size() && _functionMarkingList[i]->timeStart()==timeStart) {
00142 int count;
00143 for (count=1; i<_functionMarkingList.size() && _functionMarkingList[i]->timeStart()==timeStart; count++, i++);
00144 return count;
00145 } else
00146 return 0;
00147 }
00148