void MoveCursorAndSel(COMMAND_T* ct) { double dStart, dEnd, dPos = GetCursorPosition(); int iEdge; // -1 for left, 1 for right GetSet_LoopTimeRange(false, false, &dStart, &dEnd, false); if (dStart == dEnd) { iEdge = (int)ct->user; dStart = dEnd = dPos; } else if (dPos <= dStart) iEdge = -1; else if (dPos >= dEnd) iEdge = 1; else if (dPos - dStart < dEnd - dPos) iEdge = -1; else iEdge = 1; // Set edit cursor dPos = ((int)ct->user == -1) ? GetPrevGridDiv(dPos) : GetNextGridDiv(dPos); SetEditCurPos(dPos, true, false); // Extend the time sel if (iEdge == -1) dStart = dPos; else dEnd = dPos; GetSet_LoopTimeRange(true, false, &dStart, &dEnd, false); }
void SelPrevRegion(COMMAND_T*) { double dCurPos, d2; GetSet_LoopTimeRange(false, true, &dCurPos, &d2, false); if (dCurPos == d2) dCurPos = GetCursorPosition(); int x = 0; bool bReg; double d1, dRegStart, dRegEnd; bool bFound = false; bool bRegions = false; while ((x = EnumProjectMarkers(x, &bReg, &d1, &d2, NULL, NULL))) { if (bReg) { bRegions = true; if (dCurPos > d1) { dRegStart = d1; dRegEnd = d2; bFound = true; } } } if (bFound) GetSet_LoopTimeRange(true, true, &dRegStart, &dRegEnd, false); else if (bRegions) GetSet_LoopTimeRange(true, true, &d1, &d2, false); }
void SelNextRegion(COMMAND_T*) { double dCurPos, d2; GetSet_LoopTimeRange(false, true, &dCurPos, &d2, false); if (dCurPos == d2) dCurPos = GetCursorPosition(); int x = 0; bool bReg; double dRegStart; double dRegEnd; while ((x = EnumProjectMarkers(x, &bReg, &dRegStart, &dRegEnd, NULL, NULL))) { if (bReg && dRegStart > dCurPos) { GetSet_LoopTimeRange(true, true, &dRegStart, &dRegEnd, false); return; } } // Nothing found, loop again and set to first region while ((x = EnumProjectMarkers(x, &bReg, &dRegStart, &dRegEnd, NULL, NULL))) { if (bReg) { GetSet_LoopTimeRange(true, true, &dRegStart, &dRegEnd, false); return; } } }
void SafeTiemSel(COMMAND_T*) { double t1, t2; GetSet_LoopTimeRange(false, false, &t1, &t2, false); if (t1 == t2) Main_OnCommand(40290, 0); }
void MarkerList::CropToTimeSel(bool bOffset) { double dStart, dEnd; GetSet_LoopTimeRange(false, false, &dStart, &dEnd, false); // If no time sel just return if (dStart == dEnd) return; // Don't crop the end of regions for (int i = 0; i < m_items.GetSize(); i++) { MarkerItem* item = m_items.Get(i); if (item->GetPos() > dEnd || (!item->IsRegion() && item->GetPos() < dStart) || (item->IsRegion() && item->GetRegEnd() < dStart)) { // delete the item m_items.Delete(i, true); i--; } else { if (item->IsRegion() && item->GetPos() < dStart && item->GetRegEnd() >= dStart) item->SetPos(dStart); if (bOffset) { item->SetPos(item->GetPos() - dStart); if (item->IsRegion()) item->SetRegEnd(item->GetRegEnd() - dStart); } } } }
void SmartSplit(COMMAND_T*) { double t1, t2; GetSet_LoopTimeRange(false, false, &t1, &t2, false); if (AreThereSelItemsInTimeSel() || (t1 != t2 && !CountSelectedMediaItems(0))) Main_OnCommand(40061, 0); // Split at time sel else Main_OnCommand(40012, 0); // Std split at cursor }
void SelNextMarkerOrRegion(COMMAND_T*) { double dCurPos = GetCursorPosition(); double dCurStart, dCurEnd, dRegStart, dRegEnd; GetSet_LoopTimeRange(false, false, &dCurStart, &dCurEnd, false); int x = 0; bool bReg; while ((x = EnumProjectMarkers(x, &bReg, &dRegStart, &dRegEnd, NULL, NULL))) { bool bSelMatches = dCurStart == dRegStart && dCurEnd == dRegEnd; if (dRegStart > dCurPos || (bReg && dRegStart >= dCurPos && !bSelMatches)) { GetSet_LoopTimeRange(true, false, &dRegStart, bReg ? &dRegEnd : &dRegStart, false); SetEditCurPos(dRegStart, true, true); return; } } // Currently no wraparound, if needed add "go to first" here. }
void SelPrevMarkerOrRegion(COMMAND_T*) { // Save the current marker list so we can traverse the list bacwards MarkerList ml(NULL, true); double dCurPos = GetCursorPosition(); double dCurStart, dCurEnd; GetSet_LoopTimeRange(false, false, &dCurStart, &dCurEnd, false); bool bCurSel = dCurStart != dCurEnd; for (int i = ml.m_items.GetSize()-1; i >= 0; i--) { MarkerItem* mi = ml.m_items.Get(i); if (mi->GetPos() < dCurPos || (!mi->IsRegion() && mi->GetPos() <= dCurPos && bCurSel)) { double dNewStart = mi->GetPos(), dNewEnd = mi->GetRegEnd(); GetSet_LoopTimeRange(true, false, &dNewStart, mi->IsRegion() ? &dNewEnd : &dNewStart, false); SetEditCurPos(mi->GetPos(), true, true); return; } } }
void MoveCursorAndSel(COMMAND_T* ct) { double dStart, dEnd, dPos = GetCursorPosition(); int iEdge; // -1 for left, 1 for right GetSet_LoopTimeRange(false, false, &dStart, &dEnd, false); if (dStart == dEnd) { iEdge = (int)ct->user; dStart = dEnd = dPos; } else if (dPos <= dStart) iEdge = -1; else if (dPos >= dEnd) iEdge = 1; else if (dPos - dStart < dEnd - dPos) iEdge = -1; else iEdge = 1; // Move the edit cursor position double dQN = TimeMap2_timeToQN(NULL, dPos); // Special case for left move and on grid already int iQN = (int)(dQN + SWS_ADJACENT_ITEM_THRESHOLD); if (ct->user == -1 && fabs(dQN - iQN) < SWS_ADJACENT_ITEM_THRESHOLD) --iQN; else if (ct->user == 1) ++iQN; dPos = TimeMap2_QNToTime(NULL, (double)iQN); // Extend the time sel if (iEdge == -1) dStart = dPos; else dEnd = dPos; GetSet_LoopTimeRange(true, false, &dStart, &dEnd, false); // Set the play cursor SetEditCurPos(dPos, true, false); }
bool AreThereSelItemsInTimeSel() { double t1, t2; GetSet_LoopTimeRange(false, false, &t1, &t2, false); if (t1 != t2) { // see if sel items are in the time selection for (int i = 0; i < CountSelectedMediaItems(0); i++) { MediaItem* item = GetSelectedMediaItem(0, i); double dItemPos = *(double*)GetSetMediaItemInfo(item, "D_POSITION", NULL); double dItemLen = *(double*)GetSetMediaItemInfo(item, "D_LENGTH", NULL); if ((dItemPos >= t1 && dItemPos < t2) || (dItemPos < t1 && dItemLen > t1 - dItemPos)) return true; } } return false; }