/media/hdb5/canorusNightlyBuildSystem/trunk/src/core/functionmarkingcontext.cpp

Go to the documentation of this file.
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() ) { // add new empty functions, if chords still exist
00115                         addEmptyFunction( TS, TL);
00116                         curIdx++;
00117                 }
00118                 
00119                 // apply timestart and length to existing function markings
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 

Generated on Sat Feb 9 13:06:25 2008 for Canorus by  doxygen 1.5.3