void MainSequencer::SplitTimingMark() { int x1; int x2; if( mPlayType == PLAY_TYPE_MODEL ) { x1 = PanelTimeLine->GetPlayMarker(); x2 = x1; } else { x1 = PanelTimeLine->GetSelectedPositionStart(); x2 = PanelTimeLine->GetSelectedPositionEnd(); } if( x2 == -1 ) x2 = x1; int selectedTiming = mSequenceElements->GetSelectedTimingRow(); if(selectedTiming >= 0) { Element* e = mSequenceElements->GetVisibleRowInformation(selectedTiming)->element; EffectLayer* el = e->GetEffectLayer(mSequenceElements->GetVisibleRowInformation(selectedTiming)->layerIndex); int index1,index2; int t1 = PanelTimeLine->GetAbsoluteTimeMSfromPosition(x1); int t2 = PanelTimeLine->GetAbsoluteTimeMSfromPosition(x2); if(el->HitTestEffectByTime(t1,index1) && el->HitTestEffectByTime(t2,index2)) { if( index1 == index2 ) { Effect* eff1 = el->GetEffect(index1); int old_end_time = eff1->GetEndTimeMS(); if( t1 != t2 || ((t1 == t2) && t1 != eff1->GetStartTimeMS() && t1 != eff1->GetEndTimeMS()) ) { eff1->SetEndTimeMS(t1); std::string name,settings; el->AddEffect(0,name,settings,"",t2,old_end_time,false,false); PanelEffectGrid->ForceRefresh(); } } else { wxMessageBox("Timing cannot be split across timing marks.","Timing placement error"); } } } }
void MainSequencer::InsertTimingMarkFromRange() { bool is_range = true; int x1; int x2; if( mPlayType == PLAY_TYPE_MODEL ) { x1 = PanelTimeLine->GetPlayMarker(); x2 = x1; } else { x1 = PanelTimeLine->GetSelectedPositionStart(); x2 = PanelTimeLine->GetSelectedPositionEnd(); } if( x2 == -1 ) x2 = x1; if( x1 == x2) is_range = false; int selectedTiming = mSequenceElements->GetSelectedTimingRow(); if(selectedTiming >= 0) { int t1 = PanelTimeLine->GetAbsoluteTimeMSfromPosition(x1); int t2 = PanelTimeLine->GetAbsoluteTimeMSfromPosition(x2); if(is_range) { Element* e = mSequenceElements->GetVisibleRowInformation(selectedTiming)->element; EffectLayer* el = e->GetEffectLayer(mSequenceElements->GetVisibleRowInformation(selectedTiming)->layerIndex); int index; if(!el->HitTestEffectByTime(t1,index) && !el->HitTestEffectByTime(t2,index)) { std::string name,settings; el->AddEffect(0,name,settings,"",t1,t2,false,false); PanelEffectGrid->ForceRefresh(); } else { wxMessageBox("Timing exist already in the selected region","Timing placement error"); } } else { // x1 and x2 are the same. Insert from end time of timing to the left to x2 Element* e = mSequenceElements->GetVisibleRowInformation(selectedTiming)->element; EffectLayer* el = e->GetEffectLayer(mSequenceElements->GetVisibleRowInformation(selectedTiming)->layerIndex); int index; if(!el->HitTestEffectByTime(t2,index)) { // if there is an effect to left std::string name,settings; Effect * effect = nullptr; for (int x = 0; x < el->GetEffectCount(); x++) { Effect * e = el->GetEffect(x); if (e->GetStartTimeMS() > t2 && x > 0) { effect = el->GetEffect(x - 1); break; } } if(effect!=nullptr) { int t1 = effect->GetEndTimeMS(); el->AddEffect(0,name,settings,"",t1,t2,false,false); } // No effect to left start at time = 0 else { int t1 = 0; if (el->GetEffectCount() > 0) { Effect *e = el->GetEffect(el->GetEffectCount() - 1); t1 = e->GetEndTimeMS(); } el->AddEffect(0,name,settings,"",t1,t2,false,false); } PanelEffectGrid->ForceRefresh(); } else { SplitTimingMark(); // inserting a timing mark inside a timing mark same as a split } } } }