Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}