bool InsertSilence(const char* _undoTitle, double _pos, double _len) { if (_pos>=0.0 && _len>0.0 && _pos<SNM_GetProjectLength()) { if (_undoTitle) Undo_BeginBlock2(NULL); PreventUIRefresh(1); double timeSel1, timeSel2, d=_pos+_len; GetSet_LoopTimeRange2(NULL, false, false, &timeSel1, &timeSel2, false); GetSet_LoopTimeRange2(NULL, true, false, &_pos, &d, false); Main_OnCommand(40200, 0); // insert space at time sel // restore time sel, enlarge if needed (mimic native behavior) if (timeSel1>_pos) timeSel1+=_len; if (_pos<timeSel2) timeSel2+=_len; GetSet_LoopTimeRange2(NULL, true, false, &timeSel1, &timeSel2, false); PreventUIRefresh(-1); if (_undoTitle) Undo_EndBlock2(NULL, _undoTitle, UNDO_STATE_ALL); return true; } return false; }
void MarkersToRegions(COMMAND_T* ct) { MarkerList ml(NULL, true); WDL_PtrList<MarkerItem> &markers = ml.m_items; if(markers.GetSize() == 0) return; // Bail if there are no markers/regions double projEnd = SNM_GetProjectLength(); Undo_BeginBlock2(NULL); // Insert dummy marker at project start if necessary if(markers.Get(0)->GetPos() > 0) { markers.Insert(0, new MarkerItem(false, 0, 0, "", 0, 0)); } // Convert markers to regions for(int i = 0, c = markers.GetSize(); i < c; i++) { MarkerItem *pm = markers.Get(i); if(!pm->IsRegion()) { // Find next marker MarkerItem *pNext = NULL; int n = i + 1; do { pNext = markers.Get(n++); } while(pNext && pNext->IsRegion()); double pos = pm->GetPos(); double end = pNext ? pNext->GetPos() : projEnd; if(pos != end) { pm->SetReg(true); pm->SetRegEnd(end); } } } ml.UpdateReaper(); Undo_EndBlock2(NULL, __LOCALIZE("Convert markers to regions","sws_undo"), UNDO_STATE_MISCCFG); }
char* MarkerList::GetFormattedList(const char* format) // Must delete [] returned string { SWS_SectionLock lock(&m_mutex); int iLen = ApproxSize()*2; char* str = new char[iLen]; str[0] = 0; double dEnd = SNM_GetProjectLength(); char* s = str; int count = 1; for (int i = 0; i < m_items.GetSize(); i++) { if (format[0] == 'a' || (format[0] == 'r' && m_items.Get(i)->IsRegion()) || (format[0] == 'm' && !m_items.Get(i)->IsRegion())) { // Cheat a bit and use the region end variable for markers as "location of next marker or eop" if (!m_items.Get(i)->IsRegion()) { if (i < m_items.GetSize() - 1) m_items.Get(i)->SetRegEnd(m_items.Get(i+1)->GetPos()); else m_items.Get(i)->SetRegEnd(dEnd); } for (unsigned int j = 1; j < strlen(format); j++) { switch(format[j]) { case 'n': s += sprintf(s, "%d", count++); break; case 'i': s += sprintf(s, "%d", m_items.Get(i)->GetNum()); break; case 'l': { double len = m_items.Get(i)->GetRegEnd() - m_items.Get(i)->GetPos(); if (len < 0.0) len = 0.0; format_timestr_pos(len, s, (int)(iLen-(s-str)), 5); s += strlen(s)-3; s[0] = 0; break; } case 'd': s += sprintf(s, "%s", m_items.Get(i)->GetName()); break; case 't': format_timestr_pos(m_items.Get(i)->GetPos(), s, (int)(iLen-(s-str)), 5); s += strlen(s)-3; s[0] = 0; break; case 'T': format_timestr_pos(m_items.Get(i)->GetPos(), s, (int)(iLen-(s-str)), 5); s += strlen(s); // Change the final : to a . s[-3] = '.'; break; case 's': format_timestr_pos(m_items.Get(i)->GetPos(), s, (int)(iLen-(s-str)), 4); s += strlen(s); break; case 'p': format_timestr_pos(m_items.Get(i)->GetPos(), s, (int)(iLen-(s-str)), -1); s += strlen(s); break; case '\\': j++; s[0] = format[j]; s++; break; default: s[0] = format[j]; s[1] = 0; s++; } } strcpy(s, "\r\n"); s += 2; } } return str; }